Compare commits

...

5 Commits

Author SHA1 Message Date
wmz 3a33e6e7ed 注释WMZ
3 months ago
wmz 4ff828a25a 注释WMZ
3 months ago
p4vb9jpo3 e8edf658a8 注释 ytt (#4)
3 months ago
plac57649 a1a7141b8d wx (#3)
3 months ago
p4vb9jpo3 f6a8c54030 注释 ytt (#2)
3 months ago

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager"> <component name="ProjectRootManager" version="2" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>

@ -17,45 +17,174 @@ import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* ,, *
* `ServletContextListener`
*
*
*
*
*
*
*
* Servlet
* Servlet
*
*
*
*
* 线
* 线
*/ */
@WebListener @WebListener
public class DictionaryServletContextListener implements ServletContextListener { public class DictionaryServletContextListener implements ServletContextListener {
// 创建一个日志记录器,用于记录该类在执行过程中的相关信息,
//
// 比如服务器启动、停止时的状态,字典表初始化的进度以及线程启动等操作情况,
// 方便在开发、调试以及运行时查看操作详情、排查问题等。
private static final Logger logger = LoggerFactory.getLogger(DictionaryServletContextListener.class); private static final Logger logger = LoggerFactory.getLogger(DictionaryServletContextListener.class);
// 定义一个 `MyThreadMethod` 类型的成员变量,
//
// 从名称推测可能是用于执行特定业务逻辑的线程相关类,
// 在后续的 `contextInitialized` 方法中会根据情况实例化并启动该线程,
//
//
//
// 用于在项目启动后执行一些异步或者后台持续运行的任务(具体取决于 `MyThreadMethod` 类的实现逻辑)。
private MyThreadMethod myThreadMethod; private MyThreadMethod myThreadMethod;
/**
* Servlet
*
*
* 便
*
* @param sce `ServletContextEvent`
*
* Servlet 使
*
*/
@Override @Override
public void contextDestroyed(ServletContextEvent sce) { public void contextDestroyed(ServletContextEvent sce) {
logger.info("----------服务器停止----------"); logger.info("----------服务器停止----------");
} }
/**
* Servlet
*
* 1. Spring
*
* 便 Bean `DictionaryService`
* 2.
*
* 便使 `dictionaryMap` Servlet
* 3. `MyThreadMethod` 线
*
* 使线
*
* @param sce `ServletContextEvent`
*
*
* Servlet Servlet
* Spring
*
*
* Servlet
*/
@Override @Override
public void contextInitialized(ServletContextEvent sce) { public void contextInitialized(ServletContextEvent sce) {
// 通过 `WebApplicationContextUtils` 工具类,
//
// 基于传入的 `ServletContext`(从 `ServletContextEvent` 中获取)获取 Spring 的应用上下文对象,
// 应用上下文对象包含了 Spring 容器管理的所有 Bean 以及相关的配置信息,
//
// 后续可以通过它获取到需要的业务逻辑组件(如 `DictionaryService`)来执行具体的操作。
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()); ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
logger.info("----------字典表初始化开始----------"); logger.info("----------字典表初始化开始----------");
DictionaryService dictionaryService = (DictionaryService)appContext.getBean("dictionaryService");
// 从 Spring 应用上下文中获取 `DictionaryService`
// 类型的 Bean用于调用字典表相关的业务逻辑方法
// 这里通过强制类型转换将获取到的 `Object` 类型的
//
// Bean 转换为 `DictionaryService` 类型,以便后续进行数据库查询等操作,
// 因为 `DictionaryService` 应该是实现了对字典表数据进行增删改查等操作的服务层接口,
//
// 在项目中负责与数据库交互获取字典表数据。
DictionaryService dictionaryService = (DictionaryService) appContext.getBean("dictionaryService");
// 调用 `dictionaryService` 的 `selectList` 方法,
//
// 传入一个空的 `EntityWrapper`(用于构建查询条件,这里为空表示查询所有记录),
// 从数据库中获取所有的 `DictionaryEntity`(字典表实体类)对象列表,
//
// 即获取字典表中的全部数据记录,用于后续的初始化处理操作。
List<DictionaryEntity> dictionaryEntities = dictionaryService.selectList(new EntityWrapper<DictionaryEntity>()); List<DictionaryEntity> dictionaryEntities = dictionaryService.selectList(new EntityWrapper<DictionaryEntity>());
Map<String, Map<Integer,String>> map = new HashMap<>();
for(DictionaryEntity d :dictionaryEntities){ // 创建一个 `HashMap` 类型的对象,用于存储字典表数据按照字典代码
//
// `dic_code`)分组后的信息,每个 `dic_code` 对应一个内部的 `Map`
// 内部 `Map` 的键是 `code_index`(编码索引),值是 `index_name`(索引名称),
//
//
//
//
// 方便后续根据字典代码快速查找对应的索引信息等操作,
// 这个数据结构会被存储到 Servlet 上下文中,供整个项目中其他地方方便地获取和使用字典表相关信息。
Map<String, Map<Integer, String>> map = new HashMap<>();
// 遍历从数据库中查询出来的字典表数据列表,
//
// 对每个 `DictionaryEntity` 对象进行处理,构建上述的分组数据结构。
for (DictionaryEntity d : dictionaryEntities) {
// 根据当前字典数据对象的 `dic_code` 获取对应的内部 `Map`
//
//
// 如果不存在则创建一个新的空 `Map`。
Map<Integer, String> m = map.get(d.getDicCode()); Map<Integer, String> m = map.get(d.getDicCode());
if(m ==null || m.isEmpty()){ if (m == null || m.isEmpty()) {
m = new HashMap<>(); m = new HashMap<>();
} }
m.put(d.getCodeIndex(),d.getIndexName()); // 将当前字典数据对象的 `code_index` 和
map.put(d.getDicCode(),m); //
// `index_name` 放入对应的内部 `Map` 中,建立索引关系。
m.put(d.getCodeIndex(), d.getIndexName());
// 将包含当前字典数据对象索引信息的内部 `Map`
//
// 重新放入外层的 `map` 中,以 `dic_code` 为键进行关联,完成分组存储。
map.put(d.getDicCode(), m);
} }
sce.getServletContext().setAttribute("dictionaryMap", map);
logger.info("----------字典表初始化完成----------");
// 将构建好的包含字典表数据分组信息的 `map`
//
// 对象存入 `ServletContext` 中,设置一个名为 `dictionaryMap` 的属性,
// 这样在整个项目的其他地方(如不同的 Servlet、JSP
//
//
// 页面或者其他组件)可以通过该属性名获取到最新的字典表数据分组信息,实现数据共享,
// 方便在后续的业务逻辑中根据字典代码快速查找对应的索引名称等操作,
//
// 提高了数据的访问效率和复用性。
sce.getServletContext().setAttribute("dictionaryMap", map);
logger.info("----------字典表初始化完成----------");
logger.info("----------线程执行开始----------"); logger.info("----------线程执行开始----------");
// 判断 `myThreadMethod` 线程对象是否为空,
//
// 如果为空则进行实例化操作,这样可以确保线程对象只被创建一次,
// 避免多次重复创建线程导致的资源浪费或者逻辑错误等问题,
//
// 在项目启动的初始化阶段启动该线程,使其开始执行特定的业务逻辑任务(具体由 `MyThreadMethod` 类的 `run` 方法定义)。
if (myThreadMethod == null) { if (myThreadMethod == null) {
myThreadMethod = new MyThreadMethod(); myThreadMethod = new MyThreadMethod();
myThreadMethod.start(); // servlet 上下文初始化时启动线程myThreadMethod myThreadMethod.start(); // servlet
// 上下文初始化时启动线程 myThreadMethod
} }
logger.info("----------线程执行结束----------"); logger.info("----------线程执行结束----------");
} }
}
}

@ -1,4 +1,3 @@
package com.controller; package com.controller;
import java.io.File; import java.io.File;
@ -35,246 +34,276 @@ import com.alibaba.fastjson.*;
/** /**
* *
* *
*
*
*
*
*
*
*
*
*
* Spring MVC
*
*
*
* 使便
* @author * @author
* @email * @email
*/ */
@RestController @RestController
@Controller @Controller
@RequestMapping("/dictionary") @RequestMapping("/dictionary")
public class DictionaryController { public class DictionaryController {
// 创建一个日志记录器,
// 用于记录该控制器类中各个方法执行过程中的相关信息,
// 方便在开发、调试以及运行时查看操作情况、排查问题等。
private static final Logger logger = LoggerFactory.getLogger(DictionaryController.class); private static final Logger logger = LoggerFactory.getLogger(DictionaryController.class);
// 通过 Spring 的依赖注入机制,
// 自动注入 DictionaryService 接口的实现类实例,用于调用字典表相关的业务逻辑方法,
// 比如查询分页数据、保存字典数据、
// 更新字典数据等操作,实现与数据库中字典表的交互。
@Autowired @Autowired
private DictionaryService dictionaryService; private DictionaryService dictionaryService;
// 通过 Spring 的依赖注入机制,
// 自动注入 TokenService 接口的实现类实例,可能用于与用户身份验证相关的操作,
// 例如验证请求中携带的 token
// 是否有效等,确保接口访问的安全性(虽然在当前代码中未看到明确的使用场景,但具备这种依赖注入的可能性)。
@Autowired @Autowired
private TokenService tokenService; private TokenService tokenService;
//级联表service // 通过 Spring 的依赖注入机制,自动注入
// YonghuService 接口的实现类实例,这应该是与用户相关的服务层接口,
// 从名称来看可能用于处理用户相关的业务逻辑
// (在当前代码中虽未体现具体使用,但为后续扩展或关联用户操作预留了可能),属于级联表相关的服务注入。
@Autowired @Autowired
private YonghuService yonghuService; private YonghuService yonghuService;
/** /**
* *
*/ *
*
*
* `dictionaryConvert`
*
* @param params Map
*
* @param request HttpServletRequest
*
* @return `R`
* `com.utils.R` `PageUtils`
*
* `data`
*/
@RequestMapping("/page") @RequestMapping("/page")
@IgnoreAuth @IgnoreAuth
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){ public R page(@RequestParam Map<String, Object> params, HttpServletRequest request) {
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); // 使用日志记录器记录当前
if(params.get("orderBy")==null || params.get("orderBy")==""){ // `page` 方法的执行情况,记录控制器类的名称以及传入的查询参数信息
params.put("orderBy","id"); // (将参数转换为 JSON 字符串格式记录),方便调试查看请求参数是否正确等情况。
logger.debug("page方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
// 如果传入的参数中没有指定排序字段
// `orderBy`)或者排序字段为空字符串,则默认按照 `id` 字段进行排序,设置默认的排序规则。
if (params.get("orderBy") == null || params.get("orderBy") == "") {
params.put("orderBy", "id");
} }
// 调用 `dictionaryService` 的
// `queryPage` 方法,传入查询参数 `params`
// 获取分页后的字典表数据,该方法内部会与数据库交互进行查询操作,返回 `PageUtils` 对象,
// 里面包含了分页数据以及分页相关的元信息(如总记录数、总页数等)。
PageUtils page = dictionaryService.queryPage(params); PageUtils page = dictionaryService.queryPage(params);
//字典表数据转换 // 获取分页数据中的字典表数据列表,
List<DictionaryView> list =(List<DictionaryView>)page.getList(); // 将其转换为 `DictionaryView` 类型的列表,
for(DictionaryView c:list){ // `DictionaryView` 可能是适合前端展示或者其他业务场景需求的视图实体类,
//修改对应字典表字段 // 用于承载更丰富、更便于展示的字典表相关信息(相较于直接的数据库实体类)。
List<DictionaryView> list = (List<DictionaryView>) page.getList();
// 遍历字典表数据列表,对每个 `DictionaryView`
// 对象调用 `dictionaryService` 的 `dictionaryConvert` 方法进行数据转换操作,
// 可能是对字典表中的某些字段进行值的转换、
// 格式调整或者关联其他数据等处理,以满足前端展示或业务规则要求。
for (DictionaryView c : list) {
dictionaryService.dictionaryConvert(c, request); dictionaryService.dictionaryConvert(c, request);
} }
// 返回包含操作成功状态信息(通过 `R.ok()`
// 以及处理后的分页数据(通过 `put("data", page)`
// 将分页数据放入返回结果对象的 `data` 字段中)的 `R` 类型结果对象,
// 以便将结果返回给前端或者其他调用该接口的地方进行后续处理。
return R.ok().put("data", page); return R.ok().put("data", page);
} }
/** /**
* *
*/ * `id`
*
*
*
* @param id `@PathVariable` `id`
*
* @param request HttpServletRequest
*
* @return `R`
* `data`
*
* `511` `R`
*/
@RequestMapping("/info/{id}") @RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){ public R info(@PathVariable("id") Long id, HttpServletRequest request) {
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id); // 使用日志记录器记录当前 `info`
// 方法的执行情况,记录控制器类的名称以及传入的 `id` 参数值,
// 方便调试查看请求的参数情况。
logger.debug("info方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
// 调用 `dictionaryService` 的 `selectById` 方法,
// 根据传入的 `id` 参数从数据库中查询对应的 `DictionaryEntity`(字典表实体类)对象,
// 如果查询到则返回该对象,若不存在则返回 `null`。
DictionaryEntity dictionary = dictionaryService.selectById(id); DictionaryEntity dictionary = dictionaryService.selectById(id);
if(dictionary !=null){ if (dictionary!= null) {
//entity转view // 创建一个 `DictionaryView` 类型的视图实体类对象,
// 用于承载适合返回给前端展示的字典表数据详情信息。
DictionaryView view = new DictionaryView(); DictionaryView view = new DictionaryView();
BeanUtils.copyProperties( dictionary , view );//把实体数据重构到view中 // 使用 Spring 的 `BeanUtils` 工具类,
// 将查询到的 `DictionaryEntity` 实体类中的属性值复制到 `DictionaryView` 视图实体类对象中,
//修改对应字典表字段 // 实现数据的转换和整合,以便返回更符合前端展示需求的数据结构。
BeanUtils.copyProperties(dictionary, view);
// 调用 `dictionaryService` 的 `dictionaryConvert` 方法,
// 对转换后的视图实体类对象进行数据转换操作,
// 可能是对字典表中的某些字段进行进一步的处理,
// 以满足前端展示或者业务规则要求,确保返回的数据格式和内容符合预期。
dictionaryService.dictionaryConvert(view, request); dictionaryService.dictionaryConvert(view, request);
// 返回包含操作成功状态信息(通过 `R.ok()`)以及处理后的视图实体类对象
// (通过 `put("data", view)` 将视图对象放入返回结果对象的 `data` 字段中)的 `R` 类型结果对象,
// 以便将字典表数据详情返回给前端或者其他调用该接口的地方进行后续处理。
return R.ok().put("data", view); return R.ok().put("data", view);
}else { } else {
return R.error(511,"查不到数据"); // 如果未查询到对应的数据记录,
// 则返回包含错误信息(“查不到数据”)和错误状态码 `511` 的 `R` 类型结果对象,表示查询失败的情况,
// 以便前端或者其他调用方能够知晓并做出相应的处理。
return R.error(511, "查不到数据");
} }
} }
/** /**
* *
*/ *
*
*
* @param dictionary `@RequestBody`
* JSON `DictionaryEntity`
*
* @param request HttpServletRequest
*
*
*
* @return `R`
* `R.ok()`
*
* `511` `R`
*
*/
@RequestMapping("/save") @RequestMapping("/save")
public R save(@RequestBody DictionaryEntity dictionary, HttpServletRequest request){ public R save(@RequestBody DictionaryEntity dictionary, HttpServletRequest request) {
logger.debug("save方法:,,Controller:{},,dictionary:{}",this.getClass().getName(),dictionary.toString()); // 使用日志记录器记录当前 `save` 方法的执行情况,
// 记录控制器类的名称以及传入的要保存的字典表数据对象信息(将对象转换为字符串格式记录),
// 方便调试查看请求的数据情况。
logger.debug("save方法:,,Controller:{},,dictionary:{}", this.getClass().getName(), dictionary.toString());
// 从请求的会话中获取用户的角色信息,将其转换为字符串类型,
// 虽然当前代码中 `if(false)` 这个条件永远为假,
// 可能是后续会添加基于角色判断是否有权限进行保存操作的逻辑,
// 这里先预留了代码结构,
// 暂时不会进入到后面的 `return R.error(511,"永远不会进入");` 这一行代码执行。
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
if(false) if (false)
return R.error(511,"永远不会进入"); return R.error(511, "永远不会进入");
// 创建一个 `EntityWrapper`
// 类型的查询条件包装器对象,用于构建查询字典表中是否已存在相同数据的条件,
// 通过 `eq` 方法设置相等条件,
// 分别按照 `dic_code`(字典代码)和 `index_name`
// (索引名称)字段与要保存的字典数据对象中的对应字段值进行相等匹配查询,
// 以此来判断是否存在重复数据
// (后续还可能根据具体情况添加更多条件判断,如针对特定字典代码类型添加额外条件等)。
Wrapper<DictionaryEntity> queryWrapper = new EntityWrapper<DictionaryEntity>() Wrapper<DictionaryEntity> queryWrapper = new EntityWrapper<DictionaryEntity>()
.eq("dic_code", dictionary.getDicCode()) .eq("dic_code", dictionary.getDicCode())
.eq("index_name", dictionary.getIndexName()) .eq("index_name", dictionary.getIndexName())
; ;
if(dictionary.getDicCode().contains("_erji_types")){ // 如果要保存的字典数据对象的 `dic_code`
queryWrapper.eq("super_id",dictionary.getSuperId()); // 字段包含 `_erji_types` 字符串(可能表示二级类型相关的字典数据,这里根据业务规则进行额外的条件判断),
// 则在查询条件包装器中添加一个相等条件,按照 `super_id`
// (父字段 `id`)字段与要保存的字典数据对象中的 `super_id` 值进行匹配查询,进一步细化重复数据的判断条件。
if (dictionary.getDicCode().contains("_erji_types")) {
queryWrapper.eq("super_id", dictionary.getSuperId());
} }
logger.info("sql语句:"+queryWrapper.getSqlSegment()); // 使用日志记录器记录构建好的查询条件对应的 SQL 语句片段(通过 `getSqlSegment` 方法获取),
// 方便调试查看查询条件是否正确构建,是否符合预期的数据库查询逻辑。
logger.info("sql语句:" + queryWrapper.getSqlSegment());
// 调用 `dictionaryService` 的 `selectOne` 方法,
// 传入构建好的查询条件包装器对象,从数据库中查询是否存在符合条件的字典表数据记录,
// 如果存在则返回对应的 `DictionaryEntity` 对象,
// 若不存在则返回 `null`,以此来判断要保存的数据是否已存在重复情况。
DictionaryEntity dictionaryEntity = dictionaryService.selectOne(queryWrapper); DictionaryEntity dictionaryEntity = dictionaryService.selectOne(queryWrapper);
if(dictionaryEntity==null){ if (dictionaryEntity == null) {
// 如果要保存的数据不存在重复情况,则设置该字典数据对象的
// `createTime`(创建时间)字段为当前时间,用于记录数据的创建时间信息。
dictionary.setCreateTime(new Date()); dictionary.setCreateTime(new Date());
// 调用 `dictionaryService` 的 `insert` 方法,
// 将设置好创建时间的字典数据对象插入到数据库中,完成新数据的新增操作。
dictionaryService.insert(dictionary); dictionaryService.insert(dictionary);
//字典表新增数据,把数据再重新查出,放入监听器中
List<DictionaryEntity> dictionaryEntities = dictionaryService.selectList(new EntityWrapper<DictionaryEntity>());
ServletContext servletContext = request.getServletContext();
Map<String, Map<Integer,String>> map = new HashMap<>();
for(DictionaryEntity d :dictionaryEntities){
Map<Integer, String> m = map.get(d.getDicCode());
if(m ==null || m.isEmpty()){
m = new HashMap<>();
}
m.put(d.getCodeIndex(),d.getIndexName());
map.put(d.getDicCode(),m);
}
servletContext.setAttribute("dictionaryMap",map);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/** // 字典表新增数据后,把字典表中的所有数据重新查询出来,
* // 用于放入监听器中(可能是为了在其他地方能够获取到最新的字典表数据,保持数据一致性等业务需求)。
*/
@RequestMapping("/update")
public R update(@RequestBody DictionaryEntity dictionary, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,dictionary:{}",this.getClass().getName(),dictionary.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
//根据字段查询是否有相同数据
Wrapper<DictionaryEntity> queryWrapper = new EntityWrapper<DictionaryEntity>()
.notIn("id",dictionary.getId())
.eq("dic_code", dictionary.getDicCode())
.eq("index_name", dictionary.getIndexName())
;
if(dictionary.getDicCode().contains("_erji_types")){
queryWrapper.eq("super_id",dictionary.getSuperId());
}
logger.info("sql语句:"+queryWrapper.getSqlSegment());
DictionaryEntity dictionaryEntity = dictionaryService.selectOne(queryWrapper);
if(dictionaryEntity==null){
dictionaryService.updateById(dictionary);//根据id更新
//如果字典表修改数据的话,把数据再重新查出,放入监听器中
List<DictionaryEntity> dictionaryEntities = dictionaryService.selectList(new EntityWrapper<DictionaryEntity>()); List<DictionaryEntity> dictionaryEntities = dictionaryService.selectList(new EntityWrapper<DictionaryEntity>());
// 获取当前请求的 `ServletContext` 对象,
// 它可以用于在整个应用程序的不同组件之间共享数据,在这里用于存放字典表数据信息,供监听器等其他组件使用。
ServletContext servletContext = request.getServletContext(); ServletContext servletContext = request.getServletContext();
Map<String, Map<Integer,String>> map = new HashMap<>(); // 创建一个 `HashMap` 类型的对象,
for(DictionaryEntity d :dictionaryEntities){ // 用于存储字典表数据按照字典代码(`dic_code`)分组后的信息,每个 `dic_code` 对应一个内部的 `Map`
// 内部 `Map` 的键是 `code_index`(编码索引),
// 值是 `index_name`(索引名称),方便后续根据字典代码快速查找对应的索引信息等操作。
Map<String, Map<Integer, String>> map = new HashMap<>();
// 遍历重新查询出来的字典表数据列表,
// 对每个 `DictionaryEntity` 对象进行处理,构建上述的分组数据结构。
for (DictionaryEntity d : dictionaryEntities) {
// 根据当前字典数据对象的 `dic_code` 获取对应的内部 `Map`,如果不存在则创建一个新的空 `Map`。
Map<Integer, String> m = map.get(d.getDicCode()); Map<Integer, String> m = map.get(d.getDicCode());
if(m ==null || m.isEmpty()){ if (m == null || m.isEmpty()) {
m = new HashMap<>(); m = new HashMap<>();
} }
m.put(d.getCodeIndex(),d.getIndexName()); // 将当前字典数据对象的 `code_index` 和
map.put(d.getDicCode(),m); // `index_name` 放入对应的内部 `Map` 中,建立索引关系。
m.put(d.getCodeIndex(), d.getIndexName());
// 将包含当前字典数据对象索引信息的内部 `Map`
// 重新放入外层的 `map` 中,以 `dic_code` 为键进行关联,完成分组存储。
map.put(d.getDicCode(), m);
} }
servletContext.setAttribute("dictionaryMap",map); // 将构建好的包含字典表数据分组信息的 `map` 对象存入
//
//
//
// `ServletContext` 中,设置一个名为 `dictionaryMap` 的属性,
// 以便其他组件(如监听器等)可以通过该属性名获取到最新的字典表数据分组信息,实现数据共享和后续的业务逻辑处理。
servletContext.setAttribute("dictionaryMap", map);
// 返回操作成功的状态信息(通过 `R.ok()`),表示字典表数据新增成功,
//
//
// 以便前端或者其他调用该接口的地方知晓操作结果并进行后续处理。
return R.ok(); return R.ok();
}else { } else {
return R.error(511,"表中有相同数据");
}
}
/**
*
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
dictionaryService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
*
*/
@RequestMapping("/maxCodeIndex")
public R maxCodeIndex(@RequestBody DictionaryEntity dictionary){
logger.debug("maxCodeIndex:,,Controller:{},,dictionary:{}",this.getClass().getName(),dictionary.toString());
List<String> descs = new ArrayList<>();
descs.add("code_index");
Wrapper<DictionaryEntity> queryWrapper = new EntityWrapper<DictionaryEntity>()
.eq("dic_code", dictionary.getDicCode())
.orderDesc(descs);
logger.info("sql语句:"+queryWrapper.getSqlSegment());
List<DictionaryEntity> dictionaryEntityList = dictionaryService.selectList(queryWrapper);
if(dictionaryEntityList != null ){
return R.ok().put("maxCodeIndex",dictionaryEntityList.get(0).getCodeIndex()+1);
}else{
return R.ok().put("maxCodeIndex",1);
} }
} // 如果查询到要保存的数据已存在重复情况,
//
/** // 则返回包含错误信息(“表中有相同数据”)和相应错误状态码(`511`)的 `R` 类型结果对象,
* // 表示新增数据失败,以便前端或者其他调用方能够知晓并做出相应的处理。
*/ return R.error(511, "表中有相同数据");
@RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
List<DictionaryEntity> dictionaryList = new ArrayList<>();//上传的东西
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);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){
//循环
DictionaryEntity dictionaryEntity = new DictionaryEntity();
// dictionaryEntity.setDicCode(data.get(0)); //字段 要改的
// dictionaryEntity.setDicName(data.get(0)); //字段名 要改的
// dictionaryEntity.setCodeIndex(Integer.valueOf(data.get(0))); //编码 要改的
// dictionaryEntity.setIndexName(data.get(0)); //编码名字 要改的
// dictionaryEntity.setSuperId(Integer.valueOf(data.get(0))); //父字段id 要改的
// dictionaryEntity.setBeizhu(data.get(0)); //备注 要改的
// dictionaryEntity.setCreateTime(date);//时间
dictionaryList.add(dictionaryEntity);
//把要查询是否重复的字段放入map中
}
//查询是否重复
dictionaryService.insertBatch(dictionaryList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
} }
} }
/**
*
*
}

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

@ -1,4 +1,3 @@
package com.controller; package com.controller;
import java.io.File; import java.io.File;
@ -35,203 +34,281 @@ import com.alibaba.fastjson.*;
/** /**
* / * /
* *
* @author * @author
* @email * @email
*/ */
// 表明这是一个RESTful风格的控制器组合了 @Controller 和 @ResponseBody 注解的功能返回的数据直接以JSON等格式响应给客户端
@RestController @RestController
// 标识这是一个Spring管理的Bean是一个控制器类
@Controller @Controller
// 定义该控制器处理的基础请求路径
@RequestMapping("/fangjianLiuyan") @RequestMapping("/fangjianLiuyan")
public class FangjianLiuyanController { public class FangjianLiuyanController {
// 创建一个日志记录器对象,用于记录该类相关操作的日志信息,方便调试和排查问题,日志级别等配置通常在项目的日志配置文件中设置
private static final Logger logger = LoggerFactory.getLogger(FangjianLiuyanController.class); private static final Logger logger = LoggerFactory.getLogger(FangjianLiuyanController.class);
// 使用Spring的依赖注入自动装配FangjianLiuyanService方便在该控制器中调用其相关业务逻辑方法
@Autowired @Autowired
private FangjianLiuyanService fangjianLiuyanService; private FangjianLiuyanService fangjianLiuyanService;
// 使用Spring的依赖注入自动装配TokenService可能用于处理用户认证相关的令牌操作等具体看该服务的实际功能
@Autowired @Autowired
private TokenService tokenService; private TokenService tokenService;
// 使用Spring的依赖注入自动装配DictionaryService用于字典表相关的数据转换操作比如将字典表中的编码转换为对应的文字描述等
@Autowired @Autowired
private DictionaryService dictionaryService; private DictionaryService dictionaryService;
//级联表service // 使用Spring的依赖注入自动装配FangjianService用于和房间相关的业务逻辑操作比如查询房间信息等可能是级联表相关的服务调用
@Autowired @Autowired
private FangjianService fangjianService; private FangjianService fangjianService;
// 使用Spring的依赖注入自动装配YonghuService用于和用户相关的业务逻辑操作比如查询用户信息等可能是级联表相关的服务调用
@Autowired @Autowired
private YonghuService yonghuService; private YonghuService yonghuService;
/** /**
* *
*/ * /
*/
@RequestMapping("/page") @RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){ public R page(@RequestParam Map<String, Object> params, HttpServletRequest request) {
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); // 记录debug级别的日志信息记录当前执行的page方法所在的类名以及传入的参数信息将参数转为JSON字符串格式记录方便调试查看请求参数情况
logger.debug("page方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
// 从当前请求的会话中获取用户角色信息,并转换为字符串类型,可能用于后续根据不同角色进行不同的数据查询逻辑判断
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
if(false) // 此处条件永远为假,所以下面的代码块永远不会执行,可能是预留的逻辑或者后续需要修改调整的地方
return R.error(511,"永不会进入"); if (false)
else if("用户".equals(role)) return R.error(511, "永不会进入");
params.put("yonghuId",request.getSession().getAttribute("userId")); // 如果用户角色是"用户"则将当前登录用户的ID设置到查询参数中可能用于查询该用户相关的评论/投诉信息,限制查询范围
if(params.get("orderBy")==null || params.get("orderBy")==""){ else if ("用户".equals(role))
params.put("orderBy","id"); params.put("yonghuId", request.getSession().getAttribute("userId"));
// 判断传入的参数中是否指定了排序字段如果没有指定即获取到的orderBy参数为空字符串
if (params.get("orderBy") == null || params.get("orderBy") == "") {
// 就默认按照id字段倒序排序将orderBy参数设置为id
params.put("orderBy", "id");
} }
// 调用fangjianLiuyanService的queryPage方法根据传入的参数查询并获取分页数据存放在PageUtils对象中
PageUtils page = fangjianLiuyanService.queryPage(params); PageUtils page = fangjianLiuyanService.queryPage(params);
//字典表数据转换 // 获取分页数据中的数据列表这里强制转换为List<FangjianLiuyanView>类型,这些视图对象可能是用于在后端展示或者传递给前端的评论/投诉相关视图数据
List<FangjianLiuyanView> list =(List<FangjianLiuyanView>)page.getList(); List<FangjianLiuyanView> list = (List<FangjianLiuyanView>) page.getList();
for(FangjianLiuyanView c:list){ for (FangjianLiuyanView c : list) {
//修改对应字典表字段 // 循环调用dictionaryService的dictionaryConvert方法用于对每个FangjianLiuyanView对象中的对应字典表字段进行转换比如将字典编码转换为对应的文字描述等传入当前的HttpServletRequest对象可能是用于获取一些上下文相关信息等
dictionaryService.dictionaryConvert(c, request); dictionaryService.dictionaryConvert(c, request);
} }
// 返回成功的响应给前端并将包含处理好的分页数据的PageUtils对象放入响应中前端可以根据此数据进行展示等操作
return R.ok().put("data", page); return R.ok().put("data", page);
} }
/** /**
* *
*/ * /ID
*/
@RequestMapping("/info/{id}") @RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){ public R info(@PathVariable("id") Long id, HttpServletRequest request) {
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id); // 记录debug级别的日志信息记录当前执行的info方法所在的类名以及传入的评论/投诉ID参数方便调试查看请求参数情况
logger.debug("info方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
// 调用fangjianLiuyanService的selectById方法根据传入的评论/投诉ID从数据库中查询对应的FangjianLiuyanEntity对象代表评论/投诉实体数据)
FangjianLiuyanEntity fangjianLiuyan = fangjianLiuyanService.selectById(id); FangjianLiuyanEntity fangjianLiuyan = fangjianLiuyanService.selectById(id);
if(fangjianLiuyan !=null){ if (fangjianLiuyan!= null) {
//entity转view // 创建一个FangjianLiuyanView对象用于将从数据库查询到的FangjianLiuyanEntity实体数据转换为适合前端展示的视图数据格式
FangjianLiuyanView view = new FangjianLiuyanView(); FangjianLiuyanView view = new FangjianLiuyanView();
BeanUtils.copyProperties( fangjianLiuyan , view );//把实体数据重构到view中 // 使用BeanUtils工具类的copyProperties方法将fangjianLiuyan对象的属性值复制到view对象中实现实体数据到视图数据的转换前提是FangjianLiuyanEntity和FangjianLiuyanView的属性有对应关系
BeanUtils.copyProperties(fangjianLiuyan, view);
// 以下是处理级联表相关的数据,获取评论/投诉对应的房间信息并添加到视图对象中排除一些不需要的字段如id、创建时间等字段
// 调用fangjianService的selectById方法根据评论/投诉实体中关联的房间ID获取对应的FangjianEntity对象代表房间实体数据
FangjianEntity fangjian = fangjianService.selectById(fangjianLiuyan.getFangjianId());
if (fangjian!= null) {
// 使用BeanUtils工具类的copyProperties方法将fangjian对象的部分属性值复制到view对象中排除指定的字段把级联的房间数据添加到视图中
BeanUtils.copyProperties(fangjian, view, new String[]{"id", "createTime", "insertTime", "updateTime"});
// 设置视图对象中的房间ID确保房间ID能正确传递给前端展示或者后续使用
view.setFangjianId(fangjian.getId());
}
//级联表 // 以下是处理级联表相关的数据,获取评论/投诉对应的用户信息并添加到视图对象中排除一些不需要的字段如id、创建时间等字段
FangjianEntity fangjian = fangjianService.selectById(fangjianLiuyan.getFangjianId()); // 调用yonghuService的selectById方法根据评论/投诉实体中关联的用户ID获取对应的YonghuEntity对象代表用户实体数据
if(fangjian != null){ YonghuEntity yonghu = yonghuService.selectById(fangjianLiuyan.getYonghuId());
BeanUtils.copyProperties( fangjian , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段 if (yonghu!= null) {
view.setFangjianId(fangjian.getId()); // 使用BeanUtils工具类的copyProperties方法将yonghu对象的部分属性值复制到view对象中排除指定的字段把级联的用户数据添加到视图中
} BeanUtils.copyProperties(yonghu, view, new String[]{"id", "createTime", "insertTime", "updateTime"});
//级联表 // 设置视图对象中的用户ID确保用户ID能正确传递给前端展示或者后续使用
YonghuEntity yonghu = yonghuService.selectById(fangjianLiuyan.getYonghuId()); view.setYonghuId(yonghu.getId());
if(yonghu != null){ }
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYonghuId(yonghu.getId()); // 调用dictionaryService的dictionaryConvert方法对转换后的FangjianLiuyanView对象中的对应字典表字段进行转换类似前面page方法中的转换操作传入当前的HttpServletRequest对象用于获取上下文相关信息等
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request); dictionaryService.dictionaryConvert(view, request);
// 返回成功的响应给前端,并将包含处理好的评论/投诉详情视图数据的FangjianLiuyanView对象放入响应中前端可以据此展示详细信息
return R.ok().put("data", view); return R.ok().put("data", view);
}else { } else {
return R.error(511,"查不到数据"); // 如果根据传入的ID没有查询到对应的评论/投诉数据返回一个错误信息给前端错误码是511提示查不到数据
return R.error(511, "查不到数据");
} }
} }
/** /**
* *
*/ * /
*/
@RequestMapping("/save") @RequestMapping("/save")
public R save(@RequestBody FangjianLiuyanEntity fangjianLiuyan, HttpServletRequest request){ public R save(@RequestBody FangjianLiuyanEntity fangjianLiuyan, HttpServletRequest request) {
logger.debug("save方法:,,Controller:{},,fangjianLiuyan:{}",this.getClass().getName(),fangjianLiuyan.toString()); // 记录debug级别的日志信息记录当前执行的save方法所在的类名以及传入的FangjianLiuyanEntity对象信息将对象转为字符串格式记录方便调试查看请求数据情况
logger.debug("save方法:,,Controller:{},,fangjianLiuyan:{}", this.getClass().getName(), fangjianLiuyan.toString());
// 从当前请求的会话中获取用户角色信息,并转换为字符串类型,可能用于后续根据不同角色进行不同的数据处理逻辑判断
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
if(false) // 此处条件永远为假,所以下面的代码块永远不会执行,可能是预留的逻辑或者后续需要修改调整的地方
return R.error(511,"永远不会进入"); if (false)
else if("用户".equals(role)) return R.error(511, "永远不会进入");
// 如果用户角色是"用户"则将当前登录用户的ID设置到评论/投诉实体对象中,关联该评论/投诉与当前用户
else if ("用户".equals(role))
fangjianLiuyan.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); fangjianLiuyan.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
// 设置评论/投诉信息的插入时间为当前系统时间,用于记录该评论/投诉的创建时间
fangjianLiuyan.setInsertTime(new Date()); fangjianLiuyan.setInsertTime(new Date());
// 设置评论/投诉信息的创建时间为当前系统时间,与插入时间可能在业务上表示不同含义(具体看业务需求)
fangjianLiuyan.setCreateTime(new Date()); fangjianLiuyan.setCreateTime(new Date());
// 调用fangjianLiuyanService的insert方法将当前的FangjianLiuyanEntity对象插入到数据库中
fangjianLiuyanService.insert(fangjianLiuyan); fangjianLiuyanService.insert(fangjianLiuyan);
// 如果插入成功,返回成功的响应给前端
return R.ok(); return R.ok();
} }
/** /**
* *
*/ * /
*/
@RequestMapping("/update") @RequestMapping("/update")
public R update(@RequestBody FangjianLiuyanEntity fangjianLiuyan, HttpServletRequest request){ public R update(@RequestBody FangjianLiuyanEntity fangjianLiuyan, HttpServletRequest request) {
logger.debug("update方法:,,Controller:{},,fangjianLiuyan:{}",this.getClass().getName(),fangjianLiuyan.toString()); // 记录debug级别的日志信息记录当前执行的update方法所在的类名以及传入的FangjianLiuyanEntity对象信息将对象转为字符串格式记录方便调试查看请求数据情况
logger.debug("update方法:,,Controller:{},,fangjianLiuyan:{}", this.getClass().getName(), fangjianLiuyan.toString());
// 从当前请求的会话中获取用户角色信息,并转换为字符串类型,可能用于后续根据不同角色进行不同的数据处理逻辑判断(当前部分代码被注释掉了,可能是之前的逻辑或者后续需要调整补充的地方)
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false) // if (false)
// return R.error(511,"永远不会进入"); // return R.error(511, "永远不会进入");
// else if("用户".equals(role)) // else if ("用户".equals(role))
// fangjianLiuyan.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); // fangjianLiuyan.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
//根据字段查询是否有相同数据
// 根据字段查询是否有相同数据这里构建了一个EntityWrapper对象用于设置查询条件目前只设置了id为0的条件可能需要根据实际业务修改正确的判断重复数据的条件
Wrapper<FangjianLiuyanEntity> queryWrapper = new EntityWrapper<FangjianLiuyanEntity>() Wrapper<FangjianLiuyanEntity> queryWrapper = new EntityWrapper<FangjianLiuyanEntity>()
.eq("id",0) .eq("id", 0);
;
logger.info("sql语句:"+queryWrapper.getSqlSegment()); // 记录构建好的查询语句对应的SQL片段信息方便调试查看具体的查询条件
logger.info("sql语句:" + queryWrapper.getSqlSegment());
// 调用fangjianLiuyanService的selectOne方法根据构建好的查询条件从数据库中查询是否存在满足条件的FangjianLiuyanEntity对象即是否存在相同数据的记录当前条件可能不准确需完善
FangjianLiuyanEntity fangjianLiuyanEntity = fangjianLiuyanService.selectOne(queryWrapper); FangjianLiuyanEntity fangjianLiuyanEntity = fangjianLiuyanService.selectOne(queryWrapper);
// 设置评论/投诉信息的更新时间为当前系统时间,用于记录该评论/投诉的最后更新时间
fangjianLiuyan.setUpdateTime(new Date()); fangjianLiuyan.setUpdateTime(new Date());
if(fangjianLiuyanEntity==null){ if (fangjianLiuyanEntity == null) {
fangjianLiuyanService.updateById(fangjianLiuyan);//根据id更新 // 如果查询结果为null表示不存在相同数据的记录调用fangjianLiuyanService的updateById方法根据传入的评论/投诉实体对象的ID更新数据库中的对应记录
fangjianLiuyanService.updateById(fangjianLiuyan);
// 如果更新成功,返回成功的响应给前端
return R.ok(); return R.ok();
}else { } else {
return R.error(511,"表中有相同数据"); // 如果查询到了相同数据的记录返回一个错误信息给前端错误码是511提示表中有相同数据
return R.error(511, "表中有相同数据");
} }
} }
/** /**
* *
*/ * /ID/
*/
@RequestMapping("/delete") @RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){ public R delete(@RequestBody Integer[] ids) {
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString()); // 记录debug级别的日志信息记录当前执行的delete方法所在的类名以及传入的评论/投诉ID数组信息将数组转为字符串格式记录方便调试查看请求参数情况
logger.debug("delete:,,Controller:{},,ids:{}", this.getClass().getName(), ids.toString());
// 调用fangjianLiuyanService的deleteBatchIds方法传入要删除的评论/投诉ID列表批量删除数据库中对应的记录
fangjianLiuyanService.deleteBatchIds(Arrays.asList(ids)); fangjianLiuyanService.deleteBatchIds(Arrays.asList(ids));
// 如果删除成功,返回成功的响应给前端
return R.ok(); return R.ok();
} }
/** /**
* *
* /Excel.xls
*/ */
@RequestMapping("/batchInsert") @RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){ public R save(String fileName, HttpServletRequest request) {
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName); // 记录debug级别的日志信息记录当前执行的batchInsert方法所在的类名以及传入的文件名参数方便调试查看请求参数情况
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}", this.getClass().getName(), fileName);
// 从当前请求的会话中获取当前登录用户的ID并转换为Integer类型可能用于关联上传的评论/投诉信息与当前用户
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))); 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"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try { try {
List<FangjianLiuyanEntity> fangjianLiuyanList = new ArrayList<>();//上传的东西 // 创建一个列表用于存放从文件中读取并解析后要批量插入的FangjianLiuyanEntity对象代表房间评论/投诉实体数据)
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段 List<FangjianLiuyanEntity> fangjianLiuyanList = new ArrayList<>();
// 创建一个Map用于存放要查询是否重复的字段信息目前代码中未看到具体使用逻辑可能需要完善比如后续根据这些字段判断数据是否重复等
Map<String, List<String>> seachFields = new HashMap<>();
// 获取当前系统时间,可能用于设置评论/投诉信息的相关时间字段
Date date = new Date(); Date date = new Date();
// 获取文件名中最后一个点的索引位置,用于判断文件后缀名
int lastIndexOf = fileName.lastIndexOf("."); int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){ if (lastIndexOf == -1) {
return R.error(511,"该文件没有后缀"); // 如果没有找到点即没有后缀名返回一个错误信息给前端错误码是511提示该文件没有后缀
}else{ return R.error(511, "该文件没有后缀");
} else {
// 获取文件名中最后一个点(.)之后的后缀部分,用于后续判断文件类型是否符合要求
String suffix = fileName.substring(lastIndexOf); String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){ // 判断后缀名是否不等于 ".xls",如果不是该后缀的文件,说明不符合当前方法支持的文件类型要求
return R.error(511,"只支持后缀为xls的excel文件"); if (!".xls".equals(suffix)) {
}else{ // 返回一个错误信息给前端错误码是511并提示只支持后缀为xls的excel文件告知前端操作不符合要求
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径 return R.error(511, "只支持后缀为xls的excel文件");
} else {
// 通过当前类的类加载器获取指定文件(位于 "static/upload/" 目录下文件名由传入的fileName指定的资源路径返回一个URL对象
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);
// 根据获取到的URL对象对应的文件路径创建一个File对象用于后续判断文件是否存在以及读取文件内容等操作
File file = new File(resource.getFile()); File file = new File(resource.getFile());
if(!file.exists()){ // 判断该文件是否不存在,如果不存在,则执行下面的返回错误信息的逻辑
return R.error(511,"找不到上传文件,请联系管理员"); if (!file.exists()) {
}else{ // 返回一个错误信息给前端错误码是511提示找不到上传文件并告知前端联系管理员来解决该问题
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件 return R.error(511, "找不到上传文件,请联系管理员");
dataList.remove(0);//删除第一行,因为第一行是提示 } else {
for(List<String> data:dataList){ // 调用PoiUtil工具类的poiImport方法传入文件的路径读取该.xls文件内容返回的数据结构是一个嵌套的List外层List表示行内层List的每个元素表示每行中的单元格数据存放在dataList中
//循环 List<List<String>> dataList = PoiUtil.poiImport(file.getPath());
// 删除dataList中的第一行数据通常是因为第一行可能是标题行、提示信息之类的内容在后续将数据转换为实体对象时不需要这一行数据
dataList.remove(0);
// 遍历dataList中剩余的每一行数据每一行数据也是一个List<String>类型,表示该行各个单元格的数据)
for (List<String> data : dataList) {
// 创建一个FangjianLiuyanEntity对象用于将从Excel文件中读取到的每行数据转换为对应的实体对象后续可插入到数据库中
FangjianLiuyanEntity fangjianLiuyanEntity = new FangjianLiuyanEntity(); FangjianLiuyanEntity fangjianLiuyanEntity = new FangjianLiuyanEntity();
// fangjianLiuyanEntity.setFangjianId(Integer.valueOf(data.get(0))); //房间 要改的 // 以下这几行代码原本是用于设置FangjianLiuyanEntity对象的各个属性值但目前都是设置为固定值或者取了错误的数据索引都取的data.get(0)后续应该根据实际Excel文件中数据的列顺序修改正确的获取数据的索引和赋值逻辑
// fangjianLiuyanEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的 // 设置房间ID此处应该根据实际Excel文件中房间ID所在列的索引来获取正确的值当前写法有误都取的data.get(0)),要改的
// fangjianLiuyanEntity.setFangjianLiuyanText(data.get(0)); //评论/投诉内容 要改的 fangjianLiuyanEntity.setFangjianId(Integer.valueOf(data.get(0)));
// fangjianLiuyanEntity.setReplyText(data.get(0)); //回复内容 要改的 // 设置用户ID同样这里取值有误取的data.get(0)应该按实际Excel文件中用户ID所在列来获取对应数据要改的
// fangjianLiuyanEntity.setInsertTime(date);//时间 fangjianLiuyanEntity.setYonghuId(Integer.valueOf(data.get(0)));
// fangjianLiuyanEntity.setUpdateTime(sdf.parse(data.get(0))); //回复时间 要改的 // 设置评论/投诉内容也是错误的取值方式取的data.get(0)),需要改成对应正确的数据获取逻辑,要改的
// fangjianLiuyanEntity.setCreateTime(date);//时间 fangjianLiuyanEntity.setFangjianLiuyanText(data.get(0));
// 设置回复内容同样取值错误取的data.get(0)后续要根据实际Excel文件中回复内容所在列来获取数据要改的
fangjianLiuyanEntity.setReplyText(data.get(0));
// 设置插入时间将前面获取的当前系统时间date设置为该评论/投诉信息的插入时间,用于记录插入数据库的时间点
fangjianLiuyanEntity.setInsertTime(date);
// 设置更新时间通过SimpleDateFormat对象sdf将Excel文件中对应列的数据当前取值错误应该按正确列索引获取且要保证数据格式符合解析要求解析为Date类型后设置为更新时间要改的
fangjianLiuyanEntity.setUpdateTime(sdf.parse(data.get(0)));
// 设置创建时间将前面获取的当前系统时间date设置为该评论/投诉信息的创建时间,用于记录该信息创建的时间点
fangjianLiuyanEntity.setCreateTime(date);
// 将设置好属性的FangjianLiuyanEntity对象添加到fangjianLiuyanList列表中后续将批量插入这些对象到数据库
fangjianLiuyanList.add(fangjianLiuyanEntity); fangjianLiuyanList.add(fangjianLiuyanEntity);
// 把要查询是否重复的字段放入seachFields这个Map中代码中此处未看到具体放入map的实现逻辑可能后续要补充完整比如根据业务需求确定哪些字段用于判断重复以及如何组织这些字段数据放入map等
//把要查询是否重复的字段放入map中
} }
//查询是否重复 // 调用fangjianLiuyanService的insertBatch方法将fangjianLiuyanList中的多个FangjianLiuyanEntity对象批量插入到数据库中实现批量保存评论/投诉信息的功能
fangjianLiuyanService.insertBatch(fangjianLiuyanList); fangjianLiuyanService.insertBatch(fangjianLiuyanList);
// 如果批量插入操作成功,返回一个表示成功的响应给前端,告知前端数据已成功插入
return R.ok(); return R.ok();
} }
} }
} catch (Exception e) {
// 如果在上述文件读取、数据处理或者批量插入等操作过程中出现异常,打印异常堆栈信息,方便开发人员排查问题所在,定位错误原因
e.printStackTrace();
// 返回一个错误信息给前端错误码是511提示批量插入数据异常并告知前端联系管理员来处理该异常情况
return R.error(511, "批量插入数据异常,请联系管理员");
} }
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
} }
@ -241,70 +318,92 @@ public class FangjianLiuyanController {
/** /**
* *
*/ */
@IgnoreAuth // 前端列表相关的方法,被标注了 @IgnoreAuth 表示这个方法不需要进行权限认证,通过@RequestMapping("/list")指定了该方法处理的请求路径为 /list用于获取房间评论/投诉信息的分页列表数据并返回给前端展示
@RequestMapping("/list") @IgnoreAuth
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){ @RequestMapping("/list")
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); public R list(@RequestParam Map<String, Object> params, HttpServletRequest request) {
// 使用日志记录器记录debug级别的日志信息记录当前执行的list方法所在的类名以及传入的参数信息将参数转为JSON字符串格式记录方便调试查看请求参数情况
// 没有指定排序字段就默认id倒序 logger.debug("list方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){
params.put("orderBy","id"); // 判断传入的参数中是否指定了排序字段如果没有指定即获取到的orderBy参数为空字符串
if (StringUtil.isEmpty(String.valueOf(params.get("orderBy")))) {
// 就默认按照id字段倒序排序将orderBy参数设置为id确定数据返回给前端展示时的排序规则
params.put("orderBy", "id");
}
// 调用fangjianLiuyanService的queryPage方法根据传入的参数查询并获取分页数据存放在PageUtils对象中该对象包含了分页相关的各种信息以及实际的数据列表等
PageUtils page = fangjianLiuyanService.queryPage(params);
// 获取分页数据中的数据列表这里强制转换为List<FangjianLiuyanView>类型,这些视图对象是适合前端展示的评论/投诉相关数据格式,可能经过了一定的数据处理和转换
List<FangjianLiuyanView> list = (List<FangjianLiuyanView>) page.getList();
for (FangjianLiuyanView c : list) {
// 循环调用dictionaryService的dictionaryConvert方法用于对每个FangjianLiuyanView对象中的对应字典表字段进行转换比如将字典编码转换为对应的文字描述等传入当前的HttpServletRequest对象可能是用于获取一些上下文相关信息等确保前端展示的数据是友好可读的格式
dictionaryService.dictionaryConvert(c, request);
}
// 返回成功的响应给前端并将包含处理好的分页数据的PageUtils对象放入响应中前端可以根据此数据进行展示等操作例如在页面上分页展示评论/投诉列表信息
return R.ok().put("data", page);
} }
PageUtils page = fangjianLiuyanService.queryPage(params);
//字典表数据转换
List<FangjianLiuyanView> list =(List<FangjianLiuyanView>)page.getList();
for(FangjianLiuyanView c:list)
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
return R.ok().put("data", page);
}
/** /**
* *
*/ */
@RequestMapping("/detail/{id}") // 前端详情相关的方法,通过@RequestMapping("/detail/{id}")指定了该方法处理的请求路径为 /detail/{id},其中{id}是一个路径变量,表示要查询详情的房间评论/投诉的唯一标识,用于获取指定评论/投诉的详细信息并返回给前端展示
public R detail(@PathVariable("id") Long id, HttpServletRequest request){ @RequestMapping("/detail/{id}")
logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id); public R detail(@PathVariable("id") Long id, HttpServletRequest request) {
FangjianLiuyanEntity fangjianLiuyan = fangjianLiuyanService.selectById(id); // 使用日志记录器记录debug级别的日志信息记录当前执行的detail方法所在的类名以及传入的评论/投诉ID参数方便调试查看请求参数情况
if(fangjianLiuyan !=null){ logger.debug("detail方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
// 调用fangjianLiuyanService的selectById方法根据传入的评论/投诉ID从数据库中查询对应的FangjianLiuyanEntity对象代表评论/投诉实体数据)
FangjianLiuyanEntity fangjianLiuyan = fangjianLiuyanService.selectById(id);
//entity转view if (fangjianLiuyan!= null) {
// 创建一个FangjianLiuyanView对象用于将从数据库查询到的FangjianLiuyanEntity实体数据转换为适合前端展示的视图数据格式
FangjianLiuyanView view = new FangjianLiuyanView(); FangjianLiuyanView view = new FangjianLiuyanView();
BeanUtils.copyProperties( fangjianLiuyan , view );//把实体数据重构到view中 // 使用BeanUtils工具类的copyProperties方法将fangjianLiuyan对象的属性值复制到view对象中实现实体数据到视图数据的转换前提是FangjianLiuyanEntity和FangjianLiuyanView的属性有对应关系
BeanUtils.copyProperties(fangjianLiuyan, view);
//级联表 // 以下是处理级联表相关的数据,获取评论/投诉对应的房间信息并添加到视图对象中排除一些不需要的字段如id、创建时间等字段
FangjianEntity fangjian = fangjianService.selectById(fangjianLiuyan.getFangjianId()); // 调用fangjianService的selectById方法根据评论/投诉实体中关联的房间ID获取对应的FangjianEntity对象代表房间实体数据
if(fangjian != null){ FangjianEntity fangjian = fangjianService.selectById(fangjianLiuyan.getFangjianId());
BeanUtils.copyProperties( fangjian , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段 if (fangjian!= null) {
// 使用BeanUtils工具类的copyProperties方法将fangjian对象的部分属性值复制到view对象中排除指定的字段把级联的房间数据添加到视图中确保传递给前端的房间相关数据是符合需求且不冗余的
BeanUtils.copyProperties(fangjian, view, new String[]{"id", "createDate"});
// 设置视图对象中的房间ID保证前端能正确获取和展示关联的房间ID信息
view.setFangjianId(fangjian.getId()); view.setFangjianId(fangjian.getId());
} }
//级联表
YonghuEntity yonghu = yonghuService.selectById(fangjianLiuyan.getYonghuId()); // 以下是处理级联表相关的数据,获取评论/投诉对应的用户信息并添加到视图对象中排除一些不需要的字段如id、创建时间等字段
if(yonghu != null){ // 调用yonghuService的selectById方法根据评论/投诉实体中关联的用户ID获取对应的YonghuEntity对象代表用户实体数据
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段 YonghuEntity yonghu = yonghuService.selectById(fangjianLiuyan.getYonghuId());
if (yonghu!= null) {
// 使用BeanUtils工具类的copyProperties方法将yonghu对象的部分属性值复制到view对象中排除指定的字段把级联的用户数据添加到视图中确保传递给前端的用户相关数据是符合需求且不冗余的
BeanUtils.copyProperties(yonghu, view, new String[]{"id", "createDate"});
// 设置视图对象中的用户ID保证前端能正确获取和展示关联的用户ID信息
view.setYonghuId(yonghu.getId()); view.setYonghuId(yonghu.getId());
} }
//修改对应字典表字段
// 调用dictionaryService的dictionaryConvert方法对转换后的FangjianLiuyanView对象中的对应字典表字段进行转换类似前面list方法中的转换操作传入当前的HttpServletRequest对象用于获取上下文相关信息等使前端展示的数据更友好可读
dictionaryService.dictionaryConvert(view, request); dictionaryService.dictionaryConvert(view, request);
// 返回成功的响应给前端,并将包含处理好的评论/投诉详情视图数据的FangjianLiuyanView对象放入响应中前端可以据此展示详细的评论/投诉信息
return R.ok().put("data", view); return R.ok().put("data", view);
}else { } else {
return R.error(511,"查不到数据"); // 如果根据传入的ID没有查询到对应的评论/投诉数据返回一个错误信息给前端错误码是511提示查不到数据告知前端请求的详情数据不存在
return R.error(511, "查不到数据");
} }
} }
/** /**
* *
*/ */
@RequestMapping("/add") // 前端保存相关的方法,通过@RequestMapping("/add")指定了该方法处理的请求路径为 /add并且使用@RequestBody注解表示接收前端传来的JSON格式的请求体数据并将其转换为FangjianLiuyanEntity对象用于保存新的房间评论/投诉信息到数据库中
public R add(@RequestBody FangjianLiuyanEntity fangjianLiuyan, HttpServletRequest request){ @RequestMapping("/add")
logger.debug("add方法:,,Controller:{},,fangjianLiuyan:{}",this.getClass().getName(),fangjianLiuyan.toString()); public R add(@RequestBody FangjianLiuyanEntity fangjianLiuyan, HttpServletRequest request) {
fangjianLiuyan.setInsertTime(new Date()); // 使用日志记录器记录debug级别的日志信息记录当前执行的add方法所在的类名以及传入的FangjianLiuyanEntity对象信息将对象转为字符串格式记录方便调试查看请求数据情况
fangjianLiuyan.setCreateTime(new Date()); logger.debug("add方法:,,Controller:{},,fangjianLiuyan:{}", this.getClass().getName(), fangjianLiuyan.toString());
fangjianLiuyanService.insert(fangjianLiuyan); // 设置评论/投诉信息的插入时间为当前系统时间,用于记录该评论/投诉的创建时间,确定其插入数据库时的时间点
return R.ok(); fangjianLiuyan.setInsertTime(new Date());
// 设置评论/投诉信息的创建时间为当前系统时间,与插入时间在业务上可能有不同含义(具体看业务需求),这里统一设置为当前时间
fangjianLiuyan.setCreateTime(new Date());
// 调用fangjianLiuyanService的insert方法将当前的FangjianLiuyanEntity对象插入到数据库中实现保存新评论/投诉信息的功能
fangjianLiuyanService.insert(fangjianLiuyan);
// 如果插入操作成功,返回一个表示成功的响应给前端,告知前端数据已成功保存
return R.ok();
} }
}

@ -1,4 +1,3 @@
package com.controller; package com.controller;
import java.io.File; import java.io.File;
@ -35,377 +34,499 @@ import com.alibaba.fastjson.*;
/** /**
* *
* *
* @author * @author
* @email * @email
*/ */
// 结合了 @Controller 和 @ResponseBody 的功能表明这是一个RESTful风格的控制器返回的数据会直接转换为JSON等格式响应给客户端
@RestController @RestController
// 标识这是一个Spring管理的Bean是一个控制器类
@Controller @Controller
// 定义该控制器处理的基础请求路径,所有该控制器下的接口路径都以此为前缀
@RequestMapping("/fangjianOrder") @RequestMapping("/fangjianOrder")
public class FangjianOrderController { public class FangjianOrderController {
// 创建一个日志记录器对象,用于记录该类相关操作的日志信息,方便后续调试和排查问题,日志级别等配置通常在项目的日志配置文件中设置
private static final Logger logger = LoggerFactory.getLogger(FangjianOrderController.class); private static final Logger logger = LoggerFactory.getLogger(FangjianOrderController.class);
// 使用Spring的依赖注入自动装配FangjianOrderService方便在该控制器中调用其提供的与房间预约相关的业务逻辑方法
@Autowired @Autowired
private FangjianOrderService fangjianOrderService; private FangjianOrderService fangjianOrderService;
// 使用Spring的依赖注入自动装配TokenService可能用于处理用户认证相关的令牌操作等具体功能需看该服务的实际实现
@Autowired @Autowired
private TokenService tokenService; private TokenService tokenService;
// 使用Spring的依赖注入自动装配DictionaryService用于对字典表相关的数据进行转换操作比如将字典表中的编码转换为对应的文字描述等方便前端展示友好的数据格式
@Autowired @Autowired
private DictionaryService dictionaryService; private DictionaryService dictionaryService;
//级联表service // 使用Spring的依赖注入自动装配FangjianService用于和房间相关的业务逻辑操作例如查询房间详细信息等在处理级联表数据或者关联房间信息时会用到属于级联表相关的服务调用
@Autowired @Autowired
private FangjianService fangjianService; private FangjianService fangjianService;
// 使用Spring的依赖注入自动装配YonghuService用于和用户相关的业务逻辑操作例如查询用户信息等在处理级联表数据或者关联用户信息时会用到属于级联表相关的服务调用
@Autowired @Autowired
private YonghuService yonghuService; private YonghuService yonghuService;
/** /**
* *
*/ *
*/
@RequestMapping("/page") @RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){ public R page(@RequestParam Map<String, Object> params, HttpServletRequest request) {
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); // 记录debug级别的日志信息记录当前执行的page方法所在的类名以及传入的参数信息将参数转为JSON字符串格式记录方便调试时查看请求参数的具体情况
logger.debug("page方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
// 从当前请求的会话中获取用户角色信息,并转换为字符串类型,可能用于后续根据不同角色进行不同的数据查询逻辑判断
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
if(false) // 此处条件永远为假,所以下面的代码块永远不会执行,可能是预留的逻辑或者后续需要修改调整的地方
return R.error(511,"永不会进入"); if (false)
else if("用户".equals(role)) return R.error(511, "永不会进入");
params.put("yonghuId",request.getSession().getAttribute("userId")); // 如果用户角色是"用户"则将当前登录用户的ID设置到查询参数中可能用于查询该用户相关的房间预约信息限制查询范围
if(params.get("orderBy")==null || params.get("orderBy")==""){ else if ("用户".equals(role))
params.put("orderBy","id"); params.put("yonghuId", request.getSession().getAttribute("userId"));
// 判断传入的参数中是否指定了排序字段如果没有指定即获取到的orderBy参数为空字符串
if (params.get("orderBy") == null || params.get("orderBy") == "") {
// 就默认按照id字段倒序排序将orderBy参数设置为id确定返回数据的默认排序规则
params.put("orderBy", "id");
} }
// 调用fangjianOrderService的queryPage方法根据传入的参数查询并获取分页数据存放在PageUtils对象中该对象包含了分页相关的各种信息以及实际的数据列表等
PageUtils page = fangjianOrderService.queryPage(params); PageUtils page = fangjianOrderService.queryPage(params);
//字典表数据转换 // 获取分页数据中的数据列表这里强制转换为List<FangjianOrderView>类型,这些视图对象是适合前端展示的房间预约相关数据格式,可能经过了一定的数据处理和转换
List<FangjianOrderView> list =(List<FangjianOrderView>)page.getList(); List<FangjianOrderView> list = (List<FangjianOrderView>) page.getList();
for(FangjianOrderView c:list){ for (FangjianOrderView c : list) {
//修改对应字典表字段 // 循环调用dictionaryService的dictionaryConvert方法用于对每个FangjianOrderView对象中的对应字典表字段进行转换比如将字典编码转换为对应的文字描述等传入当前的HttpServletRequest对象可能是用于获取一些上下文相关信息等确保前端展示的数据是友好可读的格式
dictionaryService.dictionaryConvert(c, request); dictionaryService.dictionaryConvert(c, request);
} }
// 返回成功的响应给前端并将包含处理好的分页数据的PageUtils对象放入响应中前端可以根据此数据进行展示等操作例如在页面上分页展示房间预约列表信息
return R.ok().put("data", page); return R.ok().put("data", page);
} }
/** /**
* *
*/ * ID
*/
@RequestMapping("/info/{id}") @RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){ public R info(@PathVariable("id") Long id, HttpServletRequest request) {
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id); // 记录debug级别的日志信息记录当前执行的info方法所在的类名以及传入的房间预约ID参数方便调试查看请求参数情况
logger.debug("info方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
// 调用fangjianOrderService的selectById方法根据传入的房间预约ID从数据库中查询对应的FangjianOrderEntity对象代表房间预约实体数据
FangjianOrderEntity fangjianOrder = fangjianOrderService.selectById(id); FangjianOrderEntity fangjianOrder = fangjianOrderService.selectById(id);
if(fangjianOrder !=null){ if (fangjianOrder != null) {
//entity转view // 创建一个FangjianOrderView对象用于将从数据库查询到的FangjianOrderEntity实体数据转换为适合前端展示的视图数据格式
FangjianOrderView view = new FangjianOrderView(); FangjianOrderView view = new FangjianOrderView();
BeanUtils.copyProperties( fangjianOrder , view );//把实体数据重构到view中 // 使用BeanUtils工具类的copyProperties方法将fangjianOrder对象的属性值复制到view对象中实现实体数据到视图数据的转换前提是FangjianOrderEntity和FangjianOrderView的属性有对应关系
BeanUtils.copyProperties(fangjianOrder, view);
// 以下是处理级联表相关的数据获取房间预约对应的房间信息并添加到视图对象中排除一些不需要的字段如id、创建时间等字段
// 调用fangjianService的selectById方法根据房间预约实体中关联的房间ID获取对应的FangjianEntity对象代表房间实体数据
FangjianEntity fangjian = fangjianService.selectById(fangjianOrder.getFangjianId());
if (fangjian != null) {
// 使用BeanUtils工具类的copyProperties方法将fangjian对象的部分属性值复制到view对象中排除指定的字段把级联的房间数据添加到视图中确保传递给前端的房间相关数据是符合需求且不冗余的
BeanUtils.copyProperties(fangjian, view, new String[]{"id", "createTime", "insertTime", "updateTime"});
// 设置视图对象中的房间ID保证前端能正确获取和展示关联的房间ID信息
view.setFangjianId(fangjian.getId());
}
//级联表 // 以下是处理级联表相关的数据获取房间预约对应的用户信息并添加到视图对象中排除一些不需要的字段如id、创建时间等字段
FangjianEntity fangjian = fangjianService.selectById(fangjianOrder.getFangjianId()); // 调用yonghuService的selectById方法根据房间预约实体中关联的用户ID获取对应的YonghuEntity对象代表用户实体数据
if(fangjian != null){ YonghuEntity yonghu = yonghuService.selectById(fangjianOrder.getYonghuId());
BeanUtils.copyProperties( fangjian , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段 if (yonghu != null) {
view.setFangjianId(fangjian.getId()); // 使用BeanUtils工具类的copyProperties方法将yonghu对象的部分属性值复制到view对象中排除指定的字段把级联的用户数据添加到视图中确保传递给前端的用户相关数据是符合需求且不冗余的
} BeanUtils.copyProperties(yonghu, view, new String[]{"id", "createTime", "insertTime", "updateTime"});
//级联表 // 设置视图对象中的用户ID保证前端能正确获取和展示关联的用户ID信息
YonghuEntity yonghu = yonghuService.selectById(fangjianOrder.getYonghuId()); view.setYonghuId(yonghu.getId());
if(yonghu != null){ }
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYonghuId(yonghu.getId()); // 调用dictionaryService的dictionaryConvert方法对转换后的FangjianOrderView对象中的对应字典表字段进行转换类似前面page方法中的转换操作传入当前的HttpServletRequest对象用于获取上下文相关信息等使前端展示的数据更友好可读
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request); dictionaryService.dictionaryConvert(view, request);
// 返回成功的响应给前端并将包含处理好的房间预约详情视图数据的FangjianOrderView对象放入响应中前端可以据此展示详细的房间预约信息
return R.ok().put("data", view); return R.ok().put("data", view);
}else { } else {
return R.error(511,"查不到数据"); // 如果根据传入的ID没有查询到对应的房间预约数据返回一个错误信息给前端错误码是511提示查不到数据告知前端请求的详情数据不存在
return R.error(511, "查不到数据");
} }
} }
/** /**
* *
*/ *
*/
@RequestMapping("/save") @RequestMapping("/save")
public R save(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request){ public R save(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request) {
logger.debug("save方法:,,Controller:{},,fangjianOrder:{}",this.getClass().getName(),fangjianOrder.toString()); // 记录debug级别的日志信息记录当前执行的save方法所在的类名以及传入的FangjianOrderEntity对象信息将对象转为字符串格式记录方便调试查看请求数据情况
logger.debug("save方法:,,Controller:{},,fangjianOrder:{}", this.getClass().getName(), fangjianOrder.toString());
// 从当前请求的会话中获取用户角色信息,并转换为字符串类型,可能用于后续根据不同角色进行不同的数据处理逻辑判断
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
if(false) // 此处条件永远为假,所以下面的代码块永远不会执行,可能是预留的逻辑或者后续需要修改调整的地方
return R.error(511,"永远不会进入"); if (false)
else if("用户".equals(role)) return R.error(511, "永远不会进入");
// 如果用户角色是"用户"则将当前登录用户的ID设置到房间预约实体对象中关联该房间预约与当前用户
else if ("用户".equals(role))
fangjianOrder.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); fangjianOrder.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
// 设置房间预约信息的创建时间为当前系统时间,用于记录该房间预约的创建时间点
fangjianOrder.setCreateTime(new Date()); fangjianOrder.setCreateTime(new Date());
// 调用fangjianOrderService的insert方法将当前的FangjianOrderEntity对象插入到数据库中实现保存新房间预约信息的功能
fangjianOrderService.insert(fangjianOrder); fangjianOrderService.insert(fangjianOrder);
// 如果插入操作成功,返回一个表示成功的响应给前端,告知前端数据已成功保存
return R.ok(); return R.ok();
} }
/** /**
* *
*/ *
*/
@RequestMapping("/update") @RequestMapping("/update")
public R update(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request){ public R update(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request) {
logger.debug("update方法:,,Controller:{},,fangjianOrder:{}",this.getClass().getName(),fangjianOrder.toString()); // 记录debug级别的日志信息记录当前执行的update方法所在的类名以及传入的FangjianOrderEntity对象信息将对象转为字符串格式记录方便调试查看请求数据情况
logger.debug("update方法:,,Controller:{},,fangjianOrder:{}", this.getClass().getName(), fangjianOrder.toString());
// 从当前请求的会话中获取用户角色信息,并转换为字符串类型,可能用于后续根据不同角色进行不同的数据处理逻辑判断(当前部分代码被注释掉了,可能是之前的逻辑或者后续需要调整补充的地方)
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false) // if (false)
// return R.error(511,"永远不会进入"); // return R.error(511, "永远不会进入");
// else if("用户".equals(role)) // else if ("用户".equals(role))
// fangjianOrder.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); // fangjianOrder.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
//根据字段查询是否有相同数据
// 根据字段查询是否有相同数据这里构建了一个EntityWrapper对象用于设置查询条件目前只设置了id为0的条件可能需要根据实际业务修改正确的判断重复数据的条件
Wrapper<FangjianOrderEntity> queryWrapper = new EntityWrapper<FangjianOrderEntity>() Wrapper<FangjianOrderEntity> queryWrapper = new EntityWrapper<FangjianOrderEntity>()
.eq("id",0) .eq("id", 0);
;
logger.info("sql语句:"+queryWrapper.getSqlSegment()); // 记录构建好的查询语句对应的SQL片段信息方便调试查看具体的查询条件
logger.info("sql语句:" + queryWrapper.getSqlSegment());
// 调用fangjianOrderService的selectOne方法根据构建好的查询条件从数据库中查询是否存在满足条件的FangjianOrderEntity对象即是否存在相同数据的记录当前条件可能不准确需完善
FangjianOrderEntity fangjianOrderEntity = fangjianOrderService.selectOne(queryWrapper); FangjianOrderEntity fangjianOrderEntity = fangjianOrderService.selectOne(queryWrapper);
if(fangjianOrderEntity==null){ if (fangjianOrderEntity == null) {
fangjianOrderService.updateById(fangjianOrder);//根据id更新 // 如果查询结果为null表示不存在相同数据的记录调用fangjianOrderService的updateById方法根据传入的房间预约实体对象的ID更新数据库中的对应记录
fangjianOrderService.updateById(fangjianOrder);
// 如果更新操作成功,返回一个表示成功的响应给前端,告知前端数据已成功更新
return R.ok(); return R.ok();
}else { } else {
return R.error(511,"表中有相同数据"); // 如果查询到了相同数据的记录返回一个错误信息给前端错误码是511提示表中有相同数据告知前端更新操作因数据重复而失败
return R.error(511, "表中有相同数据");
} }
} }
/** /**
* *
*/ * ID
*/
@RequestMapping("/delete") @RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){ public R delete(@RequestBody Integer[] ids) {
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString()); // 记录debug级别的日志信息记录当前执行的delete方法所在的类名以及传入的房间预约ID数组信息将数组转为字符串格式记录方便调试查看请求参数情况
logger.debug("delete:,,Controller:{},,ids:{}", this.getClass().getName(), ids.toString());
// 调用fangjianOrderService的deleteBatchIds方法传入要删除的房间预约ID列表批量删除数据库中对应的记录
fangjianOrderService.deleteBatchIds(Arrays.asList(ids)); fangjianOrderService.deleteBatchIds(Arrays.asList(ids));
// 如果删除操作成功,返回一个表示成功的响应给前端,告知前端数据已成功删除
return R.ok(); return R.ok();
} }
/** /**
* *
* Excel.xls
*/ */
@RequestMapping("/batchInsert") @RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){ public R save(String fileName, HttpServletRequest request) {
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName); // 记录debug级别的日志信息记录当前执行的batchInsert方法所在的类名以及传入的文件名参数方便调试查看请求参数情况
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}", this.getClass().getName(), fileName);
// 从当前请求的会话中获取当前登录用户的ID并转换为Integer类型可能用于关联上传的房间预约信息与当前用户
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))); 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"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try { try {
List<FangjianOrderEntity> fangjianOrderList = new ArrayList<>();//上传的东西 // 创建一个列表用于存放从文件中读取并解析后要批量插入的FangjianOrderEntity对象代表房间预约实体数据
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段 List<FangjianOrderEntity> fangjianOrderList = new ArrayList<>();
// 创建一个Map用于存放要查询是否重复的字段信息目前代码中未看到具体使用逻辑可能需要完善比如后续根据这些字段判断数据是否重复等
Map<String, List<String>> seachFields = new HashMap<>();
// 获取当前系统时间,可能用于设置房间预约信息的相关时间字段
Date date = new Date(); Date date = new Date();
// 获取文件名中最后一个点(.)的索引位置,用于判断文件后缀名
int lastIndexOf = fileName.lastIndexOf("."); int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){ if (lastIndexOf == -1) {
return R.error(511,"该文件没有后缀"); // 如果文件名没有后缀返回一个错误响应给前端错误码为511并提示“该文件没有后缀”告知前端上传的文件不符合要求
}else{ return R.error(511, "该文件没有后缀");
} else {
// 获取文件名中从最后一个点(.)开始到结尾的字符串,即文件后缀名
String suffix = fileName.substring(lastIndexOf); String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){ // 判断后缀名是否不等于 ".xls",如果不是 ".xls" 后缀的文件,说明不符合当前方法支持的文件类型要求
return R.error(511,"只支持后缀为xls的excel文件"); if (!".xls".equals(suffix)) {
}else{ // 返回一个错误信息给前端错误码是511并提示“只支持后缀为xls的excel文件”告知前端上传的文件格式不正确
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径 return R.error(511, "只支持后缀为xls的excel文件");
} else {
// 通过当前类的类加载器获取指定文件(位于 "static/upload/" 目录下文件名由传入的fileName指定的资源路径返回一个URL对象
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);
// 根据获取到的URL对象对应的文件路径创建一个File对象用于后续判断文件是否存在以及读取文件内容等操作
File file = new File(resource.getFile()); File file = new File(resource.getFile());
if(!file.exists()){ // 判断该文件是否不存在,如果不存在,则执行下面的返回错误信息的逻辑
return R.error(511,"找不到上传文件,请联系管理员"); if (!file.exists()) {
}else{ // 返回一个错误信息给前端错误码是511提示“找不到上传文件请联系管理员”告知前端文件未找到需要联系管理员解决
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件 return R.error(511, "找不到上传文件,请联系管理员");
dataList.remove(0);//删除第一行,因为第一行是提示 } else {
for(List<String> data:dataList){ // 调用PoiUtil工具类的poiImport方法传入文件的路径读取该.xls文件内容返回的数据结构是一个嵌套的List外层List表示行内层List的每个元素表示每行中的单元格数据存放在dataList中
//循环 List<List<String>> dataList = PoiUtil.poiImport(file.getPath());
// 删除dataList中的第一行数据通常是因为第一行可能是标题行、提示信息之类的内容在后续将数据转换为实体对象时不需要这一行数据
dataList.remove(0);
// 遍历dataList中剩余的每一行数据每一行数据也是一个List<String>类型,表示该行各个单元格的数据)
for (List<String> data : dataList) {
// 创建一个FangjianOrderEntity对象用于将从Excel文件中读取到的每行数据转换为对应的实体对象后续可插入到数据库中
FangjianOrderEntity fangjianOrderEntity = new FangjianOrderEntity(); FangjianOrderEntity fangjianOrderEntity = new FangjianOrderEntity();
// fangjianOrderEntity.setFangjianId(Integer.valueOf(data.get(0))); //房间 要改的 // 以下这几行代码原本是用于设置FangjianOrderEntity对象的各个属性值但目前都是设置为固定值或者取了错误的数据索引都取的data.get(0)后续应该根据实际Excel文件中数据的列顺序修改正确的获取数据的索引和赋值逻辑
// fangjianOrderEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的 // 设置房间ID此处应该根据实际Excel文件中房间ID所在列的索引来获取正确的值当前写法有误都取的data.get(0)),要改的
// fangjianOrderEntity.setFangjianOrderTime(sdf.parse(data.get(0))); //预约日期 要改的 fangjianOrderEntity.setFangjianId(Integer.valueOf(data.get(0)));
// fangjianOrderEntity.setFangjianOrderText(data.get(0)); //预约备注 要改的 // 设置用户ID同样这里取值有误取的data.get(0)应该按实际Excel文件中用户ID所在列来获取对应数据要改的
// fangjianOrderEntity.setFangjianOrderTypes(Integer.valueOf(data.get(0))); //订单状态 要改的 fangjianOrderEntity.setYonghuId(Integer.valueOf(data.get(0)));
// fangjianOrderEntity.setCreateTime(date);//时间 // 设置预约日期通过SimpleDateFormat对象sdf将Excel文件中对应列的数据当前取值错误应该按正确列索引获取且要保证数据格式符合解析要求解析为Date类型后设置为预约日期要改的
fangjianOrderEntity.setFangjianOrderTime(sdf.parse(data.get(0)));
// 设置预约备注也是错误的取值方式取的data.get(0)),需要改成对应正确的数据获取逻辑,要改的
fangjianOrderEntity.setFangjianOrderText(data.get(0));
// 设置订单状态将Excel文件中对应列的数据转换为Integer类型后设置为订单状态当前取值错误应按正确列索引获取要改的
fangjianOrderEntity.setFangjianOrderTypes(Integer.valueOf(data.get(0)));
// 设置创建时间将前面获取的当前系统时间date设置为该房间预约信息的创建时间用于记录创建的时间点
fangjianOrderEntity.setCreateTime(date);
// 将设置好属性的FangjianOrderEntity对象添加到fangjianOrderList列表中后续将批量插入这些对象到数据库
fangjianOrderList.add(fangjianOrderEntity); fangjianOrderList.add(fangjianOrderEntity);
// 把要查询是否重复的字段放入seachFields这个Map中代码中此处未看到具体放入map的实现逻辑可能后续要补充完整比如根据业务需求确定哪些字段用于判断重复以及如何组织这些字段数据放入map等
//把要查询是否重复的字段放入map中
} }
//查询是否重复 // 调用fangjianOrderService的insertBatch方法将fangjianOrderList中的多个FangjianOrderEntity对象批量插入到数据库中实现批量保存房间预约信息的功能
fangjianOrderService.insertBatch(fangjianOrderList); fangjianOrderService.insertBatch(fangjianOrderList);
// 如果批量插入操作成功,返回一个表示成功的响应给前端,告知前端数据已成功插入
return R.ok(); return R.ok();
} }
} }
} }
}catch (Exception e){ } catch (Exception e) {
// 如果在上述文件读取、数据处理或者批量插入等操作过程中出现异常,打印异常堆栈信息,方便开发人员排查问题所在,定位错误原因
e.printStackTrace(); e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员"); // 返回一个错误信息给前端错误码是511提示“批量插入数据异常请联系管理员”告知前端出现异常情况需要联系管理员处理
return R.error(511, "批量插入数据异常,请联系管理员");
} }
} }
/** /**
* *
*/ * @IgnoreAuth
*/
@IgnoreAuth @IgnoreAuth
@RequestMapping("/list") @RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){ public R list(@RequestParam Map<String, Object> params, HttpServletRequest request) {
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); // 记录debug级别的日志信息记录当前执行的list方法所在的类名以及传入的参数信息将参数转为JSON字符串格式记录方便调试时查看请求参数的具体情况
logger.debug("list方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
// 没有指定排序字段就默认id倒序
if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){ // 判断传入的参数中是否指定了排序字段如果没有指定即获取到的orderBy参数为空字符串
params.put("orderBy","id"); if (StringUtil.isEmpty(String.valueOf(params.get("orderBy")))) {
// 就默认按照id字段倒序排序将orderBy参数设置为id确定返回数据的默认排序规则
params.put("orderBy", "id");
} }
// 调用fangjianOrderService的queryPage方法根据传入的参数查询并获取分页数据存放在PageUtils对象中该对象包含了分页相关的各种信息以及实际的数据列表等
PageUtils page = fangjianOrderService.queryPage(params); PageUtils page = fangjianOrderService.queryPage(params);
//字典表数据转换 // 获取分页数据中的数据列表这里强制转换为List<FangjianOrderView>类型,这些视图对象是适合前端展示的房间预约相关数据格式,可能经过了一定的数据处理和转换
List<FangjianOrderView> list =(List<FangjianOrderView>)page.getList(); List<FangjianOrderView> list = (List<FangjianOrderView>) page.getList();
for(FangjianOrderView c:list) for (FangjianOrderView c : list) {
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段 // 循环调用dictionaryService的dictionaryConvert方法用于对每个FangjianOrderView对象中的对应字典表字段进行转换比如将字典编码转换为对应的文字描述等传入当前的HttpServletRequest对象可能是用于获取一些上下文相关信息等确保前端展示的数据是友好可读的格式
dictionaryService.dictionaryConvert(c, request);
}
// 返回成功的响应给前端并将包含处理好的分页数据的PageUtils对象放入响应中前端可以根据此数据进行展示等操作例如在页面上分页展示房间预约列表信息
return R.ok().put("data", page); return R.ok().put("data", page);
} }
/** /**
* *
*/ * ID
*/
@RequestMapping("/detail/{id}") @RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id, HttpServletRequest request){ public R detail(@PathVariable("id") Long id, HttpServletRequest request) {
logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id); // 记录debug级别的日志信息记录当前执行的detail方法所在的类名以及传入的房间预约ID参数方便调试查看请求参数情况
logger.debug("detail方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
// 调用fangjianOrderService的selectById方法根据传入的房间预约ID从数据库中查询对应的FangjianOrderEntity对象代表房间预约实体数据
FangjianOrderEntity fangjianOrder = fangjianOrderService.selectById(id); FangjianOrderEntity fangjianOrder = fangjianOrderService.selectById(id);
if(fangjianOrder !=null){ if (fangjianOrder != null) {
// 创建一个FangjianOrderView对象用于将从数据库查询到的FangjianOrderEntity实体数据转换为适合前端展示的视图数据格式
FangjianOrderView view = new FangjianOrderView();
//entity转view // 使用BeanUtils工具类的copyProperties方法将fangjianOrder对象的属性值复制到view对象中实现实体数据到视图数据的转换前提是FangjianOrderEntity和FangjianOrderView的属性有对应关系
FangjianOrderView view = new FangjianOrderView(); BeanUtils.copyProperties(fangjianOrder, view);
BeanUtils.copyProperties( fangjianOrder , view );//把实体数据重构到view中
// 以下是处理级联表相关的数据获取房间预约对应的房间信息并添加到视图对象中排除一些不需要的字段如id、创建时间等字段
// 调用fangjianService的selectById方法根据房间预约实体中关联的房间ID获取对应的FangjianEntity对象代表房间实体数据
FangjianEntity fangjian = fangjianService.selectById(fangjianOrder.getFangjianId());
if (fangjian != null) {
// 使用BeanUtils工具类的copyProperties方法将fangjian对象的部分属性值复制到view对象中排除指定的字段把级联的房间数据添加到视图中确保传递给前端的房间相关数据是符合需求且不冗余的
BeanUtils.copyProperties(fangjian, view, new String[]{"id", "createDate"});
// 设置视图对象中的房间ID保证前端能正确获取和展示关联的房间ID信息
view.setFangjianId(fangjian.getId());
}
//级联表 // 以下是处理级联表相关的数据获取房间预约对应的用户信息并添加到视图对象中排除一些不需要的字段如id、创建时间等字段
FangjianEntity fangjian = fangjianService.selectById(fangjianOrder.getFangjianId()); // 调用yonghuService的selectById方法根据房间预约实体中关联的用户ID获取对应的YonghuEntity对象代表用户实体数据
if(fangjian != null){ YonghuEntity yonghu = yonghuService.selectById(fangjianOrder.getYonghuId());
BeanUtils.copyProperties( fangjian , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段 if (yonghu != null) {
view.setFangjianId(fangjian.getId()); // 使用BeanUtils工具类的copyProperties方法将yonghu对象的部分属性值复制到view对象中排除指定的字段把级联的用户数据添加到视图中确保传递给前端的用户相关数据是符合需求且不冗余的
} BeanUtils.copyProperties(yonghu, view, new String[]{"id", "createDate"});
//级联表 // 设置视图对象中的用户ID保证前端能正确获取和展示关联的用户ID信息
YonghuEntity yonghu = yonghuService.selectById(fangjianOrder.getYonghuId()); view.setYonghuId(yonghu.getId());
if(yonghu != null){
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYonghuId(yonghu.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
} }
}
// 调用dictionaryService的dictionaryConvert方法对转换后的FangjianOrderView对象中的对应字典表字段进行转换类似前面list方法中的转换操作传入当前的HttpServletRequest对象用于获取上下文相关信息等使前端展示的数据更友好可读
dictionaryService.dictionaryConvert(view, request);
// 返回成功的响应给前端并将包含处理好的房间预约详情视图数据的FangjianOrderView对象放入响应中前端可以据此展示详细的房间预约信息
return R.ok().put("data", view);
} else {
// 如果根据传入的ID没有查询到对应的房间预约数据返回一个错误信息给前端错误码是511提示“查不到数据”告知前端请求的详情数据不存在
return R.error(511, "查不到数据");
}
}
/** /**
* *
*/ *
*/
@RequestMapping("/add") @RequestMapping("/add")
public R add(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request){ public R add(@RequestBody FangjianOrderEntity fangjianOrder, HttpServletRequest request) {
logger.debug("add方法:,,Controller:{},,fangjianOrder:{}",this.getClass().getName(),fangjianOrder.toString()); // 记录debug级别的日志信息记录当前执行的add方法所在的类名以及传入的FangjianOrderEntity对象信息将对象转为字符串格式记录方便调试查看请求数据情况
FangjianEntity fangjianEntity = fangjianService.selectById(fangjianOrder.getFangjianId()); logger.debug("add方法:,,Controller:{},,fangjianOrder:{}", this.getClass().getName(), fangjianOrder.toString());
if(fangjianEntity == null){ // 根据传入的房间预约信息中的房间ID调用fangjianService的selectById方法查询对应的FangjianEntity对象代表房间实体数据用于后续判断房间是否存在以及获取房间价格等操作
return R.error(511,"查不到该房间信息"); FangjianEntity fangjianEntity = fangjianService.selectById(fangjianOrder.getFangjianId());
} if (fangjianEntity == null) {
// Double fangjianNewMoney = fangjianEntity.getFangjianMoney(); // 如果没有查询到对应的房间信息返回一个错误信息给前端错误码是511提示“查不到该房间信息”告知前端房间不存在无法进行预约操作
return R.error(511, "查不到该房间信息");
}
// 以下这行代码被注释掉了,原本可能是用于获取房间的新价格(具体用途需结合业务逻辑确定),目前代码中未使用该变量
// Double fangjianNewMoney = fangjianEntity.getFangjianMoney();
if(false){ // 此处条件永远为假,可能是预留的逻辑或者后续需要修改调整的地方,目前没有实际执行的代码块
} if (false) {
}
//计算所获得积分 // 初始化用于存储所获得积分的变量初始值设为0.0,后续可能根据业务规则计算实际获得的积分(目前代码中计算逻辑部分可能还不完善)
Double buyJifen =0.0; Double buyJifen = 0.0;
Integer userId = (Integer) request.getSession().getAttribute("userId"); // 从当前请求的会话中获取当前登录用户的ID并转换为Integer类型用于后续关联房间预约信息与当前用户以及获取用户相关信息等操作
YonghuEntity yonghuEntity = yonghuService.selectById(userId); Integer userId = (Integer) request.getSession().getAttribute("userId");
if(yonghuEntity == null) // 根据获取到的用户ID调用yonghuService的selectById方法查询对应的YonghuEntity对象代表用户实体数据用于后续判断用户是否存在以及获取用户金额等操作
return R.error(511,"用户不能为空"); YonghuEntity yonghuEntity = yonghuService.selectById(userId);
if(yonghuEntity.getNewMoney() == null) if (yonghuEntity == null) {
return R.error(511,"用户金额不能为空"); // 如果没有查询到对应的用户信息返回一个错误信息给前端错误码是511提示“用户不能为空”告知前端需要先登录用户或者用户信息不存在无法进行预约操作
double balance = yonghuEntity.getNewMoney() - fangjianEntity.getFangjianMoney()*1;//余额 return R.error(511, "用户不能为空");
if(balance<0) }
return R.error(511,"余额不够支付"); if (yonghuEntity.getNewMoney() == null) {
fangjianOrder.setFangjianOrderTypes(1); //设置订单状态为已支付 // 如果用户的金额信息为空返回一个错误信息给前端错误码是511提示“用户金额不能为空”告知前端无法进行金额相关的业务操作如判断余额是否足够等
fangjianOrder.setYonghuId(userId); //设置订单支付人id return R.error(511, "用户金额不能为空");
fangjianOrder.setCreateTime(new Date()); }
fangjianOrderService.insert(fangjianOrder);//新增订单 // 计算用户余额用用户当前的金额yonghuEntity.getNewMoney()减去房间的价格fangjianEntity.getFangjianMoney() * 1这里乘以1可能表示按原价计算具体看业务需求得到支付后的余额
yonghuEntity.setNewMoney(balance);//设置金额 double balance = yonghuEntity.getNewMoney() - fangjianEntity.getFangjianMoney() * 1;
yonghuService.updateById(yonghuEntity); if (balance < 0) {
return R.ok(); // 如果余额小于0说明用户余额不够支付房间费用返回一个错误信息给前端错误码是511提示“余额不够支付”告知前端无法完成预约操作
return R.error(511, "余额不够支付");
}
// 设置房间预约信息的订单状态为已支付可能在业务中用1表示已支付状态更新房间预约实体对象中的订单状态字段
fangjianOrder.setFangjianOrderTypes(1);
// 设置房间预约信息的用户ID为当前登录用户的ID将预约信息与当前用户关联起来更新房间预约实体对象中的用户ID字段
fangjianOrder.setYonghuId(userId);
// 设置房间预约信息的创建时间为当前系统时间,用于记录该房间预约的创建时间点,更新房间预约实体对象中的创建时间字段
fangjianOrder.setCreateTime(new Date());
// 调用fangjianOrderService的insert方法将当前的FangjianOrderEntity对象插入到数据库中实现保存新房间预约信息的功能
fangjianOrderService.insert(fangjianOrder);
// 更新用户的金额信息将用户的金额设置为支付后的余额通过调用yonghuService的updateById方法更新数据库中对应的用户信息记录
yonghuEntity.setNewMoney(balance);
yonghuService.updateById(yonghuEntity);
// 如果整个保存操作(包括预约信息插入和用户信息更新)成功,返回一个表示成功的响应给前端,告知前端房间预约操作已成功完成
return R.ok();
} }
/** /**
* 退 * 退
*/ * ID退退
*/
@RequestMapping("/refund") @RequestMapping("/refund")
public R refund(Integer id, HttpServletRequest request){ public R refund(Integer id, HttpServletRequest request) {
logger.debug("refund方法:,,Controller:{},,id:{}",this.getClass().getName(),id); // 记录debug级别的日志信息输出当前执行的"refund"方法所在的类名以及传入的房间预约ID参数方便后续调试时查看具体的调用情况和参数值
logger.debug("refund方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
// 从当前请求的会话中获取用户角色信息,并转换为字符串类型,不过从后续代码来看,暂时没有基于这个角色信息做进一步的业务逻辑处理(可能是预留的功能或者后续待完善的部分)
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
FangjianOrderEntity fangjianOrder = fangjianOrderService.selectById(id); // 根据传入的房间预约ID调用fangjianOrderService的selectById方法从数据库中查询对应的FangjianOrderEntity对象代表该房间预约的实体数据用于后续获取该预约的相关信息进行退款相关逻辑处理
Integer buyNumber = 1; FangjianOrderEntity fangjianOrder = fangjianOrderService.selectById(id);
Integer fangjianOrderPaymentTypes = 1; // 初始化购买数量变量这里设置为1可能表示此次退款操作对应的购买数量具体含义需结合业务场景确定也许后续会根据实际业务修改这个值
Integer fangjianId = fangjianOrder.getFangjianId(); Integer buyNumber = 1;
if(fangjianId == null) // 定义并初始化房间预约支付方式类型变量这里设置为1根据后续代码注释可知1代表余额支付方式可能在业务中有多种支付方式通过这个变量来区分
return R.error(511,"查不到该房间信息"); Integer fangjianOrderPaymentTypes = 1;
FangjianEntity fangjianEntity = fangjianService.selectById(fangjianId); // 获取房间预约对应的房间ID从前面查询到的FangjianOrderEntity对象中获取关联的房间ID用于后续查询房间详细信息等操作
if(fangjianEntity == null) Integer fangjianId = fangjianOrder.getFangjianId();
return R.error(511,"查不到该房间信息"); // 判断房间ID是否为null如果是null说明没有找到对应的房间信息返回一个错误信息给前端错误码是511并提示“查不到该房间信息”告知前端无法进行退款操作因为找不到对应的房间记录
Double fangjianNewMoney = fangjianEntity.getFangjianMoney(); if (fangjianId == null)
if(fangjianNewMoney == null) return R.error(511, "查不到该房间信息");
return R.error(511,"房间信息价格不能为空"); // 根据获取到的房间ID调用fangjianService的selectById方法从数据库中查询对应的FangjianEntity对象代表房间实体数据用于获取房间的价格等信息进行退款金额计算等操作
FangjianEntity fangjianEntity = fangjianService.selectById(fangjianId);
Integer userId = (Integer) request.getSession().getAttribute("userId"); // 判断房间实体对象是否为null如果是null说明没有查询到对应的房间信息返回一个错误信息给前端错误码是511并提示“查不到该房间信息”告知前端无法进行退款操作因为房间信息不存在
YonghuEntity yonghuEntity = yonghuService.selectById(userId); if (fangjianEntity == null)
if(yonghuEntity == null) return R.error(511, "查不到该房间信息");
return R.error(511,"用户不能为空"); // 获取房间的价格信息从FangjianEntity对象中获取房间的金额可能表示房间的费用等具体含义看业务定义用于后续退款金额计算等操作
if(yonghuEntity.getNewMoney() == null) Double fangjianNewMoney = fangjianEntity.getFangjianMoney();
return R.error(511,"用户金额不能为空"); // 判断房间价格是否为null如果是null说明房间价格信息缺失返回一个错误信息给前端错误码是511并提示“房间信息价格不能为空”告知前端无法进行退款金额相关的计算操作因为缺少房间价格数据
if (fangjianNewMemory == null)
Double zhekou = 1.0; return R.error(511, "房间信息价格不能为空");
// 从当前请求的会话中获取当前登录用户的ID并转换为Integer类型用于后续关联退款操作与当前用户以及获取用户相关信息等操作
//判断是什么支付方式 1代表余额 2代表积分 Integer userId = (Integer) request.getSession().getAttribute("userId");
if(fangjianOrderPaymentTypes == 1){//余额支付 // 根据获取到的用户ID调用yonghuService的selectById方法从数据库中查询对应的YonghuEntity对象代表用户实体数据用于获取用户的金额等信息进行退款后金额更新等操作
//计算金额 YonghuEntity yonghuEntity = yonghuService.selectById(userId);
Double money = fangjianEntity.getFangjianMoney() * buyNumber * zhekou; // 判断用户实体对象是否为null如果是null说明没有查询到对应的用户信息返回一个错误信息给前端错误码是511并提示“用户不能为空”告知前端无法进行退款操作因为用户信息不存在
//计算所获得积分 if (yonghuEntity == null)
Double buyJifen = 0.0; return R.error(511, "用户不能为空");
yonghuEntity.setNewMoney(yonghuEntity.getNewMoney() + money); //设置金额 // 判断用户的金额信息是否为null如果是null说明用户金额信息缺失返回一个错误信息给前端错误码是511并提示“用户金额不能为空”告知前端无法进行退款后金额更新等操作因为缺少用户金额数据
if (yonghuEntity.getNewMoney() == null)
return R.error(511, "用户金额不能为空");
}
// 定义并初始化折扣变量这里设置为1.0,表示没有折扣(具体折扣相关逻辑可能根据业务需求后续完善,也许不同情况会有不同的折扣值)
Double zhekou = 1.0;
// 判断房间预约的支付方式类型如果是1根据前面定义代表余额支付方式则进入以下余额支付的退款相关逻辑处理
if (fangjianOrderPaymentTypes == 1) {
// 计算退款金额根据房间价格fangjianEntity.getFangjianMoney()、购买数量buyNumber以及折扣zhekou相乘计算得出应退款的金额这里目前只是简单的乘法计算实际业务中可能会更复杂比如涉及不同的计价规则等
Double money = fangjianEntity.getFangjianMoney() * buyNumber * zhekou;
// 初始化用于存储所获得积分的变量这里设置为0.0,可能在业务中有根据退款操作获取积分的规则(目前代码中计算逻辑部分可能还不完善,只是简单赋值)
Double buyJifen = 0.0;
// 更新用户的金额信息将用户当前的金额yonghuEntity.getNewMoney()加上计算得出的退款金额money实现把退款金额退还到用户账户余额中的操作通过调用yonghuService的updateById方法后续会更新数据库中对应的用户信息记录
yonghuEntity.setNewMoney(yonghuEntity.getNewMoney() + money);
}
fangjianOrder.setFangjianOrderTypes(2);//设置订单状态为退款 // 设置房间预约信息的订单状态为退款可能在业务中用2表示退款状态更新房间预约实体对象中的订单状态字段用于标记该订单已进入退款状态
fangjianOrderService.updateById(fangjianOrder);//根据id更新 fangjianOrder.setFangjianOrderTypes(2);
yonghuService.updateById(yonghuEntity);//更新用户信息 // 调用fangjianOrderService的updateById方法根据传入的房间预约实体对象包含已更新的订单状态等信息的ID更新数据库中的对应记录将订单状态修改为退款状态保存到数据库中
fangjianService.updateById(fangjianEntity);//更新订单中房间信息的信息 fangjianOrderService.updateById(fangjianOrder);
return R.ok(); // 调用yonghuService的updateById方法根据传入的用户实体对象包含已更新的金额等信息更新数据库中的对应用户记录将用户信息更新保存到数据库中比如更新用户余额等信息
yonghuService.updateById(yonghuEntity);
// 调用fangjianService的updateById方法根据传入的房间实体对象虽然代码中目前没有对房间实体对象做额外修改也许后续会有相关逻辑完善更新数据库中的对应房间记录将房间相关信息更新保存到数据库中
fangjianService.updateById(fangjianEntity);
// 如果整个退款操作(包括订单状态更新、用户信息更新、房间信息更新等)成功,返回一个表示成功的响应给前端,告知前端退款操作已成功完成
return R.ok();
} }
/** /**
* *
* ID3
*/ */
@RequestMapping("/deliver") @RequestMapping("/deliver")
public R deliver(Integer id ){ public R deliver(Integer id) {
logger.debug("refund:,,Controller:{},,ids:{}",this.getClass().getName(),id.toString()); // 记录debug级别的日志信息输出当前执行的"deliver"方法所在的类名以及传入的房间预约ID参数方便后续调试时查看具体的调用情况和参数值不过这里日志输出的方法名有误应该是"deliver"而不是"refund"(可能是代码书写小失误)
FangjianOrderEntity fangjianOrderEntity = new FangjianOrderEntity();; logger.debug("refund:,,Controller:{},,ids:{}", this.getClass().getName(), id.toString());
// 创建一个FangjianOrderEntity对象用于后续设置要更新的房间预约相关信息这里先初始化一个空对象
FangjianOrderEntity fangjianOrderEntity = new FangjianOrderEntity();
// 设置FangjianOrderEntity对象的ID为传入的房间预约ID用于确定要更新的是哪条房间预约记录
fangjianOrderEntity.setId(id); fangjianOrderEntity.setId(id);
// 设置FangjianOrderEntity对象的订单状态为已发货状态这里假设业务中用3表示发货状态具体看业务定义准备更新该订单的状态信息到数据库中
fangjianOrderEntity.setFangjianOrderTypes(3); fangjianOrderEntity.setFangjianOrderTypes(3);
boolean b = fangjianOrderService.updateById( fangjianOrderEntity); // 调用fangjianOrderService的updateById方法根据设置好的FangjianOrderEntity对象包含要更新的ID和订单状态信息更新数据库中的对应记录返回一个布尔值表示更新操作是否成功
if(!b){ boolean b = fangjianOrderService.updateById(fangjianOrderEntity);
// 判断更新操作是否失败如果b为false说明更新数据库记录时出现问题返回一个错误信息给前端提示“操作出错”告知前端发货操作未能成功执行
if (!b) {
return R.error("操作出错"); return R.error("操作出错");
} }
// 如果更新操作成功,返回一个表示成功的响应给前端,告知前端发货操作已成功完成
return R.ok(); return R.ok();
} }
}
}

@ -1,4 +1,3 @@
package com.controller; package com.controller;
import java.io.File; import java.io.File;
@ -35,315 +34,305 @@ import com.alibaba.fastjson.*;
/** /**
* *
* *
* @author * HTTP
*
* @author WMZ
* @email * @email
*/ */
@RestController @RestController
@Controller @Controller
@RequestMapping("/forum") @RequestMapping("/forum")
public class ForumController { public class ForumController {
// 创建日志记录器,
// 用于记录该类中各个方法执行过程中的关键信息,方便调试和问题排查
private static final Logger logger = LoggerFactory.getLogger(ForumController.class); private static final Logger logger = LoggerFactory.getLogger(ForumController.class);
// 通过Spring的依赖注入自动装配ForumService
// 用于处理论坛相关的业务逻辑,比如查询、插入、更新、删除等操作
@Autowired @Autowired
private ForumService forumService; private ForumService forumService;
// 自动注入TokenService
// 可能用于处理用户认证相关的令牌操作(具体功能需看对应服务层实现)
@Autowired @Autowired
private TokenService tokenService; private TokenService tokenService;
// 自动注入DictionaryService
// 用于处理字典表相关的数据转换等操作(比如将字典表中的编码转换为对应的有意义的值等)
@Autowired @Autowired
private DictionaryService dictionaryService; private DictionaryService dictionaryService;
//级联表service // 自动注入YonghuService
// 用于处理与用户Yonghu可能是具体业务中的一种用户类型相关的级联表操作
@Autowired @Autowired
private YonghuService yonghuService; private YonghuService yonghuService;
// 自动注入UsersService
// 用于处理与普通用户相关的级联表操作(比如获取用户详细信息等)
@Autowired @Autowired
private UsersService usersService; private UsersService usersService;
/** /**
* *
*/ * paramsHttpServletRequest
*
* @param params Map
* @param request HttpServletRequest
* @return RR
*/
@RequestMapping("/page") @RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){ public R page(@RequestParam Map<String, Object> params, HttpServletRequest request) {
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); // 记录page方法的调用信息
if(params.get("orderBy")==null || params.get("orderBy")==""){ // 包括当前类名和传入的参数,
params.put("orderBy","id"); // 方便调试查看参数情况以JSON字符串形式记录参数
logger.debug("page方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
// 如果传入的排序字段参数为空,
// 则默认按照"id"字段进行排序
if (params.get("orderBy") == null || params.get("orderBy") == "") {
params.put("orderBy", "id");
} }
// 调用forumService的queryPage方法
// 根据传入的参数获取分页数据(该方法内部应该是与数据库交互获取相应的数据列表等)
PageUtils page = forumService.queryPage(params); PageUtils page = forumService.queryPage(params);
//字典表数据转换 // 获取分页数据中的列表数据
List<ForumView> list =(List<ForumView>)page.getList(); // 这里应该是ForumView类型的列表ForumView可能是用于展示的视图对象
for(ForumView c:list){ List<ForumView> list = (List<ForumView>) page.getList();
//修改对应字典表字段 // 遍历列表数据,
// 对每条数据进行字典表数据转换操作(比如将字典表中的编码转换为对应的实际含义显示给前端)
for (ForumView c : list) {
dictionaryService.dictionaryConvert(c, request); dictionaryService.dictionaryConvert(c, request);
} }
// 返回包含处理后数据的成功结果对象
// R.ok()表示操作成功,并将数据放入返回对象中返回给前端)
return R.ok().put("data", page); return R.ok().put("data", page);
} }
/** /**
* *
*/ * id
*
* @param id Longid
* @param request HttpServletRequest
*
* @return R
*
*/
@RequestMapping("/info/{id}") @RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){ public R info(@PathVariable("id") Long id, HttpServletRequest request) {
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id); logger.debug("info方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
// 通过forumService根据传入的id从数据库中查询对应的ForumEntity对象ForumEntity可能是数据库对应的实体类
ForumEntity forum = forumService.selectById(id); ForumEntity forum = forumService.selectById(id);
if(forum !=null){ if (forum!= null) {
//entity转view // 创建ForumView对象
// 用于将查询到的实体数据转换为适合展示的视图数据ForumView可能包含了部分需要展示给前端的字段等
ForumView view = new ForumView(); ForumView view = new ForumView();
BeanUtils.copyProperties( forum , view );//把实体数据重构到view中 // 使用Spring的BeanUtils工具
// 将forum实体对象中的属性值复制到view视图对象中
//级联表 BeanUtils.copyProperties(forum, view);
YonghuEntity yonghu = yonghuService.selectById(forum.getYonghuId());
if(yonghu != null){ // 处理级联表数据,
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段 // 获取与该论坛记录关联的YonghuEntity用户相关的实体对象并将部分属性复制到view中排除一些不需要的字段
view.setYonghuId(yonghu.getId()); YonghuEntity yonghu = yonghuService.selectById(forum.getYonghuId());
} if (yonghu!= null) {
//管理员用户表做特殊处理,防止和用户表账户姓名字段冲突 BeanUtils.copyProperties(yonghu, view, new String[] { "id", "createTime", "insertTime", "updateTime" });
UsersEntity users = usersService.selectById(forum.getUsersId()); view.setYonghuId(yonghu.getId());
if(users != null){ }
view.setUsersId(users.getId()); // 处理管理员用户表数据,
view.setUusername(users.getUsername()); // 获取与该论坛记录关联的UsersEntity管理员用户相关的实体对象并将部分关键属性设置到view中
view.setUpassword(users.getPassword()); UsersEntity users = usersService.selectById(forum.getUsersId());
view.setUrole(users.getRole()); if (users!= null) {
view.setUaddtime(users.getAddtime()); view.setUsersId(users.getId());
} view.setUusername(users.getUsername());
//修改对应字典表字段 view.setUpassword(users.getPassword());
view.setUrole(users.getRole());
view.setUaddtime(users.getAddtime());
}
// 对view视图对象进行字典表数据转换操作
// (比如将字典表中的编码转换为对应的实际含义显示给前端)
dictionaryService.dictionaryConvert(view, request); dictionaryService.dictionaryConvert(view, request);
// 返回包含处理后详细数据的成功结果对象R.ok()表示操作成功,
// 并将数据放入返回对象中返回给前端)
return R.ok().put("data", view); return R.ok().put("data", view);
}else { } else {
return R.error(511,"查不到数据"); // 如果未查询到对应的数据,
// 则返回包含错误码和错误提示信息的错误结果对象
return R.error(511, "查不到数据");
} }
} }
/** /**
* *
*/ * ForumEntityHttpServletRequest
* id
* @param forum ForumEntity
* @param request HttpServletRequestid
* @return R
*/
@RequestMapping("/save") @RequestMapping("/save")
public R save(@RequestBody ForumEntity forum, HttpServletRequest request){ public R save(@RequestBody ForumEntity forum, HttpServletRequest request) {
logger.debug("save方法:,,Controller:{},,forum:{}",this.getClass().getName(),forum.toString()); logger.debug("save方法:,,Controller:{},,forum:{}", this.getClass().getName(), forum.toString());
// 从HttpServletRequest的会话中获取当前用户的角色信息这里先将获取到的Object类型强制转换为String类型
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
if(false) if (false)
return R.error(511,"永远不会进入"); return R.error(511, "永远不会进入");
else if("用户".equals(role)) else if ("用户".equals(role))
// 如果当前用户角色是"用户"
// 则将论坛记录的YonghuId设置为从会话中获取的当前用户的id这里做了一些类型转换操作
forum.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); forum.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
else if("管理员".equals(role)) else if ("管理员".equals(role))
// 如果当前用户角色是"管理员"
// 则将论坛记录的UsersId设置为从会话中获取的当前用户的id同样进行了类型转换
forum.setUsersId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); forum.setUsersId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
// 创建EntityWrapper对象
// 用于构建查询条件,检查数据库中是否已经存在相同的数据(根据多个字段进行等值判断)
Wrapper<ForumEntity> queryWrapper = new EntityWrapper<ForumEntity>() Wrapper<ForumEntity> queryWrapper = new EntityWrapper<ForumEntity>()
.eq("forum_name", forum.getForumName()) .eq("forum_name", forum.getForumName())
.eq("yonghu_id", forum.getYonghuId()) .eq("yonghu_id", forum.getYonghuId())
.eq("users_id", forum.getUsersId()) .eq("users_id", forum.getUsersId())
.eq("super_ids", forum.getSuperIds()) .eq("super_ids", forum.getSuperIds())
.eq("forum_state_types", forum.getForumStateTypes()) .eq("forum_state_types", forum.getForumStateTypes());
;
logger.info("sql语句:" + queryWrapper.getSqlSegment());
logger.info("sql语句:"+queryWrapper.getSqlSegment()); // 根据构建的查询条件查询数据库中是否已经存在相同的数据
// 通过selectOne方法查询一条符合条件的数据
ForumEntity forumEntity = forumService.selectOne(queryWrapper); ForumEntity forumEntity = forumService.selectOne(queryWrapper);
if(forumEntity==null){ if (forumEntity == null) {
// 如果不存在相同数据,
// 则设置论坛记录的插入时间和创建时间为当前时间并将该记录插入到数据库中通过insert方法
forum.setInsertTime(new Date()); forum.setInsertTime(new Date());
forum.setCreateTime(new Date()); forum.setCreateTime(new Date());
forumService.insert(forum); forumService.insert(forum);
return R.ok(); return R.ok();
}else { } else {
return R.error(511,"表中有相同数据"); // 如果存在相同数据,
// 则返回包含错误码和提示信息的错误结果对象,表示表中已有相同数据
return R.error(511, "表中有相同数据");
} }
} }
/** /**
* *
*/ * ForumEntityHttpServletRequest
* id
* @param forum ForumEntity
* @param request HttpServletRequest
* @return R
*/
@RequestMapping("/update") @RequestMapping("/update")
public R update(@RequestBody ForumEntity forum, HttpServletRequest request){ public R update(@RequestBody ForumEntity forum, HttpServletRequest request) {
logger.debug("update方法:,,Controller:{},,forum:{}",this.getClass().getName(),forum.toString()); logger.debug("update方法:,,Controller:{},,forum:{}", this.getClass().getName(), forum.toString());
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
// else if("用户".equals(role))
// if (false)
// return R.error(511, "永远不会进入");
// else if ("用户".equals(role))
// forum.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); // forum.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
// else if("管理员".equals(role)) // else if ("管理员".equals(role))
// forum.setUsersId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); // forum.setUsersId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
//根据字段查询是否有相同数据 // 创建EntityWrapper对象用于构建查询条件检查数据库中除了当前要修改的记录根据id排除外是否存在相同的数据根据多个字段进行等值判断
Wrapper<ForumEntity> queryWrapper = new EntityWrapper<ForumEntity>() Wrapper<ForumEntity> queryWrapper = new EntityWrapper<ForumEntity>()
.notIn("id",forum.getId()) .notIn("id", forum.getId())
.andNew() .andNew()
.eq("forum_name", forum.getForumName()) .eq("forum_name", forum.getForumName())
.eq("yonghu_id", forum.getYonghuId()) .eq("yonghu_id", forum.getYonghuId())
.eq("users_id", forum.getUsersId()) .eq("users_id", forum.getUsersId())
.eq("super_ids", forum.getSuperIds()) .eq("super_ids", forum.getSuperIds())
.eq("forum_state_types", forum.getForumStateTypes()) .eq("forum_state_types", forum.getForumStateTypes());
;
logger.info("sql语句:"+queryWrapper.getSqlSegment()); logger.info("sql语句:" + queryWrapper.getSqlSegment());
// 根据构建的查询条件查询数据库中是否已经存在相同的数据通过selectOne方法查询一条符合条件的数据
ForumEntity forumEntity = forumService.selectOne(queryWrapper); ForumEntity forumEntity = forumService.selectOne(queryWrapper);
// 设置论坛记录的更新时间为当前时间
forum.setUpdateTime(new Date()); forum.setUpdateTime(new Date());
if(forumEntity==null){ if (forumEntity == null) {
forumService.updateById(forum);//根据id更新 // 如果不存在相同数据,
// 则根据传入的forum对象的id更新数据库中的对应论坛记录通过updateById方法
forumService.updateById(forum);
return R.ok(); return R.ok();
}else { } else {
return R.error(511,"表中有相同数据"); // 如果存在相同数据,
// 则返回包含错误码和提示信息的错误结果对象,表示表中已有相同数据
return R.error(511, "表中有相同数据");
} }
} }
/** /**
* *
*/ * idforumService
*
* @param ids id
* @return R
*/
@RequestMapping("/delete") @RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
public R delete(@RequestBody Integer[] ids) {
logger.debug("delete:,,Controller:{},,ids:{}", this.getClass().getName(), ids.toString());
// 调用forumService的deleteBatchIds方法
// 批量删除数据库中对应id的论坛记录传入的是将数组转换为List后的集合
forumService.deleteBatchIds(Arrays.asList(ids)); forumService.deleteBatchIds(Arrays.asList(ids));
return R.ok(); return R.ok();
} }
/** /**
* *
* fileNameHttpServletRequestExcel
*
* @param fileName
* @param request HttpServletRequestid
* @return R
*/ */
@RequestMapping("/batchInsert") @RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){ public R save(String fileName, HttpServletRequest request) {
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName); logger.debug("batchInsert方法:,,Controller:{},,fileName:{}", this.getClass().getName(), fileName);
// 从HttpServletRequest的会话中获取当前用户的id并转换为Integer类型这里做了一些强制类型转换操作
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))); Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try { try {
List<ForumEntity> forumList = new ArrayList<>();//上传的东西 // 创建一个用于存储要插入数据库的ForumEntity对象列表即从文件中读取到的多条论坛数据记录
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段 List<ForumEntity> forumList = new ArrayList<>();
// 创建一个Map用于存储要查询是否重复的字段信息具体的使用方式需看后续代码逻辑
Map<String, List<String>> seachFields = new HashMap<>();
Date date = new Date(); Date date = new Date();
int lastIndexOf = fileName.lastIndexOf("."); int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){ if (lastIndexOf == -1) {
return R.error(511,"该文件没有后缀"); return R.error(511, "该文件没有后缀");
}else{ } else {
String suffix = fileName.substring(lastIndexOf); String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){ if (!".xls".equals(suffix)) {
return R.error(511,"只支持后缀为xls的excel文件"); return R.error(511, "只支持后缀为xls的excel文件");
}else{ } else {
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径 // 通过类加载器获取指定文件名对应的文件资源路径(这里应该是位于"static/upload/"目录下的文件)
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);
File file = new File(resource.getFile()); File file = new File(resource.getFile());
if(!file.exists()){ if (!file.exists()) {
return R.error(511,"找不到上传文件,请联系管理员"); return R.error(511, "找不到上传文件,请联系管理员");
}else{ } else {
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件 // 调用PoiUtil的poiImport方法读取Excel文件中的数据返回的是一个嵌套的List外层List表示行内层List表示每行中的单元格数据
dataList.remove(0);//删除第一行,因为第一行是提示 List<List<String>> dataList = PoiUtil.poiImport(file.getPath());
for(List<String> data:dataList){ // 删除读取到的数据列表中的第一行(可能是表头之类的提示信息,不需要插入数据库)
//循环 dataList.remove(0);
for (List<String> data : dataList) {
// 循环处理每一行数据创建一个ForumEntity对象用于存储要插入数据库的一条论坛记录信息
ForumEntity forumEntity = new ForumEntity(); ForumEntity forumEntity = new ForumEntity();
// forumEntity.setForumName(data.get(0)); //帖子标题 要改的 // forumEntity.setForumName(data.get(0)); //帖子标题 要改的
// forumEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的 // forumEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的
// forumEntity.setUsersId(Integer.valueOf(data.get(0))); //管理员 要改的 // forumEntity.setUsersId(Integer.valueOf(data.get(0))); //管理员 要改的
// forumEntity.setForumContent("");//详情和图片 // forumEntity.setForumContent("");//详情和图片
// forumEntity.setSuperIds(Integer.valueOf(data.get(0))); //父id 要改的 // forumEntity.setSuperIds(Integer.valueOf(data.get(0))); //父id 要改的
// forumEntity.setForumStateTypes(Integer.valueOf(data.get(0))); //帖子状态 要改的 // forumEntity.setForumStateTypes(Integer.valueOf(data.get(0))); //帖子状态 要改的
// forumEntity.setInsertTime(date);//时间
// forumEntity.setUpdateTime(sdf.parse(data.get(0))); //修改时间 要改的
// forumEntity.setCreateTime(date);//时间
forumList.add(forumEntity);
//把要查询是否重复的字段放入map中
}
//查询是否重复
forumService.insertBatch(forumList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
/**
*
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
// 没有指定排序字段就默认id倒序
if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){
params.put("orderBy","id");
}
PageUtils page = forumService.queryPage(params);
//字典表数据转换
List<ForumView> list =(List<ForumView>)page.getList();
for(ForumView c:list)
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
return R.ok().put("data", page);
}
/**
*
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
ForumEntity forum = forumService.selectById(id);
if(forum !=null){
//entity转view
ForumView view = new ForumView();
BeanUtils.copyProperties( forum , view );//把实体数据重构到view中
//级联表
YonghuEntity yonghu = yonghuService.selectById(forum.getYonghuId());
if(yonghu != null){
BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setYonghuId(yonghu.getId());
}
UsersEntity users = usersService.selectById(forum.getUsersId());
if(users != null){
view.setUsersId(users.getId());
view.setUusername(users.getUsername());
view.setUpassword(users.getPassword());
view.setUrole(users.getRole());
view.setUaddtime(users.getAddtime());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
*
*/
@RequestMapping("/add")
public R add(@RequestBody ForumEntity forum, HttpServletRequest request){
logger.debug("add方法:,,Controller:{},,forum:{}",this.getClass().getName(),forum.toString());
Wrapper<ForumEntity> queryWrapper = new EntityWrapper<ForumEntity>()
.eq("forum_name", forum.getForumName())
.eq("yonghu_id", forum.getYonghuId())
.eq("users_id", forum.getUsersId())
.eq("super_ids", forum.getSuperIds())
.eq("forum_state_types", forum.getForumStateTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ForumEntity forumEntity = forumService.selectOne(queryWrapper);
if(forumEntity==null){
forum.setInsertTime(new Date());
forum.setCreateTime(new Date());
forumService.insert(forum);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
}

@ -1,4 +1,3 @@
package com.controller; package com.controller;
import java.io.File; import java.io.File;
@ -35,178 +34,273 @@ import com.alibaba.fastjson.*;
/** /**
* *
* *
* @author * HTTP
* @email *
*/ *
* @author wangmuzi
*
*/
@RestController @RestController
@Controller @Controller
@RequestMapping("/news") @RequestMapping("/news")
public class NewsController { public class NewsController {
// 创建一个日志记录器,用于记录该类中各个方法执行过程中的关键信息,方便后续调试和问题排查
private static final Logger logger = LoggerFactory.getLogger(NewsController.class); private static final Logger logger = LoggerFactory.getLogger(NewsController.class);
// 通过Spring的依赖注入
// 自动装配NewsService用于处理公告信息相关的核心业务逻辑比如数据库操作等
@Autowired @Autowired
private NewsService newsService; private NewsService newsService;
// 自动注入TokenService
// 可能用于处理与用户认证令牌相关的操作(具体功能需看对应服务层实现)
@Autowired @Autowired
private TokenService tokenService; private TokenService tokenService;
// 自动注入DictionaryService
// 用于处理字典表数据的转换操作,例如将字典表中的编码转换为有实际意义的展示值
@Autowired @Autowired
private DictionaryService dictionaryService; private DictionaryService dictionaryService;
//级联表service // 自动注入YonghuService
// 可能用于处理与用户Yonghu可能是特定业务中的一种用户类型相关的级联表操作具体使用场景看后续代码逻辑
@Autowired @Autowired
private YonghuService yonghuService; private YonghuService yonghuService;
/** /**
* *
*/ * HttpServletRequest
*
* @param params Map
* @param request HttpServletRequestID便
* @return RR
*/
@RequestMapping("/page") @RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){ public R page(@RequestParam Map<String, Object> params, HttpServletRequest request) {
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); // 记录page方法的调用信息
// 包括当前类名和传入的参数将参数转换为JSON字符串形式记录方便查看参数详情用于调试目的
logger.debug("page方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
// 从HttpServletRequest的会话中获取当前用户的角色信息
// 并转换为String类型
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
if(false) if (false)
return R.error(511,"永不会进入"); return R.error(511, "永不会进入");
else if("用户".equals(role)) else if ("用户".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId")); // 如果当前用户角色是"用户"
if(params.get("orderBy")==null || params.get("orderBy")==""){ // 则将当前用户的ID添加到查询参数中作为查询属于该用户的公告信息的条件这里假设数据库中有对应的关联字段
params.put("orderBy","id"); params.put("yonghuId", request.getSession().getAttribute("userId"));
// 如果传入的排序字段参数为空,则默认按照"id"字段进行排序
if (params.get("orderBy") == null || params.get("orderBy") == "") {
params.put("orderBy", "id");
} }
// 调用newsService的queryPage方法
// 根据传入的参数获取公告信息的分页数据(该方法内部应该是与数据库交互来查询相应的数据列表等)
PageUtils page = newsService.queryPage(params); PageUtils page = newsService.queryPage(params);
//字典表数据转换 // 获取分页数据中的列表数据这里应该是NewsView类型的列表NewsView可能是用于展示的视图对象
List<NewsView> list =(List<NewsView>)page.getList(); List<NewsView> list = (List<NewsView>) page.getList();
for(NewsView c:list){ // 遍历列表数据,对每条数据进行字典表数据转换操作,
//修改对应字典表字段 // 将字典表中的编码等转换为对应的实际展示值(比如状态码转换为具体的状态文字描述)
for (NewsView c : list) {
dictionaryService.dictionaryConvert(c, request); dictionaryService.dictionaryConvert(c, request);
} }
// 返回包含处理后数据的成功结果对象R.ok()表示操作成功,
// 并将数据放入返回对象中返回给前端)
return R.ok().put("data", page); return R.ok().put("data", page);
} }
/** /**
* *
*/ * id
* @param id Longid
* @param request HttpServletRequest
* @return R
*/
@RequestMapping("/info/{id}") @RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){ public R info(@PathVariable("id") Long id, HttpServletRequest request) {
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id); logger.debug("info方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
// 通过newsService根据传入的id从数据库中查询对应的NewsEntity对象NewsEntity可能是数据库对应的实体类
NewsEntity news = newsService.selectById(id); NewsEntity news = newsService.selectById(id);
if(news !=null){ if (news!= null) {
//entity转view // 创建NewsView对象
// 用于将查询到的实体数据转换为适合展示的视图数据NewsView可能包含了部分需要展示给前端的字段等
NewsView view = new NewsView(); NewsView view = new NewsView();
BeanUtils.copyProperties( news , view );//把实体数据重构到view中 // 使用Spring的BeanUtils工具
// 将news实体对象中的属性值复制到view视图对象中实现实体转视图的基本数据复制
BeanUtils.copyProperties(news, view);
//修改对应字典表字段 // 对view视图对象进行字典表数据转换操作
// 将字典表相关字段转换为有实际意义的展示值(比如将类型编码转换为类型名称等)
dictionaryService.dictionaryConvert(view, request); dictionaryService.dictionaryConvert(view, request);
// 返回包含处理后详细数据的成功结果对象R.ok()表示操作成功,
// 并将数据放入返回对象中返回给前端)
return R.ok().put("data", view); return R.ok().put("data", view);
}else { } else {
return R.error(511,"查不到数据"); // 如果未查询到对应的数据,
// 则返回包含错误码和错误提示信息的错误结果对象
return R.error(511, "查不到数据");
} }
} }
/** /**
* *
*/ * NewsEntityHttpServletRequest
*
* @param news NewsEntity
* @param request HttpServletRequest使
* @return R
*/
@RequestMapping("/save") @RequestMapping("/save")
public R save(@RequestBody NewsEntity news, HttpServletRequest request){ public R save(@RequestBody NewsEntity news, HttpServletRequest request) {
logger.debug("save方法:,,Controller:{},,news:{}",this.getClass().getName(),news.toString()); logger.debug("save方法:,,Controller:{},,news:{}", this.getClass().getName(), news.toString());
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
if(false) if (false)
return R.error(511,"永远不会进入"); return R.error(511, "永远不会进入");
// 创建EntityWrapper对象用于构建查询条件
// 检查数据库中是否已经存在相同的公告信息(根据公告名称和公告类型等字段进行等值判断)
Wrapper<NewsEntity> queryWrapper = new EntityWrapper<NewsEntity>() Wrapper<NewsEntity> queryWrapper = new EntityWrapper<NewsEntity>()
.eq("news_name", news.getNewsName()) .eq("news_name", news.getNewsName())
.eq("news_types", news.getNewsTypes()) .eq("news_types", news.getNewsTypes());
;
logger.info("sql语句:"+queryWrapper.getSqlSegment()); logger.info("sql语句:" + queryWrapper.getSqlSegment());
// 根据构建的查询条件查询数据库中是否已经存在相同的数据通过selectOne方法查询一条符合条件的数据
NewsEntity newsEntity = newsService.selectOne(queryWrapper); NewsEntity newsEntity = newsService.selectOne(queryWrapper);
if(newsEntity==null){ if (newsEntity == null) {
// 如果不存在相同数据,则设置公告信息的插入时间和创建时间为当前时间,
// 并将该公告信息插入到数据库中通过insert方法
news.setInsertTime(new Date()); news.setInsertTime(new Date());
news.setCreateTime(new Date()); news.setCreateTime(new Date());
newsService.insert(news); newsService.insert(news);
return R.ok(); return R.ok();
}else { } else {
return R.error(511,"表中有相同数据"); // 如果存在相同数据,则返回包含错误码和提示信息的错误结果对象,表示表中已有相同数据
return R.error(511, "表中有相同数据");
} }
} }
/** /**
* *
*/ * NewsEntityHttpServletRequest
* id
* @param news NewsEntity
* @param request HttpServletRequest使
* @return R
*/
@RequestMapping("/update") @RequestMapping("/update")
public R update(@RequestBody NewsEntity news, HttpServletRequest request){ public R update(@RequestBody NewsEntity news, HttpServletRequest request) {
logger.debug("update方法:,,Controller:{},,news:{}",this.getClass().getName(),news.toString()); logger.debug("update方法:,,Controller:{},,news:{}", this.getClass().getName(), news.toString());
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false) // if (false)
// return R.error(511,"永远不会进入"); // return R.error(511, "永远不会进入");
//根据字段查询是否有相同数据 // 创建EntityWrapper对象用于构建查询条件检查数据库中除了当前要修改的记录根据id排除外是否存在相同的公告信息根据公告名称和公告类型等字段进行等值判断
Wrapper<NewsEntity> queryWrapper = new EntityWrapper<NewsEntity>() Wrapper<NewsEntity> queryWrapper = new EntityWrapper<NewsEntity>()
.notIn("id",news.getId()) .notIn("id", news.getId())
.andNew() .andNew()
.eq("news_name", news.getNewsName()) .eq("news_name", news.getNewsName())
.eq("news_types", news.getNewsTypes()) .eq("news_types", news.getNewsTypes());
;
logger.info("sql语句:" + queryWrapper.getSqlSegment());
logger.info("sql语句:"+queryWrapper.getSqlSegment()); // 根据构建的查询条件查询数据库中是否已经存在相同的数据通过selectOne方法查询一条符合条件的数据
NewsEntity newsEntity = newsService.selectOne(queryWrapper); NewsEntity newsEntity = newsService.selectOne(queryWrapper);
if("".equals(news.getNewsPhoto()) || "null".equals(news.getNewsPhoto())){
news.setNewsPhoto(null); // 如果公告图片字段为空字符串或者值为"null"
// 这里可能是前端传递过来的表示空值的情况则将其设置为null以便后续正确更新到数据库中
if ("".equals(news.getNewsPhoto()) || "null".equals(news.getNewsPhoto())) {
news.setNewsPhoto(null);
} }
if(newsEntity==null){ if (newsEntity == null) {
newsService.updateById(news);//根据id更新
// 如果不存在相同数据,
// 则根据传入的news对象的id更新数据库中的对应公告信息记录通过updateById方法
newsService.updateById(news);
return R.ok(); return R.ok();
}else { } else {
return R.error(511,"表中有相同数据");
}
}
// 如果存在相同数据,
// 则返回包含错误码和提示信息的错误结果对象,表示表中已有相同数据
return R.error(511, "表中有相同数据");
}
}
/** /**
* *
*/ * idnewsService
*
* @param ids id
* @return R
*/
@RequestMapping("/delete") @RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){ public R delete(@RequestBody Integer[] ids) {
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
logger.debug("delete:,,Controller:{},,ids:{}", this.getClass().getName(), ids.toString());
// 调用newsService的deleteBatchIds方法
// 批量删除数据库中对应id的公告信息记录传入的是将数组转换为List后的集合
newsService.deleteBatchIds(Arrays.asList(ids)); newsService.deleteBatchIds(Arrays.asList(ids));
return R.ok(); return R.ok();
} }
/** /**
* *
* fileNameHttpServletRequestExcel
*
* @param fileName Excel
* @param request HttpServletRequestID
* @return R
*/ */
@RequestMapping("/batchInsert") @RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){ public R save(String fileName, HttpServletRequest request) {
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName); logger.debug("batchInsert方法:,,Controller:{},,fileName:{}", this.getClass().getName(), fileName);
// 从HttpServletRequest的会话中获取当前用户的ID
// 并转换为Integer类型这里做了一些强制类型转换操作
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))); Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try { try {
List<NewsEntity> newsList = new ArrayList<>();//上传的东西
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段 // 创建一个用于存储要插入数据库的NewsEntity对象列表即从文件中读取到的多条公告信息记录
List<NewsEntity> newsList = new ArrayList<>();
// 创建一个Map
// 用于存储要查询是否重复的字段信息(具体的使用方式需看后续代码逻辑,可能用于去重判断等)
Map<String, List<String>> seachFields = new HashMap<>();
Date date = new Date(); Date date = new Date();
int lastIndexOf = fileName.lastIndexOf("."); int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){ if (lastIndexOf == -1) {
return R.error(511,"该文件没有后缀"); return R.error(511, "该文件没有后缀");
}else{ } else {
String suffix = fileName.substring(lastIndexOf); String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){ if (!".xls".equals(suffix)) {
return R.error(511,"只支持后缀为xls的excel文件"); return R.error(511, "只支持后缀为xls的excel文件");
}else{ } else {
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径 // 通过类加载器获取指定文件名对应的文件资源路径(这里应该是位于"static/upload/"目录下的文件)
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);
File file = new File(resource.getFile()); File file = new File(resource.getFile());
if(!file.exists()){ if (!file.exists()) {
return R.error(511,"找不到上传文件,请联系管理员"); return R.error(511, "找不到上传文件,请联系管理员");
}else{ } else {
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示 // 调用PoiUtil的poiImport方法读取Excel文件中的数据返回的是一个嵌套的List
for(List<String> data:dataList){ // 外层List表示行内层List表示每行中的单元格数据
//循环 List<List<String>> dataList = PoiUtil.poiImport(file.getPath());
// 删除读取到的数据列表中的第一行(可能是表头之类的提示信息,不需要插入数据库)
dataList.remove(0);
for (List<String> data : dataList) {
// 循环处理每一行数据创建一个NewsEntity对象用于存储要插入数据库的一条公告信息记录信息
NewsEntity newsEntity = new NewsEntity(); NewsEntity newsEntity = new NewsEntity();
//
//
//
//
//
//
//
// newsEntity.setNewsName(data.get(0)); //公告标题 要改的 // newsEntity.setNewsName(data.get(0)); //公告标题 要改的
// newsEntity.setNewsTypes(Integer.valueOf(data.get(0))); //公告类型 要改的 // newsEntity.setNewsTypes(Integer.valueOf(data.get(0))); //公告类型 要改的
// newsEntity.setNewsPhoto("");//详情和图片 // newsEntity.setNewsPhoto("");//详情和图片
@ -215,91 +309,28 @@ public class NewsController {
// newsEntity.setCreateTime(date);//时间 // newsEntity.setCreateTime(date);//时间
newsList.add(newsEntity); newsList.add(newsEntity);
// 把要查询是否重复的字段放入map中此处代码未完整实现具体放入逻辑需补充
//把要查询是否重复的字段放入map中
} }
//查询是否重复
// 查询是否重复此处应该是根据放入seachFields中的字段去检查数据库中是否已存在相同记录
// 代码可能需完善)
newsService.insertBatch(newsList); newsService.insertBatch(newsList);
return R.ok(); return R.ok();
} }
} }
} }
}catch (Exception e){ } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员"); return R.error(511, "批量插入数据异常,请联系管理员");
}
}
/**
*
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
// 没有指定排序字段就默认id倒序
if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){
params.put("orderBy","id");
} }
PageUtils page = newsService.queryPage(params);
//字典表数据转换
List<NewsView> list =(List<NewsView>)page.getList();
for(NewsView c:list)
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
return R.ok().put("data", page);
} }
/** /**
* *
*/ * HttpServletRequest
@RequestMapping("/detail/{id}") * @IgnoreAuth
public R detail(@PathVariable("id") Long id, HttpServletRequest request){ * @param params Map
logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id); * @param request HttpServletRequestID便
NewsEntity news = newsService.selectById(id);
if(news !=null){
//entity转view
NewsView view = new NewsView();
BeanUtils.copyProperties( news , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
*
*/
@RequestMapping("/add")
public R add(@RequestBody NewsEntity news, HttpServletRequest request){
logger.debug("add方法:,,Controller:{},,news:{}",this.getClass().getName(),news.toString());
Wrapper<NewsEntity> queryWrapper = new EntityWrapper<NewsEntity>()
.eq("news_name", news.getNewsName())
.eq("news_types", news.getNewsTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
NewsEntity newsEntity = newsService.selectOne(queryWrapper);
if(newsEntity==null){
news.setInsertTime(new Date());
news.setCreateTime(new Date());
newsService.insert(news);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
}

@ -27,142 +27,233 @@ import com.utils.R;
/** /**
* *
* 退
* 使 @RequestMapping("users") "/users"使 @RestController RESTful JSON
*/ */
@RequestMapping("users") @RequestMapping("users")
@RestController @RestController
public class UsersController { public class UsersController {
// 自动注入用户服务层接口,通过该接口可以调用与用户相关的业务方法,比如查询用户、插入用户等数据库操作相关的方法,具体实现由对应的服务层类来完成。
@Autowired @Autowired
private UsersService usersService; private UsersService usersService;
// 自动注入Token服务层接口用于处理与用户Token相关的业务逻辑例如生成用户登录后的Token等操作具体功能在TokenService类中实现。
@Autowired @Autowired
private TokenService tokenService; private TokenService tokenService;
/** /**
* *
* Token
* 使 @IgnoreAuth 访使 @PostMapping POST "/login" "/users/login"
* @param username
* @param password
* @param captcha
* @param request HttpServletRequest使
* @return RTokenID
*/ */
@IgnoreAuth @IgnoreAuth
@PostMapping(value = "/login") @PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) { public R login(String username, String password, String captcha, HttpServletRequest request) {
// 通过用户服务层的selectOne方法结合EntityWrapper构建的查询条件根据传入的用户名从数据库中查询对应的用户实体信息。
// 这里的查询条件是查找用户名与传入的username相等的用户记录返回符合条件的UsersEntity对象若存在若不存在则返回null。
UsersEntity user = usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username)); UsersEntity user = usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username));
if(user==null || !user.getPassword().equals(password)) { // 如果查询到的用户为null即用户名不存在或者密码不匹配通过调用user对象的getPassword方法获取存储的密码并与传入的password比对则返回账号或密码不正确的错误信息给前端。
if (user == null ||!user.getPassword().equals(password)) {
return R.error("账号或密码不正确"); return R.error("账号或密码不正确");
} }
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole()); // 如果用户信息验证通过调用Token服务层的generateToken方法根据用户的ID、用户名、用户类型这里固定为"users"以及用户的角色信息生成一个用于标识用户登录状态的Token字符串。
String token = tokenService.generateToken(user.getId(), username, "users", user.getRole());
R r = R.ok(); R r = R.ok();
// 将生成的Token放入返回结果对象R中以便前端接收并后续用于验证用户登录状态等操作。
r.put("token", token); r.put("token", token);
r.put("role",user.getRole()); // 将用户的角色信息放入返回结果对象R中方便前端知晓当前登录用户的角色权限等情况。
r.put("userId",user.getId()); r.put("role", user.getRole());
// 将用户的ID信息放入返回结果对象R中前端可能会根据此ID进行一些与用户相关的后续操作。
r.put("userId", user.getId());
return r; return r;
} }
/** /**
* *
* UsersEntity使使
* 使 @IgnoreAuth 访使 @PostMapping POST "/register" "/users/register"
* @param user UsersEntity
* @return R
*/ */
@IgnoreAuth @IgnoreAuth
@PostMapping(value = "/register") @PostMapping(value = "/register")
public R register(@RequestBody UsersEntity user){ public R register(@RequestBody UsersEntity user) {
// ValidatorUtils.validateEntity(user); // 以下这行代码被注释掉了,可能原本是用于对传入的用户实体进行数据合法性验证的逻辑,比如验证用户名、密码是否符合格式要求等,目前未生效。
if(usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", user.getUsername())) !=null) { // ValidatorUtils.validateEntity(user);
return R.error("用户已存在"); // 通过用户服务层的selectOne方法结合EntityWrapper构建的查询条件根据传入的用户实体中的用户名去数据库中查询是否已存在相同用户名的用户记录若存在则返回对应的UsersEntity对象若不存在则返回null。
} if (usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", user.getUsername()))!= null) {
usersService.insert(user); return R.error("用户已存在");
return R.ok(); }
} // 如果用户名未被使用调用用户服务层的insert方法将包含新用户信息的user对象插入到数据库中完成用户注册操作。
usersService.insert(user);
return R.ok();
}
/** /**
* 退 * 退
* 退使Session退
* 使 @GetMapping GET "/logout" "/users/logout"
* @param request HttpServletRequest
* @return R"退出成功"退
*/ */
@GetMapping(value = "logout") @GetMapping(value = "logout")
public R logout(HttpServletRequest request) { public R logout(HttpServletRequest request) {
// 调用HttpServletRequest对象的invalidate方法使当前会话失效即清除会话中存储的用户登录凭证、用户相关属性等信息达到退出登录的效果。
request.getSession().invalidate(); request.getSession().invalidate();
return R.ok("退出成功"); return R.ok("退出成功");
} }
}
/**
* /**
*/ *
@IgnoreAuth * 123456
* 使 @IgnoreAuth 访 @RequestMapping "/resetPass" "/users/resetPass"@RequestMapping("users")
* @param username 便
* @param request HttpServletRequest使
* @return R
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass") @RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request){ public R resetPass(String username, HttpServletRequest request) {
UsersEntity user = usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username)); // 通过用户服务层的selectOne方法结合EntityWrapper构建的查询条件查找用户名与传入的username相等的用户记录从数据库中查询对应的用户实体信息。
if(user==null) { UsersEntity user = usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username));
return R.error("账号不存在"); // 如果查询到的用户为null即用户名对应的用户不存在返回账号不存在的错误信息给前端。
} if (user == null) {
user.setPassword("123456"); return R.error("账号不存在");
usersService.update(user,null); }
return R.ok("密码已重置为123456"); // 如果用户存在将用户的密码设置为固定值“123456”实际应用中这样直接设置密码不太安全可后续优化为更安全合理的密码重置逻辑比如通过发送验证码验证等方式。
} user.setPassword("123456");
// 调用用户服务层的update方法传入更新后的user对象以及null可能表示不需要其他额外的更新条件具体取决于update方法的参数定义将用户的密码更新到数据库中。
/** usersService.update(user, null);
* // 返回操作成功的结果信息并附带密码已重置为“123456”的提示内容告知前端密码重置操作已完成。
*/ return R.ok("密码已重置为123456");
@RequestMapping("/page") }
public R page(@RequestParam Map<String, Object> params,UsersEntity user){
EntityWrapper<UsersEntity> ew = new EntityWrapper<UsersEntity>();
PageUtils page = usersService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
return R.ok().put("data", page);
}
/** /**
* *
*/ *
@RequestMapping("/list") * @RequestMapping "/page" "/users/page"
public R list( UsersEntity user){ * @param params Map
EntityWrapper<UsersEntity> ew = new EntityWrapper<UsersEntity>(); * @param user UsersEntityMPUtil使
ew.allEq(MPUtil.allEQMapPre( user, "user")); * @return RPageUtils
return R.ok().put("data", usersService.selectListView(ew)); */
} @RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, UsersEntity user) {
/** // 创建一个EntityWrapper对象用于构建数据库查询条件它可以方便地拼接各种查询条件语句例如等于、大于、小于等条件初始时为空后续会根据业务逻辑添加相应条件。
* EntityWrapper<UsersEntity> ew = new EntityWrapper<UsersEntity>();
*/ // 调用用户服务层的queryPage方法进行分页查询传入params参数用于分页相关设置以及通过MPUtil相关工具方法构建的查询条件。
@RequestMapping("/info/{id}") // MPUtil.sort方法可能用于对查询结果进行排序设置MPUtil.between方法可能用于构建范围查询条件MPUtil.allLike方法可能用于构建模糊查询条件等具体功能取决于MPUtil工具类的实现。
public R info(@PathVariable("id") String id){ PageUtils page = usersService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
UsersEntity user = usersService.selectById(id); return R.ok().put("data", page);
return R.ok().put("data", user); }
}
/**
/** *
* session *
*/ * @RequestMapping "/list" "/users/list"
@RequestMapping("/session") * @param user UsersEntityMPUtilallEq便
public R getCurrUser(HttpServletRequest request){ * @return RusersService.selectListView
Integer id = (Integer)request.getSession().getAttribute("userId"); */
UsersEntity user = usersService.selectById(id); @RequestMapping("/list")
return R.ok().put("data", user); public R list(UsersEntity user) {
} // 创建一个EntityWrapper对象用于构建数据库查询条件方便后续添加具体的查询条件语句。
EntityWrapper<UsersEntity> ew = new EntityWrapper<UsersEntity>();
/** // 使用MPUtil工具类的allEq方法将用户对象中的属性按照指定前缀这里是"user"转换为相等查询条件添加到EntityWrapper对象中用于构建查询符合该用户对象属性值的所有用户记录的条件语句。
* ew.allEq(MPUtil.allEQMapPre(user, "user"));
*/ return R.ok().put("data", usersService.selectListView(ew));
@PostMapping("/save") }
public R save(@RequestBody UsersEntity user){
// ValidatorUtils.validateEntity(user); /**
if(usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", user.getUsername())) !=null) { *
return R.error("用户已存在"); * IDR
} * @RequestMapping "/info/{id}" "/users/info/{id}"{id}ID
user.setPassword("123456"); * @param id ID
usersService.insert(user); * @return RUsersEntity
return R.ok(); */
} @RequestMapping("/info/{id}")
public R info(@PathVariable("id") String id) {
/** // 通过用户服务层的selectById方法根据传入的用户ID从数据库中查询对应的用户实体信息。
* UsersEntity user = usersService.selectById(id);
*/ return R.ok().put("data", user);
@RequestMapping("/update") }
public R update(@RequestBody UsersEntity user){
// ValidatorUtils.validateEntity(user); /**
usersService.updateById(user);//全部更新 * session
return R.ok(); * SessionIDIDIDID
} * @RequestMapping "/session" "/users/session"
* @param request HttpServletRequestID
/** * @return RUsersEntity
* */
*/ @RequestMapping("/session")
@RequestMapping("/delete") public R getCurrUser(HttpServletRequest request) {
public R delete(@RequestBody Long[] ids){ // 从当前请求的会话中获取名为“userId”的属性值并转换为整数类型该值作为用户的唯一标识用于后续查询用户信息。
usersService.deleteBatchIds(Arrays.asList(ids)); Integer id = (Integer) request.getSession().getAttribute("userId");
return R.ok(); // 通过用户服务层的selectById方法根据获取到的用户ID从数据库中查询对应的用户实体信息。
} UsersEntity user = usersService.selectById(id);
return R.ok().put("data", user);
}
/**
*
* 使使123456
* @PostMapping POST "/save" "/users/save"
* @param user UsersEntity
* @return R
*/
@PostMapping("/save")
public R save(@RequestBody UsersEntity user) {
// 以下这行代码被注释掉了,可能原本是用于对传入的用户实体进行数据合法性验证的逻辑,比如验证用户名、密码是否符合格式要求等,目前未生效。
// ValidatorUtils.validateEntity(user);
// 通过用户服务层的selectOne方法结合EntityWrapper构建的查询条件查找用户名与传入的user.getUsername()相等的用户记录从数据库中查询是否已存在相同用户名的用户若存在则返回对应的UsersEntity对象若不存在则返回null。
if (usersService.selectOne(new EntityWrapper<UsersEntity>().eq("username", user.getUsername()))!= null) {
return R.error("用户已存在");
}
// 设置新用户的密码为固定值“123456”实际应用中这样直接设置密码不太安全可后续优化为更安全合理的密码设置方式比如进行密码加密等操作。
user.setPassword("123456");
// 调用用户服务层的insert方法将包含新用户信息的user对象插入到数据库中完成用户新增保存操作。
usersService.insert(user);
return R.ok();
}
/**
*
* UsersEntityupdateByIdID
* @RequestMapping "/update" "/users/update"
* @param user UsersEntity
* @return R
*/
@RequestMapping("/update")
public R update(@RequestBody UsersEntity user) {
// 以下这行代码被注释掉了,可能原本是用于对传入的用户实体进行数据合法性验证的逻辑,比如验证更新后的用户信息是否符合格式要求等,目前未生效。
// ValidatorUtils.validateEntity(user);
// 调用用户服务层的updateById方法根据传入的user对象中的ID通常是数据库中的主键ID找到对应的用户记录并将user对象中的所有属性值更新到数据库中对应的字段上完成用户信息更新操作。
usersService.updateById(user);
return R.ok();
}
/**
*
* ID
* @RequestMapping "/delete" "/users/delete"ID
* @param ids IDLong
* @return R
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids) {
// 调用用户服务层的deleteBatchIds方法传入要删除的用户ID列表通过Arrays.asList方法将数组转换为List集合形式具体取决于deleteBatchIds方法的参数要求执行批量删除数据库中对应用户记录的操作。
usersService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
} }

@ -42,40 +42,56 @@ import com.alibaba.fastjson.*;
@Controller @Controller
@RequestMapping("/yonghu") @RequestMapping("/yonghu")
public class YonghuController { public class YonghuController {
// 创建日志记录器,用于记录该类中的相关操作日志
private static final Logger logger = LoggerFactory.getLogger(YonghuController.class); private static final Logger logger = LoggerFactory.getLogger(YonghuController.class);
// 自动注入用户服务层接口,用于处理与用户相关的业务逻辑,如数据库操作等
@Autowired @Autowired
private YonghuService yonghuService; private YonghuService yonghuService;
// 自动注入Token服务层接口用于处理与用户Token相关的业务例如生成、验证等操作
@Autowired @Autowired
private TokenService tokenService; private TokenService tokenService;
// 自动注入字典服务层接口,用于处理字典数据相关的转换等操作
@Autowired @Autowired
private DictionaryService dictionaryService; private DictionaryService dictionaryService;
//级联表service // 此处可能用于自动注入级联表相关的服务层接口,当前代码中未完整体现具体使用情况
/** /**
* *
*/ *
* @param params Map
* @param request HttpServletRequest
* @return R
*/
@RequestMapping("/page") @RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){ public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
// 从会话中获取用户角色信息
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
// 此处条件永远为假,实际应该不会进入该分支,可能是预留逻辑待完善
if(false) if(false)
return R.error(511,"永不会进入"); return R.error(511,"永不会进入");
// 如果用户角色是"用户"则添加当前用户ID作为查询条件用于筛选当前用户相关的数据
else if("用户".equals(role)) else if("用户".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId")); params.put("yonghuId",request.getSession().getAttribute("userId"));
params.put("yonghuDeleteStart",1);params.put("yonghuDeleteEnd",1); params.put("yonghuDeleteStart",1);params.put("yonghuDeleteEnd",1);
// 设置默认的逻辑删除开始和结束标识用于筛选未删除的用户数据这里假设1表示未删除
params.put("yonghuDeleteStart",1);
params.put("yonghuDeleteEnd",1);
// 如果没有指定排序字段,则默认按照"id"字段进行排序
if(params.get("orderBy")==null || params.get("orderBy")==""){ if(params.get("orderBy")==null || params.get("orderBy")==""){
params.put("orderBy","id"); params.put("orderBy","id");
} }
// 调用用户服务层的方法查询分页数据
PageUtils page = yonghuService.queryPage(params); PageUtils page = yonghuService.queryPage(params);
// 获取分页数据中的用户视图列表(可能是用于展示给前端的特定格式数据)
//字典表数据转换 //字典表数据转换
List<YonghuView> list =(List<YonghuView>)page.getList(); List<YonghuView> list =(List<YonghuView>)page.getList();
// 遍历用户视图列表,对每个用户数据进行字典表数据转换操作
for(YonghuView c:list){ for(YonghuView c:list){
//修改对应字典表字段 //修改对应字典表字段
dictionaryService.dictionaryConvert(c, request); dictionaryService.dictionaryConvert(c, request);
@ -84,16 +100,25 @@ public class YonghuController {
} }
/** /**
* *
*/ * ID
* @param id ID
* @param request HttpServletRequest
* @return R
*/
@RequestMapping("/info/{id}") @RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){ public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id); logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
// 根据ID从数据库中查询用户实体信息
YonghuEntity yonghu = yonghuService.selectById(id); YonghuEntity yonghu = yonghuService.selectById(id);
if(yonghu !=null){ if(yonghu !=null){
//entity转view //entity转view
// 创建用户视图对象,用于转换和返回给前端展示的数据格式
YonghuView view = new YonghuView(); YonghuView view = new YonghuView();
// 将用户实体中的数据复制到用户视图对象中,实现数据格式转换
BeanUtils.copyProperties( yonghu , view );//把实体数据重构到view中 BeanUtils.copyProperties( yonghu , view );//把实体数据重构到view中
// 对用户视图对象中的相关字典表字段进行数据转换操作
//修改对应字典表字段 //修改对应字典表字段
dictionaryService.dictionaryConvert(view, request); dictionaryService.dictionaryConvert(view, request);
@ -105,15 +130,22 @@ public class YonghuController {
} }
/** /**
* *
*/ * 使
* @param yonghu YonghuEntity
* @param request HttpServletRequest
* @return R使
*/
@RequestMapping("/save") @RequestMapping("/save")
public R save(@RequestBody YonghuEntity yonghu, HttpServletRequest request){ public R save(@RequestBody YonghuEntity yonghu, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,yonghu:{}",this.getClass().getName(),yonghu.toString()); logger.debug("save方法:,,Controller:{},,yonghu:{}",this.getClass().getName(),yonghu.toString());
String role = String.valueOf(request.getSession().getAttribute("role")); String role = String.valueOf(request.getSession().getAttribute("role"));
// 此处条件永远为假,实际应该不会进入该分支,可能是预留逻辑待完善
if(false) if(false)
return R.error(511,"永远不会进入"); return R.error(511,"永远不会进入");
// 创建查询条件包装器用于构建查询用户名或手机号是否已存在且未被删除的用户的SQL条件
Wrapper<YonghuEntity> queryWrapper = new EntityWrapper<YonghuEntity>() Wrapper<YonghuEntity> queryWrapper = new EntityWrapper<YonghuEntity>()
.eq("username", yonghu.getUsername()) .eq("username", yonghu.getUsername())
@ -124,11 +156,15 @@ public class YonghuController {
; ;
logger.info("sql语句:"+queryWrapper.getSqlSegment()); logger.info("sql语句:"+queryWrapper.getSqlSegment());
// 根据构建的查询条件查询是否已存在相同用户名或手机号的用户
YonghuEntity yonghuEntity = yonghuService.selectOne(queryWrapper); YonghuEntity yonghuEntity = yonghuService.selectOne(queryWrapper);
if(yonghuEntity==null){ if(yonghuEntity==null){
yonghu.setYonghuDelete(1); yonghu.setYonghuDelete(1);
// 设置用户的逻辑删除标识为未删除这里假设1表示未删除
yonghu.setCreateTime(new Date()); yonghu.setCreateTime(new Date());
// 设置默认密码(实际应用中可能需要更安全的密码处理方式)
yonghu.setPassword("123456"); yonghu.setPassword("123456");
// 将新用户信息插入到数据库中
yonghuService.insert(yonghu); yonghuService.insert(yonghu);
return R.ok(); return R.ok();
}else { }else {
@ -137,8 +173,13 @@ public class YonghuController {
} }
/** /**
* *
*/ * 使
* @param yonghu YonghuEntity
* @param request HttpServletRequest
* @return R使
*/
@RequestMapping("/update") @RequestMapping("/update")
public R update(@RequestBody YonghuEntity yonghu, HttpServletRequest request){ public R update(@RequestBody YonghuEntity yonghu, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,yonghu:{}",this.getClass().getName(),yonghu.toString()); logger.debug("update方法:,,Controller:{},,yonghu:{}",this.getClass().getName(),yonghu.toString());
@ -158,12 +199,14 @@ public class YonghuController {
; ;
logger.info("sql语句:"+queryWrapper.getSqlSegment()); logger.info("sql语句:"+queryWrapper.getSqlSegment());
// 根据构建的查询条件查询是否已存在符合条件的用户
YonghuEntity yonghuEntity = yonghuService.selectOne(queryWrapper); YonghuEntity yonghuEntity = yonghuService.selectOne(queryWrapper);
// 如果用户的照片字段为空字符串或"null"则将其设置为null可能是为了符合数据库存储要求
if("".equals(yonghu.getYonghuPhoto()) || "null".equals(yonghu.getYonghuPhoto())){ if("".equals(yonghu.getYonghuPhoto()) || "null".equals(yonghu.getYonghuPhoto())){
yonghu.setYonghuPhoto(null); yonghu.setYonghuPhoto(null);
} }
if(yonghuEntity==null){ if(yonghuEntity==null){
yonghuService.updateById(yonghu);//根据id更新 yonghuService.updateById(yonghu);// 根据用户ID更新数据库中的用户信息
return R.ok(); return R.ok();
}else { }else {
return R.error(511,"账户或者手机号已经被使用"); return R.error(511,"账户或者手机号已经被使用");
@ -171,10 +214,13 @@ public class YonghuController {
} }
/** /**
* *
*/ * 2
* @param ids ID
* @return R
*/
@RequestMapping("/delete") @RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){ public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString()); logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
@ -194,34 +240,48 @@ public class YonghuController {
/** /**
* *
* Excel.xls
* @param fileName Excel
* @param request HttpServletRequestID
* @return R
*/ */
@RequestMapping("/batchInsert") @RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){ public R save( String fileName, HttpServletRequest request){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName); logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
// 从会话中获取当前用户ID并转换为整数类型
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))); Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try { try {
List<YonghuEntity> yonghuList = new ArrayList<>();//上传的东西 List<YonghuEntity> yonghuList = new ArrayList<>();//上传的东西
// 用于存储要查询是否重复的字段及对应的值,以字段名为键,值的列表为值
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段 Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
Date date = new Date(); Date date = new Date();
int lastIndexOf = fileName.lastIndexOf("."); int lastIndexOf = fileName.lastIndexOf(".");
// 如果文件名没有后缀,返回错误信息
if(lastIndexOf == -1){ if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀"); return R.error(511,"该文件没有后缀");
}else{ }else{
String suffix = fileName.substring(lastIndexOf); String suffix = fileName.substring(lastIndexOf);
// 如果文件后缀不是.xls返回错误信息表明只支持该后缀的Excel文件
if(!".xls".equals(suffix)){ if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件"); return R.error(511,"只支持后缀为xls的excel文件");
}else{ }else{
// 获取指定文件名对应的文件资源路径
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径 URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
File file = new File(resource.getFile()); File file = new File(resource.getFile());
// 如果文件不存在,返回错误信息,提示联系管理员
if(!file.exists()){ if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员"); return R.error(511,"找不到上传文件,请联系管理员");
}else{ }else{
// 使用工具类读取Excel文件中的数据返回二维列表每一行表示一条数据
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件 List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
// 删除第一行数据,通常第一行是标题行等提示信息,不需要插入数据库
dataList.remove(0);//删除第一行,因为第一行是提示 dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){ for(List<String> data:dataList){
//循环 //循环
YonghuEntity yonghuEntity = new YonghuEntity(); YonghuEntity yonghuEntity = new YonghuEntity();
// 以下是对用户实体各字段的赋值操作目前都被注释掉了可能需要根据实际Excel文件中的列顺序和数据内容进行正确赋值
// yonghuEntity.setUsername(data.get(0)); //账户 要改的 // yonghuEntity.setUsername(data.get(0)); //账户 要改的
// //yonghuEntity.setPassword("123456");//密码 // //yonghuEntity.setPassword("123456");//密码
// yonghuEntity.setYonghuName(data.get(0)); //用户姓名 要改的 // yonghuEntity.setYonghuName(data.get(0)); //用户姓名 要改的
@ -235,8 +295,8 @@ public class YonghuController {
yonghuList.add(yonghuEntity); yonghuList.add(yonghuEntity);
//把要查询是否重复的字段放入map中 // 把要查询是否重复的字段用户名和手机号放入seachFields中用于后续重复性检查
//账户 // 处理用户名字段
if(seachFields.containsKey("username")){ if(seachFields.containsKey("username")){
List<String> username = seachFields.get("username"); List<String> username = seachFields.get("username");
username.add(data.get(0));//要改的 username.add(data.get(0));//要改的
@ -245,7 +305,7 @@ public class YonghuController {
username.add(data.get(0));//要改的 username.add(data.get(0));//要改的
seachFields.put("username",username); seachFields.put("username",username);
} }
//手机号 // 处理手机号字段
if(seachFields.containsKey("yonghuPhone")){ if(seachFields.containsKey("yonghuPhone")){
List<String> yonghuPhone = seachFields.get("yonghuPhone"); List<String> yonghuPhone = seachFields.get("yonghuPhone");
yonghuPhone.add(data.get(0));//要改的 yonghuPhone.add(data.get(0));//要改的
@ -258,93 +318,138 @@ public class YonghuController {
//查询是否重复 //查询是否重复
//账户 //账户
// 根据从Excel文件中读取的数据里的用户名去数据库查询是否存在已逻辑删除这里假设逻辑删除标识为1表示未删除的同名用户
List<YonghuEntity> yonghuEntities_username = yonghuService.selectList(new EntityWrapper<YonghuEntity>().in("username", seachFields.get("username")).eq("yonghu_delete", 1)); List<YonghuEntity> yonghuEntities_username = yonghuService.selectList(new EntityWrapper<YonghuEntity>().in("username", seachFields.get("username")).eq("yonghu_delete", 1));
// 如果查询到的同名用户数量大于0说明存在重复的用户名
if(yonghuEntities_username.size() >0 ){ if(yonghuEntities_username.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>(); ArrayList<String> repeatFields = new ArrayList<>();
// 遍历查询到的同名用户列表将他们的用户名添加到repeatFields列表中
for(YonghuEntity s:yonghuEntities_username){ for(YonghuEntity s:yonghuEntities_username){
repeatFields.add(s.getUsername()); repeatFields.add(s.getUsername());
} }
// 返回错误信息,提示数据库中该表的[账户]字段已经存在,并列出重复的用户名数据
return R.error(511,"数据库的该表中的 [账户] 字段已经存在 存在数据为:"+repeatFields.toString()); return R.error(511,"数据库的该表中的 [账户] 字段已经存在 存在数据为:"+repeatFields.toString());
} }
//手机号 // 根据从Excel文件中读取的数据里的手机号去数据库查询是否存在已逻辑删除这里假设逻辑删除标识为1表示未删除的同手机号用户
List<YonghuEntity> yonghuEntities_yonghuPhone = yonghuService.selectList(new EntityWrapper<YonghuEntity>().in("yonghu_phone", seachFields.get("yonghuPhone")).eq("yonghu_delete", 1)); List<YonghuEntity> yonghuEntities_yonghuPhone = yonghuService.selectList(new EntityWrapper<YonghuEntity>().in("yonghu_phone", seachFields.get("yonghuPhone")).eq("yonghu_delete", 1));
// 如果查询到的同手机号用户数量大于0说明存在重复的手机号
if(yonghuEntities_yonghuPhone.size() >0 ){ if(yonghuEntities_yonghuPhone.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>(); ArrayList<String> repeatFields = new ArrayList<>();
for(YonghuEntity s:yonghuEntities_yonghuPhone){ for(YonghuEntity s:yonghuEntities_yonghuPhone){
repeatFields.add(s.getYonghuPhone()); repeatFields.add(s.getYonghuPhone());
} }
// 返回错误信息,提示数据库中该表的[手机号]字段已经存在,并列出重复的手机号数据
return R.error(511,"数据库的该表中的 [手机号] 字段已经存在 存在数据为:"+repeatFields.toString()); return R.error(511,"数据库的该表中的 [手机号] 字段已经存在 存在数据为:"+repeatFields.toString());
} }
// 经过上述重复性检查后如果没有重复数据则批量将从Excel文件中读取并整理好的用户数据列表插入到数据库中
yonghuService.insertBatch(yonghuList); yonghuService.insertBatch(yonghuList);
return R.ok(); return R.ok();
} }
} }
} }
}catch (Exception e){ }catch (Exception e){
// 如果在上述批量插入等操作过程中出现异常,打印异常堆栈信息方便排查问题
e.printStackTrace(); e.printStackTrace();
// 返回错误信息,提示批量插入数据出现异常,并建议联系管理员处理
return R.error(511,"批量插入数据异常,请联系管理员"); return R.error(511,"批量插入数据异常,请联系管理员");
} }
} }
/** /**
* *
*/ * Token
@IgnoreAuth * @param username
* @param password
* @param captcha
* @param request HttpServletRequest
* @return RTokenID
*/
@IgnoreAuth // 该注解可能表示此登录接口不需要进行权限认证(具体取决于该注解的实际定义和功能)
@RequestMapping(value = "/login") @RequestMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) { public R login(String username, String password, String captcha, HttpServletRequest request) {
// 根据传入的用户名从数据库中查询对应的用户实体信息
YonghuEntity yonghu = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("username", username)); YonghuEntity yonghu = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("username", username));
if(yonghu==null || !yonghu.getPassword().equals(password)) // 如果查询到的用户为null即用户名不存在或者密码不匹配返回账号或密码不正确的错误信息
if (yonghu == null ||!yonghu.getPassword().equals(password))
return R.error("账号或密码不正确"); return R.error("账号或密码不正确");
else if(yonghu.getYonghuDelete() != 1) // 如果用户的逻辑删除标识不为1这里假设1表示未删除即账户已被删除返回账户已被删除的错误信息
else if (yonghu.getYonghuDelete()!= 1)
return R.error("账户已被删除"); return R.error("账户已被删除");
// // 获取监听器中的字典表 // 以下几行代码被注释掉了,可能原本是用于获取字典表相关数据进行后续处理的逻辑,目前未生效
// 获取当前Web应用上下文的ServletContext对象用于获取应用范围内共享的数据比如字典表数据等
// ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext(); // ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
// Map<String, Map<Integer, String>> dictionaryMap= (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap"); // 从ServletContext中获取名为"dictionaryMap"的属性该属性可能是一个嵌套的Map结构外层键是字典类型内层键值对是字典代码和对应的名称等信息
// Map<String, Map<Integer, String>> dictionaryMap = (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");
// 从字典表数据中获取名为"role_types"的字典类型对应的内层Map可能是用于获取角色相关的字典信息如角色代码和角色名称的对应关系等
// Map<Integer, String> role_types = dictionaryMap.get("role_types"); // Map<Integer, String> role_types = dictionaryMap.get("role_types");
// role_types.get(.getRoleTypes()); // 根据用户ID、用户名、用户类型等信息生成用户登录的Token具体生成逻辑在TokenService中实现
String token = tokenService.generateToken(yonghu.getId(),username, "yonghu", "用户"); String token = tokenService.generateToken(yonghu.getId(), username, "yonghu", "用户");
R r = R.ok(); R r = R.ok();
// 将生成的Token放入返回结果对象中
r.put("token", token); r.put("token", token);
r.put("role","用户"); // 将用户角色放入返回结果对象中,这里固定为"用户"
r.put("username",yonghu.getYonghuName()); r.put("role", "用户");
r.put("tableName","yonghu"); // 将用户的真实姓名假设YonghuEntity中的YonghuName字段表示真实姓名放入返回结果对象中
r.put("userId",yonghu.getId()); r.put("username", yonghu.getYonghuName());
// 将用户所属表名放入返回结果对象中,这里固定为"yonghu"
r.put("tableName", "yonghu");
// 将用户ID放入返回结果对象中
r.put("userId", yonghu.getId());
return r; return r;
} }
/** /**
* *
*/ * 使使
@IgnoreAuth * @param yonghu YonghuEntity
* @return R使
*/
@IgnoreAuth // 该注解可能表示此注册接口不需要进行权限认证(具体取决于该注解的实际定义和功能)
@PostMapping(value = "/register") @PostMapping(value = "/register")
public R register(@RequestBody YonghuEntity yonghu){ public R register(@RequestBody YonghuEntity yonghu) {
// ValidatorUtils.validateEntity(user); // 以下这行代码被注释掉了,可能原本是用于对传入的用户实体进行数据合法性验证的逻辑,目前未生效
// ValidatorUtils.validateEntity(user);
// 创建查询条件包装器用于构建查询用户名或手机号是否已存在且未被删除的用户的SQL条件
Wrapper<YonghuEntity> queryWrapper = new EntityWrapper<YonghuEntity>() Wrapper<YonghuEntity> queryWrapper = new EntityWrapper<YonghuEntity>()
.eq("username", yonghu.getUsername()) .eq("username", yonghu.getUsername())
.or() .or()
.eq("yonghu_phone", yonghu.getYonghuPhone()) .eq("yonghu_phone", yonghu.getYonghuPhone())
.andNew() .andNew()
.eq("yonghu_delete", 1) .eq("yonghu_delete", 1);
; // 根据构建的查询条件查询是否已存在相同用户名或手机号的用户
YonghuEntity yonghuEntity = yonghuService.selectOne(queryWrapper); YonghuEntity yonghuEntity = yonghuService.selectOne(queryWrapper);
if(yonghuEntity != null) // 如果已存在相同用户名或手机号的用户,返回账户或者手机号已经被使用的错误信息
if (yonghuEntity!= null)
return R.error("账户或者手机号已经被使用"); return R.error("账户或者手机号已经被使用");
// 设置新用户的初始余额为0.0(可能根据业务需求设定的初始值)
yonghu.setNewMoney(0.0); yonghu.setNewMoney(0.0);
// 设置新用户的逻辑删除标识为未删除这里假设1表示未删除
yonghu.setYonghuDelete(1); yonghu.setYonghuDelete(1);
// 设置新用户的创建时间为当前时间
yonghu.setCreateTime(new Date()); yonghu.setCreateTime(new Date());
// 将新用户信息插入到数据库中
yonghuService.insert(yonghu); yonghuService.insert(yonghu);
return R.ok(); return R.ok();
} }
/** /**
* *
* ID"123456"
* @param id ID
* @return R
*/ */
@GetMapping(value = "/resetPassword") @GetMapping(value = "/resetPassword")
public R resetPassword(Integer id){ public R resetPassword(Integer id) {
YonghuEntity yonghu = new YonghuEntity(); YonghuEntity yonghu = new YonghuEntity();
// 设置要重置的密码为"123456"
yonghu.setPassword("123456"); yonghu.setPassword("123456");
// 设置要重置密码的用户ID
yonghu.setId(id); yonghu.setId(id);
// 根据用户ID更新数据库中对应的用户密码信息
yonghuService.updateById(yonghu); yonghuService.updateById(yonghu);
return R.ok(); return R.ok();
} }
@ -352,124 +457,177 @@ public class YonghuController {
/** /**
* *
* 123456
* @param username
* @param request HttpServletRequest使
* @return R
*/ */
@IgnoreAuth @IgnoreAuth
@RequestMapping(value = "/resetPass") @RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request) { public R resetPass(String username, HttpServletRequest request) {
// 根据传入的用户名从数据库中查询对应的用户实体信息
YonghuEntity yonghu = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("username", username)); YonghuEntity yonghu = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("username", username));
if(yonghu!=null){ // 如果查询到对应的用户实体信息不为null说明该用户存在
if (yonghu!= null) {
// 将用户的密码设置为固定值“123456”实际中这样直接设置密码不太安全可后续优化为更安全的重置逻辑
yonghu.setPassword("123456"); yonghu.setPassword("123456");
// 通过用户服务层的方法根据用户实体中的ID已设置好更新数据库中该用户的密码信息并获取更新操作的结果true表示更新成功false表示更新失败
boolean b = yonghuService.updateById(yonghu); boolean b = yonghuService.updateById(yonghu);
if(!b){ // 如果更新操作失败即b为false返回相应的错误信息
return R.error(); if (!b) {
return R.error();
} }
}else{ } else {
return R.error("账号不存在"); // 如果根据用户名未查询到对应的用户,返回账号不存在的错误信息
return R.error("账号不存在");
} }
// 如果密码重置并更新数据库操作都成功,返回操作成功的结果信息
return R.ok(); return R.ok();
} }
/** /**
* session * session
*/ * SessionIDID
* @param request HttpServletRequestID
* @return R
*/
@RequestMapping("/session") @RequestMapping("/session")
public R getCurrYonghu(HttpServletRequest request){ public R getCurrYonghu(HttpServletRequest request) {
Integer id = (Integer)request.getSession().getAttribute("userId"); // 从当前请求的会话中获取名为“userId”的属性值并转换为整数类型该值作为用户的唯一标识用于后续查询用户信息
Integer id = (Integer) request.getSession().getAttribute("userId");
// 根据获取到的用户ID从数据库中查询对应的用户实体信息
YonghuEntity yonghu = yonghuService.selectById(id); YonghuEntity yonghu = yonghuService.selectById(id);
if(yonghu !=null){ // 如果查询到的用户实体信息不为null说明找到了对应的用户
//entity转view if (yonghu!= null) {
// 创建一个用户视图对象,用于转换和返回适合前端展示的数据格式
YonghuView view = new YonghuView(); YonghuView view = new YonghuView();
BeanUtils.copyProperties( yonghu , view );//把实体数据重构到view中 // 使用Spring提供的BeanUtils工具类将用户实体中的数据复制到用户视图对象中实现数据格式的转换
BeanUtils.copyProperties(yonghu, view);
//修改对应字典表字段 // 调用字典服务层的方法对用户视图对象中的相关字典表字段进行数据转换操作,使数据格式更符合前端展示需求
dictionaryService.dictionaryConvert(view, request); dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view); return R.ok().put("data", view);
}else { } else {
return R.error(511,"查不到数据"); // 如果根据用户ID未查询到对应的用户返回查不到数据的错误信息错误码为511具体含义由业务定义
return R.error(511, "查不到数据");
} }
} }
/** /**
* 退 * 退
*/ * 退使
* @param request HttpServletRequest
* @return R退
*/
@GetMapping(value = "logout") @GetMapping(value = "logout")
public R logout(HttpServletRequest request) { public R logout(HttpServletRequest request) {
// 调用HttpServletRequest对象的invalidate方法使当前会话失效即清除会话中存储的用户登录等相关信息
request.getSession().invalidate(); request.getSession().invalidate();
// 返回操作成功的结果信息,并附带“退出成功”的提示内容
return R.ok("退出成功"); return R.ok("退出成功");
} }
/** /**
* *
*/ * "id"
* @IgnoreAuth 访
* @param params Map
* @param request HttpServletRequest使
* @return R
*/
@IgnoreAuth @IgnoreAuth
@RequestMapping("/list") @RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){ public R list(@RequestParam Map<String, Object> params, HttpServletRequest request) {
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); logger.debug("list方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
// 没有指定排序字段就默认id倒序 // 判断传入的参数中排序字段是否为空,如果为空(即没有指定排序字段),则将排序字段设置为"id",表示默认按照"id"字段进行倒序排序此处未明确体现倒序逻辑可能在PageUtils或相关数据库查询逻辑中处理
if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){ if (StringUtil.isEmpty(String.valueOf(params.get("orderBy")))) {
params.put("orderBy","id"); params.put("orderBy", "id");
} }
// 调用用户服务层的queryPage方法传入参数params用于查询符合条件的分页用户数据返回的PageUtils对象包含了分页相关信息以及用户数据列表等内容。
PageUtils page = yonghuService.queryPage(params); PageUtils page = yonghuService.queryPage(params);
//字典表数据转换 // 获取分页数据中的用户视图列表可能是用于展示给前端的特定格式数据这里将PageUtils中的用户数据列表取出并强转类型为List<YonghuView>。
List<YonghuView> list =(List<YonghuView>)page.getList(); List<YonghuView> list = (List<YonghuView>) page.getList();
for(YonghuView c:list) // 遍历用户视图列表对每个用户数据进行字典表数据转换操作调用dictionaryService的dictionaryConvert方法来处理目的是使展示的数据符合字典表相关的业务格式要求。
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段 for (YonghuView c : list)
dictionaryService.dictionaryConvert(c, request);
return R.ok().put("data", page); return R.ok().put("data", page);
} }
/** /**
* *
*/ * ID
* @param id ID{id}
* @param request HttpServletRequest使
* @return R
*/
@RequestMapping("/detail/{id}") @RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id, HttpServletRequest request){ public R detail(@PathVariable("id") Long id, HttpServletRequest request) {
logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id); logger.debug("detail方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
// 通过用户服务层的selectById方法根据传入的用户ID从数据库中查询对应的用户实体信息。
YonghuEntity yonghu = yonghuService.selectById(id); YonghuEntity yonghu = yonghuService.selectById(id);
if(yonghu !=null){ if (yonghu!= null) {
// 创建一个用户视图对象,用于将从数据库查询到的用户实体数据转换为适合前端展示的数据格式。
YonghuView view = new YonghuView();
// 使用Spring提供的BeanUtils工具类将用户实体中的数据复制到用户视图对象中实现数据格式的转换比如将实体中的各个属性值对应复制到视图对象的相应属性中。
BeanUtils.copyProperties(yonghu, view);
//entity转view // 调用字典服务层的dictionaryConvert方法对用户视图对象中的相关字典表字段进行数据转换操作使数据格式更符合前端展示需求比如将字典代码转换为对应的字典名称等。
YonghuView view = new YonghuView(); dictionaryService.dictionaryConvert(view, request);
BeanUtils.copyProperties( yonghu , view );//把实体数据重构到view中 return R.ok().put("data", view);
} else {
//修改对应字典表字段 // 如果根据传入的用户ID未查询到对应的用户返回查不到数据的错误信息错误码为511具体含义由业务定义
dictionaryService.dictionaryConvert(view, request); return R.error(511, "查不到数据");
return R.ok().put("data", view); }
}else {
return R.error(511,"查不到数据");
}
} }
/** /**
* *
*/ * 使1使
* @param yonghu YonghuEntity
* @param request HttpServletRequest使
* @return R使
*/
@RequestMapping("/add") @RequestMapping("/add")
public R add(@RequestBody YonghuEntity yonghu, HttpServletRequest request){ public R add(@RequestBody YonghuEntity yonghu, HttpServletRequest request) {
logger.debug("add方法:,,Controller:{},,yonghu:{}",this.getClass().getName(),yonghu.toString()); logger.debug("add方法:,,Controller:{},,yonghu:{}", this.getClass().getName(), yonghu.toString());
// 创建查询条件包装器用于构建查询用户名或手机号是否已存在且未被删除的用户的SQL条件通过使用EntityWrapper来方便地构建数据库查询条件。
Wrapper<YonghuEntity> queryWrapper = new EntityWrapper<YonghuEntity>() Wrapper<YonghuEntity> queryWrapper = new EntityWrapper<YonghuEntity>()
.eq("username", yonghu.getUsername()) .eq("username", yonghu.getUsername())
.or() .or()
.eq("yonghu_phone", yonghu.getYonghuPhone()) .eq("yonghu_phone", yonghu.getYonghuPhone())
.andNew() .andNew()
.eq("yonghu_delete", 1) .eq("yonghu_delete", 1);
;
logger.info("sql语句:"+queryWrapper.getSqlSegment()); logger.info("sql语句:" + queryWrapper.getSqlSegment());
// 根据构建的查询条件查询是否已存在相同用户名或手机号的用户调用用户服务层的selectOne方法执行查询操作返回符合条件的用户实体对象若存在否则返回null。
YonghuEntity yonghuEntity = yonghuService.selectOne(queryWrapper); YonghuEntity yonghuEntity = yonghuService.selectOne(queryWrapper);
if(yonghuEntity==null){ if (yonghuEntity == null) {
// 设置新用户的逻辑删除标识为未删除这里假设1表示未删除表示该用户数据为有效可用状态。
yonghu.setYonghuDelete(1); yonghu.setYonghuDelete(1);
// 设置新用户的创建时间为当前时间通过创建一个新的Date对象来表示当前时刻。
yonghu.setCreateTime(new Date()); yonghu.setCreateTime(new Date());
yonghu.setPassword("123456"); // 设置新用户的默认密码为"123456",实际应用中可能需要更安全的密码设置方式,比如密码加密等操作。
yonghuService.insert(yonghu); yonghu.setPassword("123456");
// 将包含完整信息的新用户实体对象插入到数据库中调用用户服务层的insert方法执行插入操作。
yonghuService.insert(yonghu);
return R.ok(); return R.ok();
}else { } else {
return R.error(511,"账户或者手机号已经被使用"); // 如果查询到已存在相同用户名或手机号的用户返回账户或者手机号已经被使用的错误信息错误码为511具体含义由业务定义
return R.error(511, "账户或者手机号已经被使用");
} }
} }

@ -11,11 +11,39 @@ import com.entity.view.DictionaryView;
/** /**
* Dao * Dao
* * MyBatis Plus
* @author * `BaseMapper`
*
* `BaseMapper`
*
* 便
* @author
*/ */
public interface DictionaryDao extends BaseMapper<DictionaryEntity> { public interface DictionaryDao extends BaseMapper<DictionaryEntity> {
List<DictionaryView> selectListView(Pagination page,@Param("params")Map<String,Object> params); /**
*
} *
*
*
* `DictionaryView`
* `DictionaryView`
* 使
*
* @param page `Pagination`
*
*
* @param params `Map`
*
* 便
*
* @return `List<DictionaryView>`
*
* `DictionaryView`
*
*
*
* 便
*/
List<DictionaryView> selectListView(Pagination page, @Param("params") Map<String, Object> params);
}

@ -9,11 +9,11 @@ import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import com.entity.view.ForumView; import com.entity.view.ForumView;
/** //**
* Dao //* 论坛 Dao 接口
* //*
* @author //* @author
*/ //*/
public interface ForumDao extends BaseMapper<ForumEntity> { public interface ForumDao extends BaseMapper<ForumEntity> {
List<ForumView> selectListView(Pagination page,@Param("params")Map<String,Object> params); List<ForumView> selectListView(Pagination page,@Param("params")Map<String,Object> params);

@ -9,11 +9,11 @@ import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import com.entity.view.NewsView; import com.entity.view.NewsView;
/** //**
* Dao // 公告信息 Dao 接口
* //*
* @author //* @author
*/ //*/
public interface NewsDao extends BaseMapper<NewsEntity> { public interface NewsDao extends BaseMapper<NewsEntity> {
List<NewsView> selectListView(Pagination page,@Param("params")Map<String,Object> params); List<NewsView> selectListView(Pagination page,@Param("params")Map<String,Object> params);

@ -1,4 +1,3 @@
package com.dao; package com.dao;
import java.util.List; import java.util.List;
@ -12,11 +11,53 @@ import com.entity.TokenEntity;
/** /**
* token * token
* `token` 访DAO
* MyBatis Plus `BaseMapper`
* `BaseMapper`
*
* `token`
* `token`
* 便 `token`
*/ */
public interface TokenDao extends BaseMapper<TokenEntity> { public interface TokenDao extends BaseMapper<TokenEntity> {
/**
* Wrapper `TokenEntity`
* Wrapper MyBatis Plus
*
* `Wrapper<TokenEntity>`
* `token`
* `TokenEntity`
*
* @param wrapper
* `TokenEntity`
* `token`
* `token`
* `token`
* @return `TokenEntity`
* `TokenEntity` `token`
* 便 `token`
*/
List<TokenEntity> selectListView(@Param("ew") Wrapper<TokenEntity> wrapper); List<TokenEntity> selectListView(@Param("ew") Wrapper<TokenEntity> wrapper);
List<TokenEntity> selectListView(Pagination page,@Param("ew") Wrapper<TokenEntity> wrapper); /**
* Wrapper `TokenEntity`
} *
* `token`
*
* 便 `token`
*
* @param page `Pagination`
*
*
*
* @param wrapper
* `token`
* 使
* `token`
* @return `TokenEntity`
* `token`
* 便 `token`
*/
List<TokenEntity> selectListView(Pagination page, @Param("ew") Wrapper<TokenEntity> wrapper);
}

@ -12,11 +12,34 @@ import com.entity.UsersEntity;
/** /**
* *
* 访BaseMapper<UsersEntity>
* BaseMapperID
* 便访
*
*/ */
public interface UsersDao extends BaseMapper<UsersEntity> { public interface UsersDao extends BaseMapper<UsersEntity> {
/**
*
* Wrapper<UsersEntity>
* Wrapper
* UsersEntity
* @param wrapper
*
* @return UsersEntity
*/
List<UsersEntity> selectListView(@Param("ew") Wrapper<UsersEntity> wrapper); List<UsersEntity> selectListView(@Param("ew") Wrapper<UsersEntity> wrapper);
/**
*
*
* PaginationWrapper<UsersEntity>
*
* UsersEntity
* @param page 便
* @param wrapper
* @return UsersEntity
*/
List<UsersEntity> selectListView(Pagination page, @Param("ew") Wrapper<UsersEntity> wrapper); List<UsersEntity> selectListView(Pagination page, @Param("ew") Wrapper<UsersEntity> wrapper);
} }

@ -11,11 +11,28 @@ import com.entity.view.YonghuView;
/** /**
* Dao * Dao
* BaseMapper<YonghuEntity>
* BaseMapper
* 便
* *
* @author * @author
*
*/ */
public interface YonghuDao extends BaseMapper<YonghuEntity> { public interface YonghuDao extends BaseMapper<YonghuEntity> {
List<YonghuView> selectListView(Pagination page,@Param("params")Map<String,Object> params); /**
*
* PaginationMap<String, Object>
* params
* YonghuViewYonghuView使
*
*
* @param page
* 使
* @param params Map"nameLike"
*
* @return YonghuView便
*/
List<YonghuView> selectListView(Pagination page, @Param("params") Map<String, Object> params);
} }

@ -22,212 +22,374 @@ import com.baomidou.mybatisplus.enums.IdType;
/** /**
* *
* *
* @author * `dictionary`
* `Serializable` 便
*
* @author
* @email * @email
*/ */
@TableName("dictionary") @TableName("dictionary")
public class DictionaryEntity<T> implements Serializable { public class DictionaryEntity<T> implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// **
// * 默认构造函数,用于创建一个空的 `DictionaryEntity`
// 对象实例,在需要先创建对象再逐步设置属性值的场景下使用,
// * 例如在一些复杂业务逻辑中,先实例化对象,
// 后续根据不同的数据源或条件来分别为各个属性赋值,提供了一种灵活构建对象的方式。
// */
public DictionaryEntity() {
public DictionaryEntity() { }
}
public DictionaryEntity(T t) {
try {
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// **
// * 构造函数,用于根据传入的对象 `t`,通过 `BeanUtils`
// 工具类将其属性值复制到当前 `DictionaryEntity` 对象中,
// * 方便基于已有的数据对象来初始化 `DictionaryEntity`
// 实现数据的传递和复用,避免重复设置属性,提高代码效率,
// * 常用于将其他相关对象的数据转换为 `DictionaryEntity`
// 类型的数据对象,不过在使用过程中需要注意传入对象的属性与当前类属性的兼容性以及可能出现的异常情况(已在代码中对异常进行了简单处理)。
// * @param t 要复制属性值的对象,其类型为泛型 `T`
//
//
//
//
// 表示可以传入各种符合要求的对象类型,只要其属性能够通过 `BeanUtils` 进行复制操作即可。
// */
public DictionaryEntity(T t) {
try {
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** // **
* // * 主键,用于唯一标识字典表中的每一条记录,
*/ //
// 通过 `@TableId` 注解指定该字段为主键,并设置主键的生成策略为自增长(`IdType.AUTO`
// * 在向数据库插入新记录时,系统会按照自增长规则自动为该字段赋予唯一的值,
//
// 方便在数据库操作(如查询、更新、删除等)中精准定位到特定的字典表数据行,确保数据的唯一性和可操作性。
// * @TableField 注解用于明确该字段在数据库表中对应的列名,
//
// 这里对应 `id` 列,使得对象属性与数据库表字段之间建立准确的映射关系。
// */
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
@TableField(value = "id") @TableField(value = "id")
private Integer id; private Integer id;
// **
/** // * 字段,用于存储字典表中某个条目的特定代码或者标识信息,
* //
*/ // 通过 `@TableField` 注解指定其在数据库表中对应的列名为 `dic_code`
// * 例如该字段可以是代表不同分类、类型等的代码值,
//
// 在业务逻辑中可基于此字段进行相关的查询、匹配等操作,以区分不同的字典项。
// */
@TableField(value = "dic_code") @TableField(value = "dic_code")
private String dicCode; private String dicCode;
// **
/** // * 字段名,与 `dicCode` 相对应,
* //
*/ // 用于存储该字段对应的直观的名称描述,通过 `@TableField` 注解对应数据库表中的 `dic_name` 列,
// * 方便在前端展示或者业务逻辑处理中让人更容易理解该字段所代表的含义,
//
// 例如如果 `dicCode` 是分类代码,那 `dicName` 就是具体的分类名称,增强了数据的可读性。
// */
@TableField(value = "dic_name") @TableField(value = "dic_name")
private String dicName; private String dicName;
// **
/** // * 编码,可能是对字典表中各项进行编号的一个整数值,
* //
*/ // 通过 `@TableField` 注解对应数据库表中的 `code_index` 列,
// * 用于在内部对字典项进行排序、索引或者作为另一种标识方式,
//
// 在一些需要按照特定顺序处理字典数据或者通过编号快速查找字典项的业务场景中会发挥作用。
// */
@TableField(value = "code_index") @TableField(value = "code_index")
private Integer codeIndex; private Integer codeIndex;
// **
/** // * 编码名字,与 `codeIndex` 相对应,
* //
*/ // 是对该编码所代表含义的文字描述,通过 `@TableField` 注解对应数据库表中的 `index_name` 列,
// * 同样是为了提高数据的可读性和可理解性,
//
// 便于在展示给用户或者业务逻辑处理中清晰地知晓该编码具体对应的内容。
// */
@TableField(value = "index_name") @TableField(value = "index_name")
private String indexName; private String indexName;
// **
/** // * 父字段id用于表示当前字典项在层级结构中的上级字段的唯一标识如果字典表存在层级关系的话
* id //
*/ // 通过 `@TableField` 注解对应数据库表中的 `super_id` 列,
// * 借助这个 `superId` 可以构建字典项之间的父子关联关系,
//
// 方便进行树形结构数据的展示、查询以及相关业务逻辑处理(比如查找某个分类下的子分类等情况)。
// */
@TableField(value = "super_id") @TableField(value = "super_id")
private Integer superId; private Integer superId;
// **
/** // * 备注,用于存储一些对该字典项的额外说明信息,
* //
*/ // 通过 `@TableField` 注解对应数据库表中的 `beizhu` 列,
// * 例如该项的特殊用途、适用范围、创建背景等内容,
//
// 在需要详细了解字典项相关细节或者进行一些辅助性的业务逻辑判断时,可以参考备注中的信息。
// */
@TableField(value = "beizhu") @TableField(value = "beizhu")
private String beizhu; private String beizhu;
// **
// * 创建时间,记录该字典表记录的创建时间点,
//
// 通过 `@JsonFormat` 和 `@DateTimeFormat` 注解来规范时间格式的序列化与格式化处理,
// * 确保在前后端交互以及数据存储等场景下时间格式的一致性,
//
// 同时使用 `@TableField` 注解指定其在数据库表中对应的列名为 `create_time`,并设置了 `FieldFill.INSERT` 填充策略,
// * 意味着在向数据库插入新记录时,
//
// 该字段会自动填充当前时间(通常由 MyBatis Plus 根据配置来完成),例如在按照时间顺序查询字典表数据、统计不同时间段创建的数据量等业务场景中会用到该时间信息。
// * @JsonFormat 注解用于控制在将对象转换为JSON格式时时间的显示格式
//
// 这里设置为中文(`locale="zh"`)、东八区时间(`timezone="GMT+8"`)以及指定的时间格式(`pattern="yyyy-MM-dd HH:mm:ss"`)。
// * @DateTimeFormat 注解用于在接收前端传入时间格式数据时进行解析转换。
// */
@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
/** // **
* // * 获取:主键,
*/ //
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") // 对外提供获取主键值(`id`)的方法,方便在其他类中访问该 `DictionaryEntity` 对象的主键信息,
@DateTimeFormat
@TableField(value = "create_time",fill = FieldFill.INSERT)
private Date createTime;
/** // * 例如在进行数据库查询结果映射或者业务逻辑处理中需要用到字典表记录主键时可调用此方法获取,返回对应的整数值。
* // * @return 返回主键对应的整数值。
*/ // */
public Integer getId() { public Integer getId() {
return id; return id;
} }
/**
*
*/
// **
// * 设置:主键,用于设置该对象的主键值,
//
// 通常在对象初始化或者从数据库等外部数据源加载数据后更新主键值时使用,
// * 不过由于主键一般是自增长且由数据库管理,
//
// 实际业务中手动设置的情况相对较少,但保留此方法以满足可能的特殊需求(如数据迁移等场景),
// * 通过传入对应的整数值来更新主键信息。
// * @param id 要设置的主键整数值。
// */
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/**
* // **
*/ // * 获取:字段,
//
//
// 对外提供获取字段值(`dicCode`)的方法,以便在业务逻辑中根据该字段进行相关操作,比如查询特定代码的字典项、
// * 根据代码进行匹配判断等情况时可调用此方法获取字段值,
//
// 返回对应的字符串内容。
// * @return 返回字段对应的字符串值。
// */
public String getDicCode() { public String getDicCode() {
return dicCode; return dicCode;
} }
/**
*
*/
// **
// * 设置:字段,用于更新字段值(`dicCode`
//
//
// 例如在修改字典表记录中该字段的代码内容后,调用此方法来保存新的代码信息,以反映字典项的变化。
// * @param dicCode 要设置的字段字符串值。
// */
public void setDicCode(String dicCode) { public void setDicCode(String dicCode) {
this.dicCode = dicCode; this.dicCode = dicCode;
} }
/**
* // **
*/ // * 获取:字段名,对外提供获取字段名(`dicName`)的方法,
//
//
// 在需要展示字典项的名称给用户或者在业务逻辑中基于名称进行相关处理(如筛选、排序等)时,
// * 可调用此方法获取对应的字符串内容,方便操作和展示。
// * @return 返回字段名对应的字符串值。
// */
public String getDicName() { public String getDicName() {
androidx.annotation.NonNull();
return dicName; return dicName;
} }
/**
*
*/
// **
// * 设置:字段名,用于更新字段名(`dicName`
//
// 比如对字典项的名称进行修改后,通过此方法保存新的名称信息,确保名称能准确反映字典项的实际含义。
// * @param dicName 要设置的字段名字符串值。
// */
public void setDicName(String dicName) { public void setDicName(String dicName) {
this.dicName = dicName; this.dicName = dicName;
} }
/**
* // **
*/ // * 获取:编码,对外提供获取编码值(`codeIndex`)的方法,
//
// 在涉及到按照编码进行排序、查找特定编码的字典项等业务场景中,
// * 可调用此方法获取对应的整数值,便于进行相应的业务处理。
// * @return 返回编码对应的整数值。
// */
public Integer getCodeIndex() { public Integer getCodeIndex() {
return codeIndex; return codeIndex;
} }
/**
*
*/
// **
// * 设置:编码,用于更新编码值(`codeIndex`
//
// 例如调整字典项的编号顺序或者重新分配编码后,
//
// 调用此方法来保存新的编码信息,以符合业务要求的编码规则。
// * @param codeIndex 要设置的编码整数值。
// */
public void setCodeIndex(Integer codeIndex) { public void setCodeIndex(Integer codeIndex) {
this.codeIndex = codeIndex; this.codeIndex = codeIndex;
} }
/**
* // **
*/ // * 获取:编码名字,对外提供获取编码名字(`indexName`)的方法,
//
// 在需要展示编码对应的具体含义或者基于名称进行业务逻辑处理(如匹配、筛选等)时,
// * 可调用此方法获取对应的字符串内容,增强数据的可读性和可操作性。
// * @return 返回编码名字对应的字符串值。
// */
public String getIndexName() { public String getIndexName() {
return indexName; return indexName;
} }
/**
*
*/
// **
// * 设置:编码名字,用于更新编码名字(`indexName`
//
// 比如对编码所代表的含义进行重新定义或者修改描述后,
//
// 通过此方法保存新的名称信息,
// * 以便准确传达编码的实际意义。
// * @param indexName 要设置的编码名字符串值。
// */
public void setIndexName(String indexName) { public void setIndexName(String indexName) {
this.indexName = indexName; this.indexName = indexName;
} }
/**
* id // **
*/ // * 获取父字段id对外提供获取父字段id`superId`)的方法,
//
// 在处理字典表的层级关系数据时,比如查找某个父项下的子项、
// * 判断字典项的层级归属等业务场景中,
//
//
// 可调用此方法获取对应的整数值,方便进行相关的关联操作和业务逻辑处理。
// * @return 返回父字段id对应的整数值。
// */
public Integer getSuperId() { public Integer getSuperId() {
return superId; return superId;
} }
/**
* id
*/
// **
// * 设置父字段id用于更新父字段id`superId`)的值,
//
// 例如调整字典项的层级结构、变更上级字段后通过此方法保存新的父字段id信息
// * 以正确反映字典项在层级关系中的位置变化。
// * @param superId 要设置的父字段id整数值。
// */
public void setSuperId(Integer superId) { public void setSuperId(Integer superId) {
this.superId = superId; this.superId = superId;
} }
/**
* // **
*/ // * 获取:备注,对外提供获取备注信息(`beizhu`)的方法,
//
//
// 在需要查看字典项的额外说明或者根据备注内容进行一些特殊业务逻辑判断(如判断适用范围等)时,
// * 可调用此方法获取对应的字符串内容,辅助业务处理。
// * @return 返回备注对应的字符串值。
// */
public String getBeizhu() { public String getBeizhu() {
return beizhu; return beizhu;
} }
/**
*
*/
// **
// * 设置:备注,用于更新备注信息(`beizhu`
//
// 例如添加、修改字典项的备注内容后,
//
// 通过此方法保存新的备注信息,方便后续查看和参考。
// * @param beizhu 要设置的备注字符串值。
// */
public void setBeizhu(String beizhu) { public void setBeizhu(String beizhu) {
this.beizhu = beizhu; this.beizhu = beizhu;
} }
/**
* // **
*/ // * 获取:创建时间,
//
// 对外提供获取创建时间(`createTime`)的方法,在展示字典表记录的创建时间、按照时间范围查询字典项、
// * 统计不同时间段创建的数据量等业务场景中,
//
//
// 可调用此方法获取对应的 `Date` 类型对象,用于后续的时间相关操作和展示。
// * @return 返回创建时间对应的 `Date` 类型对象。
// */
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
/**
*
*/
// **
// * 设置:创建时间,用于更新创建时间(`createTime`)的值,
//
// 不过在实际业务中通常创建时间是在记录首次创建时自动设置,较少进行手动更新,
// * 但保留此方法以满足可能的特殊需求(如数据迁移、时间校准等场景下对创建时间进行调整),
//
// 通过传入对应的 `Date` 类型对象来更新创建时间信息。
// * @param createTime 要设置的创建时间对应的 `Date` 类型对象。
// */
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
// **
// * 重写 `toString` 方法,用于返回 `DictionaryEntity`
//
// 对象的字符串表示形式,方便在调试、日志输出以及一些需要以字符串形式展示对象内容的场景中使用,
// * 按照自定义的格式将对象的各个属性值拼接成一个字符串,
//
// 使得可以直观地查看对象的属性信息,便于开发过程中的调试和问题排查等操作。
// * 返回的字符串格式形如 "Dictionary{" + "id=" + id + ", dicCode=" + dicCode + ", dicName=" + dicName + ", codeIndex=" + codeIndex + ", indexName=" + indexName + ", superId=" + superId + ", beizhu=" + beizhu + ", createTime=" + createTime + "}"
// * 其中展示了各个属性的名称和对应的值,方便快速了解对象的状态。
// */
@Override @Override
public String toString() { public String toString() {
return "Dictionary{" + return "Dictionary{" +
"id=" + id + "id=" + id +
", dicCode=" + dicCode + ", dicCode=" + dicCode +
", dicName=" + dicName + ", dicName=" + dicName +
", codeIndex=" + codeIndex + ", codeIndex=" + codeIndex +
", indexName=" + indexName + ", indexName=" + indexName +
", superId=" + superId + ", superId=" + superId +
", beizhu=" + beizhu + ", beizhu=" + beizhu +
", createTime=" + createTime + ", createTime=" + createTime +
"}"; "}";
} }
} }

@ -1,343 +1,374 @@
package com.entity; package com.entity;
// 导入MyBatis Plus中用于标识主键的注解通过设置其type属性可以指定主键的生成策略例如这里设置为IdType.AUTO表示自动增长
import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableId;
// 导入MyBatis Plus中用于指定实体类对应的数据库表名的注解使得框架能将该实体类与数据库中的相应表进行关联操作
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
// 导入用于验证字段不能为空的注解,确保对应属性在使用时有值,常用于参数校验场景,比如在接收前端传入的数据时验证是否符合要求
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
// 导入用于验证集合类型字段不能为空的注解强调对应的集合属性不能为null且不能是空集合常用于对列表等数据结构的校验
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
// 导入用于验证基本数据类型字段不能为空的注解,保证对应属性有具体的非空值,防止出现空指针等问题
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
// 导入Jackson框架的注解用于指定在序列化和反序列化过程中忽略某些属性常用于处理一些不需要展示或者不需要参与数据交互的属性
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
// 导入用于处理Java反射机制中方法调用异常的相关类在使用反射相关操作时可能会抛出此类异常需要进行捕获处理以保证程序稳定运行
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
// 导入Java的序列化接口表明该类的对象可以被序列化和反序列化方便在网络传输、持久化存储等场景下对该类的实例进行操作例如在前后端数据交互或者保存对象状态到文件等情况中使用
import java.io.Serializable; import java.io.Serializable;
// 导入Java中的日期类用于处理可能涉及到的创建时间等日期相关属性便于记录实体对象在数据库中的创建时间等信息
import java.util.Date; import java.util.Date;
// 导入Java的集合类框架中的List接口虽然在当前代码中未看到明显使用场景但可能用于后续扩展该实体类与其他集合类型数据的关联比如房间关联的多个评论列表等情况
import java.util.List; import java.util.List;
// 导入Spring框架的日期格式化注解用于在接收前端传入的日期参数或者向前端返回日期数据时按照指定格式进行转换处理使日期数据的格式符合业务要求
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
// 导入Jackson框架的另一个注解用于在序列化和反序列化日期类型数据时按照指定的格式如这里配置的"yyyy-MM-dd HH:mm:ss")进行处理,确保日期格式的一致性和准确性
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
// 导入Apache Commons BeanUtils工具类其提供了方便的方法来进行Java对象之间属性的复制操作在本类的构造函数中会使用它来进行属性赋值操作
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.BeanUtils;
// 导入MyBatis Plus中用于标识字段与数据库表字段映射关系的注解同时可以设置一些额外属性如这里的fill属性用于指定字段在插入或更新时的自动填充策略
import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableField;
// 导入MyBatis Plus中用于定义字段填充策略的枚举类型这里使用的FieldFill.INSERT表示在插入数据时自动填充指定字段常用于创建时间等字段的自动赋值
import com.baomidou.mybatisplus.enums.FieldFill; import com.baomidou.mybatisplus.enums.FieldFill;
// 导入MyBatis Plus中用于定义主键生成类型的枚举类型之前提到的IdType.AUTO就是其中一种表示自动增长的类型
import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.enums.IdType;
/** /**
* *
* "fangjian"访gettersetterSerializable便使
* *
* @author * @author // 此处应该填写作者相关信息,可能是开发人员的姓名等,但代码中未明确给出具体值
* @email * @email // 同样,此处应该填写作者的邮箱信息,代码中也未给出具体内容,用于标识代码的归属或者方便联系作者等用途
*/ */
@TableName("fangjian") @TableName("fangjian")
public class FangjianEntity<T> implements Serializable { public class FangjianEntity<T> implements Serializable {
// 定义一个序列化版本号用于在序列化和反序列化过程中保证版本的兼容性当类的结构发生变化如添加、删除字段等可以通过修改这个版本号来避免反序列化出错初始值设为1L在类相对稳定的情况下一般不需要改动
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// 默认构造函数用于创建FangjianEntity类的实例对象在一些情况下比如通过反射等方式创建对象时可能会用到它会创建一个默认状态的对象实例各个属性会使用其对应类型的默认值初始化如基本数据类型的默认初始值等
public FangjianEntity() {
public FangjianEntity() { }
}
public FangjianEntity(T t) {
try {
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 构造函数接收一个泛型类型参数t用于将传入的对象其类型由泛型T指定的属性值复制到当前FangjianEntity对象中通过BeanUtils工具类来实现属性复制方便基于已有的同类型或者兼容类型的数据构建FangjianEntity对象不过在复制过程中可能会抛出异常所以进行了异常捕获处理
public FangjianEntity(T t) {
try {
// 使用BeanUtils的copyProperties方法将t对象的属性值复制到当前对象this实现属性的赋值操作但该方法可能会抛出IllegalAccessException访问权限异常和InvocationTargetException方法调用异常所以需要进行异常捕获处理
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// 如果在属性复制过程中出现异常,打印异常堆栈信息,方便开发人员排查问题,确定是哪里出现了访问权限问题或者方法调用出错等情况
e.printStackTrace();
}
}
/** /**
* *
* @TableIdIdType.AUTO@TableField"id"
*/ */
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
@TableField(value = "id") @TableField(value = "id")
private Integer id; private Integer id;
/** /**
* *
* "标准间""豪华套房"@TableField"fangjian_name"便
*/ */
@TableField(value = "fangjian_name") @TableField(value = "fangjian_name")
private String fangjianName; private String fangjianName;
/** /**
* *
* @TableField"fangjian_photo"便
*/ */
@TableField(value = "fangjian_photo") @TableField(value = "fangjian_photo")
private String fangjianPhoto; private String fangjianPhoto;
/** /**
* *
* "海景房""主题房"@TableField"fangjian_tese"使
*/ */
@TableField(value = "fangjian_tese") @TableField(value = "fangjian_tese")
private String fangjianTese; private String fangjianTese;
/** /**
* *
* "有电视、空调、独立卫生间"@TableField"fangjian_peizhi"便
*/ */
@TableField(value = "fangjian_peizhi") @TableField(value = "fangjian_peizhi")
private String fangjianPeizhi; private String fangjianPeizhi;
/** /**
* *
* "提供免费的矿泉水、洗漱用品"@TableField"fangjian_shangpin"
*/ */
@TableField(value = "fangjian_shangpin") @TableField(value = "fangjian_shangpin")
private String fangjianShangpin; private String fangjianShangpin;
/** /**
* *
* "包含早餐服务""提供免费的客房清洁服务"@TableField"fangjian_fuwu"便
*/ */
@TableField(value = "fangjian_fuwu") @TableField(value = "fangjian_fuwu")
private String fangjianFuwu; private String fangjianFuwu;
/** /**
* *
* @TableField"fangjian_money"使便
*/ */
@TableField(value = "fangjian_money") @TableField(value = "fangjian_money")
private Double fangjianMoney; private Double fangjianMoney;
/** /**
* *
* 12@TableField"fangjian_types"便
*/ */
@TableField(value = "fangjian_types") @TableField(value = "fangjian_types")
private Integer fangjianTypes; private Integer fangjianTypes;
/** /**
* *
* @TableField"fangjian_number"便
*/ */
@TableField(value = "fangjian_number") @TableField(value = "fangjian_number")
private Integer fangjianNumber; private Integer fangjianNumber;
/** /**
* *
* @TableField"fangjian_clicknum"便
*/ */
@TableField(value = "fangjian_clicknum") @TableField(value = "fangjian_clicknum")
private Integer fangjianClicknum; private Integer fangjianClicknum;
/** /**
* *
* @TableField"fangjian_content"使便使
*/ */
@TableField(value = "fangjian_content") @TableField(value = "fangjian_content")
private String fangjianContent; private String fangjianContent;
/** /**
* *
* @JsonFormat"yyyy-MM-dd HH:mm:ss""GMT+8"@DateTimeFormat@TableFieldFieldFill.INSERT便
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT + 8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
@TableField(value = "create_time",fill = FieldFill.INSERT) @TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime; private Date createTime;
/** /**
* *
*/ * JavaBeansetterid
*/
public Integer getId() { public Integer getId() {
return id; return id;
} }
/**
*
*/
/**
*
* JavaBean访getterid
*/
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/** /**
* *
*/ * fangjianNameJavaBeansetter
*/
public String getFangjianName() { public String getFangjianName() {
return fangjianName; return fangjianName;
} }
/**
*
*/
/**
*
* JavaBean访getterfangjianName
*/
public void setFangjianName(String fangjianName) { public void setFangjianName(String fangjianName) {
this.fangjianName = fangjianName; this.fangjianName = fangjianName;
} }
/** /**
* *
*/ * fangjianPhotoJavaBeansetter
*/
public String getFangjianPhoto() { public String getFangjianPhoto() {
return fangjianPhoto; return fangjianPhoto;
} }
/**
*
*/
/**
*
* JavaBean访getterfangjianPhoto便
*/
public void setFangjianPhoto(String fangjianPhoto) { public void setFangjianPhoto(String fangjianPhoto) {
this.fangjianPhoto = fangjianPhoto; this.fangjianPhoto = fangjianPhoto;
} }
/** /**
* *
*/ * fangjianTeseJavaBeansetter
*/
public String getFangjianTese() { public String getFangjianTese() {
return fangjianTese; return fangjianTese;
} }
/**
*
*/
/**
*
* JavaBean访getterfangjianTese便
*/
public void setFangjianTese(String fangjianTese) { public void setFangjianTese(String fangjianTese) {
this.fangjianTese = fangjianTese; this.fangjianTese = fangjianTese;
} }
/** /**
* *
*/ * JavaBeanfangjianPeizhisetter
*/
public String getFangjianPeizhi() { public String getFangjianPeizhi() {
return fangjianPeizhi; return fangjianPeizhi;
} }
/**
*
*/
/**
*
* JavaBean访fangjianPeizhi便
*/
public void setFangjianPeizhi(String fangjianPeizhi) { public void setFangjianPeizhi(String fangjianPeizhi) {
this.fangjianPeizhi = fangjianPeizhi; this.fangjianPeizhi = fangjianPeizhi;
} }
/** /**
*
* fangjianShangpinJavaBeansetter /**
* *
*/ */
// 获取:提供的商品
// 按照JavaBean规范定义的访问器getter方法用于获取提供的商品fangjianShangpin属性的值。
// 外部代码(例如在前端展示房间详情页面,需要告知用户该房间原本为住客提供哪些商品的相关业务逻辑代码中)可以调用这个方法,获取当前对象注明的房间提供的商品信息,像房间是否提供免费的矿泉水、洗漱用品等内容,便于在前端展示给用户知晓,从而帮助用户更好地理解房间相关情况。
public String getFangjianShangpin() { public String getFangjianShangpin() {
return fangjianShangpin; return fangjianShangpin;
} }
/**
*
*/
// 设置:提供的商品
// 这是遵循JavaBean规范定义的用于设置提供的商品fangjianShangpin属性值的方法属于属性修改器setter方法。
// 外部代码在有新增商品种类、修改已提供商品的相关描述(比如商品品牌更换等情况)等业务场景下,需要更新房间提供商品的相关描述内容时,可以调用这个方法,传入对应的字符串内容作为新的商品描述信息,以此来更新该属性的值,确保前端展示的房间提供商品信息是最新且准确的。
public void setFangjianShangpin(String fangjianShangpin) { public void setFangjianShangpin(String fangjianShangpin) {
this.fangjianShangpin = fangjianShangpin; this.fangjianShangpin = fangjianShangpin;
} }
/**
* // 获取:提供的服务
*/ // 依据JavaBean规范定义的访问器getter方法用于获取提供的服务fangjianFuwu属性的值。
// 外部代码(在前端展示房间信息时,为了让用户从服务角度更好地理解相关房间情况,需要获取房间配套提供的服务项目信息的相关业务逻辑代码中)可以调用这个方法,获取当前对象列出的房间提供的服务信息,例如房间是否包含早餐服务、有没有免费的客房清洁服务等内容,方便在前端展示给用户,辅助用户从服务方面去理解房间相关情况。
public String getFangjianFuwu() { public String getFangjianFuwu() {
return fangjianFuwu; return fangjianFuwu;
} }
/**
*
*/
// 设置:提供的服务
// 定义了设置提供的服务fangjianFuwu属性值的方法遵循JavaBean规范里的属性修改器setter规则。
// 外部代码在业务运营过程中,当对房间配套的服务项目进行调整(比如新增了某项服务,或者取消了原有的某项服务等情况),或者根据业务需求修改服务介绍的相关文本(比如对服务内容描述进行优化等)时,可以调用这个方法,传入新的描述房间提供服务的字符串内容,来更新该属性的值,保证前端展示的房间提供服务信息与实际情况一致。
public void setFangjianFuwu(String fangjianFuwu) { public void setFangjianFuwu(String fangjianFuwu) {
this.fangjianFuwu = fangjianFuwu; this.fangjianFuwu = fangjianFuwu;
} }
/**
* // 获取:价格(天)
*/ // 按照JavaBean规范定义的访问器getter方法用于获取价格fangjianMoney属性的值该价格指的是房间每天的出租价格。
// 外部代码(比如在前端展示房间信息时,为了让用户从性价比等角度综合考虑相关房间情况,需要获取房间价格信息的相关业务逻辑代码中)可以调用这个方法,获取当前对象对应的房间每天的出租价格信息,方便在前端展示给用户查看,使得用户能够结合价格情况以及房间的其他配置、服务等信息,来全面评估房间是否符合自己的需求,比如判断价格是否符合自己的预算等。
public Double getFangjianMoney() { public Double getFangjianMoney() {
return fangjianMoney; return fangjianMoney;
} }
/**
*
*/
// 设置:价格(天)
// 定义了设置价格fangjianMoney属性值的方法遵循JavaBean规范里的属性修改器setter规则用于设置房间每天的出租价格。
// 外部代码在诸如酒店进行价格调整(根据市场行情、淡旺季等因素改变房间价格),或者根据不同的业务场景(比如针对特定客户群体设置优惠价格等情况)设定价格时,可以调用这个方法,传入相应的价格数值,以此来更新该属性的值,确保前端展示的房间价格信息是准确且符合实际业务设定的。
public void setFangjianMoney(Double fangjianMoney) { public void setFangjianMoney(Double fangjianMoney) {
this.fangjianMoney = fangjianMoney; this.fangjianMoney = fangjianMoney;
} }
/**
* // 获取:房间类型
*/ // 此为按照JavaBean规范定义的访问器getter方法用于获取房间类型fangjianTypes属性的值这里的房间类型通常是通过特定的标识如数字、代码等方式来区分不同种类的房间。
// 外部代码在前端展示房间信息时为了便于进行房间分类展示以及方便用户根据房型对房间进行分类查看和理解的相关业务逻辑代码中可以调用这个方法获取当前对象表示的房间类型信息例如用1表示单人间2表示双人间等便于前端根据不同的房型分类展示对应的房间信息使用户能够更高效地查找和查看自己关注的房型相关信息。
public Integer getFangjianTypes() { public Integer getFangjianTypes() {
return fangjianTypes; return fangjianTypes;
} }
/**
*
*/
// 设置:房间类型
// 这是遵循JavaBean规范定义的用于设置房间类型fangjianTypes属性值的方法属于属性修改器setter方法用于设置房间的类型标识。
// 外部代码在诸如酒店新增了一种房型,需要对其设定相应的类型标识,或者根据业务运营需要对已有的房间分类进行修改(比如重新调整房型分类标准等情况)时,可以调用这个方法,传入对应的房间类型标识数值,来更新该属性的值,保证前端展示的房间类型信息与实际的房型分类情况相符。
public void setFangjianTypes(Integer fangjianTypes) { public void setFangjianTypes(Integer fangjianTypes) {
this.fangjianTypes = fangjianTypes; this.fangjianTypes = fangjianTypes;
} }
/**
* // 获取:房间剩余数量
*/ // 按照JavaBean规范定义的访问器getter方法用于获取房间剩余数量fangjianNumber属性的值该属性记录的是当前房间还可预订的剩余数量。
// 外部代码(在前端展示房间信息时,为了展示房间的热门程度等相关背景信息,让用户了解房间的预订余量情况的相关业务逻辑代码中)可以调用这个方法,获取当前对象记录的房间可预订剩余数量信息,例如剩余数量少可能意味着房间比较热门,用户可以结合这个信息以及其他房间相关情况,来综合考虑是否预订该房间等情况。
public Integer getFangjianNumber() { public Integer getFangjianNumber() {
return fangjianNumber; return fangjianNumber;
} }
/**
*
*/
// 设置:房间剩余数量
// 这是遵循JavaBean规范定义的用于设置房间剩余数量fangjianNumber属性值的方法属于属性修改器setter方法用于设置房间剩余可预订的数量。
// 外部代码在出现诸如有新预订、取消预订等操作后(这些操作会导致房间剩余可预订数量发生变化),需要更新相应数值,使前端展示的信息保持准确时,可以调用这个方法,传入新的剩余数量数值,来更新该属性的值,保证前端展示的房间剩余数量信息与实际可预订情况相符。
public void setFangjianNumber(Integer fangjianNumber) { public void setFangjianNumber(Integer fangjianNumber) {
this.fangjianNumber = fangjianNumber; this.fangjianNumber = fangjianNumber;
} }
/**
* // 获取:点击次数
*/ // 依据JavaBean规范定义的访问器getter方法用于获取房间的点击次数属性fangjianClicknum的值点击次数用于统计房间信息被查看的次数。
// 外部代码(比如展示房间相关信息的业务逻辑代码或者前端交互代码等,特别是在需要呈现房间受关注程度相关情况的场景下)可以调用这个方法,来获取当前对象所代表的房间被查看的次数信息,以便根据点击次数情况进行相应的展示(比如在前端页面展示房间的热门程度排序等)或业务处理(比如基于点击次数分析房间的受欢迎程度等),辅助用户了解该房间的关注度情况。
public Integer getFangjianClicknum() { public Integer getFangjianClicknum() {
return fangjianClicknum; return fangjianClicknum;
} }
/**
*
*/
// 设置:点击次数
// 这是遵循JavaBean规范定义的修改器setter方法用于设置房间的点击次数属性fangjianClicknum的值。
// 外部代码在需要更新房间的点击次数信息时(例如每次有用户查看房间详情页面后,按照业务逻辑通常会对点击次数进行累加更新等情况),可以调用这个方法,传入相应的整数值(一般是在原有的点击次数基础上进行增加等操作)来改变该属性的值,确保点击次数数据能准确反映房间被查看的实际情况。
public void setFangjianClicknum(Integer fangjianClicknum) { public void setFangjianClicknum(Integer fangjianClicknum) {
this.fangjianClicknum = fangjianClicknum; this.fangjianClicknum = fangjianClicknum;
} }
/**
* // 获取:房间详情
*/ // 按照JavaBean的属性访问器规范定义的方法用于获取房间详情属性fangjianContent的值该属性存储的是关于房间更全面、详细的描述信息。
// 外部代码(在展示房间相关信息时,为了同时向用户呈现房间的详细情况,帮助用户更好地理解房间的具体情况的相关业务逻辑代码中)可以调用这个方法,获取到像房间布局、面积大小、装修风格等更全面的介绍内容,使得用户在考虑预订等操作时能结合房间详情信息,更深入地了解具体情况,比如判断房间是否满足自己对住宿环境等方面的需求。
public String getFangjianContent() { public String getFangjianContent() {
return fangjianContent; return fangjianContent;
} }
/**
*
*/
// 设置:房间详情
// 遵循JavaBean规范的属性修改器方法用于设置房间详情属性fangjianContent的值。
// 当需要更新房间的详细描述信息时(比如完善房间介绍、修改房间详情中的部分内容等业务场景,例如酒店重新装修后需要更新房间布局、风格等相关描述信息),外部代码可以调用这个方法,传入新的字符串内容来更新该属性的值,确保房间详情信息的准确性和及时性,使前端展示给用户的房间详情与实际情况一致。
public void setFangjianContent(String fangjianContent) { public void setFangjianContent(String fangjianContent) {
this.fangjianContent = fangjianContent; this.fangjianContent = fangjianContent;
} }
/**
* // 获取:创建时间
*/ // 这是按照JavaBean规范定义的访问器getter方法用于获取创建时间createTime属性的值该属性用于记录房间信息在数据库中首次创建的时间。
// 外部代码(例如在进行数据统计分析,查看房间信息的创建时间分布情况,或者在一些业务逻辑中需要根据创建时间来判断房间相关业务的先后顺序等场景下)可以调用这个方法,获取当前对象对应的房间创建时间信息,方便进行后续的业务处理和分析。
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
/**
*
*/
// 设置:创建时间
// 定义了设置创建时间createTime属性值的方法遵循JavaBean规范里的属性修改器setter规则用于设置房间信息在数据库中首次创建的时间值。
// 不过通常情况下,由于该属性在代码中设置了自动填充(通过@TableField(value = "create_time", fill = FieldFill.INSERT)注解指定在插入数据时自动填充当前时间),所以外部代码直接调用这个方法来设置创建时间的情况相对较少,更多是由框架在合适的时机自动赋值,但在某些特殊业务场景下(比如数据迁移、数据修复等情况)可能会用到手动设置创建时间的操作。
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
// 重写了toString()方法用于返回一个包含FangjianEntity类所有属性信息的字符串表示形式。
// 当需要将FangjianEntity对象以字符串形式展示比如在调试过程中打印对象信息、在日志中记录对象内容等场景会自动调用这个方法返回的字符串格式如"Fangjian{" + "id=" + id +...}",方便开发人员直观地查看对象各个属性的具体值情况。
@Override @Override
public String toString() { public String toString() {
return "Fangjian{" + return "Fangjian{" +
"id=" + id + "id=" + id +
", fangjianName=" + fangjianName + ", fangjianName=" + fangjianName +
", fangjianPhoto=" + fangjianPhoto + ", fangjianPhoto=" + fangjianPhoto +
", fangjianTese=" + fangjianTese + ", fangjianTese=" + fangjianTese +
", fangjianPeizhi=" + fangjianPeizhi + ", fangjianPeizhi=" + fangjianPeizhi +
", fangjianShangpin=" + fangjianShangpin + ", fangjianShangpin=" + fangjianShangpin +
", fangjianFuwu=" + fangjianFuwu + ", fangjianFuwu=" + fangjianFuwu +
", fangjianMoney=" + fangjianMoney + ", fangjianMoney=" + fangjianMoney +
", fangjianTypes=" + fangjianTypes + ", fangjianTypes=" + fangjianTypes +
", fangjianNumber=" + fangjianNumber + ", fangjianNumber=" + fangjianNumber +
", fangjianClicknum=" + fangjianClicknum + ", fangjianClicknum=" + fangjianClicknum +
", fangjianContent=" + fangjianContent + ", fangjianContent=" + fangjianContent +
", createTime=" + createTime + ", createTime=" + createTime +
"}"; "}";
} }
}

@ -1,237 +1,266 @@
package com.entity; package com.entity;
// 导入MyBatis Plus中用于标识主键的注解通过设置其type属性可以指定主键的生成策略这里设置为IdType.AUTO表示主键为自动增长类型
import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableId;
// 导入MyBatis Plus中用于指定实体类对应的数据库表名的注解使得框架能将该实体类与数据库中的相应表进行关联操作此处表明该类对应数据库中的"fangjian_liuyan"表
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
// 导入用于验证字段不能为空的注解,确保对应属性在使用时有值,常用于参数校验场景,比如在接收前端传入的数据时验证是否符合要求,这里强调对应属性不能为空白(包含空字符串、空格等情况)
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
// 导入用于验证集合类型字段不能为空的注解强调对应的集合属性不能为null且不能是空集合常用于对列表等数据结构的校验不过在当前类中暂时未看到明显相关使用场景
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
// 导入用于验证基本数据类型字段不能为空的注解,保证对应属性有具体的非空值,防止出现空指针等问题,用于确保基本数据类型属性有实际值
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
// 导入Jackson框架的注解用于指定在序列化和反序列化过程中忽略某些属性常用于处理一些不需要展示或者不需要参与数据交互的属性不过此处未明确配置忽略的属性列表
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
// 导入用于处理Java反射机制中方法调用异常的相关类在使用反射相关操作如通过BeanUtils复制属性时可能会抛出此类异常需要进行捕获处理以保证程序稳定运行
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
// 导入Java的序列化接口表明该类的对象可以被序列化和反序列化方便在网络传输、持久化存储等场景下对该类的实例进行操作例如在前后端数据交互或者保存对象状态到文件等情况中使用
import java.io.Serializable; import java.io.Serializable;
// 导入Java中的日期类用于处理评论/投诉相关的时间属性,如评论/投诉时间、回复时间、创建时间等,方便记录对应操作发生的具体时间点
import java.util.Date; import java.util.Date;
// 导入Java的集合类框架中的List接口虽然在当前代码中未看到明显使用场景但可能用于后续扩展该实体类与其他集合类型数据的关联比如可能关联多条相关回复记录等情况
import java.util.List; import java.util.List;
// 导入Spring框架的日期格式化注解用于在接收前端传入的日期参数或者向前端返回日期数据时按照指定格式进行转换处理使日期数据的格式符合业务要求
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
// 导入Jackson框架的另一个注解用于在序列化和反序列化日期类型数据时按照指定的格式如这里配置的"yyyy-MM-dd HH:mm:ss")进行处理,确保日期格式的一致性和准确性
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
// 导入Apache Commons BeanUtils工具类其提供了方便的方法来进行Java对象之间属性的复制操作在本类的构造函数中会使用它来进行属性赋值操作将传入对象的属性复制到当前对象中
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.BeanUtils;
// 导入MyBatis Plus中用于标识字段与数据库表字段映射关系的注解同时可以设置一些额外属性如这里的fill属性用于指定字段在插入或更新时的自动填充策略
import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableField;
// 导入MyBatis Plus中用于定义字段填充策略的枚举类型此处使用的FieldFill.INSERT表示在插入数据时自动填充指定字段常用于创建时间等字段的自动赋值FieldFill.UPDATE表示在更新数据时自动填充指定字段
import com.baomidou.mybatisplus.enums.FieldFill; import com.baomidou.mybatisplus.enums.FieldFill;
// 导入MyBatis Plus中用于定义主键生成类型的枚举类型之前提到的IdType.AUTO就是其中一种表示自动增长的类型
import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.enums.IdType;
/** /**
* / * /
* "fangjian_liuyan"/访gettersetterSerializable便使
* *
* @author * @author // 此处应该填写作者相关信息,可能是开发人员的姓名等,但代码中未明确给出具体值
* @email * @email // 同样,此处应该填写作者的邮箱信息,代码中也未给出具体内容,用于标识代码的归属或者方便联系作者等用途
*/ */
@TableName("fangjian_liuyan") @TableName("fangjian_liuyan")
public class FangjianLiuyanEntity<T> implements Serializable { public class FangjianLiuyanEntity<T> implements Serializable {
// 定义一个序列化版本号用于在序列化和反序列化过程中保证版本的兼容性当类的结构发生变化如添加、删除字段等可以通过修改这个版本号来避免反序列化出错初始值设为1L在类相对稳定的情况下一般不需要改动
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// 默认构造函数用于创建FangjianLiuyanEntity类的实例对象在一些情况下比如通过反射等方式创建对象时可能会用到它会创建一个默认状态的对象实例各个属性会使用其对应类型的默认值初始化如基本数据类型的默认初始值等
public FangjianLiuyanEntity() {
public FangjianLiuyanEntity() { }
}
public FangjianLiuyanEntity(T t) {
try {
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 构造函数接收一个泛型类型参数t用于将传入的对象其类型由泛型T指定的属性值复制到当前FangjianLiuyanEntity对象中通过BeanUtils工具类来实现属性复制方便基于已有的同类型或者兼容类型的数据构建FangjianLiuyanEntity对象不过在复制过程中可能会抛出异常所以进行了异常捕获处理
public FangjianLiuyanEntity(T t) {
try {
// 使用BeanUtils的copyProperties方法将t对象的属性值复制到当前对象this实现属性的赋值操作但该方法可能会抛出IllegalAccessException访问权限异常和InvocationTargetException方法调用异常所以需要进行异常捕获处理
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// 如果在属性复制过程中出现异常,打印异常堆栈信息,方便开发人员排查问题,确定是哪里出现了访问权限问题或者方法调用出错等情况
e.printStackTrace();
}
}
/** /**
* *
* /@TableIdIdType.AUTO@TableField"id"便
*/ */
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
@TableField(value = "id") @TableField(value = "id")
private Integer id; private Integer id;
/** /**
* *
* @TableField"fangjian_id"/
*/ */
@TableField(value = "fangjian_id") @TableField(value = "fangjian_id")
private Integer fangjianId; private Integer fangjianId;
/** /**
* *
* /@TableField"yonghu_id"便便/
*/ */
@TableField(value = "yonghu_id") @TableField(value = "yonghu_id")
private Integer yonghuId; private Integer yonghuId;
/** /**
* / * /
* @TableField"fangjian_liuyan_text"使/便
*/ */
@TableField(value = "fangjian_liuyan_text") @TableField(value = "fangjian_liuyan_text")
private String fangjianLiuyanText; private String fangjianLiuyanText;
/** /**
* *
* /@TableField"reply_text"便
*/ */
@TableField(value = "reply_text") @TableField(value = "reply_text")
private String replyText; private String replyText;
/** /**
* / * /
* /@JsonFormat"yyyy-MM-dd HH:mm:ss""GMT+8"@DateTimeFormat@TableFieldFieldFill.INSERT/便/
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT + 8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
@TableField(value = "insert_time",fill = FieldFill.INSERT) @TableField(value = "insert_time", fill = FieldFill.INSERT)
private Date insertTime; private Date insertTime;
/** /**
* *
* /@JsonFormat@DateTimeFormat@TableFieldFieldFill.UPDATE便便
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT + 8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
@TableField(value = "update_time",fill = FieldFill.UPDATE) @TableField(value = "update_time", fill = FieldFill.UPDATE)
private Date updateTime; private Date updateTime;
/** /**
* *
* /@TableFieldFieldFill.INSERT便/
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT + 8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
@TableField(value = "create_time",fill = FieldFill.INSERT) @TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime; private Date createTime;
/** /**
* *
*/ * JavaBeansetterid/
*/
public Integer getId() { public Integer getId() {
return id; return id;
} }
/**
*
*/
/**
*
* JavaBean访getterid/
*/
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/** /**
* *
*/ * fangjianIdJavaBeansetter/
*/
public Integer getFangjianId() { public Integer getFangjianId() {
return fangjianId; return fangjianId;
} }
/**
*
*/
/**
*
* JavaBean访getterfangjianId/便
*/
public void setFangjianId(Integer fangjianId) { public void setFangjianId(Integer fangjianId) {
this.fangjianId = fangjianId; this.fangjianId = fangjianId;
} }
/** /**
* *
*/ * yonghuIdJavaBeansetter/
*/
public Integer getYonghuId() { public Integer getYonghuId() {
return yonghuId; return yonghuId;
} }
/**
*
*/
/**
*
* JavaBean访getteryonghuId//便
*/
public void setYonghuId(Integer yonghuId) { public void setYonghuId(Integer yonghuId) {
this.yonghuId = yonghuId; this.yonghuId = yonghuId;
} }
/** /**
* / * /
*/ * /fangjianLiuyanTextJavaBeansetter///
*/
public String getFangjianLiuyanText() { public String getFangjianLiuyanText() {
return fangjianLiuyanText; return fangjianLiuyanText;
} }
/**
* /
*/
/**
* /
* JavaBean访getter/fangjianLiuyanText//便
*/
public void setFangjianLiuyanText(String fangjianLiuyanText) { public void setFangjianLiuyanText(String fangjianLiuyanText) {
this.fangjianLiuyanText = fangjianLiuyanText; this.fangjianLiuyanText = fangjianLiuyanText;
} }
/** /**
* *
*/ * JavaBeanreplyTextsetter
*/
public String getReplyText() { public String getReplyText() {
return replyText; return replyText;
} }
/**
*
*/
/**
*
* JavaBean访getterreplyText/便
*/
public void setReplyText(String replyText) { public void setReplyText(String replyText) {
this.replyText = replyText; this.replyText = replyText;
} }
/** /**
* / * /
*/ * /insertTimeJavaBeansetterDate
*/
public Date getInsertTime() { public Date getInsertTime() {
return insertTime; return insertTime;
} }
/**
* /
*/
/**
* /
* JavaBean访getter/insertTime///便
*/
public void setInsertTime(Date insertTime) { public void setInsertTime(Date insertTime) {
this.insertTime = insertTime; this.insertTime = insertTime;
} }
/**
*
*/ // 获取:回复时间
// 按照JavaBean规范定义的访问器getter方法用于获取回复时间updateTime属性的值。
// 外部代码(比如在展示房间评论/投诉相关信息时,需要呈现针对该评论/投诉的回复具体是何时做出的相关业务逻辑代码中,或者在分析回复及时性等业务场景下)可以调用这个方法,获取当前对象记录的回复操作发生的时间信息,方便进行展示以及后续的时间相关分析,例如查看回复是否及时等情况。
public Date getUpdateTime() { public Date getUpdateTime() {
return updateTime; return updateTime;
} }
/**
*
*/
// 设置:回复时间
// 定义了设置回复时间updateTime属性值的方法遵循JavaBean规范里的属性修改器setter规则。
// 通常情况下,该属性会通过框架在更新数据(例如添加或修改回复内容时)自动填充当前时间(通过@TableField(value = "update_time", fill = FieldFill.UPDATE)注解配置实现自动填充不过在一些特殊业务场景下比如数据迁移、时间数据修复等情况外部代码如负责数据维护相关的业务逻辑代码可以调用这个方法传入相应的Date类型的时间对象来更新该属性的值确保回复时间记录的准确性。
public void setUpdateTime(Date updateTime) { public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime; this.updateTime = updateTime;
} }
/**
* // 获取:创建时间
*/ // 这是按照JavaBean规范定义的访问器getter方法用于获取创建时间createTime属性的值该属性用于记录这条房间评论/投诉记录在数据库中首次被创建的时间点。
// 外部代码(例如在进行数据统计分析,查看不同时间段内房间评论/投诉记录的创建数量变化情况,或者在一些业务逻辑中需要根据创建时间来判断相关业务的先后顺序等场景下)可以调用这个方法,获取当前对象对应的创建时间信息,方便进行后续的业务处理和分析操作。
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
/**
*
*/
// 设置:创建时间
// 遵循JavaBean规范里的属性修改器setter规则定义的方法用于设置房间评论/投诉记录的创建时间createTime属性值。
// 一般来说,该属性会在插入数据时由框架自动填充当前时间(通过@TableField(value = "create_time", fill = FieldFill.INSERT)注解配置实现自动填充不过在特定的业务需求场景下比如数据迁移、历史数据修复等外部代码例如负责数据处理的相关业务逻辑代码可以调用这个方法传入对应的Date类型的时间对象来改变该属性的值以保证创建时间数据的准确性和符合实际业务要求。
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
// 重写了toString()方法用于返回一个包含FangjianLiuyanEntity类所有属性信息的字符串表示形式。
// 当需要将FangjianLiuyanEntity对象以字符串形式展示比如在调试过程中打印对象信息、在日志中记录对象内容等场景会自动调用这个方法按照指定的格式如"FangjianLiuyan{" + "id=" + id +...}")返回包含各个属性值的字符串,方便开发人员直观地查看对象各个属性的具体值情况,有助于快速定位和排查对象数据相关的问题。
@Override @Override
public String toString() { public String toString() {
return "FangjianLiuyan{" + return "FangjianLiuyan{" +
"id=" + id + "id=" + id +
", fangjianId=" + fangjianId + ", fangjianId=" + fangjianId +
", yonghuId=" + yonghuId + ", yonghuId=" + yonghuId +
", fangjianLiuyanText=" + fangjianLiuyanText + ", fangjianLiuyanText=" + fangjianLiuyanText +
", replyText=" + replyText + ", replyText=" + replyText +
", insertTime=" + insertTime + ", insertTime=" + insertTime +
", updateTime=" + updateTime + ", updateTime=" + updateTime +
", createTime=" + createTime + ", createTime=" + createTime +
"}"; "}";
} }
}

@ -1,213 +1,248 @@
package com.entity; package com.entity;
// 导入MyBatis Plus中用于标识主键的注解通过设置其type属性可以指定主键的生成策略这里设置为IdType.AUTO表示主键是自动增长类型方便数据库为每条记录自动分配唯一的标识符
import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableId;
// 导入MyBatis Plus中用于指定实体类对应的数据库表名的注解使得框架能将该实体类与数据库中的相应表进行关联操作此处表明该类对应数据库中的"fangjian_order"表,即房间预约相关的数据表
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
// 导入用于验证字段不能为空的注解,确保对应属性在使用时有值,常用于参数校验场景,比如在接收前端传入的数据时验证是否符合要求,防止出现空值导致后续业务逻辑出错
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
// 导入用于验证集合类型字段不能为空的注解强调对应的集合属性不能为null且不能是空集合不过在当前类中暂时未看到明显与之相关的使用场景更多是针对集合属性的校验保障
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
// 导入用于验证基本数据类型字段不能为空的注解,保证对应属性有具体的非空值,避免因基本数据类型属性为空引发空指针等异常情况,保障业务逻辑的正常执行
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
// 导入Jackson框架的注解用于指定在序列化和反序列化过程中忽略某些属性常用于处理一些不需要展示或者不需要参与数据交互的属性可根据业务需求灵活配置忽略的属性列表但此处未明确具体要忽略的属性
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
// 导入用于处理Java反射机制中方法调用异常的相关类在使用反射相关操作比如通过BeanUtils进行属性复制时可能会抛出此类异常所以需要进行捕获处理以保证程序稳定运行避免因异常导致程序崩溃
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
// 导入Java的序列化接口表明该类的对象可以被序列化和反序列化方便在网络传输、持久化存储等场景下对该类的实例进行操作例如在前后端数据交互或者保存对象状态到文件等情况中使用确保数据能以合适的方式进行传递和保存
import java.io.Serializable; import java.io.Serializable;
// 导入Java中的日期类用于处理与房间预约相关的各种时间属性如预约日期、创建时间等方便准确记录和操作不同时间节点的信息满足业务对时间数据的需求
import java.util.Date; import java.util.Date;
// 导入Java的集合类框架中的List接口虽然在当前代码中未看到明显使用场景但可能用于后续扩展该实体类与其他集合类型数据的关联比如可能关联多条同房间不同时间段的预约记录等情况
import java.util.List; import java.util.List;
// 导入Spring框架的日期格式化注解用于在接收前端传入的日期参数或者向前端返回日期数据时按照指定格式进行转换处理使日期数据的格式符合业务要求确保数据在交互过程中的格式一致性和准确性
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
// 导入Jackson框架的另一个注解用于在序列化和反序列化日期类型数据时按照指定的格式如这里配置的不同格式有的是"yyyy-MM-dd"用于预约日期,有的是"yyyy-MM-dd HH:mm:ss"用于创建时间等)进行处理,保证日期数据在不同操作中的格式规范统一
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
// 导入Apache Commons BeanUtils工具类其提供了方便的方法来进行Java对象之间属性的复制操作在本类的构造函数中会使用它来进行属性赋值操作将传入对象的属性复制到当前对象中实现对象间属性值的快速传递
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.BeanUtils;
// 导入MyBatis Plus中用于标识字段与数据库表字段映射关系的注解同时可以设置一些额外属性如这里的fill属性用于指定字段在插入或更新时的自动填充策略便于在数据库操作时自动处理一些字段值的赋值情况
import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.enums.FieldFill; // 导入MyBatis Plus中用于定义字段填充策略的枚举类型此处使用的FieldFill.INSERT表示在插入数据时自动填充指定字段常用于创建时间等字段的自动赋值方便记录关键时间信息
import com.baomidou.myatisplus.enums.FieldFill;
// 导入MyBatis Plus中用于定义主键生成类型的枚举类型之前提到的IdType.AUTO就是其中一种表示自动增长的类型清晰定义主键的生成规则
import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.enums.IdType;
/** /**
* *
* "fangjian_order"访gettersetterSerializable便使
* *
* @author * @author // 此处应该填写作者相关信息,可能是开发人员的姓名等,但代码中未明确给出具体值,用于标识代码的创作者
* @email * @email // 同样,此处应该填写作者的邮箱信息,代码中也未给出具体内容,可用于方便联系作者或者明确代码归属等用途
*/ */
@TableName("fangjian_order") @TableName("fangjian_order")
public class FangjianOrderEntity<T> implements Serializable { public class FangjianOrderEntity<T> implements Serializable {
// 定义一个序列化版本号用于在序列化和反序列化过程中保证版本的兼容性当类的结构发生变化如添加、删除字段等可以通过修改这个版本号来避免反序列化出错初始值设为1L在类相对稳定的情况下一般不需要改动维持对象序列化的稳定性
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// 默认构造函数用于创建FangjianOrderEntity类的实例对象在一些情况下比如通过反射等方式创建对象时可能会用到它会创建一个默认状态的对象实例各个属性会使用其对应类型的默认值初始化如基本数据类型的默认初始值等为对象的创建提供一种基础方式
public FangjianOrderEntity() {
public FangjianOrderEntity() { }
}
public FangjianOrderEntity(T t) {
try {
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 构造函数接收一个泛型类型参数t用于将传入的对象其类型由泛型T指定的属性值复制到当前FangjianOrderEntity对象中通过BeanUtils工具类来实现属性复制方便基于已有的同类型或者兼容类型的数据构建FangjianOrderEntity对象不过在复制过程中可能会抛出异常所以进行了异常捕获处理保障属性复制操作的稳定性
public FangjianOrderEntity(T t) {
try {
// 使用BeanUtils的copyProperties方法将t对象的属性值复制到当前对象this实现属性的赋值操作但该方法可能会抛出IllegalAccessException访问权限异常和InvocationTargetException方法调用异常所以需要进行异常捕获处理确保属性复制过程遇到问题能妥善处理
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// 如果在属性复制过程中出现异常,打印异常堆栈信息,方便开发人员排查问题,确定是哪里出现了访问权限问题或者方法调用出错等情况,辅助定位和解决异常
e.printStackTrace();
}
}
/** /**
* *
* @TableIdIdType.AUTO@TableField"id"便
*/ */
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
@TableField(value = "id") @TableField(value = "id")
private Integer id; private Integer id;
/** /**
* *
* @TableField"fangjian_id"
*/ */
@TableField(value = "fangjian_id") @TableField(value = "fangjian_id")
private Integer fangjianId; private Integer fangjianId;
/** /**
* *
* @TableField"yonghu_id"便便
*/ */
@TableField(value = "yonghu_id") @TableField(value = "yonghu_id")
private Integer yonghuId; private Integer yonghuId;
/** /**
* *
* @JsonFormat"yyyy-MM-dd""GMT+8"@DateTimeFormat@TableField"fangjian_order_time"使便
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd") @JsonFormat(locale = "zh", timezone = "GMT + 8", pattern = "yyyy-MM-dd")
@DateTimeFormat @DateTimeFormat
@TableField(value = "fangjian_order_time") @TableField(value = "fangjian_order_time")
private Date fangjianOrderTime; private Date fangjianOrderTime;
/** /**
* *
* @TableField"fangjian_order_text"便
*/ */
@TableField(value = "fangjian_order_text") @TableField(value = "fangjian_order_text")
private String fangjianOrderText; private String fangjianOrderText;
/** /**
* *
* @TableField"fangjian_order_types"便便
*/ */
@TableField(value = "fangjian_order_types") @TableField(value = "fangjian_order_types")
private Integer fangjianOrderTypes; private Integer fangjianOrderTypes;
/** /**
* *
* @JsonFormat"yyyy-MM-dd HH:mm:ss""GMT+8"@DateTimeFormat@TableFieldFieldFill.INSERT便便
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT + 8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
@TableField(value = "create_time",fill = FieldFill.INSERT) @TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime; private Date createTime;
/** /**
* *
*/ * JavaBeansetterid
*/
public Integer getId() { public Integer getId() {
return id; return id;
} }
/**
*
*/
/**
*
* JavaBean访getterid便使
*/
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/** /**
* *
*/ * fangjianIdJavaBeansetter
*/
public Integer getFangjianId() { public Integer getFangjianId() {
return fangjianId; return fangjianId;
} }
/**
*
*/
/**
*
* JavaBean访getterfangjianId便
*/
public void setFangjianId(Integer fangjianId) { public void setFangjianId(Integer fangjianId) {
this.fangjianId = fangjianId; this.fangjianId = fangjianId;
} }
/** /**
* *
*/ * yonghuIdJavaBeansetter
*/
public Integer getYonghuId() { public Integer getYonghuId() {
return yonghuId; return yonghuId;
} }
/**
*
*/
/**
*
* JavaBean访getteryonghuId便
*/
public void setYonghuId(Integer yonghuId) { public void setYonghuId(Integer yonghuId) {
this.yonghuId = yonghuId; this.yonghuId = yonghuId;
} }
/** /**
* *
*/ * fangjianOrderTimeJavaBeansetterDate
*/
public Date getFangjianOrderTime() { public Date getFangjianOrderTime() {
return fangjianOrderTime; return fangjianOrderTime;
} }
/**
*
*/
/**
*
* JavaBean访getterfangjianOrderTime便
*/
public void setFangjianOrderTime(Date fangjianOrderTime) { public void setFangjianOrderTime(Date fangjianOrderTime) {
this.fangjianOrderTime = fangjianOrderTime; this.fangjianOrderTime = fangjianOrderTime;
} }
/** /**
* *
*/ * JavaBeanfangjianOrderTextsetter便
*/
public String getFangjianOrderText() { public String getFangjianOrderText() {
return fangjianOrderText; return fangjianOrderText;
} }
/**
*
*/
/**
*
* JavaBean访getterfangjianOrderText便使
*/
public void setFangjianOrderText(String fangjianOrderText) { public void setFangjianOrderText(String fangjianOrderText) {
this.fangjianOrderText = fangjianOrderText; this.fangjianOrderText = fangjianOrderText;
} }
/** /**
* *
*/ * fangjianOrderTypesJavaBeansetter
* 便
*/
public Integer getFangjianOrderTypes() { public Integer getFangjianOrderTypes() {
// 按照JavaBean规范定义的访问器getter方法用于获取订单状态fangjianOrderTypes属性的值。
// 外部代码(例如在展示预约订单详情页面,需要告知用户当前订单处于何种状态,或者在业务逻辑中根据订单状态决定下一步操作,像已支付状态则安排后续入住流程等相关业务逻辑代码中)可以调用这个方法,获取当前对象记录的订单状态信息,方便进行展示以及后续的业务处理操作。
return fangjianOrderTypes; return fangjianOrderTypes;
} }
/** /**
* *
*/ */
public void setFangjianOrderTypes(Integer fangjianOrderTypes) { public void setFangjianOrderTypes(Integer fangjianOrderTypes) {
// 将传入的参数值代表新的订单状态的整数值赋值给当前对象的fangjianOrderTypes属性完成对订单状态属性值的更新操作。
// 这样就能使订单状态在业务流程变化时及时得到准确修改,保证整个预约业务系统中订单状态信息的准确性和时效性,以便后续各环节能依据正确的状态进行相应处理。
this.fangjianOrderTypes = fangjianOrderTypes; this.fangjianOrderTypes = fangjianOrderTypes;
} }
/** /**
* *
*/ * JavaBeansettercreateTime
* @TableField(value = "create_time", fill = FieldFill.INSERT)Date
*/
public Date getCreateTime() { public Date getCreateTime() {
// 按照JavaBean规范定义的访问器getter方法用于获取创建时间createTime属性的值该属性用于记录这条房间预约记录在数据库中首次被创建的时间点。
// 外部代码(例如在进行数据统计分析,查看不同时间段内房间预约记录的创建数量变化情况,或者在一些业务逻辑中需要根据创建时间来判断相关业务的先后顺序等场景下)可以调用这个方法,获取当前对象对应的创建时间信息,方便进行后续的业务处理和分析操作。
return createTime; return createTime;
} }
/** /**
* *
*/ */
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
// 将传入的Date类型的时间对象赋值给当前对象的createTime属性完成对创建时间属性值的更新操作。
// 主要用于特殊业务场景下对创建时间的手动调整,确保其能准确反映预约记录真实的创建时间情况,保障基于创建时间相关的业务逻辑和数据分析的准确性。
this.createTime = createTime; this.createTime = createTime;
} }
@Override @Override
public String toString() { public String toString() {
// 重写了toString()方法用于返回一个包含FangjianOrderEntity类所有属性信息的字符串表示形式。
// 当需要将FangjianOrderEntity对象以字符串形式展示比如在调试过程中打印对象信息、在日志中记录对象内容等场景会自动调用这个方法按照指定的格式如"FangjianOrder{" + "id=" + id +...}")返回包含各个属性值的字符串,方便开发人员直观地查看对象各个属性的具体值情况,有助于快速定位和排查对象数据相关的问题。
return "FangjianOrder{" + return "FangjianOrder{" +
"id=" + id + "id=" + id +
", fangjianId=" + fangjianId + ", fangjianId=" + fangjianId +
", yonghuId=" + yonghuId + ", yonghuId=" + yonghuId +
", fangjianOrderTime=" + fangjianOrderTime + ", fangjianOrderTime=" + fangjianOrderTime +
", fangjianOrderText=" + fangjianOrderText + ", fangjianOrderText=" + fangjianOrderText +
", fangjianOrderTypes=" + fangjianOrderTypes + ", fangjianOrderTypes=" + fangjianOrderTypes +
", createTime=" + createTime + ", createTime=" + createTime +
"}"; "}";
} }
}

@ -22,243 +22,292 @@ import com.baomidou.mybatisplus.enums.IdType;
/** /**
* *
*
* *
* @author *
* "forum"
* Getter
*
* SetterSerializable
* @author wangmuzi
* @email * @email
*/ */
@TableName("forum") @TableName("forum")
public class ForumEntity<T> implements Serializable { public class ForumEntity<T> implements Serializable {
// 用于定义序列化版本号,
// 保证在对象序列化和反序列化过程中的兼容性,
// 当类的结构发生变化时可更新该版本号
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// 无参构造函数,用
// 于创建ForumEntity对象的默认实例
// 在一些框架或反射创建对象的场景中可能会用到
public ForumEntity() {
public ForumEntity() { }
}
public ForumEntity(T t) {
try {
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 有参构造函数接受一个泛型参数t
//// 尝试将t对象的属性值复制到当前ForumEntity对象中
//// 通过BeanUtils进行属性复制
// ,若出现异常则打印堆栈信息,可用于基于已有对象来初始化该实体对象的场景。
public ForumEntity(T t) {
try {
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** //**
* //* 主键
// * 对应数据库表中记录的唯一标识符,
* 使MyBatis Plus
* IdType.AUTO
* "id"
*/ */
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
@TableField(value = "id") @TableField(value = "id")
private Integer id; private Integer id;
// /**
/** // * 帖子标题
* // * 用于存储论坛帖子的标题信息,
// * 通过@TableField注解指定了在数据库表"forum"中对应的字段名为"forum_name"。
*/ */
@TableField(value = "forum_name") @TableField(value = "forum_name")
private String forumName; private String forumName;
/** /**
* *
*/ // * 用于存储发布该帖子的用户的唯一标识可能关联到用户表中的用户ID
// * 通过@TableField注解指定了在数据库表"forum"中对应的字段名为"yonghu_id"。
// */
@TableField(value = "yonghu_id") @TableField(value = "yonghu_id")
private Integer yonghuId; private Integer yonghuId;
/** /**
* // * 管理员
*/ //* 用于存储与该帖子相关的管理员用户的唯一标识(可能在一些管理操作或权限相关场景中有作用),
// * 通过@TableField注解指定了在数据库表"forum"中对应的字段名为"users_id"。
//*/
@TableField(value = "users_id") @TableField(value = "users_id")
private Integer usersId; private Integer usersId;
// /**
/** //* 发布内容
* // * 用于存储论坛帖子的具体内容信息,通过@TableField注解指定了在数据库表"forum"中对应的字段名为"forum_content"。
*/ //*/
@TableField(value = "forum_content") @TableField(value = "forum_content")
private String forumContent; private String forumContent;
// /**
/** // * 父id
* id // * 可能用于表示帖子之间的层级关系比如回复帖子时关联到原帖子的ID等情况
*/ //* 通过@TableField注解指定了在数据库表"forum"中对应的字段名为"super_ids"。
// */
@TableField(value = "super_ids") @TableField(value = "super_ids")
private Integer superIds; private Integer superIds;
// /**
/** //* 帖子状态
* // * 用于存储帖子当前所处的状态信息(例如审核状态、是否可见等不同状态,具体含义由业务定义),
*/ //* 通过@TableField注解指定了在数据库表"forum"中对应的字段名为"forum_state_types"。
//*/
@TableField(value = "forum_state_types") @TableField(value = "forum_state_types")
private Integer forumStateTypes; private Integer forumStateTypes;
///**
/** // * 发帖时间
* //* 用于记录帖子发布的时间,使用了@JsonFormat注解来指定时间格式化的相关配置如设置时区、格式化模式等
*/ // * 使其在序列化为JSON等格式时能以指定格式展示时间同时通过@DateTimeFormat注解用于在接收前端传入时间格式数据时进行解析
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") // * 并且通过@TableField注解指定了该字段在数据库表"forum"中对应的字段名为"insert_time"以及其填充策略为插入时自动填充FieldFill.INSERT
@DateTimeFormat // */
@TableField(value = "insert_time",fill = FieldFill.INSERT) @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat
@TableField(value = "insert_time", fill = FieldFill.INSERT)
private Date insertTime; private Date insertTime;
// /**
/** // * 修改时间
* //* 用于记录帖子最后一次被修改的时间,同样使用了@JsonFormat和@DateTimeFormat注解来处理时间的格式化和解析
*/ //* 通过@TableField注解指定了该字段在数据库表"forum"中对应的字段名为"update_time"以及其填充策略为更新时自动填充FieldFill.UPDATE
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") // */
@DateTimeFormat @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "update_time",fill = FieldFill.UPDATE) @DateTimeFormat
@TableField(value = "update_time", fill = FieldFill.UPDATE)
private Date updateTime; private Date updateTime;
///**
/** //* 创建时间
* //* 用于记录帖子相关记录在系统中创建的时间,使用了@JsonFormat和@DateTimeFormat注解来处理时间的格式化和解析
*/ //* 通过@TableField注解指定了该字段在数据库表"forum"中对应的字段名为"create_time"以及其填充策略为插入时自动填充FieldFill.INSERT
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") // */
@DateTimeFormat @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "create_time",fill = FieldFill.INSERT) @DateTimeFormat
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime; private Date createTime;
///**
/** //* 设置:主键
* //* Getter方法用于获取主键id的值外部代码可以通过该方法获取当前ForumEntity对象的主键值。
*/ //*/
public Integer getId() { public Integer getId() {
return id; return id;
} }
/**
*
*/
///**
//* 获取:主键
//* Setter方法用于设置主键id的值外部代码可以通过该方法来修改当前ForumEntity对象的主键值。
//*/
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/**
* ///**
*/ // * 设置:帖子标题
//* Getter方法用于获取帖子标题forumName的值外部代码可以通过该方法获取当前ForumEntity对象的帖子标题。
// */
public String getForumName() { public String getForumName() {
return forumName; return forumName;
} }
/**
*
*/
///**
// * 获取:帖子标题
//* Setter方法用于设置帖子标题forumName的值外部代码可以通过该方法来修改当前ForumEntity对象的帖子标题。
//*/
public void setForumName(String forumName) { public void setForumName(String forumName) {
this.forumName = forumName; this.forumName = forumName;
} }
/**
* ///**
*/ // * 设置:用户
//* Getter方法用于获取用户IDyonghuId的值外部代码可以通过该方法获取当前ForumEntity对象所关联的用户标识。
//*/
//
//
//
//
public Integer getYonghuId() { public Integer getYonghuId() {
return yonghuId; return yonghuId;
} }
/**
*
*/
// /**
//* 获取:用户
//* Setter方法用于设置用户IDyonghuId的值外部代码可以通过该方法来修改当前ForumEntity对象所关联的用户标识。
//*/
public void setYonghuId(Integer yonghuId) { public void setYonghuId(Integer yonghuId) {
this.yonghuId = yonghuId; this.yonghuId = yonghuId;
} }
/**
* ///**
*/ //* 设置:管理员
// * Getter方法用于获取管理员用户IDusersId的值外部代码可以通过该方法获取当前ForumEntity对象所关联的管理员标识。
//*/
public Integer getUsersId() { public Integer getUsersId() {
return usersId; return usersId;
} }
/**
*
*/
///**
// * 获取:管理员
// * Setter方法用于设置管理员用户IDusersId的值外部代码可以通过该方法来修改当前ForumEntity对象所关联的管理员标识。
// */
public void setUsersId(Integer usersId) { public void setUsersId(Integer usersId) {
this.usersId = usersId; this.usersId = usersId;
} }
/**
* ///**
*/ //* 设置:发布内容
//* Getter方法用于获取帖子发布内容forumContent的值外部代码可以通过该方法获取当前ForumEntity对象的帖子具体内容。
//*/
public String getForumContent() { public String getForumContent() {
return forumContent; return forumContent;
} }
/**
*
*/
// /**
//* 获取:发布内容
//* Setter方法用于设置帖子发布内容forumContent的值外部代码可以通过该方法来修改当前ForumEntity对象的帖子具体内容。
//*/
public void setForumContent(String forumContent) { public void setForumContent(String forumContent) {
this.forumContent = forumContent; this.forumContent = forumContent;
} }
/**
* id ///**
*/ //* 设置父id
//* Getter方法用于获取父IDsuperIds的值外部代码可以通过该方法获取当前ForumEntity对象所关联的父级帖子标识如果有层级关系的话
// */
public Integer getSuperIds() { public Integer getSuperIds() {
return superIds; return superIds;
} }
/**
* id
*/
///**
// * 获取父id
//* Setter方法用于设置父IDsuperIds的值外部代码可以通过该方法来修改当前ForumEntity对象所关联的父级帖子标识如果有层级关系的话
// */
public void setSuperIds(Integer superIds) { public void setSuperIds(Integer superIds) {
this.superIds = superIds; this.superIds = superIds;
} }
/**
* // /**
*/ // * 设置:帖子状态
//* Getter方法用于获取帖子状态forumStateTypes的值外部代码可以通过该方法获取当前ForumEntity对象的帖子当前状态信息。
//*/
public Integer getForumStateTypes() { public Integer getForumStateTypes() {
return forumStateTypes; return forumStateTypes;
} }
/**
*
*/
///**
// * 获取:帖子状态
// * Setter方法用于设置帖子状态forumStateTypes的值外部代码可以通过该方法来修改当前ForumEntity对象的帖子当前状态信息。
//*/
public void setForumStateTypes(Integer forumStateTypes) { public void setForumStateTypes(Integer forumStateTypes) {
this.forumStateTypes = forumStateTypes; this.forumStateTypes = forumStateTypes;
} }
/**
* //**
*/ //* 设置:发帖时间
// * Getter方法用于获取发帖时间insertTime的值外部代码可以通过该方法获取当前ForumEntity对象的帖子发布时间信息。
// */
public Date getInsertTime() { public Date getInsertTime() {
return insertTime; return insertTime;
} }
/**
*
*/
///**
//* 获取:发帖时间
////* Setter方法用于设置发帖时间insertTime的值外部代码可以通过该方法来修改当前ForumEntity对象的帖子发布时间信息。
//*/
public void setInsertTime(Date insertTime) { public void setInsertTime(Date insertTime) {
this.insertTime = insertTime; this.insertTime = insertTime;
} }
/**
* ///**
*/ // * 设置:修改时间
//* Getter方法用于获取修改时间updateTime的值外部代码可以通过该方法获取当前ForumEntity对象的帖子最后修改时间信息。
// */
public Date getUpdateTime() { public Date getUpdateTime() {
return updateTime; return updateTime;
} }
/**
*
*/
///**
//* 获取:修改时间
//* Setter方法用于设置修改时间updateTime的值外部代码可以通过该方法来修改当前ForumEntity对象的帖子最后修改时间信息。
// */
public void setUpdateTime(Date updateTime) { public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime; this.updateTime = updateTime;
} }
/**
* ///**
*/ // * 设置:创建时间
// * Getter方法用于获取创建时间createTime的值外部代码可以通过该方法获取当前ForumEntity对象的帖子相关记录创建时间信息。
// */
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
/**
*
*/
// /**
// * 获取:创建时间
//* Setter方法用于设置创建时间createTime的值外部代码可以通过该方法来修改当前ForumEntity对象的帖子相关记录创建时间信息。
// */
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
@ -266,16 +315,16 @@ public class ForumEntity<T> implements Serializable {
@Override @Override
public String toString() { public String toString() {
return "Forum{" + return "Forum{" +
"id=" + id + "id=" + id +
", forumName=" + forumName + ", forumName=" + forumName +
", yonghuId=" + yonghuId + ", yonghuId=" + yonghuId +
", usersId=" + usersId + ", usersId=" + usersId +
", forumContent=" + forumContent + ", forumContent=" + forumContent +
", superIds=" + superIds + ", superIds=" + superIds +
", forumStateTypes=" + forumStateTypes + ", forumStateTypes=" + forumStateTypes +
", insertTime=" + insertTime + ", insertTime=" + insertTime +
", updateTime=" + updateTime + ", updateTime=" + updateTime +
", createTime=" + createTime + ", createTime=" + createTime +
"}"; "}";
} }
} }

@ -20,180 +20,251 @@ import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.enums.FieldFill; import com.baomidou.mybatisplus.enums.FieldFill;
import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.enums.IdType;
/** ///**
* //* 公告信息
* // 该类定义了公告信息相关的数据实体,对应数据库中的"news"表,用于存储和传递公告相关的各种属性信息,
* @author //* 同时实现了Serializable接口使其能够进行序列化操作方便在网络传输、持久化等场景中使用
* @email //* 类中还包含了用于属性访问的Getter和Setter方法以及重写的toString方法便于对象的操作和信息展示。
*/ //* @author wangmuzi
//* @email
//*/
@TableName("news") @TableName("news")
public class NewsEntity<T> implements Serializable { public class NewsEntity<T> implements Serializable {
//
//
// 定义序列化版本号,用于在对象序列化和反序列化过程中确保兼容性,
// 当类的结构发生变化(如新增、删除字段等)时,
// 可适当更新该版本号,以避免出现序列化和反序列化不一致的问题。
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// 无参构造函数主要用于创建NewsEntity类的默认实例对象
// 在一些框架自动实例化对象或者通过反射创建对象等场景下会被调用。
public NewsEntity() {
public NewsEntity() { }
}
public NewsEntity(T t) {
try {
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 有参构造函数接受一个泛型参数t
// 其目的是尝试将传入的t对象的属性值复制到当前的NewsEntity对象中。
// 通过使用BeanUtils工具类的copyProperties方法来实现属性复制
// 若在复制过程中出现IllegalAccessException例如访问权限问题
// 或者InvocationTargetException例如被调用方法抛出异常
// 则会打印异常堆栈信息进行调试。
public NewsEntity(T t) {
try {
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** ///**
* //* 主键
*/ //* 对应数据库中"news"表记录的唯一标识符,
// * 通过@TableId注解指定了主键的生成策略为自增长IdType.AUTO
//* 并使用@TableField注解明确了在数据库表中的字段名为"id",用于唯一标识每条公告信息记录。
//*/
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
@TableField(value = "id") @TableField(value = "id")
private Integer id; private Integer id;
// /**
/** // * 公告标题
* // * 用于存储公告的标题内容,
*/ // * 通过@TableField注解将该属性与数据库表"news"中的"news_name"字段进行映射关联,
//// 方便在进行数据库操作时进行数据的存取。
// */
@TableField(value = "news_name") @TableField(value = "news_name")
private String newsName; private String newsName;
///**
/** // * 公告类型
* //* 用于表示公告所属的类型(例如通知类、活动类等,
*/ // * 具体类型由业务逻辑定义),通过@TableField注解将其与数据库表"news"中的"news_types"字段对应起来,
//* 其类型为Integer可能在数据库中以数字编码形式存储不同的公告类型。
// */
@TableField(value = "news_types") @TableField(value = "news_types")
private Integer newsTypes; private Integer newsTypes;
//
// /**
/** // * 公告图片
* // * 用于存放公告相关的图片路径或者图片资源的标识信息具体取决于业务实现方式可能是文件系统路径、URL等
*/ // * 通过@TableField注解关联到数据库表"news"中的"news_photo"字段,方便进行图片相关的数据操作与存储。
// */
@TableField(value = "news_photo") @TableField(value = "news_photo")
private String newsPhoto; private String newsPhoto;
// /**
/** // * 添加时间
* // * 用于记录公告信息添加到系统中的时间,
*/ // * 通过@JsonFormat注解来指定时间的格式化方式使其在序列化为JSON格式数据时能够按照指定的格式展示
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") // * 例如设置了中文地区locale="zh"、东八区时区timezone="GMT+8"以及具体的时间格式pattern="yyyy-MM-dd HH:mm:ss")。
@DateTimeFormat // * 同时,@DateTimeFormat注解用于在接收前端传入的时间格式数据时进行解析转换使其能正确赋值给该属性。
@TableField(value = "insert_time",fill = FieldFill.INSERT) // * @TableField注解指定了在数据库表中的字段名为"insert_time"并且设置了填充策略为插入时自动填充FieldFill.INSERT
//* 意味着在将该实体对象插入数据库时,该时间字段会自动被赋值为当前时间(通常由相关框架自动处理)。
//*/
@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat
@TableField(value = "insert_time", fill = FieldFill.INSERT)
private Date insertTime; private Date insertTime;
///**
/** //* 公告详情
* //* 用于存储公告的详细内容信息,
*/ //* 通过@TableField注解与数据库表"news"中的"news_content"字段进行关联,
// // 方便在进行数据库读写操作时传递和保存公告的详细文本内容。
// */
@TableField(value = "news_content") @TableField(value = "news_content")
private String newsContent; private String newsContent;
// /**
/** // * 创建时间
* // * 类似于添加时间,用于记录公告相关记录在系统中创建的时间,
*/ // * 同样使用了@JsonFormat和@DateTimeFormat注解来处理时间的格式化和解析
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") //* 通过@TableField注解指定了该字段在数据库表"news"中对应的字段名为"create_time"以及其填充策略为插入时自动填充FieldFill.INSERT
@DateTimeFormat //* 保证在插入数据时能正确记录创建时间。
@TableField(value = "create_time",fill = FieldFill.INSERT) //*/
@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime; private Date createTime;
// /**
/** // * 设置:主键
* // * 这是属性id的Getter方法
*/ /// * 外部代码可以通过调用该方法获取当前NewsEntity对象的主键值方便在业务逻辑中进行基于主键的操作
///* 比如查询、更新、删除等操作时使用该主键来定位特定的公告记录。
//*/
public Integer getId() { public Integer getId() {
return id; return id;
} }
/**
*
*/
///**
// * 获取:主键
// * 这是属性id的Setter方法外部代码可以通过调用该方法来设置当前NewsEntity对象的主键值
// * 不过通常主键在数据库中是由自增长等策略生成,
// * 手动设置的情况相对较少,但在一些特定业务场景下可能会用到,比如数据迁移等情况。
// */
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/**
* // /**
*/ // * 设置:公告标题
//* 这是属性newsName的Getter方法
//* 外部代码通过调用它可以获取当前NewsEntity对象所存储的公告标题内容
//// 便于在展示公告信息或者进行标题相关的业务判断等场景中使用。
// */
public String getNewsName() { public String getNewsName() {
return newsName; return newsName;
} }
/**
*
*/
// /**
// * 获取:公告标题
// * 这是属性newsName的Setter方法
// * 外部代码调用该方法可以修改当前NewsEntity对象的公告标题内容
// 比如在编辑公告功能中更新公告的标题时会用到。
// */
public void setNewsName(String newsName) { public void setNewsName(String newsName) {
this.newsName = newsName; this.newsName = newsName;
} }
/**
* // /**
*/ // * 设置:公告类型
// * 这是属性newsTypes的Getter方法
// * 外部代码通过调用它可以获取当前NewsEntity对象所代表的公告类型标识数字编码形式
// // 便于在业务逻辑中根据公告类型进行分类处理、查询筛选等操作。
//*/
public Integer getNewsTypes() { public Integer getNewsTypes() {
return newsTypes; return newsTypes;
} }
/**
*
*/
// /**
//* 获取:公告类型
//* 这是属性newsTypes的Setter方法外部代码调用该方法可以修改当前NewsEntity对象的公告类型标识
//// 例如在调整公告所属分类等业务场景下会用到。
//*/
public void setNewsTypes(Integer newsTypes) { public void setNewsTypes(Integer newsTypes) {
this.newsTypes = newsTypes; this.newsTypes = newsTypes;
} }
/**
* // /**
*/ // * 设置:公告图片
// * 这是属性newsPhoto的Getter方法
//* 外部代码通过调用它可以获取当前NewsEntity对象存储的公告图片相关信息路径或标识等
// 在显示公告图片或者对图片资源进行管理等场景中会用到该方法获取相应信息。
// */
public String getNewsPhoto() { public String getNewsPhoto() {
return newsPhoto; return newsPhoto;
} }
/**
*
*/
/**
*
* newsPhotoSetter
* NewsEntity
// 比如更新公告的配图、修改图片路径等业务操作时会用到。
*/
public void setNewsPhoto(String newsPhoto) { public void setNewsPhoto(String newsPhoto) {
this.newsPhoto = newsPhoto; this.newsPhoto = newsPhoto;
} }
/** /**
* *
*/ * insertTimeGetter
* NewsEntity
// 在查询公告历史记录、按照时间范围筛选公告等业务场景中会用到该时间信息。
*/
public Date getInsertTime() { public Date getInsertTime() {
return insertTime; return insertTime;
} }
/**
*
*/
/**
*
* insertTimeSetter
* NewsEntity
// 不过一般情况下该时间是由系统自动填充,
*/
public void setInsertTime(Date insertTime) { public void setInsertTime(Date insertTime) {
this.insertTime = insertTime; this.insertTime = insertTime;
} }
/** /**
* *
*/ * newsContentGetter
* NewsEntity
// 是展示公告完整内容给用户查看的关键方法,在公告详情页面等场景中会用到。
*/
public String getNewsContent() { public String getNewsContent() {
return newsContent; return newsContent;
} }
/**
*
*/
/**
*
* newsContentSetter
* NewsEntity
// 比如在编辑公告详情文本内容时会用到该方法进行更新操作。
*/
public void setNewsContent(String newsContent) { public void setNewsContent(String newsContent) {
this.newsContent = newsContent; this.newsContent = newsContent;
} }
/** /**
* *
*/ * createTimeGetter
* NewsEntity
// 在一些涉及到数据创建时间跟踪、按照创建时间排序等业务场景中会用到该时间信息。
*/
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
/**
*
*/
/**
*
* createTimeSetter
* NewsEntity
// 通常该时间由系统自动填充,手动修改场景较少,特殊业务场景下(如数据迁移、时间校正等)可能会用到。
*/
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
@ -201,13 +272,13 @@ public class NewsEntity<T> implements Serializable {
@Override @Override
public String toString() { public String toString() {
return "News{" + return "News{" +
"id=" + id + "id=" + id +
", newsName=" + newsName + ", newsName=" + newsName +
", newsTypes=" + newsTypes + ", newsTypes=" + newsTypes +
", newsPhoto=" + newsPhoto + ", newsPhoto=" + newsPhoto +
", insertTime=" + insertTime + ", insertTime=" + insertTime +
", newsContent=" + newsContent + ", newsContent=" + newsContent +
", createTime=" + createTime + ", createTime=" + createTime +
"}"; "}";
} }
} }

@ -7,116 +7,337 @@ import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.enums.IdType;
/** /**
* token * token
* `token`
* `token` `token`
* `Serializable`
*
*
*
* 便
*/ */
@TableName("token") @TableName("token")
public class TokenEntity implements Serializable { public class TokenEntity implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// **
// * 主键标识,通过 `@TableId`
//
//
// 注解指定该字段为主键,并且设置主键的生成策略为自增长(`IdType.AUTO`
// * 在数据库插入操作时,系统会按照设定的自增长规则自动为该字段赋值,
//
//
// 用于唯一标识每条 `token` 记录,方便进行数据库层面的操作(如查询、更新、删除等),
// * 确保数据的唯一性和可定位性。
// */
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
private Integer id; private Integer id;
/** // **
* id // * 用户id用于关联具体的用户明确该 `token` 是属于哪个用户的标识信息,
*/ // * 通过这个字段可以建立 `token`
//
// 与用户之间的对应关系,在进行用户认证、权限验证等业务场景中,
// * 基于该用户 `id` 去查找对应的用户信息以及判断该 `token` 是否合法等操作。
// */
private Integer userid; private Integer userid;
/** // **
* // * 用户名,存储对应用户的名称信息,
*/ //
// 与 `userid` 一起进一步明确用户身份,增强用户标识的可读性和可辨识度,
// * 在一些业务场景中(如展示用户相关信息、
//
// 记录操作日志等涉及到用户显示名称的情况)会用到该字段内容。
// */
private String username; private String username;
/** // **
* // * 表名,可能用于标识该 `token`
*/ //
//
// 相关数据存储所在的具体数据库表(在多表关联或者分表存储等复杂业务场景下),
// * 可以帮助更准确地定位和管理与该 `token` 相关的其他数据信息,
//
// 也有助于区分不同业务模块下的 `token` 情况,
// * 例如不同业务表对应的 `token` 有不同的作用范围和验证规则等,
//
// 通过这个字段可以进行区分和相应的业务处理。
// */
private String tablename; private String tablename;
/** // **
* // * 角色,用于记录用户在系统中所扮演的角色,例如管理员、普通用户、
*/ //
//
// 特定权限角色等不同角色往往具有不同的权限范围,
// * 通过该 `role` 字段可以在基于 `token` 进行权限验证等操作时,
//
// 判断用户是否具备执行某些特定操作的权限,
// * 确保系统的安全性和数据访问的合法性。
// */
private String role; private String role;
/** // **
* token // * token存储实际的 `token` 字符串值,
*/ //
// 这是用于标识用户身份的关键信息,
//
// 在用户登录成功或者进行身份验证等操作后生成,
// * 后续用户在访问系统接口、进行页面操作等场景下,
//
// 需要携带该 `token` 字符串进行身份验证,系统通过验证该 `token` 的有效性来确定用户是否有权限继续操作,
// * 它通常是一个具有一定随机性和唯一性的字符串,
//
// 保证每个用户的 `token` 都能唯一标识其身份。
// */
private String token; private String token;
/** // **
* // * 过期时间,记录该 `token` 的有效截止时间,
*/ //
// 通过设置过期时间可以提高系统的安全性,避免 `token` 长期有效可能带来的安全风险,
// * 在进行 `token` 验证时,
//
// 会对比当前时间与该过期时间来判断 `token` 是否仍然有效,
//
// 对于过期的 `token` 则拒绝相应的操作请求,
// * 通常是一个 `Date` 类型的时间对象,表示具体的时间点。
// */
private Date expiratedtime; private Date expiratedtime;
/** // **
* // * 新增时间,记录该 `token` 在系统中创建的时间点,
*/ //
// 可用于查询、统计等业务场景,例如查看新生成的 `token` 情况、
// * 分析不同时间段内 `token` 的生成频率等,
//
// 也有助于在一些数据管理和审计场景下了解 `token` 的生命周期相关信息,
// * 同样是一个 `Date` 类型的时间对象。
// */
private Date addtime; private Date addtime;
// **
// * 获取:主键,对外提供获取主键值(`id`)的方法,
//
// 方便在其他类中访问该 `TokenEntity` 对象的主键信息,
// * 例如在进行数据库查询结果映射或者业务逻辑处理中需要用到
//
// `token` 记录主键时可调用此方法获取,返回对应的整数值。
// * @return 返回主键对应的整数值。
// */
public Integer getId() { public Integer getId() {
return id; return id;
} }
// **
// * 设置:主键,用于设置该对象的主键值,
//
// 通常在对象初始化或者从数据库等外部数据源加载数据后更新主键值时使用,
// * 不过由于主键一般是自增长且由数据库管理,
// 在实际业务中手动设置的情况相对较少,
// 但保留此方法以满足可能的特殊需求(如数据迁移等场景),
// * 通过传入对应的整数值来更新主键信息。
// * @param id 要设置的主键整数值。
// */
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
// **
// * 获取用户id对外提供获取用户 `id`
//
// 值(`userid`)的方法,在需要关联用户信息、进行基于用户的业务逻辑处理(如查找用户相关的其他数据、
// * 判断 `token` 所属用户等情况)时,
// 可调用此方法获取对应的整数值,便于操作和业务逻辑实现。
// * @return 返回用户 `id` 对应的整数值。
// */
public Integer getUserid() { public Integer getUserid() {
return userid; return userid;
} }
// **
// * 设置用户id用于更新用户 `id` 值(`userid`
// 例如在某些特殊情况下(如用户信息变更导致关联的 `userid` 需要调整等),
// * 通过传入新的整数值来改变该 `TokenEntity`
// 对象所关联的用户标识信息,不过这种情况相对较少出现,需谨慎操作以保证数据一致性。
// * @param userid 要设置的用户 `id` 整数值。
// */
public void setUserid(Integer userid) { public void setUserid(Integer userid) {
this.userid = userid; this.userid = userid;
} }
public String getRole() { // **
return role; // * 获取:用户名,对外提供获取用户名(`username`)的方法,
} //
//
public void setRole(String role) { // 在需要展示用户名称、基于用户名进行业务逻辑处理(如记录操作日志中显示用户名等情况)时,
this.role = role; // * 可调用此方法获取对应的字符串内容,方便进行相应的展示和操作。
// * @return 返回用户名对应的字符串值。
// */
public String getUsername() {
return username;
} }
public String getToken() { // **
return token; // * 设置:用户名,用于更新用户名(`username`
//
// 比如用户修改了自己的用户名后,通过此方法保存新的用户名信息到该 `TokenEntity` 对象中,
// * 确保相关业务逻辑中获取到的用户名是最新且准确的,
//
// 需要注意的是这种更新可能需要同时考虑与其他关联数据的一致性等问题。
// * @param username 要设置的用户名字符串值。
// */
public void setUsername(String username) {
this.username = username;
} }
// **
// * 获取:表名,对外提供获取表名(`tablename`)的方法,
//
// 在涉及到多表关联操作、区分不同业务模块下 `token` 的处理逻辑或者根据表名查找相关数据等业务场景中,
// * 可调用此方法获取对应的字符串内容,
//
// 便于进行相应的数据库操作和业务处理。
// * @return 返回表名对应的字符串值。
// */
public String getTablename() { public String getTablename() {
return tablename; return tablename;
} }
// **
// * 设置:表名,用于更新表名(`tablename`
//
// 在一些特殊的业务场景变化(如数据库结构调整、业务模块重新划分导致表名变更等)时,
// * 通过传入新的字符串值来改变该 `TokenEntity`
//
// 对象对应的表名信息,不过这种变更需要谨慎处理,确保与数据库实际情况以及其他相关代码逻辑的一致性。
// * @param tablename 要设置的表名字符串值。
// */
public void setTablename(String tablename) { public void setTablename(String tablename) {
this.tablename = tablename; this.tablename = tablename;
} }
// **
// * 获取:角色,对外提供获取角色(`role`)的方法,
//
// 在基于 `token` 进行权限验证、判断用户在系统中的操作权限范围等业务场景中,
// * 可调用此方法获取对应的字符串内容,
//
// 以便根据角色信息进行相应的权限控制和业务逻辑处理。
// * @return 返回角色对应的字符串值。
// */
public String getRole() {
return role;
}
// **
// * 设置:角色,用于更新角色(`role`
//
// 例如在系统进行角色调整、用户权限变更等情况下,通过传入新的字符串值来改变该 `TokenEntity` 对象中记录的用户角色信息,
// * 从而影响后续基于角色的权限验证等业务操作,
//
// 同样需要注意保证数据一致性以及相关业务逻辑的正确调整。
// * @param role 要设置的角色字符串值。
// */
public void setRole(String role) {
this.role = role;
}
// **
// * 获取token对外提供获取 `token`
//
// 字符串值(`token`)的方法,在需要使用 `token` 进行身份验证、传递给其他模块进行相关操作等场景中,
// * 可调用此方法获取对应的字符串内容,
//
// 它是整个 `TokenEntity` 对象中最为关键的用于标识用户身份的信息部分。
// * @return 返回 `token` 对应的字符串值。
// */
public String getToken() {
return token;
}
// **
// * 设置token用于更新 `token` 字符串值(`token`
//
// 通常在 `token` 重新生成(如用户重新登录、`token` 过期后重新获取等情况)时,
// * 通过传入新的字符串值来替换原有的 `token` 信息,
//
// 确保 `token` 的有效性和安全性,同时需要注意更新相关的验证逻辑以及与其他模块的交互情况。
// * @param token 要设置的 `token` 字符串值。
// */
public void setToken(String token) { public void setToken(String token) {
this.token = token; this.token = token;
} }
// **
// * 获取:过期时间,对外提供获取过期时间(`expiratedtime`)的方法,
//
// 在进行 `token` 有效性验证、判断是否需要重新获取 `token` 等业务场景中,
// * 可调用此方法获取对应的 `Date` 类型对象,
//
// 以便与当前时间进行比较操作,进而确定 `token` 是否还能继续使用。
// * @return 返回过期时间对应的 `Date` 类型对象。
// */
public Date getExpiratedtime() { public Date getExpiratedtime() {
return expiratedtime; return expiratedtime;
} }
// **
// * 设置:过期时间,用于更新过期时间(`expiratedtime`)的值,
//
// 例如在调整 `token` 的有效期策略、手动延长或缩短 `token` 有效期等特殊情况下,
// * 通过传入新的 `Date` 类型对象来改变该 `TokenEntity`
//
// 对象中记录的 `token` 过期时间信息,不过这种操作需要谨慎进行,避免影响系统的安全性和正常业务流程。
// * @param expiratedtime 要设置的过期时间对应的 `Date` 类型对象。
// */
public void setExpiratedtime(Date expiratedtime) { public void setExpiratedtime(Date expiratedtime) {
this.expiratedtime = expiratedtime; this.expiratedtime = expiratedtime;
} }
// **
// * 获取:新增时间,对外提供获取新增时间(`addtime`)的方法,
//
// 在进行数据统计、审计以及一些基于时间顺序的业务逻辑处理(如查找近期生成的 `token` 等情况)时,
// * 可调用此方法获取对应的 `Date` 类型对象,方便进行相应的时间相关操作和业务逻辑实现。
// * @return 返回新增时间对应的 `Date` 类型对象。
// */
public Date getAddtime() { public Date getAddtime() {
return addtime; return addtime;
} }
// **
// * 设置:新增时间,用于更新新增时间(`addtime`)的值,
//
// 虽然在实际业务中新增时间一般是在 `token` 创建时自动记录且较少手动修改,
// * 但保留此方法以满足可能的特殊需求(如数据迁移、时间校准等场景下对新增时间进行调整),
//
// 通过传入对应的 `Date` 类型对象来更新新增时间信息,
// * 同样需要注意保证数据的合理性和一致性。
// */
public void setAddtime(Date addtime) { public void setAddtime(Date addtime) {
this.addtime = addtime; this.addtime = addtime;
} }
public String getUsername() { // **
return username; // * 构造函数,用于创建 `TokenEntity` 对象实例时传入必要的参数进行初始化,
} //
// 通常在创建新的 `token` 相关记录或者从数据库等外部数据源加载数据后创建对象时使用,
public void setUsername(String username) { // * 接收用户 `id`、用户名、表名、角色、`token` 字符串以及过期时间等参数,
this.username = username; //
} // 按照传入的值初始化对象的各个属性,方便快速构建一个完整的 `TokenEntity` 对象,
// * 用于后续的业务操作(如插入数据库、传递给其他模块等)。
public TokenEntity(Integer userid, String username, String tablename,String role, String token, Date expiratedtime) { // * @param userid 用户的唯一标识,整数值。
// * @param username 用户的名称,字符串值。
// * @param tablename 所属表名,字符串值。
// * @param role 用户在系统中所扮演的角色,字符串值。
// * @param token 用于标识用户身份的 `token` 字符串值。
// * @param expiratedtime `token` 的过期时间,`Date` 类型对象。
// */
public TokenEntity(Integer userid, String username, String tablename, String role, String token, Date expiratedtime) {
super(); super();
this.userid = userid; this.userid = userid;
this.username = username; this.username = username;
@ -125,8 +346,16 @@ public class TokenEntity implements Serializable {
this.token = token; this.token = token;
this.expiratedtime = expiratedtime; this.expiratedtime = expiratedtime;
} }
// **
// * 默认构造函数,用于创建一个空的 `TokenEntity` 对象实例,
//
// 当需要先创建对象再逐步设置属性值时可使用该构造函数,
// * 例如在一些复杂的业务逻辑中,先创建对象占位,后续根据不同的条件和数据来源来分别设置对象的各个属性,
//
// 方便灵活构建 `TokenEntity` 对象,
// * 为空对象的初始化提供了一种方式。
// */
public TokenEntity() { public TokenEntity() {
} }
}
}

@ -10,68 +10,140 @@ import com.baomidou.mybatisplus.enums.IdType;
/** /**
* *
*/ */
// 通过 @TableName 注解指定该实体类对应的数据库表名为 "users",表明这个实体类与数据库中名为 "users" 的表存在映射关系,
// 在使用一些持久化框架(如 MyBatis-Plus 等)时,框架会依据这个映射关系进行数据库操作,例如将该实体类的对象持久化到对应表中,或者从表中查询数据填充到该类的对象里。
@TableName("users") @TableName("users")
// 定义一个名为 UsersEntity 的类,实现了 Serializable 接口,意味着该类的对象可以被序列化和反序列化,
// 常用于在网络传输、对象持久化存储等场景中保证对象状态的保存和恢复,方便数据的传递与存储操作。
public class UsersEntity implements Serializable { public class UsersEntity implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// 通过 @TableId 注解指定了主键的生成策略为自动增长IdType.AUTO即数据库会自动为该字段分配唯一的整数值
// 这里的主键字段用于唯一标识数据库表中的每一条用户记录,方便后续对特定用户数据进行精准的查询、更新、删除等操作。
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
private Integer id; private Integer id;
/** /**
* *
* 使
// 通常具有唯一性,以区分不同的用户个体。
*/ */
private String username; private String username;
/** /**
* *
*
// 而不只是简单的文本存储,在用户登录验证、修改密码等业务场景中会重点使用该字段。
*/ */
private String password; private String password;
/** /**
* *
* "普通用户""管理员"
// 系统可以根据该字段来判断用户具备哪些操作权限,进而控制用户对不同功能模块的访问,在权限管理相关的业务逻辑中起到关键作用。
*/ */
private String role; private String role;
// 用于记录用户相关数据添加到系统中的时间,比如在统计用户增长趋势、查询某个时间段内新增的用户等业务场景下会用到该时间信息,
// 具体的时间格式和处理方式可能会根据业务需求以及相关的时间格式化注解来确定(当前代码中未展示相关格式化处理,但实际应用中可能会有)。
private Date addtime; private Date addtime;
/**
* getter
* Java JavaBean 便 UsersEntity
* @return
*/
public String getUsername() { public String getUsername() {
return username; return username;
} }
/**
* setter
* Java JavaBean
*
* @param username
*/
public void setUsername(String username) { public void setUsername(String username) {
this.username = username; this.username = username;
} }
/**
* getter
* 访
// 可能会经过加密等处理后再进行相关操作,此处返回的是存储的密码字符串值。
* @return
*/
public String getPassword() { public String getPassword() {
return password; return password;
} }
/**
* setter
*
// 传入要设置的用户密码字符串值,用于更新用户对象的密码字段内容。
* @param password
*/
public void setPassword(String password) { public void setPassword(String password) {
this.password = password; this.password = password;
} }
/**
* getter
* 便 UsersEntity
* @return
*/
public String getRole() { public String getRole() {
return role; return role;
} }
/**
* setter
*
// 传入要设置的用户类型字符串值,用于更新用户对象的用户类型字段内容。
* @param role
*/
public void setRole(String role) { public void setRole(String role) {
this.role = role; this.role = role;
} }
/**
* getter
*
// 返回存储的 Date 类型的添加时间对象。
* @return Date
*/
public Date getAddtime() { public Date getAddtime() {
return addtime; return addtime;
} }
/**
* setter
* Date
// 比如在数据从其他数据源导入到系统中时,需要准确设置该时间信息等场景下会用到。
* @param addtime Date
*/
public void setAddtime(Date addtime) { public void setAddtime(Date addtime) {
this.addtime = addtime; this.addtime = addtime;
} }
/**
* getter
* Java JavaBean 便 UsersEntity
* @return
*/
public Integer getId() { public Integer getId() {
return id; return id;
} }
/**
* setter
*
// 传入要设置的主键整数值,用于更新用户对象的主键字段内容。
* @param id
*/
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
}
} }

@ -26,274 +26,369 @@ import com.baomidou.mybatisplus.enums.IdType;
* @author * @author
* @email * @email
*/ */
// 通过 @TableName 注解指定该实体类对应的数据库表名为 "yonghu",表明这个实体类与数据库中名为 "yonghu" 的表存在映射关系,
// 在使用一些持久化框架(如 MyBatis-Plus 等)时,框架会依据这个映射关系进行数据库操作,例如将该实体类的对象持久化到对应表中,或者从表中查询数据填充到该类的对象里。
@TableName("yonghu") @TableName("yonghu")
// 定义一个名为 YonghuEntity 的泛型类,实现了 Serializable 接口,意味着该类的对象可以被序列化和反序列化,
// 常用于在网络传输、对象持久化存储等场景中保证对象状态的保存和恢复,方便数据的传递与存储操作。
public class YonghuEntity<T> implements Serializable { public class YonghuEntity<T> implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// 默认构造函数,用于创建一个空的 YonghuEntity 对象实例,在某些初始化场景(如通过反射创建对象等情况)下会被调用,
// 此时对象的各个属性会被赋予默认的初始值(例如基本数据类型会有对应的默认值,引用类型为 null 等)。
public YonghuEntity() {
public YonghuEntity() { }
}
public YonghuEntity(T t) {
try {
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 带参数的构造函数,接受一个泛型参数 T尝试使用 BeanUtils.copyProperties 方法(通常来自 Spring 等相关框架提供的工具类)
// 将传入的参数对象 t 的属性值复制到当前的 YonghuEntity 对象中,实现基于已有对象来初始化当前对象的功能。
// 如果在属性复制过程中出现异常(比如属性没有对应的访问权限或者复制方法调用出现问题等),会打印异常堆栈信息方便排查问题,
// 不过当前只是简单打印,实际应用中可根据需求完善异常处理逻辑。
public YonghuEntity(T t) {
try {
BeanUtils.copyProperties(this, t);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** /**
* *
* @TableId IdType.AUTO
* @TableField "id"
*
*/ */
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
@TableField(value = "id") @TableField(value = "id")
private Integer id; private Integer id;
/** /**
* *
* 使 @TableField "username"
// 保证了实体类与数据库表之间在该字段上的映射关系,方便数据的读写操作,在用户登录、注册等业务场景中会频繁涉及对该字段的操作。
*/ */
@TableField(value = "username") @TableField(value = "username")
private String username; private String username;
/** /**
* *
* @TableField "password"
// 由于密码涉及用户隐私安全,在实际应用中通常需要对其进行加密存储等额外的安全处理,而不只是简单的文本存储。
*/ */
@TableField(value = "password") @TableField(value = "password")
private String password; private String password;
/** /**
* *
* @TableField "yonghu_name"
// 方便在系统中展示用户的个人信息,比如在用户资料页面、用户列表展示等地方呈现给用户或者管理员查看。
*/ */
@TableField(value = "yonghu_name") @TableField(value = "yonghu_name")
private String yonghuName; private String yonghuName;
/** /**
* *
*
// 通过 @TableField 注解与数据库表中的 "yonghu_photo" 列关联,以便在需要展示用户头像的界面或者相关业务逻辑中进行数据操作。
*/ */
@TableField(value = "yonghu_photo") @TableField(value = "yonghu_photo")
private String yonghuPhoto; private String yonghuPhoto;
/** /**
* *
* @TableField "yonghu_phone"
// 在诸多业务场景中都有重要作用,例如身份验证、短信通知、找回密码等操作时作为与用户联系的关键方式。
*/ */
@TableField(value = "yonghu_phone") @TableField(value = "yonghu_phone")
private String yonghuPhone; private String yonghuPhone;
/** /**
* *
* @TableField "yonghu_email"
// 同样可用于系统与用户之间的沟通交流,像发送重要通知、密码重置链接等业务场景都会用到该字段存储的邮箱信息。
*/ */
@TableField(value = "yonghu_email") @TableField(value = "yonghu_email")
private String yonghuEmail; private String yonghuEmail;
/** /**
* *
* 0 1
// 通过 @TableField 注解与数据库表中的 "sex_types" 列关联,便于系统根据性别进行相关的统计、展示或者业务逻辑处理。
*/ */
@TableField(value = "sex_types") @TableField(value = "sex_types")
private Integer sexTypes; private Integer sexTypes;
/** /**
* *
*
// 通过 @TableField 注解与数据库表中的 "new_money" 列建立映射关系,以保证余额数据在实体类与数据库之间的正确读写。
*/ */
@TableField(value = "new_money") @TableField(value = "new_money")
private Double newMoney; private Double newMoney;
/** /**
* *
* 1 0
// 借助 @TableField 注解与数据库表中的 "yonghu_delete" 列相对应,相比于直接从数据库中物理删除数据,软删除便于数据的恢复以及相关业务逻辑的处理,同时可以保留数据的历史记录等信息。
*/ */
@TableField(value = "yonghu_delete") @TableField(value = "yonghu_delete")
private Integer yonghuDelete; private Integer yonghuDelete;
/** /**
* *
* @JsonFormat JSON
// @DateTimeFormat 注解则可能用于在接收前端传入的时间格式数据时进行格式化处理,以便正确地将数据绑定到该字段上,
// 并且通过 @TableField 注解与数据库表中的 "create_time" 列关联,同时设置了 fill = FieldFill.INSERT 表示在插入数据时该字段会自动填充相应的值(通常是当前时间),
// 该时间信息在很多业务场景中都有作用,比如按照创建时间排序、查询某个时间段内创建的用户等。
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT + 8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
@TableField(value = "create_time",fill = FieldFill.INSERT) @TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime; private Date createTime;
/** /**
* *
*/ * 访getter Java JavaBean 便 YonghuEntity
*
* @return
*/
public Integer getId() { public Integer getId() {
return id; return id;
} }
/**
*
*/
/**
*
* setter Java JavaBean
*
* @param id
*/
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/** /**
* *
*/ * 访getter 便 YonghuEntity 使
* @return
*/
public String getUsername() { public String getUsername() {
return username; return username;
} }
/**
*
*/
/**
*
* setter
*
* @param username
*/
public void setUsername(String username) { public void setUsername(String username) {
this.username = username; this.username = username;
} }
/** /**
* *
*/ * 访getter
*
* @return
*/
public String getPassword() { public String getPassword() {
return password; return password;
} }
/**
*
*/
/**
*
* setter
*
* @param password
*/
public void setPassword(String password) { public void setPassword(String password) {
this.password = password; this.password = password;
} }
/** /**
* *
*/ * 访getter 便
* @return
*/
public String getYonghuName() { public String getYonghuName() {
return yonghuName; return yonghuName;
} }
/**
*
*/
/**
*
* setter 使
*
* @param yonghuName
*/
public void setYonghuName(String yonghuName) { public void setYonghuName(String yonghuName) {
this.yonghuName = yonghuName; this.yonghuName = yonghuName;
} }
/** /**
* *
*/ * 访getter
*
* @return
*/
public String getYonghuPhoto() { public String getYonghuPhoto() {
return yonghuPhoto; return yonghuPhoto;
} }
/**
*
*/
/**
*
* setter
*
* @param yonghuPhoto
*/
public void setYonghuPhoto(String yonghuPhoto) { public void setYonghuPhoto(String yonghuPhoto) {
this.yonghuPhoto = yonghuPhoto; this.yonghuPhoto = yonghuPhoto;
} }
/** /**
* *
*/ * 访getter
*
* @return
*/
public String getYonghuPhone() { public String getYonghuPhone() {
return yonghuPhone; return yonghuPhone;
} }
/**
*
*/
/**
*
* setter
*
* @param yonghuPhone
*/
public void setYonghuPhone(String yonghuPhone) { public void setYonghuPhone(String yonghuPhone) {
this.yonghuPhone = yonghuPhone; this.yonghuPhone = yonghuPhone;
} }
/** /**
* *
*/ * 访getter
*
* @return
*/
public String getYonghuEmail() { public String getYonghuEmail() {
return yonghuEmail; return yonghuEmail;
} }
/**
*
*/
/**
*
* setter
*
* @param yonghuEmail
*/
public void setYonghuEmail(String yonghuEmail) { public void setYonghuEmail(String yonghuEmail) {
this.yonghuEmail = yonghuEmail; this.yonghuEmail = yonghuEmail;
} }
/** /**
* *
*/ * 访getter
* 0 1
* @return
*/
public Integer getSexTypes() { public Integer getSexTypes() {
return sexTypes; return sexTypes;
} }
/**
*
*/
/**
*
* setter
*
* @param sexTypes
*/
public void setSexTypes(Integer sexTypes) { public void setSexTypes(Integer sexTypes) {
this.sexTypes = sexTypes; this.sexTypes = sexTypes;
} }
/** /**
* *
*/ * 访getter
*
* @return
*/
public Double getNewMoney() { public Double getNewMoney() {
return newMoney; return newMoney;
} }
/**
*
*/
/**
*
* setter
*
* @param newMoney
*/
public void setNewMoney(Double newMoney) { public void setNewMoney(Double newMoney) {
this.newMoney = newMoney; this.newMoney = newMoney;
} }
/** /**
* *
*/ * 访getter
*
* @return
*/
public Integer getYonghuDelete() { public Integer getYonghuDelete() {
return yonghuDelete; return yonghuDelete;
} }
/** /**
* *
*/ * JavaBean访getter
*
* @return
*/
public void setYonghuDelete(Integer yonghuDelete) { public void setYonghuDelete(Integer yonghuDelete) {
this.yonghuDelete = yonghuDelete; this.yonghuDelete = yonghuDelete;
} }
/** /**
* *
*/ * 访getterJavaBean
*
* Date @JsonFormat @DateTimeFormat 使
* @return Date
*/
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
/**
*
*/
/**
*
* JavaBeansetter
*
* @DateTimeFormat
* @param createTime Date
*/
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
/**
* toString
* toStringJava便使
*
* 使便
* @return "Yonghu{" + + "}"
*/
@Override @Override
public String toString() { public String toString() {
return "Yonghu{" + return "Yonghu{" +
"id=" + id + "id=" + id +
", username=" + username + ", username=" + username +
", password=" + password + ", password=" + password +
", yonghuName=" + yonghuName + ", yonghuName=" + yonghuName +
", yonghuPhoto=" + yonghuPhoto + ", yonghuPhoto=" + yonghuPhoto +
", yonghuPhone=" + yonghuPhone + ", yonghuPhone=" + yonghuPhone +
", yonghuEmail=" + yonghuEmail + ", yonghuEmail=" + yonghuEmail +
", sexTypes=" + sexTypes + ", sexTypes=" + sexTypes +
", newMoney=" + newMoney + ", newMoney=" + newMoney +
", yonghuDelete=" + yonghuDelete + ", yonghuDelete=" + yonghuDelete +
", createTime=" + createTime + ", createTime=" + createTime +
"}"; "}";
} }
} }

@ -8,180 +8,266 @@ import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable; import java.io.Serializable;
/** /**
* *
* *
* entity *
* ModelAndView model *
*
*
* 使 `entity`
* `DictionaryEntity` `Model`
* `ModelAndView` `model`
*
*/ */
public class DictionaryModel implements Serializable { public class DictionaryModel implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// **
// * 主键,用于唯一标识字典表中的每一条记录,
// 在数据库操作中(如查询、更新、删除等)可通过主键精准定位到特定的字典表数据行,
/** // * 通常对应数据库表中定义的主键字段,
* // 保证数据的唯一性和可识别性。
*/ // */
private Integer id; private Integer id;
// **
/** // * 字段,可能用于存储字典表中某个条目的特定代码或者标识信息,
* // 例如可以是代表不同分类、类型等的代码值,
*/ // * 通过该字段能够区分不同的字典项,
// 并且在业务逻辑中可以基于此字段进行相关的查询、匹配等操作。
// */
private String dicCode; private String dicCode;
// **
/** // * 字段名,与 `dicCode` 相对应,
* // 用于存储该字段对应的直观的名称描述,
*/ // 方便在前端展示或者业务逻辑处理中让人更容易理解该字段所代表的含义,
// * 例如如果 `dicCode` 是分类代码,那 `dicName` 就是具体的分类名称,增强了数据的可读性。
// */
private String dicName; private String dicName;
// **
/** // * 编码,可能是对字典表中各项进行编号的一个整数值,
* // 用于在内部对字典项进行排序、索引或者作为另一种标识方式,
*/ // * 在一些需要按照特定顺序处理字典数据或者通过编号快速查找字典项的业务场景中会发挥作用。
// */
private Integer codeIndex; private Integer codeIndex;
// **
/** // * 编码名字,与 `codeIndex` 相对应,
* // 是对该编码所代表含义的文字描述,
*/ // 同样是为了提高数据的可读性和可理解性,
// * 便于在展示给用户或者业务逻辑处理中清晰地知晓该编码具体对应的内容。
// */
private String indexName; private String indexName;
// **
/** // * 父字段id用于表示当前字典项在层级结构中的上级字段的唯一标识如果字典表存在层级关系的话
* id // * 通过这个 `superId`
*/ // 可以构建字典项之间的父子关联关系,方便进行树形结构数据的展示、
// 查询以及相关业务逻辑处理(比如查找某个分类下的子分类等情况)。
// */
private Integer superId; private Integer superId;
// **
/** // * 备注,用于存储一些对该字典项的额外说明信息,
* // 例如该项的特殊用途、适用范围、创建背景等内容,
*/ // * 在需要详细了解字典项相关细节或者进行一些辅助性的业务逻辑判断时,
// 可以参考备注中的信息。
// */
private String beizhu; private String beizhu;
// **
/** // * 创建时间,记录该字典表记录的创建时间点,
* // 通过 `@JsonFormat` 和 `@DateTimeFormat` 注解来规范时间格式的序列化与格式化处理,
*/ // * 确保在前后端交互以及数据存储等场景下时间格式的一致性。
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") // 例如在按照时间顺序查询字典表数据、统计不同时间段创建的数据量等业务场景中会用到该时间信息。
@DateTimeFormat // * @JsonFormat 注解用于控制在将对象转换为JSON格式时时间的显示格式。
// * @DateTimeFormat 注解用于在接收前端传入时间格式数据时进行解析转换。
// */
@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat
private Date createTime; private Date createTime;
// **
/** // * 获取:主键,对外提供获取主键值的方法,
* // 方便在其他类中访问该对象的主键信息,
*/ // 例如在进行数据库查询结果映射或者业务逻辑处理中需要用到字典表记录主键时可调用此方法获取。
// * @return 返回主键对应的整数值。
// */
public Integer getId() { public Integer getId() {
return id; return id;
} }
// **
/** // * 设置:主键,用于设置该对象的主键值,
* // 通常在对象初始化或者从数据库等外部数据源加载数据后更新主键值时使用
*/ // ,例如创建新字典表记录对象并保存到数据库前需要设置主键值。
// * @param id 要设置的主键整数值。
// */
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/**
* // **
*/ // * 获取:字段,对外提供获取字段值(`dicCode`)的方法,
// 以便在业务逻辑中根据该字段进行相关操作,比如查询特定代码的字典项、
// * 根据代码进行匹配判断等情况时可调用此方法获取字段值,返回对应的字符串内容。
// * @return 返回字段对应的字符串值。
// */
public String getDicCode() { public String getDicCode() {
return dicCode; return dicCode;
} }
// **
/** // * 设置:字段,用于更新字段值(`dicCode`
* // 例如在修改字典表记录中该字段的代码内容后,
*/ // 调用此方法来保存新的代码信息,以反映字典项的变化。
// * @param dicCode 要设置的字段字符串值。
// */
public void setDicCode(String dicCode) { public void setDicCode(String dicCode) {
this.dicCode = dicCode; this.dicCode = dicCode;
} }
/**
* // **
*/ // * 获取:字段名,对外提供获取字段名(`dicName`)的方法,
// 在需要展示字典项的名称给用户或者在业务逻辑中基于名称进行相关处理(如筛选、排序等)时,
// * 可调用此方法获取对应的字符串内容,方便操作和展示。
// * @return 返回字段名对应的字符串值。
// */
public String getDicName() { public String getDicName() {
return dicName; return dicName;
} }
// **
/** // * 设置:字段名,用于更新字段名(`dicName`
* // 比如对字典项的名称进行修改后,通过此方法保存新的名称信息,
*/ // 确保名称能准确反映字典项的实际含义。
// * @param dicName 要设置的字段名字符串值。
// */
public void setDicName(String dicName) { public void setDicName(String dicName) {
this.dicName = dicName; this.dicName = dicName;
} }
/**
* // **
*/ // * 获取:编码,对外提供获取编码值(`codeIndex`)的方法,
// 在涉及到按照编码进行排序、查找特定编码的字典项等业务场景中,
// * 可调用此方法获取对应的整数值,便于进行相应的业务处理。
// * @return 返回编码对应的整数值。
// */
public Integer getCodeIndex() { public Integer getCodeIndex() {
return codeIndex; return codeIndex;
} }
// **
/** // * 设置:编码,用于更新编码值(`codeIndex`
* // 例如调整字典项的编号顺序或者重新分配编码后,
*/ // 调用此方法来保存新的编码信息,以符合业务要求的编码规则。
// * @param codeIndex 要设置的编码整数值。
// */
public void setCodeIndex(Integer codeIndex) { public void setCodeIndex(Integer codeIndex) {
this.codeIndex = codeIndex; this.codeIndex = codeIndex;
} }
/**
* // **
*/ // * 获取:编码名字,对外提供获取编码名字(`indexName`)的方法,
// 在需要展示编码对应的具体含义或者基于名称进行业务逻辑处理(如匹配、筛选等)时,
// * 可调用此方法获取对应的字符串内容,增强数据的可读性和可操作性。
// * @return 返回编码名字对应的字符串值。
// */
public String getIndexName() { public String getIndexName() {
return indexName; return indexName;
} }
// **
/** // * 设置:编码名字,用于更新编码名字(`indexName`
* // 比如对编码所代表的含义进行重新定义或者修改描述后,通过此方法保存新的名称信息,
*/ // * 以便准确传达编码的实际意义。
// * @param indexName 要设置的编码名字符串值。
// */
public void setIndexName(String indexName) { public void setIndexName(String indexName) {
this.indexName = indexName; this.indexName = indexName;
} }
/**
* id // **
*/ // * 获取父字段id对外提供获取父字段id`superId`)的方法,
// 在处理字典表的层级关系数据时,比如查找某个父项下的子项、
// * 判断字典项的层级归属等业务场景中,
// 可调用此方法获取对应的整数值,
// 方便进行相关的关联操作和业务逻辑处理。
// * @return 返回父字段id对应的整数值。
// */
public Integer getSuperId() { public Integer getSuperId() {
return superId; return superId;
} }
// **
// * 设置父字段id用于更新父字段id`superId`)的值,
// 例如调整字典项的层级结构、变更上级字段后通过此方法保存新的父字段id信息
// * 以正确反映字典项在层级关系中的位置变化。
// * @param superId 要设置的父字段id整数值。
// */
/**
* id
*/
public void setSuperId(Integer superId) { public void setSuperId(Integer superId) {
this.superId = superId; this.superId = superId;
} }
/**
* // **
*/ // * 获取:备注,对外提供获取备注信息(`beizhu`)的方法,
//
// 在需要查看字典项的额外说明或者根据备注内容进行一些特殊业务逻辑判断(如判断适用范围等)时,
// * 可调用此方法获取对应的字符串内容,辅助业务处理。
// * @return 返回备注对应的字符串值。
// */
public String getBeizhu() { public String getBeizhu() {
return beizhu; return beizhu;
} }
// **
/** // * 设置:备注,用于更新备注信息(`beizhu`
* //
*/ // 例如添加、修改字典项的备注内容后,通过此方法保存新的备注信息,方便后续查看和参考。
// * @param beizhu 要设置的备注字符串值。
// */
public void setBeizhu(String beizhu) { public void setBeizhu(String beizhu) {
this.beizhu = beizhu; this.beizhu = beizhu;
} }
/**
* // **
*/ // * 获取:创建时间,对外提供获取创建时间(`createTime`)的方法,
//
// 在展示字典表记录的创建时间、按照时间范围查询字典项、
// * 统计不同时间段创建的数据量等业务场景中,可调用此方法获取对应的 `
//
//
// Date` 类型对象,用于后续的时间相关操作和展示。
// * @return 返回创建时间对应的 `Date` 类型对象。
// */
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
// **
/** // * 设置:创建时间,用于更新创建时间(`createTime`)的值
* //
*/ // ,不过在实际业务中通常创建时间是在记录首次创建时自动设置,较少进行手动更新,
// * 但保留此方法以满足可能的特殊需求(如数据迁移、时间校准等场景下对创建时间进行调整),
//
// 通过传入对应的 `Date` 类型对象来更新创建时间信息。
// * @param createTime 要设置的创建时间对应的 `Date` 类型对象。
// */
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
}
}

@ -1,191 +1,209 @@
package com.entity.model; package com.entity.model;
// 导入房间评论/投诉对应的实体类,可能在后续代码中会基于这个实体类进行一些关联操作或者属性继承等(具体看业务需求)
import com.entity.FangjianLiuyanEntity; import com.entity.FangjianLiuyanEntity;
// 导入MyBatis Plus的注解用于指定该实体类对应的数据库表名方便在数据持久化操作时进行表名的映射
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
// 导入Jackson框架的注解用于在序列化和反序列化日期类型数据时按照指定的格式进行处理这里指定了中文环境"zh")、东八区时区("GMT+8")以及具体的日期时间格式("yyyy-MM-dd HH:mm:ss"
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
// 导入Java中的日期类用于表示日期时间相关的属性比如评论/投诉时间、回复时间、创建时间等
import java.util.Date; import java.util.Date;
// 导入Spring框架的日期格式化注解用于在接收前端传入的日期参数或者向前端返回日期数据时进行格式转换的配置通常和 @JsonFormat 配合使用来处理日期相关的输入输出格式)
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
// 导入Java的序列化接口表明该类的对象可以被序列化和反序列化方便在网络传输、持久化存储等场景中使用
import java.io.Serializable; import java.io.Serializable;
/** /**
* / * /
* *
* entity * entity
* ModelAndView model * ModelAndView model
* /便
*/ */
public class FangjianLiuyanModel implements Serializable { public class FangjianLiuyanModel implements Serializable {
// 定义一个序列化版本号,用于在序列化和反序列化过程中保证版本的兼容性,当类的结构发生变化时(如添加、删除字段等),可以通过修改这个版本号来避免反序列化出错
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* *
* /ID/
*/ */
private Integer id; private Integer id;
/** /**
* *
* IDID
*/ */
private Integer fangjianId; private Integer fangjianId;
/** /**
* *
* /IDID
*/ */
private Integer yonghuId; private Integer yonghuId;
/** /**
* / * /
*
*/ */
private String fangjianLiuyanText; private String fangjianLiuyanText;
/** /**
* *
* /
*/ */
private String replyText; private String replyText;
/** /**
* / * /
* / @JsonFormat @DateTimeFormat
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
private Date insertTime; private Date insertTime;
/** /**
* *
* /便使
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
private Date updateTime; private Date updateTime;
/** /**
* *
* /
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
private Date createTime; private Date createTime;
/** /**
* *
*/ * idJavaBean访getter
*/
public Integer getId() { public Integer getId() {
return id; return id;
} }
/** /**
* *
*/ * idJavaBeansetter
*/
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/** /**
* *
*/ * fangjianId便
*/
public Integer getFangjianId() { public Integer getFangjianId() {
return fangjianId; return fangjianId;
} }
/** /**
* *
*/ * fangjianId/ID
*/
public void setFangjianId(Integer fangjianId) { public void setFangjianId(Integer fangjianId) {
this.fangjianId = fangjianId; this.fangjianId = fangjianId;
} }
/** /**
* *
*/ * yonghuId便
*/
public Integer getYonghuId() { public Integer getYonghuId() {
return yonghuId; return yonghuId;
} }
/** /**
* *
*/ * yonghuId/
*/
public void setYonghuId(Integer yonghuId) { public void setYonghuId(Integer yonghuId) {
this.yonghuId = yonghuId; this.yonghuId = yonghuId;
} }
/** /**
* / * /
*/ * /fangjianLiuyanText使
*/
public String getFangjianLiuyanText() { public String getFangjianLiuyanText() {
return fangjianLiuyanText; return fangjianLiuyanText;
} }
/** /**
* / * /
*/ * /fangjianLiuyanText/
*/
public void setFangjianLiuyanText(String fangjianLiuyanText) { public void setFangjianLiuyanText(String fangjianLiuyanText) {
this.fangjianLiuyanText = fangjianLiuyanText; this.fangjianLiuyanText = fangjianLiuyanText;
} }
/** /**
* *
*/ * replyText/使
*/
public String getReplyText() { public String getReplyText() {
return replyText; return replyText;
} }
/** /**
* *
*/ * replyText/
*/
public void setReplyText(String replyText) { public void setReplyText(String replyText) {
this.replyText = replyText; this.replyText = replyText;
} }
/** /**
* / * /
*/ * /insertTime/使
*/
public Date getInsertTime() { public Date getInsertTime() {
return insertTime; return insertTime;
} }
/** /**
* / * /
*/ * /insertTime//
*/
public void setInsertTime(Date insertTime) { public void setInsertTime(Date insertTime) {
this.insertTime = insertTime; this.insertTime = insertTime;
} }
/** /**
* *
*/ * updateTime/
*/
public Date getUpdateTime() { public Date getUpdateTime() {
return updateTime; return updateTime;
} }
/** /**
* *
*/ * updateTime/
*/
public void setUpdateTime(Date updateTime) { public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime; this.updateTime = updateTime;
} }
/** /**
* *
*/ * createTime/使
*/
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
/** /**
* *
*/ * createTime
*/
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
}
}

@ -1,287 +1,319 @@
package com.entity.model; package com.entity.model;
// 导入房间实体类,可能后续会基于该实体类与本模型类进行关联操作,比如获取房间的其他详细信息等(具体取决于业务逻辑)
import com.entity.FangjianEntity; import com.entity.FangjianEntity;
// 导入MyBatis Plus的注解用于指定该实体类对应的数据库表名方便在数据持久化操作时进行表名的映射使得在与数据库交互时能准确地找到对应的表来执行增删改查等操作
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
// 导入Jackson框架的注解用于在序列化将对象转换为便于存储或传输的字节流等形式和反序列化将字节流等还原为对象日期类型数据时按照指定的格式进行处理这里指定了符合中文习惯的环境"zh")、东八区时区("GMT+8")以及具体的日期时间格式("yyyy-MM-dd HH:mm:ss"),确保日期数据在不同场景下格式统一且符合业务需求
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
// 导入Java中的日期类用于表示创建时间这个日期时间相关的属性方便记录和操作房间信息记录创建的具体时间点
import java.util.Date; import java.util.Date;
// 导入Spring框架的日期格式化注解用于在接收前端传入的日期参数或者向前端返回日期数据时进行格式转换的配置通常和 @JsonFormat 配合使用来处理日期相关的输入输出格式,保证数据交互过程中日期格式的一致性)
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
// 导入Java的序列化接口表明该类的对象可以被序列化和反序列化这样在网络传输例如在分布式系统中不同服务间传递数据、持久化存储如保存到文件或数据库等场景下该类的对象能够正常使用
import java.io.Serializable;
/** /**
* *
* *
* entity * entity
* ModelAndView model * ModelAndView model
* JavaBean便访
*/ */
public class FangjianModel implements Serializable { public class FangjianModel implements Serializable {
// 定义一个序列化版本号用于在序列化和反序列化过程中保证版本的兼容性当类的结构发生变化时如添加、删除字段等可以通过修改这个版本号来避免反序列化出错初始值设为1L在类结构稳定的情况下通常不需要改动
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* *
* ID
*/ */
private Integer id; private Integer id;
/** /**
* *
* 便便
*/ */
private String fangjianName; private String fangjianName;
/** /**
* *
* 便
*/ */
private String fangjianPhoto; private String fangjianPhoto;
/** /**
* *
*
*/ */
private String fangjianTese; private String fangjianTese;
/** /**
* *
* 便使
*/ */
private String fangjianPeizhi; private String fangjianPeizhi;
/** /**
* *
*
*/ */
private String fangjianShangpin; private String fangjianShangpin;
/** /**
* *
*
*/ */
private String fangjianFuwu; private String fangjianFuwu;
/** /**
* *
* 便宿
*/ */
private Double fangjianMoney; private Double fangjianMoney;
/** /**
* *
* 12便宿
*/ */
private Integer fangjianTypes; private Integer fangjianTypes;
/** /**
* *
*
*/ */
private Integer fangjianNumber; private Integer fangjianNumber;
/** /**
* *
*
*/ */
private Integer fangjianClicknum; private Integer fangjianClicknum;
/** /**
* *
*
*/ */
private String fangjianContent; private String fangjianContent;
/** /**
* show1 show2 photoShow * show1 show2 photoShow
* @JsonFormat @DateTimeFormat show1show2photoShow
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
private Date createTime; private Date createTime;
/** /**
* *
*/ * idJavaBean访getter便使
*/
public Integer getId() { public Integer getId() {
return id; return id;
} }
/** /**
* *
*/ * idJavaBeansetter
*/
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/** /**
* *
*/ * fangjianNameJavaBean访便使
*/
public String getFangjianName() { public String getFangjianName() {
return fangjianName; return fangjianName;
} }
/** /**
* *
*/ * fangjianNameJavaBean
*/
public void setFangjianName(String fangjianName) { public void setFangjianName(String fangjianName) {
this.fangjianName = fangjianName; this.fangjianName = fangjianName;
} }
/** /**
* *
*/ * fangjianPhotoJavaBean访
*/
public String getFangjianPhoto() { public String getFangjianPhoto() {
return fangjianPhoto; return fangjianPhoto;
} }
/** /**
* *
*/ * fangjianPhotoJavaBean
*/
public void setFangjianPhoto(String fangjianPhoto) { public void setFangjianPhoto(String fangjianPhoto) {
this.fangjianPhoto = fangjianPhoto; this.fangjianPhoto = fangjianPhoto;
} }
/** /**
* *
*/ * fangjianTeseJavaBean访
*/
public String getFangjianTese() { public String getFangjianTese() {
return fangjianTese; return fangjianTese;
} }
/** /**
* *
*/ * fangjianTeseJavaBean
*/
public void setFangjianTese(String fangjianTese) { public void setFangjianTese(String fangjianTese) {
this.fangjianTese = fangjianTese; this.fangjianTese = fangjianTese;
} }
/** /**
* *
*/ * fangjianPeizhiJavaBean访便便
*/
public String getFangjianPeizhi() { public String getFangjianPeizhi() {
return fangjianPeizhi; return fangjianPeizhi;
} }
/** /**
* *
*/ * fangjianPeizhiJavaBean
*/
public void setFangjianPeizhi(String fangjianPeizhi) { public void setFangjianPeizhi(String fangjianPeizhi) {
this.fangjianPeizhi = fangjianPeizhi; this.fangjianPeizhi = fangjianPeizhi;
} }
/** /**
* *
*/ * fangjianShangpinJavaBean访
*/
public String getFangjianShangpin() { public String getFangjianShangpin() {
return fangjianShangpin; return fangjianShangpin;
} }
/** /**
* *
*/ * fangjianShangpinJavaBean
*/
public void setFangjianShangpin(String fangjianShangpin) { public void setFangjianShangpin(String fangjianShangpin) {
this.fangjianShangpin = fangjianShangpin; this.fangjianShangpin = fangjianShangpin;
} }
/** /**
* *
*/ * fangjianFuwuJavaBean访
*/
public String getFangjianFuwu() { public String getFangjianFuwu() {
return fangjianFuwu; return fangjianFuwu;
} }
/** /**
* *
*/ * fangjianFuwuJavaBean
*/
public void setFangjianFuwu(String fangjianFuwu) { public void setFangjianFuwu(String fangjianFuwu) {
this.fangjianFuwu = fangjianFuwu; this.fangjianFuwu = fangjianFuwu;
} }
/** /**
* *
*/ * fangjianMoneyJavaBean访便宿
*/
public Double getFangjianMoney() { public Double getFangjianMoney() {
return fangjianMoney; return fangjianMoney;
} }
/** /**
* *
*/ * fangjianMoneyJavaBean
*/
public void setFangjianMoney(Double fangjianMoney) { public void setFangjianMoney(Double fangjianMoney) {
this.fangjianMoney = fangjianMoney; this.fangjianMoney = fangjianMoney;
} }
/** /**
* *
*/ * fangjianTypesJavaBean访便便宿
*/
public Integer getFangjianTypes() { public Integer getFangjianTypes() {
return fangjianTypes; return fangjianTypes;
} }
/** /**
* *
*/ * fangjianTypesJavaBean
*/
public void setFangjianTypes(Integer fangjianTypes) { public void setFangjianTypes(Integer fangjianTypes) {
this.fangjianTypes = fangjianTypes; this.fangjianTypes = fangjianTypes;
} }
/** /**
* *
*/ * fangjianNumberJavaBean访
*/
public Integer getFangjianNumber() { public Integer getFangjianNumber() {
return fangjianNumber; return fangjianNumber;
} }
/** /**
* *
*/ * fangjianNumberJavaBean
*/
public void setFangjianNumber(Integer fangjianNumber) { public void setFangjianNumber(Integer fangjianNumber) {
this.fangjianNumber = fangjianNumber; this.fangjianNumber = fangjianNumber;
} }
/**
*
*/
public Integer getFangjianClicknum() {
return fangjianClicknum;
}
/**
*
* fangjianClicknum
*/
public Integer getFangjianClicknum() {
return fangjianClicknum;
}
/** /**
* *
*/ * fangjianClicknum
*/
public void setFangjianClicknum(Integer fangjianClicknum) { public void setFangjianClicknum(Integer fangjianClicknum) {
this.fangjianClicknum = fangjianClicknum; this.fangjianClicknum = fangjianClicknum;
} }
/** /**
* *
*/ * fangjianContent
*/
public String getFangjianContent() { public String getFangjianContent() {
return fangjianContent; return fangjianContent;
} }
/** /**
* *
*/ * fangjianContent
*/
public void setFangjianContent(String fangjianContent) { public void setFangjianContent(String fangjianContent) {
this.fangjianContent = fangjianContent; this.fangjianContent = fangjianContent;
} }
/** /**
* show1 show2 photoShow * show1 show2 photoShow
*/ * createTimeshow1show2photoShow
*/
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
/** /**
* show1 show2 photoShow * show1 show2 photoShow
*/ * createTime
*/
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
}
}

@ -1,169 +1,216 @@
package com.entity.model; package com.entity.model;
// 导入房间预约对应的实体类FangjianOrderEntity可能后续会基于这个实体类进行一些拓展或者关联操作例如在某些业务逻辑中需要获取实体类中的其他属性或方法等
// 比如可能基于FangjianOrderEntity中的一些通用属性进行复用或者在复杂业务场景下调用其相关业务方法来完善房间预约功能相关逻辑。
import com.entity.FangjianOrderEntity; import com.entity.FangjianOrderEntity;
// 导入MyBatis Plus的注解用于指定该实体类对应的数据库表名方便在进行数据库操作如数据持久化、查询等能准确地将实体类与数据库表进行映射
// 通过这个注解MyBatis Plus框架就能知道该实体类对应数据库中的哪张表确保数据操作的准确性避免操作到错误的表。
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
// 导入Jackson框架的注解用于在序列化将对象转换为字节流等形式以便存储或传输和反序列化将字节流等转换回对象日期类型数据时按照指定的格式中文环境、东八区时区以及具体的日期时间格式进行处理
// 这样在将该实体类对象传输(比如通过网络发送给其他服务或者前端)或者从存储中读取还原对象时,日期类型的属性能够以正确的格式呈现和解析,保证数据的一致性和正确性。
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
// 导入Java中的日期类用于表示像预约日期、创建时间等与时间相关的属性这些属性在业务中需要精确地记录具体的时间点
// 方便后续基于时间进行各种业务判断、统计以及展示等操作,例如判断预约是否过期、统计每天的预约量等。
import java.util.Date; import java.util.Date;
// 导入Spring框架的日期格式化注解用于在接收前端传入的日期参数或者向前端返回日期数据时进行格式转换的配置常和 @JsonFormat 注解配合使用,确保日期数据在不同交互场景下格式统一
// 比如前端传入的日期格式可能不规范,通过这个注解可以将其转换为符合后端业务要求的格式,同时返回给前端时也能以统一的格式展示,提升数据交互的兼容性和准确性。
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
// 导入Java的序列化接口表明该类的对象可以被序列化和反序列化使得该类的实例能够在网络传输、持久化存储等场景中正常使用比如在分布式系统中传递该对象或者将其保存到文件等情况
// 遵循这个接口规范,对象就能在不同的运行环境和存储场景下顺利转换和传递,保障系统间数据交互的可行性。
import java.io.Serializable;
/** /**
* *
* *
* entity * entity
* ModelAndView model * ModelAndView model
* JavaBean便访
*/ */
public class FangjianOrderModel implements Serializable { public class FangjianOrderModel implements Serializable {
// 定义一个序列化版本号用于在序列化和反序列化过程中保证版本的兼容性。当类的结构发生变化比如添加、删除字段等情况可以通过修改这个版本号来避免反序列化出现错误初始值设为1L在类结构稳定时通常不需要改动。
// 它就像是类的一个版本标识,在对象序列化存储后,如果类结构改变了,通过调整这个版本号来提示反序列化机制进行相应的兼容处理,确保数据能正确还原。
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* *
* 便
*
*/ */
private Integer id; private Integer id;
/** /**
* *
* ID
* ID
*/ */
private Integer fangjianId; private Integer fangjianId;
/** /**
* *
* ID
* ID
*/ */
private Integer yonghuId; private Integer yonghuId;
/** /**
* *
* @JsonFormat @DateTimeFormat "yyyy-MM-dd HH:mm:ss"
* 便使
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
private Date fangjianOrderTime; private Date fangjianOrderTime;
/** /**
* *
* 便
*
*/ */
private String fangjianOrderText; private String fangjianOrderText;
/** /**
* *
* 1234退便便
*
*/ */
private Integer fangjianOrderTypes; private Integer fangjianOrderTypes;
/** /**
* *
* @JsonFormat @DateTimeFormat
*
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
private Date createTime; private Date createTime;
/** /**
* *
*/ * idJavaBean访getter便使
*
*/
public Integer getId() { public Integer getId() {
return id; return id;
} }
/** /**
* *
*/ * idJavaBeansetter
*
*/
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/** /**
* *
*/ * fangjianIdJavaBean访
* IDID
*/
public Integer getFangjianId() { public Integer getFangjianId() {
return fangjianId; return fangjianId;
} }
/** /**
* *
*/ * fangjianIdJavaBeanID
* ABIDBID
*/
public void setFangjianId(Integer fangjianId) { public void setFangjianId(Integer fangjianId) {
this.fangjianId = fangjianId; this.fangjianId = fangjianId;
} }
/** /**
* *
*/ * yonghuIdJavaBean访
* IDID
*/
public Integer getYonghuId() { public Integer getYonghuId() {
return yonghuId; return yonghuId;
} }
/** /**
* *
*/ * yonghuIdJavaBeanID
* ABIDBID
*/
public void setYonghuId(Integer yonghuId) { public void setYonghuId(Integer yonghuId) {
this.yonghuId = yonghuId; this.yonghuId = yonghuId;
} }
/** /**
* *
*/ * fangjianOrderTimeJavaBean访
* 退
*/
public Date getFangjianOrderTime() { public Date getFangjianOrderTime() {
return fangjianOrderTime; return fangjianOrderTime;
} }
/** /**
* *
*/ * fangjianOrderTimeJavaBean
*
*/
public void setFangjianOrderTime(Date fangjianOrderTime) { public void setFangjianOrderTime(Date fangjianOrderTime) {
this.fangjianOrderTime = fangjianOrderTime; this.fangjianOrderTime = fangjianOrderTime;
} }
/** /**
* *
*/ * fangjianOrderTextJavaBean访便
*
*/
public String getFangjianOrderText() { public String getFangjianOrderText() {
return fangjianOrderText; return fangjianOrderText;
} }
/** /**
* *
*/ * fangjianOrderTextJavaBean
* 便
*/
public void setFangjianOrderText(String fangjianOrderText) { public void setFangjianOrderText(String fangjianOrderText) {
this.fangjianOrderText = fangjianOrderText; this.fangjianOrderText = fangjianOrderText;
} }
/** /**
* *
*/ * fangjianOrderTypesJavaBean访便
*
*/
public Integer getFangjianOrderTypes() { public Integer getFangjianOrderTypes() {
return fangjianOrderTypes; return fangjianOrderTypes;
} }
/** /**
* *
*/ * fangjianOrderTypesJavaBean
*
*/
public void setFangjianOrderTypes(Integer fangjianOrderTypes) { public void setFangjianOrderTypes(Integer fangjianOrderTypes) {
this.fangjianOrderTypes = fangjianOrderTypes; this.fangjianOrderTypes = fangjianOrderTypes;
} }
/** /**
* *
*/ * createTimeJavaBean访
*
*/
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
// 设置:创建时间
/** // 定义了设置 `createTime` 属性值的方法遵循JavaBean的属性修改器setter规范。
* // 外部代码(例如在业务逻辑层进行数据处理,或者在与数据库交互的相关代码中)可以调用这个方法,为当前 `FangjianOrderModel` 对象的 `createTime` 属性赋予具体的日期时间值。
*/ // 例如在初次向数据库插入一条新的房间预约记录时,通常会获取当前系统时间,并通过调用这个方法将获取到的时间值传递进来,以此准确记录该房间预约记录创建的时间点,保证数据的完整性以及后续基于时间相关的业务逻辑(如按照创建时间排序、统计不同时间段的预约数量等)能够正确执行。
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
}
}

@ -1,231 +1,238 @@
package com.entity.model; package com.entity.model;
import com.entity.ForumEntity; import com.entity.ForumEntity;
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date; import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable; import java.io.Serializable;
// **
/** // * 论坛
* // * 接收传参的实体类
* // * (实际开发中配合移动端接口开发手动去掉些没用的字段, 后端一般用entity就够用了
* entity // * 取自ModelAndView的model名称
* ModelAndView model // */
*/
public class ForumModel implements Serializable { public class ForumModel implements Serializable {
private static final long serialVersionUID = 1L;
// 用于定义序列化版本号,在对象序列化和反序列化过程中确保版本兼容性,当类的结构发生变化时,可适当更新此版本号
private static final long serialVersionUID = 1L;
/** // **
* // * 主键,用于唯一标识论坛中的每一条记录,通常对应数据库表中的主键字段
*/ // */
private Integer id; private Integer id;
// **
/** // * 帖子标题,用于存储论坛帖子的标题内容,展示给用户查看帖子主题
* // */
*/
private String forumName; private String forumName;
// **
/** // * 用户可能关联到发布该帖子的用户的唯一标识通常是用户ID用于记录帖子的发布者信息
* // */
*/
private Integer yonghuId; private Integer yonghuId;
// **
/** // * 管理员可能关联到对该帖子有管理权限的管理员的唯一标识通常是管理员ID便于后续进行相关管理操作时确定操作主体
* // */
*/
private Integer usersId; private Integer usersId;
// **
/** // * 发布内容,用于存储用户在论坛中发布帖子的具体文本内容,是帖子的核心信息部分
* // */
*/
private String forumContent; private String forumContent;
// **
/** // * 父id可能用于表示当前帖子所属的上级帖子的ID例如在有回复、跟帖等层级结构的论坛中用于构建帖子之间的关联关系
* id // */
*/
private Integer superIds; private Integer superIds;
// **
/** // * 帖子状态,用于标记帖子当前所处的状态,比如是正常显示、已删除、待审核等不同状态,不同整数值可对应不同的业务状态含义
* // */
*/
private Integer forumStateTypes; private Integer forumStateTypes;
// **
/** // * 发帖时间,记录帖子发布的具体时间,通过 @JsonFormat 和 @DateTimeFormat 注解来规范时间格式的序列化与格式化处理,确保在前后端交互以及数据存储等场景下时间格式的一致性
* // * @JsonFormat 注解用于控制在将对象转换为JSON格式时时间的显示格式
*/ // * @DateTimeFormat 注解用于在接收前端传入时间格式数据时进行解析转换
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") // */
@DateTimeFormat @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat
private Date insertTime; private Date insertTime;
// **
/** // * 修改时间,记录帖子最后一次被修改的具体时间,同样使用相关注解保证时间格式处理的正确性,用于跟踪帖子内容更新情况
* // */
*/ @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @DateTimeFormat
@DateTimeFormat
private Date updateTime; private Date updateTime;
// **
/** // * 创建时间 show2可能是用于特定展示需求或者区分不同创建时间相关概念的字段同样进行时间格式规范处理记录帖子相关创建操作对应的时间信息
* show2 // */
*/ @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @DateTimeFormat
@DateTimeFormat
private Date createTime; private Date createTime;
// **
/** // * 获取:主键,对外提供获取主键值的方法,方便在其他类中访问该对象的主键信息
* // * @return 返回主键对应的整数值
*/ // */
public Integer getId() { public Integer getId() {
return id; return id;
} }
// **
/** // * 设置:主键,用于设置该对象的主键值,通常在对象初始化或者从数据库等外部数据源加载数据后更新主键值时使用
* // * @param id 要设置的主键整数值
*/ // */
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/**
* // **
*/ // * 获取:帖子标题,对外提供获取帖子标题的方法,以便在业务逻辑中获取并展示或处理帖子标题相关内容
// * @return 返回帖子标题对应的字符串值
// */
public String getForumName() { public String getForumName() {
return forumName; return forumName;
} }
// **
/** // * 设置:帖子标题,用于更新帖子标题内容,例如用户编辑帖子标题后调用此方法来保存新的标题信息
* // * @param forumName 要设置的帖子标题字符串值
*/ // */
public void setForumName(String forumName) { public void setForumName(String forumName) {
this.forumName = forumName; this.forumName = forumName;
} }
/**
* // **
*/ // * 获取用户对外提供获取发布该帖子用户ID的方法便于在业务逻辑中关联用户相关信息如查询用户详情等
// * @return 返回发布帖子的用户对应的ID整数值
// */
public Integer getYonghuId() { public Integer getYonghuId() {
return yonghuId; return yonghuId;
} }
// **
/** // * 设置用户用于设置发布该帖子的用户ID可能在从数据库加载数据或者创建新帖子对象时调用此方法来关联用户信息
* // * @param yonghuId 要设置的用户ID整数值
*/ // */
public void setYonghuId(Integer yonghuId) { public void setYonghuId(Integer yonghuId) {
this.yonghuId = yonghuId; this.yonghuId = yonghuId;
} }
/**
* // **
*/ // * 获取管理员对外提供获取对该帖子有管理权限的管理员ID的方法方便在进行管理操作时确定操作主体相关信息
// * @return 返回管理员对应的ID整数值
// */
public Integer getUsersId() { public Integer getUsersId() {
return usersId; return usersId;
} }
// **
/** // * 设置管理员用于设置对该帖子有管理权限的管理员ID例如在分配管理员对特定帖子进行管理等场景下调用此方法来关联管理员信息
* // * @param usersId 要设置的管理员ID整数值
*/ // */
public void setUsersId(Integer usersId) { public void setUsersId(Integer usersId) {
this.usersId = usersId; this.usersId = usersId;
} }
/**
* // **
*/ // * 获取:发布内容,对外提供获取帖子发布内容的方法,用于在展示帖子详情、搜索帖子内容等业务场景中获取具体文本信息
// * @return 返回帖子发布内容对应的字符串值
// */
public String getForumContent() { public String getForumContent() {
return forumContent; return forumContent;
} }
// **
/** // * 设置:发布内容,用于更新帖子的发布内容,例如用户编辑帖子内容后调用此方法来保存新的内容信息
* // * @param forumContent 要设置的发布内容字符串值
*/ // */
public void setForumContent(String forumContent) { public void setForumContent(String forumContent) {
this.forumContent = forumContent; this.forumContent = forumContent;
} }
/**
* id // **
*/ // * 获取父id对外提供获取帖子父ID的方法在处理帖子层级关系相关业务逻辑时如查询回复所属的原帖等会用到此信息
// * @return 返回帖子父ID对应的整数值
// */
public Integer getSuperIds() { public Integer getSuperIds() {
return superIds; return superIds;
} }
// **
/** // * 设置父id用于设置帖子的父ID例如在创建回复帖子并关联到原帖等场景下调用此方法来构建帖子间的层级关联关系
* id // * @param superIds 要设置的父ID整数值
*/ // */
public void setSuperIds(Integer superIds) { public void setSuperIds(Integer superIds) {
this.superIds = superIds; this.superIds = superIds;
} }
/**
* // **
*/ // * 获取:帖子状态,对外提供获取帖子当前状态的方法,便于在业务逻辑中根据状态进行不同的处理,如显示、隐藏、审核等操作
// * @return 返回帖子状态对应的整数值
// */
public Integer getForumStateTypes() { public Integer getForumStateTypes() {
return forumStateTypes; return forumStateTypes;
} }
// **
/** // * 设置:帖子状态,用于更新帖子的状态,比如管理员审核通过帖子后调用此方法将状态设置为正常显示等场景下使用
* // * @param forumStateTypes 要设置的帖子状态整数值
*/ // */
public void setForumStateTypes(Integer forumStateTypes) { public void setForumStateTypes(Integer forumStateTypes) {
this.forumStateTypes = forumStateTypes; this.forumStateTypes = forumStateTypes;
} }
/**
* // **
*/ // * 获取:发帖时间,对外提供获取帖子发布时间的方法,在展示帖子信息、按时间排序等业务场景中会用到此时间信息
// * @return 返回帖子发布时间对应的Date对象
// */
public Date getInsertTime() { public Date getInsertTime() {
return insertTime; return insertTime;
} }
// **
/** // * 设置:发帖时间,用于设置帖子的发布时间,一般在创建帖子对象时会根据实际发布时间来调用此方法进行设置
* // * @param insertTime 要设置的发布时间对应的Date对象
*/ // */
public void setInsertTime(Date insertTime) { public void setInsertTime(Date insertTime) {
this.insertTime = insertTime; this.insertTime = insertTime;
} }
/**
* // **
*/ // * 获取:修改时间,对外提供获取帖子最后修改时间的方法,在展示帖子历史修改记录、判断内容更新情况等业务场景中会用到此时间信息
// * @return 返回帖子最后修改时间对应的Date对象
// */
public Date getUpdateTime() { public Date getUpdateTime() {
return updateTime; return updateTime;
} }
// **
/** // * 设置:修改时间,用于更新帖子最后修改时间,在帖子内容被修改后调用此方法来记录最新的修改时间信息
* // * @param updateTime 要设置的最后修改时间对应的Date对象
*/ // */
public void setUpdateTime(Date updateTime) { public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime; this.updateTime = updateTime;
} }
/**
* show2 // **
*/ // * 获取:创建时间 show2对外提供获取该特定创建时间字段值的方法根据具体业务需求在相关场景中使用此时间信息
// * @return 返回创建时间 show2对应的Date对象
// */
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
// **
/** // * 设置:创建时间 show2用于设置该特定创建时间字段的值在相应的创建相关业务操作场景下调用此方法进行设置
* show2 // * @param createTime 要设置的创建时间 show2对应的Date对象
*/ // */
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
}
}

@ -1,169 +1,198 @@
package com.entity.model; package com.entity.model;
import com.entity.NewsEntity; import com.entity.NewsEntity;
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date; import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable; import java.io.Serializable;
/** /**
* *
* *
* entity * entity
* ModelAndView model * ModelAndViewmodel
*/ */
public class NewsModel implements Serializable { public class NewsModel implements Serializable {
private static final long serialVersionUID = 1L;
// 用于定义序列化版本号,在对象序列化和反序列化过程中确保版本兼容性,
// 当类的结构发生变化时,可适当更新此版本号
private static final long serialVersionUID = 1L;
/** // **
* // * 主键,用于唯一标识每一条公告记录,
*/ // 通常对应数据库表中的主键字段,方便对公告进行查找、更新、删除等操作
// */
private Integer id; private Integer id;
// **
/** // * 公告标题,存储公告的标题内容,
* // 用于直观展示公告主题,方便用户快速了解公告大致内容
*/ // */
private String newsName; private String newsName;
// **
/** // * 公告类型,可能用于区分不同种类的公告(例如通知类、活动类、政策类等)
* // ,通过不同的整数值对应不同的公告分类,便于后续按类型筛选、展示公告
*/ // */
private Integer newsTypes; private Integer newsTypes;
// **
/** // * 公告图片,用于存储公告相关的图片路径或者图片资源的标识等信息
* // (具体取决于项目中图片存储和引用的方式),可用于在前端展示公告时显示对应的图片内容,增强公告的展示效果
*/ // */
private String newsPhoto; private String newsPhoto;
// **
/** // * 添加时间,记录公告被添加到系统中的具体时间,
* // 通过 @JsonFormat 和 @DateTimeFormat
*/ // 注解来规范时间格式的序列化与格式化处理,确保在前后端交互以及数据存储等场景下时间格式的一致性
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") // * @JsonFormat 注解用于控制在将对象转换为JSON格式时时间的显示格式
@DateTimeFormat // * @DateTimeFormat 注解用于在接收前端传入时间格式数据时进行解析转换
// */
@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat
private Date insertTime; private Date insertTime;
// **
/** // * 公告详情,用于存储公告的详细文本内容,
* // 是公告的核心信息部分,包含了需要传达给用户的具体事项、说明等内容
*/ // */
private String newsContent; private String newsContent;
// **
/** // * 创建时间 show1 show2 nameShow
* show1 show2 nameShow // 可能是用于满足不同业务场景下对公告创建时间展示需求而设置的字段(比如在不同页面或者功能模块中以不同名称展示创建时间),同样使用相关注解保证时间格式处理的正确性,用于记录公告创建相关的时间信息
*/ // */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
private Date createTime; private Date createTime;
// **
/** // * 获取:主键,对外提供获取主键值的方法,
* // 方便在其他类中访问该对象的主键信息,例如在进行数据库查询结果映射或者业务逻辑处理中需要用到公告主键时可调用此方法获取
*/ // * @return 返回主键对应的整数值
// */
public Integer getId() { public Integer getId() {
return id; return id;
} }
// **
/** // * 设置:主键,用于设置该对象的主键值,
* // 通常在对象初始化或者从数据库等外部数据源加载数据后更新主键值时使用,例如创建新公告对象并保存到数据库前需要设置主键值
*/ // * @param id 要设置的主键整数值
// */
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/**
* // **
*/ // * 获取:公告标题,对外提供获取公告标题的方法,
// 以便在业务逻辑中获取并展示或处理公告标题相关内容,比如在前端页面展示公告列表时调用此方法获取标题并显示给用户
// * @return 返回公告标题对应的字符串值
// */
public String getNewsName() { public String getNewsName() {
return newsName; return newsName;
} }
// **
/** // * 设置:公告标题,用于更新公告标题内容,
* // 例如管理员编辑公告标题后调用此方法来保存新的标题信息
*/ // * @param newsName 要设置的公告标题字符串值
// */
public void setNewsName(String newsName) { public void setNewsName(String newsName) {
this.newsName = newsName; this.newsName = newsName;
} }
/**
* // **
*/ // * 获取:公告类型,对外提供获取公告类型的方法,
// 便于在业务逻辑中根据类型进行不同的处理,如按类型分类展示公告、根据类型进行权限控制等操作,
// 可通过返回的整数值判断公告所属类型
// * @return 返回公告类型对应的整数值
// */
public Integer getNewsTypes() { public Integer getNewsTypes() {
return newsTypes; return newsTypes;
} }
// **
/** // * 设置:公告类型,用于更新公告的类型,
* // 比如管理员对公告重新分类后调用此方法将类型设置为新的分类对应整数值,以反映公告类型的变化
*/ // * @param newsTypes 要设置的公告类型整数值
// */
public void setNewsTypes(Integer newsTypes) { public void setNewsTypes(Integer newsTypes) {
this.newsTypes = newsTypes; this.newsTypes = newsTypes;
} }
/**
* // **
*/ // * 获取:公告图片,对外提供获取公告图片相关信息的方法,
// 在业务逻辑中用于获取图片信息以在前端展示公告图片,具体返回的字符串根据项目中图片存储和引用方式而定,
// 可能是图片的URL、本地路径等
// * @return 返回公告图片对应的字符串值
// */
public String getNewsPhoto() { public String getNewsPhoto() {
return newsPhoto; return newsPhoto;
} }
// **
/** // * 设置:公告图片,用于更新公告的图片信息,
* // 例如管理员更换公告图片后调用此方法来保存新的图片相关字符串信息,以更新公告展示时的图片内容
*/ // * @param newsPhoto 要设置的公告图片字符串值
// */
public void setNewsPhoto(String newsPhoto) { public void setNewsPhoto(String newsPhoto) {
this.newsPhoto = newsPhoto; this.newsPhoto = newsPhoto;
} }
/**
* // **
*/ // * 获取:添加时间,对外提供获取公告添加时间的方法,在展示公告信息、
// 按时间排序等业务场景中会用到此时间信息,例如在公告列表中按照添加时间先后顺序展示公告
// * @return 返回公告添加时间对应的Date对象
// */
public Date getInsertTime() { public Date getInsertTime() {
return insertTime; return insertTime;
} }
// **
/** // * 设置:添加时间,用于设置公告的添加时间,
* // 一般在创建公告对象时会根据实际添加时间来调用此方法进行设置,确保添加时间记录的准确性
*/ // * @param insertTime 要设置的添加时间对应的Date对象
// */
public void setInsertTime(Date insertTime) { public void setInsertTime(Date insertTime) {
this.insertTime = insertTime; this.insertTime = insertTime;
} }
/**
* // **
*/ // * 获取:公告详情,对外提供获取公告详细内容的方法,
// 用于在展示公告详情页面、搜索公告内容等业务场景中获取具体文本信息,以完整呈现公告需要传达的信息
// * @return 返回公告详情对应的字符串值
// */
public String getNewsContent() { public String getNewsContent() {
return newsContent; return newsContent;
} }
// **
/** // * 设置:公告详情,用于更新公告的详细内容,
* // 例如管理员编辑公告内容后调用此方法来保存新的内容信息,保证公告详情能及时更新反映最新情况
*/ // * @param newsContent 要设置的公告详情字符串值
// */
public void setNewsContent(String newsContent) { public void setNewsContent(String newsContent) {
this.newsContent = newsContent; this.newsContent = newsContent;
} }
/**
* show1 show2 nameShow // **
*/ // * 获取:创建时间 show1 show2 nameShow
// 对外提供获取该特定创建时间字段值的方法,根据具体业务需求在相关场景中使用此时间信息,例如在不同的展示页面按照对应名称展示公告创建时间
// * @return 返回创建时间 show1 show2 nameShow对应的Date对象
// */
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
// **
/** // * 设置:创建时间 show1 show2 nameShow
* show1 show2 nameShow // 用于设置该特定创建时间字段的值,在相应的创建相关业务操作场景下调用此方法进行设置,确保创建时间记录符合业务要求
*/ // * @param createTime 要设置的创建时间 show1 show2 nameShow对应的Date对象
// */
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
}
}

@ -12,236 +12,290 @@ import java.io.Serializable;
/** /**
* *
* *
* entity *
* entity
* 使
* ModelAndView model * ModelAndView model
* ModelAndViewmodel
*/ */
public class YonghuModel implements Serializable { public class YonghuModel implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* *
*
*/ */
private Integer id; private Integer id;
/** /**
* *
* 使便
*/ */
private String username; private String username;
/** /**
* *
* 访
*/ */
private String password; private String password;
/** /**
* *
* 便
*/ */
private String yonghuName; private String yonghuName;
/** /**
* *
*
*/ */
private String yonghuPhoto; private String yonghuPhoto;
/** /**
* *
*
*/ */
private String yonghuPhone; private String yonghuPhone;
/** /**
* *
*
*/ */
private String yonghuEmail; private String yonghuEmail;
/** /**
* *
* 01便
*/ */
private Integer sexTypes; private Integer sexTypes;
/** /**
* *
*
*/ */
private Double newMoney; private Double newMoney;
/** /**
* *
* 10
* 便
*/ */
private Integer yonghuDelete; private Integer yonghuDelete;
/** /**
* *
* @JsonFormatJSON
* @DateTimeFormat便
*
*/ */
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(locale = "zh", timezone = "GMT + 8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat @DateTimeFormat
private Date createTime; private Date createTime;
/** /**
* *
*/ * 访getterJavaJavaBean便
* @return
*/
public Integer getId() { public Integer getId() {
return id; return id;
} }
/** /**
* *
*/ * setterJavaJavaBean
*
* @param id
*/
public void setId(Integer id) { public void setId(Integer id) {
this.id = id; this.id = id;
} }
/** /**
* *
*/ * 访getter便
* @return 使
*/
public String getUsername() { public String getUsername() {
return username; return username;
} }
/** /**
* *
*/ * setter
* @param username
*/
public void setUsername(String username) { public void setUsername(String username) {
this.username = username; this.username = username;
} }
/** /**
* *
*/ * 访getter
*
* @return
*/
public String getPassword() { public String getPassword() {
return password; return password;
} }
/** /**
* *
*/ * setter
*
* @param password
*/
public void setPassword(String password) { public void setPassword(String password) {
this.password = password; this.password = password;
} }
/** /**
* *
*/ * 访getter便
* @return
*/
public String getYonghuName() { public String getYonghuName() {
return yonghuName; return yonghuName;
} }
/** /**
* *
*/ * setter使
* @param yonghuName
*/
public void setYonghuName(String yonghuName) { public void setYonghuName(String yonghuName) {
this.yonghuName = yonghuName; this.yonghuName = yonghuName;
} }
/** /**
* *
*/ * 访getter
* @return
*/
public String getYonghuPhoto() { public String getYonghuPhoto() {
return yonghuPhoto; return yonghuPhoto;
} }
/** /**
* *
*/ * setter
* @param yonghuPhoto
*/
public void setYonghuPhoto(String yonghuPhoto) { public void setYonghuPhoto(String yonghuPhoto) {
this.yonghuPhoto = yonghuPhoto; this.yonghuPhoto = yonghuPhoto;
} }
/** /**
* *
*/ * 访getter
* @return
*/
public String getYonghuPhone() { public String getYonghuPhone() {
return yonghuPhone; return yonghuPhone;
} }
/** /**
* *
*/ * setter
* @param yonghuPhone
*/
public void setYonghuPhone(String yonghuPhone) { public void setYonghuPhone(String yonghuPhone) {
this.yonghuPhone = yonghuPhone; this.yonghuPhone = yonghuPhone;
} }
/** /**
* *
*/ * 访getter
* @return
*/
public String getYonghuEmail() { public String getYonghuEmail() {
return yonghuEmail; return yonghuEmail;
} }
/** /**
* *
*/ * setter
* @param yonghuEmail
*/
public void setYonghuEmail(String yonghuEmail) { public void setYonghuEmail(String yonghuEmail) {
this.yonghuEmail = yonghuEmail; this.yonghuEmail = yonghuEmail;
} }
/** /**
* *
*/ * 访getter
* @return 01
*/
public Integer getSexTypes() { public Integer getSexTypes() {
return sexTypes; return sexTypes;
} }
/** /**
* *
*/ * setter
*
* @param sexTypes
*/
public void setSexTypes(Integer sexTypes) { public void setSexTypes(Integer sexTypes) {
this.sexTypes = sexTypes; this.sexTypes = sexTypes;
} }
/** /**
* *
*/ * 访getter
* @return
*/
public Double getNewMoney() { public Double getNewMoney() {
return newMoney; return newMoney;
} }
/** /**
* *
*/ * setter
*
* @param newMoney
*/
public void setNewMoney(Double newMoney) { public void setNewMoney(Double newMoney) {
this.newMoney = newMoney; this.newMoney = newMoney;
} }
/** /**
* *
*/ * 访getter
*
* @return 10
*/
public Integer getYonghuDelete() { public Integer getYonghuDelete() {
return yonghuDelete; return yonghuDelete;
} }
/** /**
* *
*/ * setter
*
* @param yonghuDelete
*/
public void setYonghuDelete(Integer yonghuDelete) { public void setYonghuDelete(Integer yonghuDelete) {
this.yonghuDelete = yonghuDelete; this.yonghuDelete = yonghuDelete;
} }
/** /**
* *
*/ * 访getter
* @JsonFormat@DateTimeFormat
* @return Date
*/
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;
} }
/** /**
* *
*/ * setter
* @DateTimeFormat
* @param createTime Date
*/
public void setCreateTime(Date createTime) { public void setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
} }
}
}

@ -12,19 +12,45 @@ import java.util.Date;
/** /**
* *
* *
* 使 *
* `DictionaryEntity` `DictionaryEntity`
*
* 使
*
*
*/ */
@TableName("dictionary") @TableName("dictionary")
public class DictionaryView extends DictionaryEntity implements Serializable { public class DictionaryView extends DictionaryEntity implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
// **
// * 默认构造函数,用于创建一个空的 `DictionaryView`
// 对象实例,在某些场景下(比如先创建对象,后续再根据具体数据来填充属性值)会使用到,
// * 提供了一种灵活创建该视图实体对象的方式,
//
// 方便后续在复杂业务逻辑中按需构建对象并设置其属性。
// */
public DictionaryView() { public DictionaryView() {
} }
// **
// * 构造函数,用于根据传入的 `DictionaryEntity` 对象,
//
// 通过 `BeanUtils` 工具类将其属性值复制到当前 `DictionaryView` 对象中,
// * 这样可以方便地基于已有的 `DictionaryEntity`
//
//
// 类型的数据对象来初始化 `DictionaryView` 对象,实现数据的传递和复用,避免重复设置各个属性,提高代码效率,
// * 在后端从数据库查询出 `DictionaryEntity` 数据后,
//
// 若要转换为适合返回的视图实体时,就可以使用这个构造函数进行属性值的复制,
//
// 不过在使用过程中需要注意可能出现的异常情况(已在代码中对异常进行了简单处理)。
// * @param dictionaryEntity 要复制属性值的 `DictionaryEntity`
//
// 对象,通过该对象的属性来初始化当前 `DictionaryView` 对象的属性。
// */
public DictionaryView(DictionaryEntity dictionaryEntity) { public DictionaryView(DictionaryEntity dictionaryEntity) {
try { try {
BeanUtils.copyProperties(this, dictionaryEntity); BeanUtils.copyProperties(this, dictionaryEntity);
@ -33,25 +59,4 @@ public class DictionaryView extends DictionaryEntity implements Serializable {
e.printStackTrace(); e.printStackTrace();
} }
} }
}
}

@ -1,378 +1,418 @@
package com.entity.view; package com.entity.view;
// 导入房间评论/投诉对应的实体类,可能后续会基于这个实体类进行一些属性的继承或者数据的关联操作等,以构建视图实体类所需的数据内容
// 例如可能继承实体类中的部分基础属性,或者通过关联操作获取实体类中与评论/投诉相关联的其他有用数据,丰富视图类展示的信息。
import com.entity.FangjianLiuyanEntity; import com.entity.FangjianLiuyanEntity;
// 导入MyBatis Plus的注解用于指定该实体类对应的数据库表名方便在数据持久化操作等场景下进行表名的映射关联
// 这样在与数据库进行交互(如插入、查询、更新、删除数据等操作)时,框架能准确知道该视图类对应数据库中的哪张表,确保数据操作的准确性。
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
// 导入Apache Commons BeanUtils工具类用于方便地进行Java对象之间属性的复制操作在构造函数中会使用它来复制相关实体类的属性到当前视图类中
// 避免手动逐个设置属性值的繁琐过程,提高代码的复用性和开发效率,使得基于已有实体对象构建视图对象时更加便捷。
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.BeanUtils;
// 导入异常处理相关的类用于捕获在使用BeanUtils进行属性复制操作时可能抛出的异常保证程序的稳定性避免因异常导致程序崩溃
// 因为BeanUtils的copyProperties方法在一些情况下如属性的访问权限问题、源对象或目标对象的方法调用出现错误等可能会抛出异常通过捕获这些异常可以进行相应的处理如记录日志、提示错误信息等
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
// 导入Spring框架的日期格式化注解用于在接收前端传入的日期参数或者向前端返回日期数据时进行格式转换的配置通常和其他日期处理注解配合使用
// 确保前端传入的日期数据能被后端正确解析并转换为合适的格式进行处理,同时向前端返回的日期数据格式也符合前端展示的要求,增强数据交互的兼容性。
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
// 导入Jackson框架的注解用于在序列化和反序列化日期类型数据时按照指定的格式进行处理保证日期数据在传输和存储过程中的格式一致性
// 例如在将对象转换为JSON格式传输序列化或者从JSON数据还原为对象反序列化日期属性能够按照设定的格式如指定的时区、日期时间格式等进行正确处理避免出现日期格式错乱的问题。
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
// 导入Java的序列化接口表明该类的对象可以被序列化和反序列化方便在网络传输、持久化存储等场景中使用该类的实例对象
// 比如在分布式系统中,需要将该视图类的对象通过网络发送给其他服务进行处理,或者将对象保存到文件、数据库等存储介质中时,序列化和反序列化机制就能正常工作。
import java.io.Serializable; import java.io.Serializable;
// 导入Java中的日期类用于处理可能涉及到的日期相关属性虽然在当前代码片段中未明确看到使用场景但作为通用的日期处理类引入
// 以备后续在业务逻辑扩展或者其他相关功能开发中,如果需要记录与房间评论/投诉相关的时间信息(如评论时间、投诉处理时间等)时可以直接使用该类来表示日期数据。
import java.util.Date; import java.util.Date;
/** /**
* / * /
* *
* 使 * 使
* FangjianLiuyanEntity/访gettersetter便
*
*/ */
@TableName("fangjian_liuyan") @TableName("fangjian_liuyan")
public class FangjianLiuyanView extends FangjianLiuyanEntity implements Serializable { public class FangjianLiuyanView extends FangjianLiuyanEntity implements Serializable {
private static final long serialVersionUID = 1L; // 定义一个序列化版本号用于在序列化和反序列化过程中保证版本的兼容性当类的结构发生变化时如添加、删除字段等可以通过修改这个版本号来避免反序列化出错初始值设为1L在类相对稳定的情况下一般不需要改动
// 它类似于一个标识,在对象进行序列化存储后,如果类的结构发生了改变(比如添加了新属性、修改了属性类型等),反序列化时会根据这个版本号来判断是否能够正确还原对象,若版本号不匹配可能会导致反序列化失败,通过手动修改它可以尝试进行兼容处理。
private static final long serialVersionUID = 1L;
// 以下是级联表 fangjian 相关的属性定义,用于存储房间的各种详细信息,方便在展示房间评论/投诉信息时,同时向前端提供对应的房间具体情况,增强信息的完整性和展示效果
//级联表 fangjian
/** // 房间名称
* // 用于存储房间的具体名称,方便用户更直观地识别和区分不同的房间,例如“标准间”“豪华套房”等,在前端展示评论/投诉信息时可一并展示房间名称,让用户清楚是针对哪个房间的反馈
*/ // 这样用户在查看评论或投诉内容时,能快速了解所涉及的具体房间,有助于更好地理解反馈的针对性和关联性。
private String fangjianName; private String fangjianName;
/**
* // 房间图片
*/ // 用于存储房间相关图片的路径或者图片的标识信息(具体取决于业务中图片存储和引用的方式),以便在前端展示房间外观、内部布置等图片信息,结合评论/投诉内容能让用户更全面了解房间情况
private String fangjianPhoto; // 例如,若评论提到房间的装修风格,同时展示房间的图片可以让用户更直观地感受装修的实际效果,增强对评论/投诉内容的理解。
/** private String fangjianPhoto;
*
*/ // 房间特色
private String fangjianTese; // 用于描述房间具有的独特特点,比如“海景房”的海景特色、“主题房”的主题特色等,在展示评论/投诉时展示房间特色有助于用户更好地理解反馈背景
/** // 比如用户投诉房间的海景视野不好,知道这是海景房这个特色后,就能更清楚问题所在以及影响的程度等情况。
* private String fangjianTese;
*/
private String fangjianPeizhi; // 房间配置
/** // 用于列举房间内配备的各种设施设备等信息,像“有电视、空调、独立卫生间”等,使前端能展示房间的硬件配置情况,辅助用户了解评论/投诉所涉及的房间设施相关内容
* // 如果评论提到房间内某个设施出现故障等问题,通过展示房间配置信息,用户能明确知道是哪种设施出了状况,便于后续的处理和理解。
*/ private String fangjianPeizhi;
private String fangjianShangpin;
/** // 提供的商品
* // 用于说明房间为住客额外提供的商品信息,例如“提供免费的矿泉水、洗漱用品”等,在展示评论/投诉信息时告知用户房间原本提供的商品情况,便于更好地理解反馈内容
*/ // 例如用户投诉没有提供应有的免费矿泉水,通过展示提供的商品信息就能直观判断是否确实存在该问题。
private String fangjianFuwu; private String fangjianShangpin;
/**
* // 提供的服务
*/ // 用于介绍房间配套提供的服务项目,比如“包含早餐服务”“提供免费的客房清洁服务”等,让前端能展示房间配套的服务内容,帮助用户从服务角度理解评论/投诉相关情况
private Double fangjianMoney; // 比如用户投诉客房清洁服务不及时,知道房间有该项服务后,就能更准确地评估问题的合理性以及影响程度等。
/** private String fangjianFuwu;
*
*/ // 价格(天)
private Integer fangjianTypes; // 用于存储房间每天的出租价格,方便用户了解住宿该房间的费用情况,在展示评论/投诉时展示价格信息可让用户从性价比等角度综合考虑相关反馈
/** // 例如用户评论房间价格过高,通过展示价格信息,其他用户可以结合房间配置、服务等情况来判断这个价格是否确实不合理,从更全面的角度看待评论内容。
* private Double fangjianMoney;
*/
private String fangjianValue; // 房间类型
/** // 用于区分不同种类的房间可能通过数字或其他编码方式对应不同的房型分类例如1表示单人间2表示双人间等便于前端进行房间分类展示以及用户根据房型对评论/投诉进行分类查看和理解
* // 不同房型的特点和用户期望可能不同,这样分类展示能让用户更方便地筛选和查看与自己关注的房型相关的评论/投诉内容,提高信息查找的效率。
*/ private Integer fangjianTypes;
private Integer fangjianNumber;
/** // 房间类型的值
* // 可能用于存储房间类型对应的更具体的描述性值(比如房间类型代码对应的具体文字描述等),方便在前端更友好地展示房间类型相关信息,辅助用户理解评论/投诉涉及的房间类型情况
*/ // 例如对于一些复杂的房型分类,仅用数字或代码表示不够直观,通过这个具体描述性值(如“豪华海景双人房”等)能让用户更清晰地知晓房型情况,更好地理解相关评论/投诉。
private Integer fangjianClicknum; private String fangjianValue;
/**
* // 房间剩余数量
*/ // 用于记录当前房间还可预订的剩余数量,实时反映房间的预订余量情况,在展示评论/投诉时展示剩余数量可让用户了解房间的热门程度等相关背景信息
private String fangjianContent; // 如果一个房间剩余数量很少但评论较多,可能说明该房间比较热门,用户可以从这个角度进一步思考评论内容的参考价值等。
private Integer fangjianNumber;
//级联表 yonghu
/** // 点击次数
* // 用于统计房间信息被查看的次数,可用于分析房间的受欢迎程度等,在展示评论/投诉时展示点击次数能让用户知晓房间的关注度情况,辅助理解反馈的重要性等
*/ // 一般来说,点击次数高的房间关注度高,其评论/投诉可能更受关注,用户可以根据这个关注度情况来判断评论/投诉内容的影响力和参考价值。
private String yonghuName; private Integer fangjianClicknum;
/**
* // 房间详情
*/ // 用于存储更详细的关于房间的描述信息,可能包含房间的布局、面积大小、装修风格等更全面的介绍内容,在前端展示评论/投诉时一并展示详细内容能让用户更深入了解房间情况及反馈背景
private String yonghuPhoto; // 例如用户投诉房间空间小,通过查看房间详情里的面积大小等信息,能更准确地判断这个投诉是否合理,帮助用户更全面地理解评论/投诉的具体情况。
/** private String fangjianContent;
*
*/ // 以下是级联表 yonghu 相关的属性定义,用于存储发表评论/投诉的用户的各种详细信息,方便在展示房间评论/投诉信息时,同时向前端提供对应的用户具体情况,增强信息的完整性和展示效果
private String yonghuPhone;
/** // 用户姓名
* // 用于存储发表评论/投诉的用户的姓名,方便在前端展示评论/投诉信息时明确反馈者身份,增强信息的可读性和关联性
*/ // 知道是谁发表的评论/投诉,能让其他用户更直观地判断反馈的可信度以及可能的针对性等情况,使信息展示更人性化。
private String yonghuEmail; private String yonghuName;
/**
* // 头像
*/ // 用于存储用户的头像相关信息(比如头像图片的路径或者标识等),以便在前端展示用户头像,使展示的评论/投诉信息更具个性化和直观性
private Double newMoney; // 展示头像可以让用户界面更生动,同时也有助于用户快速识别不同的反馈者,增强信息展示的辨识度。
/** private String yonghuPhoto;
*
*/ // 手机号
private Integer yonghuDelete; // 用于存储用户的手机号码,可能在某些业务场景下(如需要联系用户核实评论/投诉内容等)会用到该信息,同时在前端展示也能增加用户信息的完整性
// 虽然一般不会直接在前端完全展示手机号,但在特定情况下(如管理员有相应权限查看并联系用户),手机号信息的存在能确保业务流程的连贯性,方便进行相关操作。
private String yonghuPhone;
// 电子邮箱
// 用于存储用户的电子邮箱地址,同样在一些业务相关操作(如发送反馈处理结果等)或者增强前端展示信息完整性方面有作用
// 比如后台处理完评论/投诉后,可以通过电子邮箱向用户发送处理结果通知,完善了整个业务的信息交互环节。
private String yonghuEmail;
// 余额
// 用于存储用户账户的余额信息,虽然在房间评论/投诉场景下可能关联性不是特别紧密,但作为用户的整体信息一部分,在一些综合业务展示场景下可能会涉及到
// 例如在展示用户的综合账户情况或者涉及到一些与消费、优惠等相关联且和余额有关的业务拓展场景下,余额信息可能会一同展示出来。
private Double newMoney;
// 假删
// 可能用于表示用户是否被标记为假删除状态(具体含义需结合业务逻辑确定),在前端展示用户相关信息时可体现该状态情况
// 比如在一些数据管理场景下,用户可能只是被标记为假删除(并非真正从系统中删除),在前端展示相关信息时显示这个状态可以让管理员等清楚用户数据的实际处理情况。
private Integer yonghuDelete;
// 默认构造函数用于创建FangjianLiuyanView类的实例对象在一些情况下比如通过反射等方式创建对象时可能会用到
// 当使用某些框架或机制需要创建该类的对象,但又没有明确的参数传入时,就会调用这个默认构造函数来创建一个默认初始化的对象实例。
public FangjianLiuyanView() { public FangjianLiuyanView() {
} }
// 构造函数接收一个FangjianLiuyanEntity对象作为参数用于将传入的实体类对象的属性值复制到当前视图类对象中通过BeanUtils工具类来实现属性复制方便基于已有的实体数据构建视图对象
// 这种方式可以复用已有的实体类数据,快速构建出符合前端展示需求的视图对象,避免重复设置各个属性值,提高了代码的复用性和开发效率。
public FangjianLiuyanView(FangjianLiuyanEntity fangjianLiuyanEntity) { public FangjianLiuyanView(FangjianLiuyanEntity fangjianLiuyanEntity) {
try { try {
// 使用BeanUtils的copyProperties方法将fangjianLiuyanEntity对象的属性值复制到当前对象this实现属性的赋值操作但该方法可能会抛出IllegalAccessException访问权限异常和InvocationTargetException方法调用异常所以需要进行异常捕获处理
// 因为在复制属性过程中,可能存在源对象的某些属性没有对应的访问权限(如私有属性且没有提供合适的访问方法等情况),或者在调用属性的 setter 方法时出现异常(比如 setter 方法内部逻辑错误等),都可能导致这两个异常被抛出。
BeanUtils.copyProperties(this, fangjianLiuyanEntity); BeanUtils.copyProperties(this, fangjianLiuyanEntity);
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block // 如果在属性复制过程中出现异常,打印异常堆栈信息,方便开发人员排查问题,确定是哪里出现了访问权限问题或者方法调用出错等情况
// 通过查看堆栈信息,可以追溯到具体是哪个属性的复制出现了问题,有助于快速定位和修复代码中的错误。
e.printStackTrace(); e.printStackTrace();
} }
} }
// 以下是级联表 fangjian 相关属性的访问器getter和修改器setter方法定义遵循JavaBean规范方便外部代码获取和设置这些属性的值用于数据的传递和操作
// 获取: 房间名称
// 定义了获取房间名称fangjianName属性值的方法外部代码可以通过调用这个方法获取该对象对应的房间名称信息便于在前端展示房间评论/投诉信息时展示对应的房间名称
// 例如在前端页面的评论/投诉详情展示模块中,通过调用这个方法获取房间名称并展示在相应位置,让用户清楚反馈对应的具体房间。
public String getFangjianName() {
return fangjianName;
}
// 设置: 房间名称
// 定义了设置房间名称fangjianName属性值的方法外部代码可以通过调用这个方法为该对象设置房间的名称例如在从数据库查询数据构建视图对象后根据实际情况更新房间名称等场景下使用
// 比如数据库中房间名称有更新,通过调用这个方法可以将新的房间名称设置到视图对象中,确保前端展示的信息是最新的。
public void setFangjianName(String fangjianName) {
this.fangjianName = fangjianName;
}
// 获取: 房间图片
// 定义了获取房间图片fangjianPhoto属性值的方法外部代码可以通过调用这个方法获取该对象关联的房间图片相关信息用于在前端展示房间评论/投诉时展示相应的房间图片内容
// 在前端页面渲染评论/投诉信息时,可以调用这个方法获取图片信息并展示出来,让用户更直观地看到房间的样子,辅助理解评论/投诉内容。
public String getFangjianPhoto() {
return fangjianPhoto;
}
// 设置: 房间图片
// 定义了设置房间图片fangjianPhoto属性值的方法外部代码可以通过调用这个方法为该对象设置房间图片的相关信息比如在更新房间图片信息或者根据不同业务场景设置图片路径等情况时使用
// 例如房间重新上传了新的宣传图片,通过调用这个方法可以更新视图对象中的图片信息,使前端展示的图片是最新的。
public void setFangjianPhoto(String fangjianPhoto) {
this.fangjianPhoto = fangjianPhoto;
}
// 获取: 房间特色
// 这是按照JavaBean规范定义的访问器getter方法用于获取房间特色fangjianTese属性的值。
// 外部代码(例如在构建前端页面展示房间评论/投诉相关信息的业务逻辑中,或者处理数据展示交互的代码等)可以调用这个方法,获取当前对象所代表房间具备的特色信息,然后将其展示给用户,帮助用户更好地理解该房间在评论/投诉中所涉及的相关背景情况,比如房间具有的独特卖点或者与众不同之处等内容。
public String getFangjianTese() {
return fangjianTese;
}
// 设置: 房间特色
// 定义了设置房间特色fangjianTese属性值的方法遵循JavaBean规范中的属性修改器setter方法定义。
// 外部代码在需要对房间特色的描述内容进行更新时(比如酒店对房间进行了新的装修,增添了新的特色元素,需要完善房间信息;或者根据业务运营需求,对房间特色介绍文案进行调整修改等情况),可以调用这个方法,传入相应的字符串内容作为新的房间特色描述,以此来改变该属性的值,确保在前端展示给用户的房间特色信息是准确且符合实际情况的。
public void setFangjianTese(String fangjianTese) {
this.fangjianTese = fangjianTese;
}
// 获取: 房间配置
// 按照JavaBean的属性访问器规范定义的方法用于获取房间配置fangjianPeizhi属性的值。
// 外部代码(像是在前端展示房间评论/投诉信息时,需要呈现房间内部配备的设施设备等具体情况的相关代码逻辑中)可以调用此方法,获取到当前对象记录的房间内的硬件配置信息,例如房间里有哪些电器、家具等设施配备情况,方便在前端页面展示给用户,辅助用户更清晰地理解评论/投诉中涉及到的关于房间设施方面的相关内容,比如用户投诉某个设施不好用,通过查看配置信息能更明确具体是哪项设施的问题。
public String getFangjianPeizhi() {
return fangjianPeizhi;
}
// 设置: 房间配置
// 这是遵循JavaBean规范定义的用于设置房间配置fangjianPeizhi属性值的方法属于属性修改器setter方法。
// 外部代码在出现诸如房间设施配备发生变化(比如新添加了某种设施设备,或者原有的设施被更换等更新房间设施配备情况),或者根据实际的业务场景需要对已记录的配置信息文本进行修改(比如纠正之前配置信息录入的错误等)时,可以调用这个方法,传入新的描述房间配置的字符串内容,来更新该属性的值,保证前端展示的房间配置信息与实际情况相符。
public void setFangjianPeizhi(String fangjianPeizhi) {
this.fangjianPeizhi = fangjianPeizhi;
}
// 获取: 提供的商品
// 依据JavaBean规范定义的访问器getter方法用于获取提供的商品fangjianShangpin属性的值。
// 外部代码(例如在前端展示房间评论/投诉详情页面,需要告知用户该房间原本为住客提供哪些商品的相关业务逻辑代码中)可以调用这个方法,获取当前对象注明的房间提供的商品信息,像房间是否提供免费的矿泉水、洗漱用品等内容,便于在前端展示给用户知晓,从而帮助用户更好地理解评论/投诉中涉及到的与房间提供商品相关的情况,比如用户投诉没收到应有的商品,通过查看提供的商品信息就能判断是否合理。
public String getFangjianShangpin() {
return fangjianShangpin;
}
// 设置: 提供的商品
// 定义了设置提供的商品fangjianShangpin属性值的方法遵循JavaBean规范里的属性修改器setter规则。
// 外部代码在有新增商品种类、修改已提供商品的相关描述(比如商品品牌更换等情况)等业务场景下,需要更新房间提供商品的相关描述内容时,可以调用这个方法,传入对应的字符串内容,以此来更新该属性的值,确保前端展示的房间提供商品信息是最新且准确的。
public void setFangjianShangpin(String fangjianShangpin) {
this.fangjianShangpin = fangjianShangpin;
}
// 获取: 提供的服务
// 按照JavaBean规范定义的访问器getter方法用于获取提供的服务fangjianFuwu属性的值。
// 外部代码(在前端展示房间评论/投诉信息时,为了让用户从服务角度更好地理解相关反馈情况,需要获取房间配套提供的服务项目信息的相关代码逻辑中)可以调用这个方法,获取当前对象列出的房间提供的服务信息,例如房间是否包含早餐服务、有没有免费的客房清洁服务等内容,方便在前端展示给用户,辅助用户从服务方面去理解评论/投诉所涉及的相关情况,比如用户投诉服务不到位,通过查看提供的服务信息能更清楚具体是哪项服务出现了问题。
public String getFangjianFuwu() {
return fangjianFuwu;
}
// 设置: 提供的服务
// 这是遵循JavaBean规范定义的用于设置提供的服务fangjianFuwu属性值的方法属于属性修改器setter方法。
// 外部代码在业务运营过程中,当对房间配套的服务项目进行调整(比如新增了某项服务,或者取消了原有的某项服务等情况),或者根据业务需求修改服务介绍的相关文本(比如对服务内容描述进行优化等)时,可以调用这个方法,传入新的描述房间提供服务的字符串内容,来更新该属性的值,保证前端展示的房间提供服务信息与实际情况一致。
public void setFangjianFuwu(String fangjianFuwu) {
this.fangjianFuwu = fangjianFuwu;
}
// 获取: 价格(天)
// 按照JavaBean规范定义的访问器getter方法用于获取价格fangjianMoney属性的值该价格指的是房间每天的出租价格。
// 外部代码(比如在前端展示房间评论/投诉信息时,为了让用户从性价比等角度综合考虑相关反馈,需要获取房间价格信息的相关业务逻辑代码中)可以调用这个方法,获取当前对象对应的房间每天的出租价格信息,方便在前端展示给用户查看,使得用户能够结合价格情况以及房间的其他配置、服务等信息,来全面评估评论/投诉内容中关于价格方面的合理性等情况,比如用户评价价格过高,通过展示价格信息,其他用户可以对比判断是否确实如此。
public Double getFangjianMoney() {
return fangjianMoney;
}
// 设置: 价格(天)
// 定义了设置价格fangjianMoney属性值的方法遵循JavaBean规范里的属性修改器setter规则用于设置房间每天的出租价格。
// 外部代码在诸如酒店进行价格调整(根据市场行情、淡旺季等因素改变房间价格),或者根据不同的业务场景(比如针对特定客户群体设置优惠价格等情况)设定价格时,可以调用这个方法,传入相应的价格数值,以此来更新该属性的值,确保前端展示的房间价格信息是准确且符合实际业务设定的。
public void setFangjianMoney(Double fangjianMoney) {
this.fangjianMoney = fangjianMoney;
}
// 获取: 房间类型
// 依据JavaBean规范定义的访问器getter方法用于获取房间类型fangjianTypes属性的值这里的房间类型通常是通过特定的标识如数字、代码等方式来区分不同种类的房间。
// 外部代码(在前端展示房间评论/投诉信息时,为了便于进行房间分类展示,以及方便用户根据房型对评论/投诉进行分类查看和理解的相关业务逻辑代码中可以调用这个方法获取当前对象表示的房间类型信息例如用1表示单人间2表示双人间等便于前端根据不同的房型分类展示对应的评论/投诉内容,使用户能够更高效地查找和查看自己关注的房型相关的反馈信息。
public Integer getFangjianTypes() {
return fangjianTypes;
}
// 设置: 房间类型
// 这是遵循JavaBean规范定义的用于设置房间类型fangjianTypes属性值的方法属于属性修改器setter方法用于设置房间的类型标识。
// 外部代码在诸如酒店新增了一种房型,需要对其设定相应的类型标识,或者根据业务运营需要对已有的房间分类进行修改(比如重新调整房型分类标准等情况)时,可以调用这个方法,传入对应的房间类型标识数值,来更新该属性的值,保证前端展示的房间类型信息与实际的房型分类情况相符。
public void setFangjianTypes(Integer fangjianTypes) {
this.fangjianTypes = fangjianTypes;
}
// 获取: 房间类型的值
// 按照JavaBean规范定义的访问器getter方法用于获取房间类型的值fangjianValue属性的值该属性存储的是房间类型对应的更具体的描述性值比如房间类型代码对应的具体文字描述等内容
// 外部代码(在前端展示房间评论/投诉信息时,为了更友好、直观地展示房间类型相关信息,辅助用户更好地理解评论/投诉涉及的房间类型情况的相关业务逻辑代码中可以调用这个方法获取当前对象存储的房间类型对应的具体描述性值例如对于“2”这个房间类型标识对应的具体描述性值可能是“豪华海景双人房”这样能让用户更清晰地知晓房型情况更准确地理解相关评论/投诉内容。
public String getFangjianValue() {
return fangjianValue;
}
//级联表的get和set fangjian // 设置: 房间类型的值
// 定义了设置房间类型的值fangjianValue属性值的方法遵循JavaBean规范里的属性修改器setter规则用于设置房间类型对应的具体描述性值。
/** // 外部代码在诸如更新房间类型对应的文字描述(比如对房型的命名进行优化、修改,使其更符合实际情况或者更通俗易懂等情况)时,可以调用这个方法,传入新的描述性字符串内容,以此来更新该属性的值,确保前端展示的房间类型具体描述信息是准确且易于用户理解的。
* public void setFangjianValue(String fangjianValue) {
*/ this.fangjianValue = fangjianValue;
public String getFangjianName() { }
return fangjianName;
}
/**
*
*/
public void setFangjianName(String fangjianName) {
this.fangjianName = fangjianName;
}
/**
*
*/
public String getFangjianPhoto() {
return fangjianPhoto;
}
/**
*
*/
public void setFangjianPhoto(String fangjianPhoto) {
this.fangjianPhoto = fangjianPhoto;
}
/**
*
*/
public String getFangjianTese() {
return fangjianTese;
}
/**
*
*/
public void setFangjianTese(String fangjianTese) {
this.fangjianTese = fangjianTese;
}
/**
*
*/
public String getFangjianPeizhi() {
return fangjianPeizhi;
}
/**
*
*/
public void setFangjianPeizhi(String fangjianPeizhi) {
this.fangjianPeizhi = fangjianPeizhi;
}
/**
*
*/
public String getFangjianShangpin() {
return fangjianShangpin;
}
/**
*
*/
public void setFangjianShangpin(String fangjianShangpin) {
this.fangjianShangpin = fangjianShangpin;
}
/**
*
*/
public String getFangjianFuwu() {
return fangjianFuwu;
}
/**
*
*/
public void setFangjianFuwu(String fangjianFuwu) {
this.fangjianFuwu = fangjianFuwu;
}
/**
*
*/
public Double getFangjianMoney() {
return fangjianMoney;
}
/**
*
*/
public void setFangjianMoney(Double fangjianMoney) {
this.fangjianMoney = fangjianMoney;
}
/**
*
*/
public Integer getFangjianTypes() {
return fangjianTypes;
}
/**
*
*/
public void setFangjianTypes(Integer fangjianTypes) {
this.fangjianTypes = fangjianTypes;
}
/**
*
*/
public String getFangjianValue() {
return fangjianValue;
}
/**
*
*/
public void setFangjianValue(String fangjianValue) {
this.fangjianValue = fangjianValue;
}
/**
*
*/
public Integer getFangjianNumber() {
return fangjianNumber;
}
/**
*
*/
public void setFangjianNumber(Integer fangjianNumber) {
this.fangjianNumber = fangjianNumber;
}
/**
*
*/
public Integer getFangjianClicknum() {
return fangjianClicknum;
}
/**
*
*/
public void setFangjianClicknum(Integer fangjianClicknum) {
this.fangjianClicknum = fangjianClicknum;
}
/**
*
*/
public String getFangjianContent() {
return fangjianContent;
}
/**
*
*/
public void setFangjianContent(String fangjianContent) {
this.fangjianContent = fangjianContent;
}
//级联表的get和set yonghu
/**
*
*/
public String getYonghuName() {
return yonghuName;
}
/**
*
*/
public void setYonghuName(String yonghuName) {
this.yonghuName = yonghuName;
}
/**
*
*/
public String getYonghuPhoto() {
return yonghuPhoto;
}
/**
*
*/
public void setYonghuPhoto(String yonghuPhoto) {
this.yonghuPhoto = yonghuPhoto;
}
/**
*
*/
public String getYonghuPhone() {
return yonghuPhone;
}
/**
*
*/
public void setYonghuPhone(String yonghuPhone) {
this.yonghuPhone = yonghuPhone;
}
/**
*
*/
public String getYonghuEmail() {
return yonghuEmail;
}
/**
*
*/
public void setYonghuEmail(String yonghuEmail) {
this.yonghuEmail = yonghuEmail;
}
/**
*
*/
public Double getNewMoney() {
return newMoney;
}
/**
*
*/
public void setNewMoney(Double newMoney) {
this.newMoney = newMoney;
}
/**
*
*/
public Integer getYonghuDelete() {
return yonghuDelete;
}
/**
*
*/
public void setYonghuDelete(Integer yonghuDelete) {
this.yonghuDelete = yonghuDelete;
}
// 获取: 房间剩余数量
// 依据JavaBean规范定义的访问器getter方法用于获取房间剩余数量fangjianNumber属性的值该属性记录的是当前房间还可预订的剩余数量。
// 外部代码(在前端展示房间评论/投诉信息时,为了展示房间的热门程度等相关背景信息,让用户了解房间的预订余量情况的相关业务逻辑代码中)可以调用这个方法,获取当前对象记录的房间可预订剩余数量信息,例如剩余数量少可能意味着房间比较热门,用户可以结合这个信息以及评论/投诉内容,从不同角度来综合考虑相关反馈的参考价值等情况。
public Integer getFangjianNumber() {
return fangjianNumber;
}
} // 设置: 房间剩余数量
// 这是遵循JavaBean规范定义的用于设置房间剩余数量fangjianNumber属性值的方法属于属性修改器setter方法用于设置房间剩余可预订的数量。
// 外部代码在出现诸如有新预订、取消预订等操作后(这些操作会导致房间剩余可预订数量发生变化),需要更新相应数值,使前端展示的信息保持准确时,可以调用这个方法,传入新的剩余数量数值,来更新该属性的值,保证前端展示的房间剩余数量信息与实际可预订情况相符。
public void setFangjianNumber(Integer fangjianNumber) {
this.fangjianNumber = fangjianNumber;
}
// 获取: 点击次数
// 此方法是按照JavaBean规范定义的访问器getter方法用于获取房间的点击次数属性fangjianClicknum的值点击次数用于统计房间信息被查看的次数。
// 外部代码(比如展示房间相关信息的业务逻辑代码或者前端交互代码等,特别是在需要呈现房间受关注程度相关情况的场景下)可以调用这个方法,来获取当前对象所代表的房间被查看的次数信息,以便根据点击次数情况进行相应的展示(比如在前端页面展示房间的热门程度排序等)或业务处理(比如基于点击次数分析房间的受欢迎程度等)。
public Integer getFangjianClicknum() {
return fangjianClicknum;
}
// 设置: 点击次数
// 这是遵循JavaBean规范定义的修改器setter方法用于设置房间的点击次数属性fangjianClicknum的值。
// 外部代码在需要更新房间的点击次数信息时(例如每次有用户查看房间详情页面后,按照业务逻辑通常会对点击次数进行累加更新等情况),可以调用这个方法,传入相应的整数值(一般是在原有的点击次数基础上进行增加等操作)来改变该属性的值,确保点击次数数据能准确反映房间被查看的实际情况。
public void setFangjianClicknum(Integer fangjianClicknum) {
this.fangjianClicknum = fangjianClicknum;
}
// 获取: 房间详情
// 按照JavaBean的属性访问器规范定义的方法用于获取房间详情属性fangjianContent的值该属性存储的是关于房间更全面、详细的描述信息。
// 外部代码(在展示房间相关的评论/投诉信息时,为了同时向用户呈现房间的详细情况,帮助用户更好地理解评论/投诉的背景的相关业务逻辑代码中)可以调用这个方法,获取到像房间布局、面积大小、装修风格等更全面的介绍内容,使得用户在查看评论/投诉时能结合房间详情信息,更深入地了解具体情况,比如用户投诉房间空间小,通过查看房间详情里的面积大小等信息,就能更准确地判断这个投诉是否合理。
public String getFangjianContent() {
return fangjianContent;
}
// 设置: 房间详情
// 遵循JavaBean规范的属性修改器方法用于设置房间详情属性fangjianContent的值。
// 当需要更新房间的详细描述信息时(比如完善房间介绍、修改房间详情中的部分内容等业务场景,例如酒店重新装修后需要更新房间布局、风格等相关描述信息),外部代码可以调用这个方法,传入新的字符串内容来更新该属性的值,确保房间详情信息的准确性和及时性,使前端展示给用户的房间详情与实际情况一致。
public void setFangjianContent(String fangjianContent) {
this.fangjianContent = fangjianContent;
}
// 以下是级联表 yonghu 的相关get和set方法部分用于对与用户相关的各个属性进行访问和修改操作方便在处理房间评论/投诉相关业务时,获取和更新对应的用户信息。
// 获取: 用户姓名
// 按照JavaBean规范定义的访问器方法用于获取用户姓名属性yonghuName的值该属性存储的是发表评论/投诉的用户的姓名。
// 在展示房间评论/投诉信息时,通过调用这个方法可以获取发表该评论/投诉的用户的姓名,从而明确反馈者身份,增强信息展示的完整性和可读性,方便前端进行相应的展示处理,比如在前端页面评论/投诉详情区域展示用户姓名,让其他用户能清楚知道是谁发表的反馈内容,提高信息的可信度和关联性。
public String getYonghuName() {
return yonghuName;
}
// 设置: 用户姓名
// 遵循JavaBean规范的修改器方法用于设置用户姓名属性yonghuName的值。
// 例如在从数据库查询到用户信息并构建当前视图对象后,若发现用户姓名需要更新(如用户修改了昵称等情况),外部代码可以调用这个方法传入新的姓名值来更新该属性,确保前端展示的用户姓名信息是最新且准确的,符合用户实际情况。
public void setYonghuName(String yonghuName) {
this.yonghuName = yonghuName;
}
// 获取: 头像
// 这是用于获取用户头像属性yonghuPhoto值的访问器方法符合JavaBean规范该属性存储的是用户头像相关的信息比如头像图片的路径或者标识等内容
// 外部代码调用它可以获取到用户头像相关的信息,便于在前端展示评论/投诉信息时同时展示用户头像,使展示效果更具个性化和直观性,比如在前端页面评论/投诉展示区域旁边展示用户头像图片,让用户界面更生动形象,也有助于用户快速识别不同的反馈者,增强信息展示的辨识度。
public String getYonghuPhoto() {
return yonghuPhoto;
}
// 设置: 头像
// 按照JavaBean的属性修改器规范定义的方法用于设置用户头像属性yonghuPhoto的值。
// 当用户更新了头像信息(比如更换了头像图片)后,外部代码可以调用这个方法,传入新的头像相关信息(如更新后的图片路径等)来更新该属性的值,保证前端展示的头像信息是最新的,与用户实际的头像情况相符。
public void setYonghuPhoto(String yonghuPhoto) {
this.yonghuPhoto = yonghuPhoto;
}
// 获取: 手机号
// 这是按照JavaBean规范定义的访问器getter方法用于获取用户手机号属性yonghuPhone的值。
// 外部代码(比如在涉及到需要获取用户联系方式相关的业务逻辑中,像后台管理员在特定情况下需要联系用户核实评论/投诉内容,或者系统要向用户发送重要通知等场景下对应的代码部分)可以调用这个方法,获取到当前对象所关联用户的手机号码信息,以便进行后续相应的操作,不过出于隐私保护,通常不会随意将手机号展示给所有用户,只是在有对应权限和必要的业务场景下使用该信息。
public String getYonghuPhone() {
return yonghuPhone;
}
// 设置: 手机号
// 遵循JavaBean规范定义的用于设置用户手机号属性yonghuPhone值的修改器setter方法。
// 当用户的手机号码发生了变更(例如用户更换了新的手机号码,在前端进行相应手机号修改操作并提交到后端后),外部代码(如处理用户信息更新的业务逻辑代码)可以调用这个方法,传入新的手机号作为参数,来更新该属性的值,以此保证在系统中存储以及后续使用的用户手机号信息是准确无误的,与用户实际的联系方式保持一致。
public void setYonghuPhone(String yonghuPhone) {
this.yonghuPhone = yonghuPhone;
}
// 获取: 电子邮箱
// 按照JavaBean规范定义的访问器方法用于获取用户电子邮箱属性yonghuEmail的值。
// 外部代码(在业务流程中,像是后台业务逻辑里需要向用户发送反馈处理结果,或者要与用户进行一些关于评论/投诉相关的沟通、发送系统通知等通过邮件形式交互的业务场景对应的代码部分)调用该方法后,能够获取到当前对象所关联用户的电子邮箱地址,从而可以利用这个邮箱地址进行邮件的发送操作,同时也有助于完善前端展示的用户信息内容,尽管不一定直接展示邮箱地址给所有用户,但它作为用户信息的一部分能让整体信息更加完整。
public String getYonghuEmail() {
return yonghuEmail;
}
// 设置: 电子邮箱
// 遵循JavaBean规范的修改器方法用于设置用户电子邮箱属性yonghuEmail的值。
// 当用户更新了自己的电子邮箱地址(比如用户在个人信息设置页面修改了邮箱,相关操作请求传递到后端)后,外部代码(例如负责处理用户信息修改保存的业务逻辑代码)可以调用这个方法,传入新的邮箱地址作为参数,来更新该属性的值,确保在后续的各种业务操作(如发送邮件等)中使用的邮箱信息是最新且准确的,符合用户实际的邮箱设置情况。
public void setYonghuEmail(String yonghuEmail) {
this.yonghuEmail = yonghuEmail;
}
// 获取: 余额
// 这是用于获取用户余额属性newMoney值的访问器getter方法符合JavaBean规范。
// 外部代码(在一些综合业务展示页面(比如展示用户的综合账户信息详情时),或者涉及到用户资金相关的扩展业务场景(如判断用户是否满足某些优惠活动条件、分析用户消费能力等情况对应的业务逻辑代码)中)调用它可以获取到用户账户的余额信息,虽然在房间评论/投诉的主要业务场景下,余额信息关联性可能不是特别紧密,但在更全面的业务范畴内,该信息可能会起到一定的作用,有助于对用户进行更全面的了解和相关业务分析。
public Double getNewMoney() {
return newMoney;
}
// 设置: 余额
// 按照JavaBean的属性修改器规范定义的方法用于设置用户余额属性newMoney的值。
// 例如在用户进行了充值、消费等操作(比如用户通过线上支付渠道进行充值,或者在酒店内使用房间相关服务产生消费等情况发生后,对应的业务逻辑处理代码)导致余额发生变化后,外部代码可以调用这个方法,传入新的余额数值作为参数,来更新该属性的值,以此保证系统中记录的用户余额信息始终是准确的,能够真实反映用户账户的资金情况。
public void setNewMoney(Double newMoney) {
this.newMoney = newMoney;
}
// 获取: 假删
// 此为获取用户假删属性yonghuDelete值的访问器getter方法遵循JavaBean规范。
// 该属性可能用于表示用户是否被标记为假删除状态(具体含义需结合业务逻辑确定,比如可能是在数据管理过程中,为了保留用户数据但又暂时不让其在某些常规展示场景下出现等情况而设置的一种特殊状态标识),外部代码(比如在前端展示用户相关信息时,需要根据用户状态进行不同展示效果处理的业务逻辑代码)调用这个方法可以获取到这个状态信息,以便在前端展示用户相关信息时体现该状态情况,让管理员或者相关人员清楚了解用户数据的实际处理状态。
public Integer getYonghuDelete() {
return yonghuDelete;
}
// 设置: 假删
// 遵循JavaBean规范定义的用于设置用户假删属性yonghuDelete值的修改器setter方法。
// 当用户的假删状态发生变化比如从正常状态变为假删除状态可能是因为某些业务规则触发如用户长时间未活跃等情况需要将其标记为假删除或者反之从假删除状态恢复为正常状态例如用户重新激活账号等情况外部代码如负责处理用户状态变更的业务逻辑代码可以调用这个方法传入相应的整数值通常是代表不同状态的特定数值如0表示正常1表示假删除等具体看业务定义来更新该属性的值确保用户的假删状态在系统中能准确记录和体现。
public void setYonghuDelete(Integer yonghuDelete) {
this.yonghuDelete = yonghuDelete;
}
}

@ -1,394 +1,460 @@
package com.entity.view; package com.entity.view;
// 导入房间预约对应的实体类,后续可能基于该实体类进行属性继承、数据关联等操作,以构建适合后端返回给前端展示的视图实体类所需的数据内容
import com.entity.FangjianOrderEntity; import com.entity.FangjianOrderEntity;
// 导入MyBatis Plus的注解用于指定该实体类对应的数据库表名方便在与数据库进行数据持久化操作如查询、插入、更新、删除等时进行表名的映射关联
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
// 导入Apache Commons BeanUtils工具类用于方便地进行Java对象之间属性的复制操作在构造函数中会使用它来将相关实体类的属性复制到当前视图类中
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.BeanUtils;
// 导入异常处理相关的类用于捕获在使用BeanUtils进行属性复制操作时可能抛出的异常保证程序的稳定性避免因异常导致程序崩溃
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
// 导入Spring框架的日期格式化注解用于在接收前端传入的日期参数或者向前端返回日期数据时进行格式转换的配置通常和其他日期处理注解配合使用
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
// 导入Jackson框架的注解用于在序列化和反序列化日期类型数据时按照指定的格式进行处理保证日期数据在传输和存储过程中的格式一致性
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
// 导入Java的序列化接口表明该类的对象可以被序列化和反序列化方便在网络传输、持久化存储等场景中使用该类的实例对象
import java.io.Serializable; import java.io.Serializable;
// 导入Java中的日期类用于处理可能涉及到的日期相关属性虽然在当前代码片段中未明确看到使用场景但作为通用的日期处理类引入
import java.util.Date; import java.util.Date;
/** /**
* *
* *
* 使 * 使
* FangjianOrderEntity访gettersetter便
*/ */
@TableName("fangjian_order") @TableName("fangjian_order")
public class FangjianOrderView extends FangjianOrderEntity implements Serializable { public class FangjianOrderView extends FangjianOrderEntity implements Serializable {
private static final long serialVersionUID = 1L; // 定义一个序列化版本号用于在序列化和反序列化过程中保证版本的兼容性当类的结构发生变化时如添加、删除字段等可以通过修改这个版本号来避免反序列化出错初始值设为1L在类相对稳定的情况下一般不需要改动
private static final long serialVersionUID = 1L;
/**
* /**
*/ *
private String fangjianOrderValue; * 便
*/
private String fangjianOrderValue;
//级联表 fangjian // 级联表 fangjian相关属性定义用于存储房间的各种详细信息方便在展示房间预约信息时同时向前端提供对应的房间具体情况增强信息的完整性和展示效果
/**
* /**
*/ *
private String fangjianName; * 便
/** */
* private String fangjianName;
*/
private String fangjianPhoto; /**
/** *
* * 便
*/ */
private String fangjianTese; private String fangjianPhoto;
/**
* /**
*/ *
private String fangjianPeizhi; *
/** */
* private String fangjianTese;
*/
private String fangjianShangpin; /**
/** *
* * 使
*/ */
private String fangjianFuwu; private String fangjianPeizhi;
/**
* /**
*/ *
private Double fangjianMoney; * 便
/** */
* private String fangjianShangpin;
*/
private Integer fangjianTypes; /**
/** *
* *
*/ */
private String fangjianValue; private String fangjianFuwu;
/**
* /**
*/ *
private Integer fangjianNumber; * 便宿
/** */
* private Double fangjianMoney;
*/
private Integer fangjianClicknum; /**
/** *
* * 12便
*/ */
private String fangjianContent; private Integer fangjianTypes;
//级联表 yonghu /**
/** *
* * 便
*/ */
private String yonghuName; private String fangjianValue;
/**
* /**
*/ *
private String yonghuPhoto; *
/** */
* private Integer fangjianNumber;
*/
private String yonghuPhone; /**
/** *
* *
*/ */
private String yonghuEmail; private Integer fangjianClicknum;
/**
* /**
*/ *
private Double newMoney; *
/** */
* private String fangjianContent;
*/
private Integer yonghuDelete; // 级联表 yonghu相关属性定义用于存储进行房间预约的用户的各种详细信息方便在展示房间预约信息时同时向前端提供对应的用户具体情况增强信息的完整性和展示效果
/**
*
* 便
*/
private String yonghuName;
/**
*
* 便使
*/
private String yonghuPhoto;
/**
*
*
*/
private String yonghuPhone;
/**
*
*
*/
private String yonghuEmail;
/**
*
*
*/
private Double newMoney;
/**
*
*
*/
private Integer yonghuDelete;
// 默认构造函数用于创建FangjianOrderView类的实例对象在一些情况下比如通过反射等方式创建对象时可能会用到
public FangjianOrderView() { public FangjianOrderView() {
} }
// 构造函数接收一个FangjianOrderEntity对象作为参数用于将传入的实体类对象的属性值复制到当前视图类对象中通过BeanUtils工具类来实现属性复制方便基于已有的实体数据构建视图对象
public FangjianOrderView(FangjianOrderEntity fangjianOrderEntity) { public FangjianOrderView(FangjianOrderEntity fangjianOrderEntity) {
try { try {
// 使用BeanUtils的copyProperties方法将fangjianOrderEntity对象的属性值复制到当前对象this实现属性的赋值操作但该方法可能会抛出IllegalAccessException访问权限异常和InvocationTargetException方法调用异常所以需要进行异常捕获处理
BeanUtils.copyProperties(this, fangjianOrderEntity); BeanUtils.copyProperties(this, fangjianOrderEntity);
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block // 如果在属性复制过程中出现异常,打印异常堆栈信息,方便开发人员排查问题,确定是哪里出现了访问权限问题或者方法调用出错等情况
e.printStackTrace(); e.printStackTrace();
} }
} }
/**
*
* JavaBean访getterfangjianOrderValue
* 便
*/
public String getFangjianOrderValue() {
return fangjianOrderValue;
}
/**
*
* fangjianOrderValueJavaBeansetter
*
*/
public void setFangjianOrderValue(String fangjianOrderValue) {
this.fangjianOrderValue = fangjianOrderValue;
}
// 级联表的get和set fangjian
/**
*
* JavaBean访getterfangjianName
*
*/
public String getFangjianName() {
return fangjianName;
}
/**
*
* fangjianNameJavaBeansetter
*
*/
public void setFangjianName(String fangjianName) {
this.fangjianName = fangjianName;
}
/**
*
* JavaBean访getterfangjianPhoto
* 便使
*/
public String getFangjianPhoto() {
return fangjianPhoto;
}
/** /**
* *
*/ * JavaBeanfangjianPhotosetter
public String getFangjianOrderValue() { *
return fangjianOrderValue; */
} public void setFangjianPhoto(String fangjianPhoto) {
/** this.fangjianPhoto = fangjianPhoto;
* }
*/
public void setFangjianOrderValue(String fangjianOrderValue) {
this.fangjianOrderValue = fangjianOrderValue;
}
//级联表的get和set fangjian
/**
*
*/
public String getFangjianName() {
return fangjianName;
}
/**
*
*/
public void setFangjianName(String fangjianName) {
this.fangjianName = fangjianName;
}
/**
*
*/
public String getFangjianPhoto() {
return fangjianPhoto;
}
/**
*
*/
public void setFangjianPhoto(String fangjianPhoto) {
this.fangjianPhoto = fangjianPhoto;
}
/**
*
*/
public String getFangjianTese() {
return fangjianTese;
}
/**
*
*/
public void setFangjianTese(String fangjianTese) {
this.fangjianTese = fangjianTese;
}
/**
*
*/
public String getFangjianPeizhi() {
return fangjianPeizhi;
}
/**
*
*/
public void setFangjianPeizhi(String fangjianPeizhi) {
this.fangjianPeizhi = fangjianPeizhi;
}
/**
*
*/
public String getFangjianShangpin() {
return fangjianShangpin;
}
/**
*
*/
public void setFangjianShangpin(String fangjianShangpin) {
this.fangjianShangpin = fangjianShangpin;
}
/**
*
*/
public String getFangjianFuwu() {
return fangjianFuwu;
}
/**
*
*/
public void setFangjianFuwu(String fangjianFuwu) {
this.fangjianFuwu = fangjianFuwu;
}
/**
*
*/
public Double getFangjianMoney() {
return fangjianMoney;
}
/**
*
*/
public void setFangjianMoney(Double fangjianMoney) {
this.fangjianMoney = fangjianMoney;
}
/**
*
*/
public Integer getFangjianTypes() {
return fangjianTypes;
}
/**
*
*/
public void setFangjianTypes(Integer fangjianTypes) {
this.fangjianTypes = fangjianTypes;
}
/**
*
*/
public String getFangjianValue() {
return fangjianValue;
}
/**
*
*/
public void setFangjianValue(String fangjianValue) {
this.fangjianValue = fangjianValue;
}
/**
*
*/
public Integer getFangjianNumber() {
return fangjianNumber;
}
/**
*
*/
public void setFangjianNumber(Integer fangjianNumber) {
this.fangjianNumber = fangjianNumber;
}
/**
*
*/
public Integer getFangjianClicknum() {
return fangjianClicknum;
}
/**
*
*/
public void setFangjianClicknum(Integer fangjianClicknum) {
this.fangjianClicknum = fangjianClicknum;
}
/**
*
*/
public String getFangjianContent() {
return fangjianContent;
}
/**
*
*/
public void setFangjianContent(String fangjianContent) {
this.fangjianContent = fangjianContent;
}
//级联表的get和set yonghu
/**
*
*/
public String getYonghuName() {
return yonghuName;
}
/**
*
*/
public void setYonghuName(String yonghuName) {
this.yonghuName = yonghuName;
}
/**
*
*/
public String getYonghuPhoto() {
return yonghuPhoto;
}
/**
*
*/
public void setYonghuPhoto(String yonghuPhoto) {
this.yonghuPhoto = yonghuPhoto;
}
/**
*
*/
public String getYonghuPhone() {
return yonghuPhone;
}
/**
*
*/
public void setYonghuPhone(String yonghuPhone) {
this.yonghuPhone = yonghuPhone;
}
/**
*
*/
public String getYonghuEmail() {
return yonghuEmail;
}
/**
*
*/
public void setYonghuEmail(String yonghuEmail) {
this.yonghuEmail = yonghuEmail;
}
/**
*
*/
public Double getNewMoney() {
return newMoney;
}
/**
*
*/
public void setNewMoney(Double newMoney) {
this.newMoney = newMoney;
}
/**
*
*/
public Integer getYonghuDelete() {
return yonghuDelete;
}
/**
*
*/
public void setYonghuDelete(Integer yonghuDelete) {
this.yonghuDelete = yonghuDelete;
}
/**
*
* JavaBean访getterfangjianTese
* 便
*/
public String getFangjianTese() {
return fangjianTese;
}
/**
*
* fangjianTeseJavaBeansetter
*
*/
public void setFangjianTese(String fangjianTese) {
this.fangjianTese = fangjianTese;
}
/**
*
* JavaBean访fangjianPeizhi
* 便
*/
public String getFangjianPeizhi() {
return fangjianPeizhi;
}
/**
*
* JavaBeanfangjianPeizhisetter
*
*/
public void setFangjianPeizhi(String fangjianPeizhi) {
this.fangjianPeizhi = fangjianPeizhi;
}
/**
*
* JavaBean访getterfangjianShangpin
* 便
*/
public String getFangjianShangpin() {
return fangjianShangpin;
}
// 设置: 提供的商品
// 这是遵循JavaBean规范定义的用于设置提供的商品fangjianShangpin属性值的方法属于属性修改器setter方法。
// 外部代码在有新增商品种类、修改已提供商品的相关描述(比如商品品牌更换等情况)等业务场景下,需要更新房间提供商品的相关描述内容时,可以调用这个方法,传入对应的字符串内容作为新的商品描述信息,以此来更新该属性的值,确保前端展示的房间提供商品信息是最新且准确的。
public void setFangjianShangpin(String fangjianShangpin) {
this.fangjianShangpin = fangjianShangpin;
}
// 获取: 提供的服务
// 按照JavaBean规范定义的访问器getter方法用于获取提供的服务fangjianFuwu属性的值。
// 外部代码(在前端展示房间预约信息时,为了让用户从服务角度更好地理解相关预约情况,需要获取房间配套提供的服务项目信息的相关业务逻辑代码中)可以调用这个方法,获取当前对象列出的房间提供的服务信息,例如房间是否包含早餐服务、有没有免费的客房清洁服务等内容,方便在前端展示给用户,辅助用户从服务方面去理解房间预约所涉及的相关情况,比如是否满足自己对服务的期望等。
public String getFangjianFuwu() {
return fangjianFuwu;
}
// 设置: 提供的服务
// 定义了设置提供的服务fangjianFuwu属性值的方法遵循JavaBean规范里的属性修改器setter规则。
// 外部代码在业务运营过程中,当对房间配套的服务项目进行调整(比如新增了某项服务,或者取消了原有的某项服务等情况),或者根据业务需求修改服务介绍的相关文本(比如对服务内容描述进行优化等)时,可以调用这个方法,传入新的描述房间提供服务的字符串内容,来更新该属性的值,保证前端展示的房间提供服务信息与实际情况一致。
public void setFangjianFuwu(String fangjianFuwu) {
this.fangjianFuwu = fangjianFuwu;
}
// 获取: 价格(天)
// 按照JavaBean规范定义的访问器getter方法用于获取价格fangjianMoney属性的值该价格指的是房间每天的出租价格。
// 外部代码(比如在前端展示房间预约信息时,为了让用户从性价比等角度综合考虑相关预约情况,需要获取房间价格信息的相关业务逻辑代码中)可以调用这个方法,获取当前对象对应的房间每天的出租价格信息,方便在前端展示给用户查看,使得用户能够结合价格情况以及房间的其他配置、服务等信息,来全面评估预约该房间是否合适,比如判断价格是否符合自己的预算等。
public Double getFangjianMoney() {
return fangjianMoney;
}
// 设置: 价格(天)
// 定义了设置价格fangjianMoney属性值的方法遵循JavaBean规范里的属性修改器setter规则用于设置房间每天的出租价格。
// 外部代码在诸如酒店进行价格调整(根据市场行情、淡旺季等因素改变房间价格),或者根据不同的业务场景(比如针对特定客户群体设置优惠价格等情况)设定价格时,可以调用这个方法,传入相应的价格数值,以此来更新该属性的值,确保前端展示的房间价格信息是准确且符合实际业务设定的。
public void setFangjianMoney(Double fangjianMoney) {
this.fangjianMoney = fangjianMoney;
}
// 获取: 房间类型
// 依据JavaBean规范定义的访问器getter方法用于获取房间类型fangjianTypes属性的值这里的房间类型通常是通过特定的标识如数字、代码等方式来区分不同种类的房间。
// 外部代码在前端展示房间预约信息时为了便于进行房间分类展示以及方便用户根据房型对预约进行分类查看和理解的相关业务逻辑代码中可以调用这个方法获取当前对象表示的房间类型信息例如用1表示单人间2表示双人间等便于前端根据不同的房型分类展示对应的预约内容使用户能够更高效地查找和查看自己关注的房型相关的预约信息。
public Integer getFangjianTypes() {
return fangjianTypes;
}
// 设置: 房间类型
// 这是遵循JavaBean规范定义的用于设置房间类型fangjianTypes属性值的方法属于属性修改器setter方法用于设置房间的类型标识。
// 外部代码在诸如酒店新增了一种房型,需要对其设定相应的类型标识,或者根据业务运营需要对已有的房间分类进行修改(比如重新调整房型分类标准等情况)时,可以调用这个方法,传入对应的房间类型标识数值,来更新该属性的值,保证前端展示的房间类型信息与实际的房型分类情况相符。
public void setFangjianTypes(Integer fangjianTypes) {
this.fangjianTypes = fangjianTypes;
}
// 获取: 房间类型的值
// 按照JavaBean规范定义的访问器getter方法用于获取房间类型的值fangjianValue属性的值该属性存储的是房间类型对应的更具体的描述性值比如房间类型代码对应的具体文字描述等内容
// 外部代码在前端展示房间预约信息时为了更友好、直观地展示房间类型相关信息辅助用户更好地理解预约涉及的房间类型情况的相关业务逻辑代码中可以调用这个方法获取当前对象存储的房间类型对应的具体描述性值例如对于“2”这个房间类型标识对应的具体描述性值可能是“豪华海景双人房”这样能让用户更清晰地知晓房型情况更准确地理解相关预约内容。
public String getFangjianValue() {
return fangjianValue;
}
// 设置: 房间类型的值
// 定义了设置房间类型的值fangjianValue属性值的方法遵循JavaBean规范里的属性修改器setter规则用于设置房间类型对应的具体描述性值。
// 外部代码在诸如更新房间类型对应的文字描述(比如对房型的命名进行优化、修改,使其更符合实际情况或者更通俗易懂等情况)时,可以调用这个方法,传入新的描述性字符串内容,以此来更新该属性的值,确保前端展示的房间类型具体描述信息是准确且易于用户理解的。
public void setFangjianValue(String fangjianValue) {
this.fangjianValue = fangjianValue;
}
// 获取: 房间剩余数量
// 依据JavaBean规范定义的访问器getter方法用于获取房间剩余数量fangjianNumber属性的值该属性记录的是当前房间还可预订的剩余数量。
// 外部代码(在前端展示房间预约信息时,为了展示房间的热门程度等相关背景信息,让用户了解房间的预订余量情况的相关业务逻辑代码中)可以调用这个方法,获取当前对象记录的房间可预订剩余数量信息,例如剩余数量少可能意味着房间比较热门,用户可以结合这个信息以及其他房间相关情况,来综合考虑是否进行预约等情况。
public Integer getFangjianNumber() {
return fangjianNumber;
}
// 设置: 房间剩余数量
// 这是遵循JavaBean规范定义的用于设置房间剩余数量fangjianNumber属性值的方法属于属性修改器setter方法用于设置房间剩余可预订的数量。
// 外部代码在出现诸如有新预订、取消预订等操作后(这些操作会导致房间剩余可预订数量发生变化),需要更新相应数值,使前端展示的信息保持准确时,可以调用这个方法,传入新的剩余数量数值,来更新该属性的值,保证前端展示的房间剩余数量信息与实际可预订情况相符。
public void setFangjianNumber(Integer fangjianNumber) {
this.fangjianNumber = fangjianNumber;
}
// 获取: 点击次数
// 此方法是按照JavaBean规范定义的访问器getter方法用于获取房间的点击次数属性fangjianClicknum的值点击次数用于统计房间信息被查看的次数。
// 外部代码(比如展示房间相关信息的业务逻辑代码或者前端交互代码等,特别是在需要呈现房间受关注程度相关情况的场景下)可以调用这个方法,来获取当前对象所代表的房间被查看的次数信息,以便根据点击次数情况进行相应的展示(比如在前端页面展示房间的热门程度排序等)或业务处理(比如基于点击次数分析房间的受欢迎程度等),辅助用户了解该房间的关注度情况,进而考虑是否预约该房间。
public Integer getFangjianClicknum() {
return fangjianClicknum;
}
// 设置: 点击次数
// 这是遵循JavaBean规范定义的修改器setter方法用于设置房间的点击次数属性fangjianClicknum的值。
// 外部代码在需要更新房间的点击次数信息时(例如每次有用户查看房间详情页面后,按照业务逻辑通常会对点击次数进行累加更新等情况),可以调用这个方法,传入相应的整数值(一般是在原有的点击次数基础上进行增加等操作)来改变该属性的值,确保点击次数数据能准确反映房间被查看的实际情况。
public void setFangjianClicknum(Integer fangjianClicknum) {
this.fangjianClicknum = fangjianClicknum;
}
// 获取: 房间详情
// 按照JavaBean的属性访问器规范定义的方法用于获取房间详情属性fangjianContent的值该属性存储的是关于房间更全面、详细的描述信息。
// 外部代码(在展示房间相关的预约信息时,为了同时向用户呈现房间的详细情况,帮助用户更好地理解预约的背景的相关业务逻辑代码中)可以调用这个方法,获取到像房间布局、面积大小、装修风格等更全面的介绍内容,使得用户在进行预约操作时能结合房间详情信息,更深入地了解具体情况,比如判断房间是否满足自己对住宿环境等方面的需求。
public String getFangjianContent() {
return fangjianContent;
}
// 设置: 房间详情
// 遵循JavaBean规范的属性修改器方法用于设置房间详情属性fangjianContent的值。
// 当需要更新房间的详细描述信息时(比如完善房间介绍、修改房间详情中的部分内容等业务场景,例如酒店重新装修后需要更新房间布局、风格等相关描述信息),外部代码可以调用这个方法,传入新的字符串内容来更新该属性的值,确保房间详情信息的准确性和及时性,使前端展示给用户的房间详情与实际情况一致。
public void setFangjianContent(String fangjianContent) {
this.fangjianContent = fangjianContent;
}
// 级联表的get和set yonghu
// 获取: 用户姓名
// 按照JavaBean规范定义的访问器方法用于获取用户姓名属性yonghuName的值该属性存储的是进行房间预约的用户的姓名。
// 在展示房间预约信息时,通过调用这个方法可以获取进行预约操作的用户的姓名,从而明确预约者身份,增强信息展示的完整性和可读性,方便前端进行相应的展示处理,比如在前端页面预约详情区域展示用户姓名,让其他用户能清楚知道是谁进行的预约,提高信息的可信度和关联性。
public String getYonghuName() {
return yonghuName;
}
// 设置: 用户姓名
// 遵循JavaBean规范的修改器方法用于设置用户姓名属性yonghuName的值。
// 例如在从数据库查询到用户信息并构建当前视图对象后,若发现用户姓名需要更新(如用户修改了昵称等情况),外部代码可以调用这个方法传入新的姓名值来更新该属性,确保前端展示的用户姓名信息是最新且准确的,符合用户实际情况。
public void setYonghuName(String yonghuName) {
this.yonghuName = yonghuName;
}
// 获取: 头像
// 这是用于获取用户头像属性yonghuPhoto值的访问器方法符合JavaBean规范该属性存储的是用户头像相关的信息比如头像图片的路径或者标识等内容
// 外部代码调用它可以获取到用户头像相关的信息,便于在前端展示房间预约信息时同时展示用户头像,使展示效果更具个性化和直观性,比如在前端页面预约展示区域旁边展示用户头像图片,让用户界面更生动形象,也有助于用户快速识别不同的预约者,增强信息展示的辨识度。
public String getYonghuPhoto() {
return yonghuPhoto;
}
// 设置: 头像
// 按照JavaBean的属性修改器规范定义的方法用于设置用户头像属性yonghuPhoto的值。
// 当用户更新了头像信息(比如更换了头像图片)后,外部代码可以调用这个方法,传入新的头像相关信息(如更新后的图片路径等)来更新该属性的值,保证前端展示的头像信息是最新的,与用户实际的头像情况相符。
public void setYonghuPhoto(String yonghuPhoto) {
this.yonghuPhoto = yonghuPhoto;
}
// 获取: 手机号
// 此为获取用户手机号属性yonghuPhone值的访问器方法遵循JavaBean规范该属性存储的是用户的手机号码信息。
// 外部代码通过调用这个方法可以获取到用户的手机号码信息,在一些业务场景下(比如需要联系用户确认预约信息、进行预约相关通知等情况)可能会用到该手机号信息,同时也能增加前端展示用户信息的完整性,不过出于隐私保护,一般不会直接完全展示手机号给所有用户,可能只有特定权限的人员(如管理员等)在必要时可见。
public String getYonghuPhone() {
return yonghuPhone;
}
// 设置: 手机号
// 遵循JavaBean规范定义的用于设置用户手机号属性yonghuPhone值的修改器方法。
// 若用户的手机号码发生了变更,外部代码(如处理用户信息更新的业务逻辑代码)可以调用这个方法,传入新的手机号作为参数,来更新该属性的值,以此保证在系统中存储以及后续使用的用户手机号信息是准确无误的,与用户实际的联系方式保持一致。
public void setYonghuPhone(String yonghuPhone) {
this.yonghuPhone = yonghuPhone;
}
// 获取: 电子邮箱
// 按照JavaBean规范定义的访问器方法用于获取用户电子邮箱属性yonghuEmail的值。
// 外部代码调用该方法可以获取用户的电子邮箱地址,在业务中可能用于发送预约确认、提醒等邮件,或者处理预约变更等情况与用户沟通等通过邮件形式交互的业务场景,也有助于完善前端展示的用户信息内容,尽管不一定直接展示邮箱地址给所有用户,但它作为用户信息的一部分能让整体信息更加完整。
public String getYonghuEmail() {
return yonghuEmail;
}
// 设置: 电子邮箱
// 遵循JavaBean规范的修改器方法用于设置用户电子邮箱属性yonghuEmail的值。
// 当用户更新了自己的电子邮箱地址(比如用户在个人信息设置页面修改了邮箱,相关操作请求传递到后端)后,外部代码(例如负责处理用户信息修改保存的业务逻辑代码)可以调用这个方法,传入新的邮箱地址作为参数,来更新该属性的值,确保在后续的各种业务操作(如发送邮件等)中使用的邮箱信息是最新且准确的,符合用户实际的邮箱设置情况。
public void setYonghuEmail(String yonghuEmail) {
this.yonghuEmail = yonghuEmail;
}
// 获取: 余额
// 这是用于获取用户余额属性newMoney值的访问器getter方法符合JavaBean规范。
// 外部代码(在一些综合业务展示页面(比如展示用户的综合账户信息详情时),或者涉及到用户资金相关的扩展业务场景(如判断用户是否满足某些优惠活动条件、分析用户消费能力等情况对应的业务逻辑代码)中)调用它可以获取到用户账户的余额信息,虽然在房间预约的主要业务场景下,余额信息关联性可能不是特别紧密,但在更全面的业务范畴内,该信息可能会起到一定的作用,有助于对用户进行更全面的了解和相关业务分析。
public Double getNewMoney() {
return newMoney;
}
// 设置: 余额
// 按照JavaBean的属性修改器规范定义的方法用于设置用户余额属性newMoney的值。
// 例如在用户进行了充值、消费等操作(比如用户通过线上支付渠道进行充值,或者在酒店内使用房间相关服务产生消费等情况发生后,对应的业务逻辑处理代码)导致余额发生变化后,外部代码可以调用这个方法,传入新的余额数值作为参数,来更新该属性的值,以此保证系统中记录的用户余额信息始终是准确的,能够真实反映用户账户的资金情况。
public void setNewMoney(Double newMoney) {
this.newMoney = newMoney;
}
// 获取: 假删
// 此为获取用户假删属性yonghuDelete值的访问器getter方法遵循JavaBean规范。
// 该属性可能用于表示用户是否被标记为假删除状态(具体含义需结合业务逻辑确定,比如可能是在数据管理过程中,为了保留用户数据但又暂时不让其在某些常规展示场景下出现等情况而设置的一种特殊状态标识),外部代码(比如在前端展示用户相关信息时,需要根据用户状态进行不同展示效果处理的业务逻辑代码)调用这个方法可以获取到这个状态信息,以便在前端展示用户相关信息时体现该状态情况,让管理员或者相关人员清楚了解用户数据的实际处理状态。
public Integer getYonghuDelete() {
return yonghuDelete;
}
// 设置: 假删
// 遵循JavaBean规范定义的用于设置用户假删属性yonghuDelete值的修改器setter方法。
// 当用户的假删状态发生变化比如从正常状态变为假删除状态可能是因为某些业务规则触发如用户长时间未活跃等情况需要将其标记为假删除或者反之从假删除状态恢复为正常状态例如用户重新激活账号等情况外部代码如负责处理用户状态变更的业务逻辑代码可以调用这个方法传入相应的整数值通常是代表不同状态的特定数值如0表示正常1表示假删除等具体看业务定义来更新该属性的值确保用户的假删状态在系统中能准确记录和体现使得系统对用户数据的处理状态与实际业务情况相符。
public void setYonghuDelete(Integer yonghuDelete) {
// 将传入的参数值赋值给当前对象的yonghuDelete属性完成对用户假删属性值的更新操作
this.yonghuDelete = yonghuDelete;
}
} // 最后的右花括号用于结束FangjianOrderView类的定义表示该类的代码块范围到此结束
}

@ -1,65 +1,73 @@
package com.entity.view; package com.entity.view;
// 导入房间实体类FangjianEntity该类可能包含了与房间相关的基础属性及对应的数据库操作逻辑等
// 这里的FangjianView类会基于它来扩展或调整相关属性以满足后端返回给前端视图展示的需求
import com.entity.FangjianEntity; import com.entity.FangjianEntity;
// 导入MyBatis Plus的注解用于指定该实体类对应的数据库表名使得在与数据库交互时框架能准确地知道该类关联的是哪张数据表
import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.annotations.TableName;
// 导入Apache Commons BeanUtils工具类其提供了方便的方法来进行Java对象之间属性的复制操作
// 本类中会使用它来将FangjianEntity对象的属性复制到FangjianView对象中
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.BeanUtils;
// 导入异常处理相关的类用于捕获在使用BeanUtils进行属性复制操作时可能抛出的异常保证程序在出现异常情况时也能稳定运行避免因异常导致程序崩溃
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
// 导入Spring框架的日期格式化注解用于在接收前端传入的日期参数或者向前端返回日期数据时按照指定格式进行转换处理使日期数据的格式符合业务要求
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
// 导入Jackson框架的注解用于在序列化和反序列化日期类型数据时控制其格式确保在数据传输和存储过程中日期格式的一致性与准确性
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
// 导入Java的序列化接口表明该类的对象可以被序列化和反序列化方便在网络传输、持久化存储等场景下对该类的实例进行操作比如在前后端数据交互或者保存对象状态到文件等情况中使用
import java.io.Serializable; import java.io.Serializable;
// 导入Java中的日期类用于处理可能涉及到的日期相关属性虽然在当前代码片段中未明确看到使用场景但作为通用的日期处理类引入以备后续业务扩展可能会用到
import java.util.Date; import java.util.Date;
/** /**
* *
* *
* 使 * 使
* FangjianEntity
* Serializable
*/ */
@TableName("fangjian") @TableName("fangjian")
public class FangjianView extends FangjianEntity implements Serializable { public class FangjianView extends FangjianEntity implements Serializable {
private static final long serialVersionUID = 1L; // 定义一个序列化版本号用于在序列化和反序列化过程中保证版本的兼容性当类的结构发生变化如添加、删除字段等可以通过修改这个版本号来避免反序列化出错初始值设为1L在类相对稳定的情况下一般不需要改动
private static final long serialVersionUID = 1L;
/**
*
*/
private String fangjianValue;
/**
*
* 便
*/
private String fangjianValue;
// 默认构造函数用于创建FangjianView类的实例对象在一些情况下比如通过反射等方式创建对象时可能会用到它会创建一个默认状态的对象实例
public FangjianView() { public FangjianView() {
} }
// 构造函数接收一个FangjianEntity对象作为参数用于将传入的实体类对象的属性值复制到当前视图类对象中通过BeanUtils工具类来实现属性复制方便基于已有的实体数据构建视图对象
public FangjianView(FangjianEntity fangjianEntity) { public FangjianView(FangjianEntity fangjianEntity) {
try { try {
// 使用BeanUtils的copyProperties方法将fangjianEntity对象的属性值复制到当前对象this实现属性的赋值操作但该方法可能会抛出IllegalAccessException访问权限异常和InvocationTargetException方法调用异常所以需要进行异常捕获处理
BeanUtils.copyProperties(this, fangjianEntity); BeanUtils.copyProperties(this, fangjianEntity);
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block // 如果在属性复制过程中出现异常,打印异常堆栈信息,方便开发人员排查问题,确定是哪里出现了访问权限问题或者方法调用出错等情况
e.printStackTrace(); e.printStackTrace();
} }
} }
/**
*
* JavaBean访getterfangjianValue
* 便
*/
public String getFangjianValue() {
return fangjianValue;
}
/**
/** *
* * fangjianValueJavaBeansetter
*/ * 使
public String getFangjianValue() { */
return fangjianValue; public void setFangjianValue(String fangjianValue) {
} this.fangjianValue = fangjianValue;
/** }
* }
*/
public void setFangjianValue(String fangjianValue) {
this.fangjianValue = fangjianValue;
}
}

@ -12,67 +12,102 @@ import java.util.Date;
/** /**
* *
* *
* 使 * 使
*/ */
@TableName("forum") @TableName("forum")
public class ForumView extends ForumEntity implements Serializable { public class ForumView extends ForumEntity implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** // **
* // * 帖子状态的值,
*/ // 用于存储帖子状态对应的具体描述性字符串
private String forumStateValue; // (可能比单纯用数字表示状态更直观,便于前端直接展示给用户理解帖子当前状态含义)
// */
private String forumStateValue;
//级联表 yonghu // 以下是与级联表 yonghu 相关的属性,
/** // 用于扩展论坛帖子关联的用户相关信息,
* // 方便在展示帖子时一并提供用户的详细资料
*/
private String yonghuName; // **
/** // * 用户姓名,存储发布该帖子的用户的真实姓名信息,
* // 便于在前端展示帖子时显示发布者的姓名,增强信息展示的完整性
*/ // */
private String yonghuPhoto; private String yonghuName;
/**
* // **
*/ // * 头像,用于存储用户的头像图片相关信息
private String yonghuPhone; // 可能是图片路径、URL或者其他标识取决于项目中头像存储和引用方式
/** // 以便在前端展示用户头像,提升用户界面的可视化效果
* // */
*/ private String yonghuPhoto;
private String yonghuEmail;
/** // **
* // * 手机号,存储用户的手机号码信息,
*/ // 在某些业务场景下(比如需要联系用户、验证用户身份等)
private Double newMoney; // 可能会用到该信息进行相关操作或展示给有权限查看的角色
/** // */
* private String yonghuPhone;
*/
private Integer yonghuDelete; // **
// * 电子邮箱,保存用户的电子邮箱地址,
//级联表 users // 可用于发送通知、进行账号相关操作验证等业务场景,
/** // 也可能展示给用户用于沟通联系等用途
* // */
*/ private String yonghuEmail;
private String uusername;
/** // **
* // * 余额,可能用于记录用户在系统中的账户余额信息(
*/ // 例如在涉及支付、消费等功能的论坛系统中,用户可能有相应的资金账户情况),
private String upassword; // 方便在相关业务逻辑中查询和处理余额相关操作
/** // */
* private Double newMoney;
*/
private String urole; // **
/** // * 假删,可能用于标记用户账号是否处于一种类似“软删除”的状态(
* // 即表面上好像删除了,但实际数据还保留,只是在某些业务场景下不显示等情况),方便进行数据管理和状态控制
*/ // */
private Date uaddtime; private Integer yonghuDelete;
// 以下是与级联表 users 相关的属性,
// 用于扩展与论坛帖子可能关联的管理员或其他相关角色的详细信息
// **
// * 用户名,存储对应管理员或相关角色的用户名,
// 便于在前端展示或者业务逻辑中识别和区分不同的操作主体(比如知道是哪个管理员进行了帖子管理操作等)
// */
private String uusername;
// **
// * 密码,虽然在实际返回给前端的视图数据中通常不会直接展示密码(出于安全考虑),
// 但在后端业务逻辑处理中,可能涉及到验证、加密等与密码相关的操作,这里存储对应角色的密码信息
// */
private String upassword;
// **
// * 角色,用于明确该用户在系统中所扮演的角色
// (例如管理员、普通用户、版主等不同角色具有不同的权限和操作范围),方便进行权限控制和业务流程处理
// */
private String urole;
// **
// * 新增时间,记录该用户账号
// (对应管理员或相关角色)在系统中创建的具体时间,
// 可用于查询、统计等业务场景,例如查看新注册的管理员情况等
// */
private Date uaddtime;
// 默认构造函数,用于创建 ForumView
// 对象实例时进行一些默认的初始化操作
// (目前为空实现,可根据后续需求添加初始化逻辑)
public ForumView() { public ForumView() {
} }
// 构造函数,用于根据已有的 ForumEntity 对象来初始化 ForumView 对象,
// 通过 BeanUtils 工具类将 ForumEntity 中的属性值复制到当前对象中
// 这样可以方便地基于已有的实体对象数据来构建视图对象,
// 减少重复设置属性的操作,提高代码复用性
public ForumView(ForumEntity forumEntity) { public ForumView(ForumEntity forumEntity) {
try { try {
BeanUtils.copyProperties(this, forumEntity); BeanUtils.copyProperties(this, forumEntity);
@ -82,176 +117,241 @@ public class ForumView extends ForumEntity implements Serializable {
} }
} }
// **
// * 获取: 帖子状态的值,
// 对外提供获取帖子状态对应描述性字符串的方法,
// 以便在前端展示帖子状态信息或者在业务逻辑中根据该字符串进行相应处理
// * @return 返回帖子状态对应的字符串值
// */
public String getForumStateValue() {
return forumStateValue;
}
// **
// * 设置: 帖子状态的值,
// 用于更新帖子状态对应的描述性字符串,
// 例如当帖子状态发生变化后,通过此方法设置新的状态描述信息,方便后续展示和处理
// * @param forumStateValue 要设置的帖子状态描述性字符串值
// */
public void setForumStateValue(String forumStateValue) {
this.forumStateValue = forumStateValue;
}
/** // 以下是级联表 yonghu 的一系列获取get和设置set方法
* // 用于对用户相关属性进行访问和修改操作
*/
public String getForumStateValue() { // **
return forumStateValue; // * 获取: 用户姓名,对外提供获取用户姓名的方法,
} // 便于在前端展示帖子时获取并显示发布者的姓名信息,
/** // 或者在业务逻辑中根据姓名进行查询、统计等操作
* // * @return 返回用户姓名对应的字符串值
*/ // */
public void setForumStateValue(String forumStateValue) { public String getYonghuName() {
this.forumStateValue = forumStateValue; return yonghuName;
} }
// **
// * 设置: 用户姓名,用于更新用户的姓名信息,
// 例如用户修改了自己的真实姓名后,
// 通过此方法保存新的姓名数据,以便后续正确展示
// * @param yonghuName 要设置的用户姓名字符串值
// */
public void setYonghuName(String yonghuName) {
this.yonghuName = yonghuName;
}
// **
// * 获取: 头像,对外提供获取用户头像相关信息的方法,
// 在前端展示用户头像时调用此方法获取对应数据(根据存储方式进行相应的图片展示处理),
// 也可在业务逻辑中对头像信息进行修改、更新等操作时使用
// * @return 返回用户头像对应的字符串值如图片路径、URL等
// */
public String getYonghuPhoto() {
return yonghuPhoto;
}
// **
// * 设置: 头像,用于更新用户的头像信息,
// 比如用户更换了头像图片后,通过此方法保存新的头像相关数据,
// 确保前端展示的头像为最新的图片
// * @param yonghuPhoto 要设置的用户头像字符串值如新的图片路径、URL等
// */
public void setYonghuPhoto(String yonghuPhoto) {
this.yonghuPhoto = yonghuPhoto;
}
// **
// * 获取: 手机号,对外提供获取用户手机号码的方法,
// 在需要联系用户、验证身份等业务场景下可调用此方法获取手机号信息,
// 也可用于在前端展示用户信息时包含手机号(需考虑隐私保护相关设置)
// * @return 返回用户手机号对应的字符串值
// */
public String getYonghuPhone() {
return yonghuPhone;
}
// **
// * 设置: 手机号,用于更新用户的手机号码信息,
// 例如用户更换了手机号后,通过此方法保存新的手机号数据,
// 以便后续业务逻辑能正确使用最新的号码
// * @param yonghuPhone 要设置的用户手机号字符串值
// */
public void setYonghuPhone(String yonghuPhone) {
this.yonghuPhone = yonghuPhone;
}
// **
// * 获取: 电子邮箱,对外提供获取用户电子邮箱地址的方法,
// 在发送通知、账号验证等业务场景下可调用此方法获取邮箱信息,
// 也可在前端展示用户信息时包含邮箱(同样需考虑隐私保护)
// * @return 返回用户电子邮箱对应的字符串值
// */
public String getYonghuEmail() {
return yonghuEmail;
}
// **
// * 设置: 电子邮箱,用于更新用户的电子邮箱地址,
// 例如用户修改了邮箱后,通过此方法保存新的邮箱数据,
// 保证后续相关业务操作使用正确的邮箱信息
// * @param yonghuEmail 要设置的用户电子邮箱字符串值
// */
public void setYonghuEmail(String yonghuEmail) {
this.yonghuEmail = yonghuEmail;
}
// **
// * 获取: 余额,对外提供获取用户账户余额的方法,
// 在涉及支付、消费、查询余额等业务逻辑中可调用此方法获取余额数值,
// 方便进行相应的资金相关处理
// * @return 返回用户账户余额对应的 Double 类型数值
// */
public Double getNewMoney() {
return newMoney;
}
// **
// * 设置: 余额,用于更新用户的账户余额信息,
// 比如用户进行充值、消费等操作后,通过此方法保存新的余额数据,
// 确保系统中记录的余额是最新准确的
// * @param newMoney 要设置的用户账户余额 Double 类型数值
// */
public void setNewMoney(Double newMoney) {
this.newMoney = newMoney;
}
// **
// * 获取: 假删,对外提供获取用户“假删”状态标记的方法,
// 在数据管理、查询已“删除”用户等业务场景下可调用此方法获取该状态值,
// 以便进行相应的业务处理
// * @return 返回用户“假删”状态对应的整数值(通常是表示是否处于假删状态的标志位)
// */
public Integer getYonghuDelete() {
return yonghuDelete;
}
// **
// * 设置: 假删,
// 用于更新用户的“假删”状态标记,
//
//
//
// 例如管理员进行账号删除操作(软删除情况)时,
//
//
// 通过此方法设置相应的状态值,改变用户在系统中的显示和可操作状态
// * @param yonghuDelete 要设置的用户“假删”状态整数值
// */
public void setYonghuDelete(Integer yonghuDelete) {
this.yonghuDelete = yonghuDelete;
}
// 以下是级联表 users 的一系列获取get和设置set方法
// 用于对管理员或相关角色的属性进行访问和修改操作
// **
// * 获取: 用户名,对外提供获取管理员或相关角色用户名的方法,
// 便于在前端展示帖子管理操作主体信息或者在业务逻辑中根据用户名进行权限判断、操作记录查询等操作
// * @return 返回用户名对应的字符串值
// */
public String getUusername() {
return uusername;
}
// **
// * 设置: 用户名,用于更新管理员或相关角色的用户名信息,
// 例如管理员修改了自己的用户名后,
// 通过此方法保存新的用户名数据,以便后续正确展示和处理相关业务
// * @param uusername 要设置的用户名字符串值
// */
public void setUusername(String uusername) {
this.uusername = uusername;
}
// **
// * 获取: 密码,对外提供获取管理员或相关角色密码的方法,
// 虽然在前端视图展示中通常不会直接显示密码,
// 但在后端业务逻辑中涉及密码验证、加密存储等操作时会用到此方法获取密码信息(需确保密码存储和传输的安全性)
// * @return 返回密码对应的字符串值
// */
public String getUpassword() {
return upassword;
}
// **
// * 设置: 密码,用于更新管理员或相关角色的密码信息,
// 比如管理员修改密码后,通过此方法保存新的密码数据,
// 保证系统中存储的密码是最新且符合安全要求的
// * @param upassword 要设置的密码字符串值
// */
public void setUpassword(String upassword) {
this.upassword = upassword;
}
// **
// * 获取: 角色,对外提供获取管理员或相关角色在系统中所扮演角色的方法,
// 便于在业务逻辑中根据角色进行权限控制、
// 操作范围限定等处理,例如判断是否具有特定帖子管理权限等
// * @return 返回角色对应的字符串值(如管理员、普通用户、版主等不同角色名称或标识)
// */
public String getUrole() {
return urole;
}
//级联表的get和set yonghu // **
// * 设置: 角色,用于更新管理员或相关角色的角色信息,
// 例如系统进行角色调整后,通过此方法保存新的角色数据,
// 以便后续根据新角色进行相应的权限和业务流程处理
// * @param urole 要设置的角色字符串值(如修改后的角色名称或标识)
// */
public void setUrole(String urole) {
this.urole = urole;
}
/** // **
* // * 获取: 新增时间,
*/ // 对外提供获取管理员或相关角色账号创建时间的方法,
public String getYonghuName() { // 在查询新注册管理员、
return yonghuName; // 统计账号创建趋势等业务场景下可调用此方法获取时间信息,
} // 方便进行相应的数据分析和管理操作
/** // * @return 返回新增时间对应的 Date 类型对象
* // */
*/ public Date getUaddtime() {
public void setYonghuName(String yonghuName) { return uaddtime;
this.yonghuName = yonghuName; }
}
/** // **
* // * 设置: 新增时间,
*/ // 用于更新管理员或相关角色的账号创建时间信息
public String getYonghuPhoto() { // (虽然在实际业务中一般较少出现修改创建时间的情况,
return yonghuPhoto; // 但保留此方法以满足可能的特殊需求),
} // 例如数据迁移、时间校准等场景下可能会用到
/** // * @param uaddtime 要设置的新增时间对应的 Date 类型对象
* // */
*/ public void setUaddtime(Date uaddtime) {
public void setYonghuPhoto(String yonghuPhoto) { this.uaddtime = uaddtime;
this.yonghuPhoto = yonghuPhoto; }
} }
/**
*
*/
public String getYonghuPhone() {
return yonghuPhone;
}
/**
*
*/
public void setYonghuPhone(String yonghuPhone) {
this.yonghuPhone = yonghuPhone;
}
/**
*
*/
public String getYonghuEmail() {
return yonghuEmail;
}
/**
*
*/
public void setYonghuEmail(String yonghuEmail) {
this.yonghuEmail = yonghuEmail;
}
/**
*
*/
public Double getNewMoney() {
return newMoney;
}
/**
*
*/
public void setNewMoney(Double newMoney) {
this.newMoney = newMoney;
}
/**
*
*/
public Integer getYonghuDelete() {
return yonghuDelete;
}
/**
*
*/
public void setYonghuDelete(Integer yonghuDelete) {
this.yonghuDelete = yonghuDelete;
}
//级联表的get和set users
/**
*
*/
public String getUusername() {
return uusername;
}
/**
*
*/
public void setUusername(String uusername) {
this.uusername = uusername;
}
/**
*
*/
public String getUpassword() {
return upassword;
}
/**
*
*/
public void setUpassword(String upassword) {
this.upassword = upassword;
}
/**
*
*/
public String getUrole() {
return urole;
}
/**
*
*/
public void setUrole(String urole) {
this.urole = urole;
}
/**
*
*/
public Date getUaddtime() {
return uaddtime;
}
/**
*
*/
public void setUaddtime(Date uaddtime) {
this.uaddtime = uaddtime;
}
}

@ -12,23 +12,38 @@ import java.util.Date;
/** /**
* *
* *
* 使 //* (通常后端关联的表或者自定义的字段需要返回使用,
便
*/ */
@TableName("news") @TableName("news")
public class NewsView extends NewsEntity implements Serializable { public class NewsView extends NewsEntity implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** // **
* // * 公告类型的值,
*/ // 用于存储公告类型对应的具体描述性字符串。
private String newsValue; //
//
// 相较于单纯使用数字等方式表示公告类型,这个字符串形式能更直观地体现公告类型含义,
//
// 方便前端直接展示给用户理解公告所属的具体分类情况
// */
private String newsValue;
// 默认构造函数,用于创建 NewsView 对象实例时进行一
// 些默认的初始化操作(当前为空实现,后续若有需要可以添加相应的初始化逻辑,
// 比如设置一些默认属性值等)
public NewsView() { public NewsView() {
} }
// 构造函数,用于根据已有的 NewsEntity 对象来初始化 NewsView 对象。通
// 过 BeanUtils 工具类将 NewsEntity 中的属性值复制到当前对象中,
// 这样可以便捷地基于已有的实体对象数据构建视图对象,避免重复逐个设置属性,
// 提高代码复用性,减少代码冗余,方便在不同业务场景下进行对象数据的转换和传递
public NewsView(NewsEntity newsEntity) { public NewsView(NewsEntity newsEntity) {
try { try {
BeanUtils.copyProperties(this, newsEntity); BeanUtils.copyProperties(this, newsEntity);
@ -38,28 +53,28 @@ public class NewsView extends NewsEntity implements Serializable {
} }
} }
// **
// * 获取: 公告类型的值,
// 对外提供获取公告类型对应描述性字符串的方法,
// 以便在前端展示公告信息时能直观呈现公告类型内容,
// 或者在业务逻辑中根据该字符串进行相应的分类处理、筛选等操作
// * @return 返回公告类型对应的字符串值
// */
public String getNewsValue() {
return newsValue;
}
// **
/** // * 设置: 公告类型的值,
* // 用于更新公告类型对应的描述性字符串,
*/ // 例如当公告分类发生变化或者需要更准确、
public String getNewsValue() { //
return newsValue; //
} // 更符合业务展示需求的类型描述时,通过此方法设置新的类型描述信息,
/** // 便于后续展示和处理相关业务逻辑
* // * @param newsValue 要设置的公告类型描述性字符串值
*/ // */
public void setNewsValue(String newsValue) { public void setNewsValue(String newsValue) {
this.newsValue = newsValue; this.newsValue = newsValue;
} }
}
}

@ -12,54 +12,65 @@ import java.util.Date;
/** /**
* *
* *
* 使 * 使
* 便
*/ */
@TableName("yonghu") @TableName("yonghu")
// 通过 @TableName 注解指定了该实体类对应的数据库表名为 "yonghu",通常在与数据库交互的框架(如 MyBatis-Plus 等)中,
// 用于建立实体类与数据库表之间的映射关系,框架可以根据这个注解来确定操作的具体表。
public class YonghuView extends YonghuEntity implements Serializable { public class YonghuView extends YonghuEntity implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* *
*/ * "男""女" YonghuEntity
private String sexValue; * 便
*/
private String sexValue;
/**
*
* YonghuView
*/
public YonghuView() { public YonghuView() {
} }
/**
* YonghuEntity
* YonghuEntity YonghuEntity YonghuView
* 使 BeanUtils.copyProperties Spring
* 便 YonghuEntity YonghuView
* YonghuView sexValue
* @param yonghuEntity YonghuEntity YonghuView
*/
public YonghuView(YonghuEntity yonghuEntity) { public YonghuView(YonghuEntity yonghuEntity) {
try { try {
BeanUtils.copyProperties(this, yonghuEntity); BeanUtils.copyProperties(this, yonghuEntity);
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block // 如果在属性复制过程中出现异常(比如属性没有对应的访问权限或者复制方法调用出现问题等),
// 则会打印异常堆栈信息,方便开发人员排查问题所在,当前只是简单地将异常打印出来,实际应用中可根据需求进行更完善的异常处理逻辑。
e.printStackTrace(); e.printStackTrace();
} }
} }
/**
*
* sexValue 访getter Java JavaBean
* 便 YonghuView "男""女"
* @return
*/
public String getSexValue() {
return sexValue;
}
/**
/** *
* * sexValue setter Java JavaBean
*/ * YonghuView
public String getSexValue() { * @param sexValue YonghuView sexValue
return sexValue; */
} public void setSexValue(String sexValue) {
/** this.sexValue = sexValue;
* }
*/ }
public void setSexValue(String sexValue) {
this.sexValue = sexValue;
}
}

@ -8,17 +8,67 @@ import javax.servlet.http.HttpServletRequest;
/** /**
* *
*
* MyBatis Plus `IService`
* `IService`
*
* 便
* 使
*
*/ */
public interface DictionaryService extends IService<DictionaryEntity> { public interface DictionaryService extends IService<DictionaryEntity> {
/** /**
* @param params *
* @return *
*/ *
PageUtils queryPage(Map<String, Object> params); *
/** *
* * `Map`
* @param obj *
*/ *
void dictionaryConvert(Object obj, HttpServletRequest request); * `PageUtils`
*
* 便
*
* @param params `Map`
*
*
*
*
*
* @return `PageUtils`
*
*
* 便
*
*
*/
PageUtils queryPage(Map<String, Object> params);
/**
*
*
* `HttpServletRequest`
*
*
*
* 使
*
* `Object`
*
* @param obj `Object`
*
* `DictionaryEntity`
*
*
*
* @param request `HttpServletRequest`
*
*
*
*
* 使
*/
void dictionaryConvert(Object obj, HttpServletRequest request);
} }

@ -1,19 +1,31 @@
package com.service; package com.service;
// 导入MyBatis Plus中定义的服务层接口基础类IService接口提供了一系列通用的数据库操作方法如增删改查等基础操作的定义
// 这里让FangjianLiuyanService接口继承它意味着FangjianLiuyanService可以直接使用或重写这些通用方法以满足房间评论/投诉相关业务逻辑中的数据库操作需求
import com.baomidou.mybatisplus.service.IService; import com.baomidou.mybatisplus.service.IService;
// 导入自定义的工具类,用于处理分页相关的功能,比如构建分页查询的参数、获取分页结果等操作,方便在查询房间评论/投诉数据时实现分页展示效果
import com.utils.PageUtils; import com.utils.PageUtils;
// 导入房间评论/投诉对应的实体类,该实体类包含了房间评论/投诉相关的各种属性信息,服务层接口中的方法操作基本都是围绕这个实体类对应的数据库表记录来进行的
import com.entity.FangjianLiuyanEntity; import com.entity.FangjianLiuyanEntity;
// 导入Java中的Map接口用于存储键值对形式的查询参数在查询房间评论/投诉数据时可以通过Map来传递各种不同的查询条件如按用户ID查询、按时间范围查询等灵活性较高
import java.util.Map; import java.util.Map;
// 导入用于处理HTTP请求相关的类在服务层的方法中可能会根据请求对象获取一些额外的信息比如从请求头获取用户信息等虽然当前代码中未体现明显使用场景但预留了使用的可能性辅助业务逻辑处理
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
/** /**
* / * /
* /IService
* /便/
*/ */
public interface FangjianLiuyanService extends IService<FangjianLiuyanEntity> { public interface FangjianLiuyanService extends IService<FangjianLiuyanEntity> {
/** /**
* @param params * @param params
* @return * Map"user_id"ID"start_time""end_time"
*/ * ID
PageUtils queryPage(Map<String, Object> params); *
* @return
* PageUtils/便
*/
PageUtils queryPage(Map<String, Object> params);
} }

@ -1,19 +1,30 @@
package com.service; package com.service;
// 导入MyBatis Plus中定义的服务层接口基础类IService接口提供了如增删改查等一系列通用的数据库操作方法的定义
// 此处让FangjianOrderService接口继承它意味着FangjianOrderService接口能借助这些已定义好的通用操作同时也可根据房间预约业务的特殊需求去拓展或重写相关方法方便与数据库进行交互来处理房间预约相关的数据操作。
import com.baomidou.mybatisplus.service.IService; import com.baomidou.mybatisplus.service.IService;
// 导入自定义的工具类,用于处理分页相关的功能,比如组织分页查询所需的参数、整合分页查询后的结果等,目的是在对房间预约信息进行查询时,能够按照分页的形式来展示和处理数据,提升用户查看数据的体验以及方便数据管理。
import com.utils.PageUtils; import com.utils.PageUtils;
// 导入房间预约对应的实体类FangjianOrderEntity类包含了房间预约业务中涉及的各项关键属性如预约房间的ID、预约用户的ID、预约时间等服务层接口里的各种方法操作基本都是围绕这个实体类所对应的数据库表记录来展开的。
import com.entity.FangjianOrderEntity; import com.entity.FangjianOrderEntity;
// 导入Java中的Map接口通过它可以创建键值对形式的对象用于存储各种查询参数。在查询房间预约信息时可将不同的查询条件例如按照预约日期范围查询键可以是“start_date”和“end_date”对应的值就是具体的日期范围或者按照用户ID查询键为“user_id”值就是具体的用户ID数值等以键值对形式放入Map中传递给查询方法使得查询条件的传递更加灵活多样。
import java.util.Map; import java.util.Map;
// 导入用于处理HTTP请求相关的类在实际的业务场景中服务层的方法可能会依据HTTP请求对象获取一些额外有用的信息比如从请求头里获取用户的登录状态、权限信息等来辅助判断能否进行相关预约操作等虽然当前代码里没体现出明显使用场景但预留了这样的扩展可能性以便更好地处理业务逻辑。
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
/** /**
* *
* IServiceIService便
*/ */
public interface FangjianOrderService extends IService<FangjianOrderEntity> { public interface FangjianOrderService extends IService<FangjianOrderEntity> {
/** /**
* @param params * @param params
* @return * paramsMaproom_idorder_status
*/ *
PageUtils queryPage(Map<String, Object> params); *
* @return
* PageUtilsFangjianOrderEntity便
*/
PageUtils queryPage(Map<String, Object> params);
} }

@ -1,19 +1,35 @@
package com.service; package com.service;
// 导入MyBatis Plus中定义的服务层接口基础类。IService接口提供了一系列通用的数据库操作方法定义例如常见的增删改查等操作方法的规范
// 此处让FangjianService接口继承它意味着FangjianService可以复用这些通用的数据库操作逻辑同时也能够根据房间信息业务特有的需求去扩展或者重写相应的方法方便与数据库进行交互处理和房间信息相关的数据操作。
import com.baomidou.mybatisplus.service.IService; import com.baomidou.mybatisplus.service.IService;
// 导入自定义的工具类,主要用于处理分页相关功能,像构建分页查询所需的参数、整合分页查询后得到的结果数据等操作,
// 其目的是在对房间信息进行查询时,能够按照分页的形式来展示和处理数据,便于前端更好地展示大量的房间信息,也方便用户查看不同页面的内容,提升交互体验。
import com.utils.PageUtils; import com.utils.PageUtils;
// 导入房间信息对应的实体类FangjianEntity类包含了描述房间各种属性的字段例如房间名称、房间图片、价格、配置等信息
// 服务层接口中的各个方法基本都是围绕这个实体类所对应的数据库表记录来开展操作的,例如查询、更新房间信息等都是针对这些实体数据进行。
import com.entity.FangjianEntity; import com.entity.FangjianEntity;
// 导入Java中的Map接口它可以用来存储键值对形式的数据在这里用于存放各种查询参数。比如可以通过键值对来表示不同的查询条件像以"room_type"为键,对应的房型值为值来查询特定房型的房间;或者以"price_min"和"price_max"为键,分别存放价格区间的最小值和最大值来查询符合价格范围的房间等,使得查询条件的设置更加灵活多样。
import java.util.Map; import java.util.Map;
// 导入用于处理HTTP请求相关的类虽然在当前代码中没有明显体现出具体使用场景但在实际的业务逻辑中服务层的方法可能会依据HTTP请求对象获取一些额外的有用信息
// 例如从请求头中获取用户的权限信息,以此判断用户是否有权限查询某些房间信息;或者获取用户的地理位置信息,来推荐距离较近的房间等,为业务处理提供更多的辅助信息。
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
/** /**
* *
* IServiceIService
* 便
*/ */
public interface FangjianService extends IService<FangjianEntity> { public interface FangjianService extends IService<FangjianEntity> {
/** /**
* @param params * @param params
* @return * paramsMaproom_namecreate_time_startcreate_time_end
*/ * room_name
PageUtils queryPage(Map<String, Object> params); *
* @return
* PageUtilsFangjianEntity
* 便便
*/
PageUtils queryPage(Map<String, Object> params);
} }

@ -8,12 +8,34 @@ import javax.servlet.http.HttpServletRequest;
/** /**
* *
*
* MyBatis Plus IService
* IService
*
*
* 使便
*/ */
public interface ForumService extends IService<ForumEntity> { public interface ForumService extends IService<ForumEntity> {
/** /**
* @param params *
* @return *
*/ *
PageUtils queryPage(Map<String, Object> params); * @param params Map
*
*
*
*
*
*
*
*
*
*
*
*
* @return PageUtils
* 便
*/
PageUtils queryPage(Map<String, Object> params);
} }

@ -8,12 +8,35 @@ import javax.servlet.http.HttpServletRequest;
/** /**
* *
* MyBatis Plus IService
* IService
*
* 便
*
*
*/ */
public interface NewsService extends IService<NewsEntity> { public interface NewsService extends IService<NewsEntity> {
/** /**
* @param params *
* @return *
*/ *
PageUtils queryPage(Map<String, Object> params); * @param params Map
*
*
*
*
*
* @return PageUtils
*
*
*
*
*
*
*
* 便
* 便
*/
PageUtils queryPage(Map<String, Object> params);
} }

@ -1,4 +1,3 @@
package com.service; package com.service;
import java.util.List; import java.util.List;
@ -9,20 +8,92 @@ import com.baomidou.mybatisplus.service.IService;
import com.entity.TokenEntity; import com.entity.TokenEntity;
import com.utils.PageUtils; import com.utils.PageUtils;
/** /**
* token * token
* token token
* @author yangliyuan * @author yangliyuan
* @date 20191010 9:18:20 * @date 20191010 9:18:20
*/ */
public interface TokenService extends IService<TokenEntity> { public interface TokenService extends IService<TokenEntity> {
PageUtils queryPage(Map<String, Object> params);
/**
List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper); *
* token
PageUtils queryPage(Map<String, Object> params,Wrapper<TokenEntity> wrapper); *
* @param params
String generateToken(Integer userid,String username,String tableName, String role); *
*
TokenEntity getTokenEntity(String token); * Map token
} * 便
* @return PageUtils token
* 便
*/
PageUtils queryPage(Map<String, Object> params);
/**
* Wrapper TokenEntity
* Wrapper
* token
*
* @param wrapper
* TokenEntity
*
* token token
* @return TokenEntity TokenEntity
* token
* 便 token
*/
List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper);
/**
* paramswrapper token
*
*
* @param params Map
*
* wrapper
* @param wrapper token
* token params
* @return PageUtils
* token
*
*/
PageUtils queryPage(Map<String, Object> params, Wrapper<TokenEntity> wrapper);
/**
* token ID token
* token token
* 便
*
* @param userid
* ID token
* token
* @param username
* userid token
* @param tableName
*
* token token
* @param role
*
*
* token 便 token
* @return token
* 访
*/
String generateToken(Integer userid, String username, String tableName, String role);
/**
* token TokenEntity
* TokenEntity token
*
* token TokenEntity
* 便 token token
*
* @param token
* token generateToken
* TokenEntity
* @return token TokenEntity
* null token
*/
TokenEntity getTokenEntity(String token);
}

@ -15,11 +15,45 @@ import com.utils.PageUtils;
* @author yangliyuan * @author yangliyuan
* @date 20191010 9:18:20 * @date 20191010 9:18:20
*/ */
// 定义了一个名为 UsersService 的接口,该接口继承自 IService<UsersEntity>,意味着它会继承 IService 接口中针对 UsersEntity 类型的一系列通用的服务层方法,
// 比如常见的根据主键查询、插入、更新、删除等基础业务操作方法,在此基础上又自定义了一些特定于用户业务相关的方法,用于满足更复杂的业务需求。
// 通常会有对应的实现类来具体实现这些方法逻辑,以实现与数据库或其他数据源交互来完成相应的业务功能。
public interface UsersService extends IService<UsersEntity> { public interface UsersService extends IService<UsersEntity> {
/**
*
* Map PageUtils
* PageUtils 便
*
*
* @param params Map "pageNum" "pageSize"
*
* @return PageUtils
*/
PageUtils queryPage(Map<String, Object> params); PageUtils queryPage(Map<String, Object> params);
/**
*
* Wrapper<UsersEntity> Wrapper
* UsersEntity 便
*
*
* @param wrapper
* @return UsersEntity
*/
List<UsersEntity> selectListView(Wrapper<UsersEntity> wrapper); List<UsersEntity> selectListView(Wrapper<UsersEntity> wrapper);
/**
*
* queryPage(Map<String, Object> params) Wrapper<UsersEntity>
* params
* 使
*
* @param params Map queryPage params
* @param wrapper params
* @return PageUtils 使
*/
PageUtils queryPage(Map<String, Object> params, Wrapper<UsersEntity> wrapper); PageUtils queryPage(Map<String, Object> params, Wrapper<UsersEntity> wrapper);
} }

@ -15,5 +15,9 @@ public interface YonghuService extends IService<YonghuEntity> {
* @param params * @param params
* @return * @return
*/ */
// 定义了一个名为 `queryPage` 的方法,它接收一个 `Map<String, Object>` 类型的参数 `params`
// 该方法的作用是根据传入的 `params` 参数中包含的各种查询条件及分页相关信息,查询相应的分页数据,
// 并返回一个 `PageUtils` 类型的对象,`PageUtils` 类通常用于封装分页相关的属性(如总记录数、每页记录数、当前页码以及具体的分页数据列表等),
// 以便后续进行分页展示或者其他与分页数据相关的业务操作。例如在用户管理系统中,通过传入不同的查询条件和分页参数,获取对应分页的用户数据列表等场景会调用此方法。
PageUtils queryPage(Map<String, Object> params); PageUtils queryPage(Map<String, Object> params);
} }

@ -19,21 +19,48 @@ import com.entity.view.ForumView;
/** /**
* *
* MyBatis Plus ServiceImpl
* ForumService
* Spring @Service
* @Transactional
*/ */
@Service("forumService") @Service("forumService")
@Transactional @Transactional
public class ForumServiceImpl extends ServiceImpl<ForumDao, ForumEntity> implements ForumService { public class ForumServiceImpl extends ServiceImpl<ForumDao, ForumEntity> implements ForumService {
/**
*
* 使
*
* @param params Map
*
* @return PageUtils
* 便
*/
@Override @Override
public PageUtils queryPage(Map<String,Object> params) { public PageUtils queryPage(Map<String, Object> params) {
if(params != null && (params.get("limit") == null || params.get("page") == null)){ // 如果传入的参数不为空,
params.put("page","1"); // 并且参数中没有设置 "limit"(每页显示数量)
params.put("limit","10"); // 或者 "page"(页码)字段,则设置默认的页码为 1每页显示数量为 10
if (params!= null && (params.get("limit") == null || params.get("page") == null)) {
params.put("page", "1");
params.put("limit", "10");
} }
Page<ForumView> page =new Query<ForumView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
// 通过传入的参数构建一个 Query 对象,
// 并调用其 getPage 方法获取一个 Page<ForumView> 类型的分页对象,
// 这里 ForumView 可能是一个适合展示给前端的视图实体类,
// 包含了论坛相关数据以及可能关联的其他必要信息。
Page<ForumView> page = new Query<ForumView>(params).getPage();
// 调用 baseMapper继承自 ServiceImpl 类,
// 实际对应 ForumDao 接口中定义的数据库操作方法)的 selectListView 方法,
// 将分页对象以及查询参数传入,获取符合条件的分页数据列表,
// 并设置到 page 对象的 records 属性中,用于后续封装返回。
page.setRecords(baseMapper.selectListView(page, params));
} // 使用获取到的包含分页数据的 page
// 对象构建并返回一个 PageUtils 对象,将分页数据及相关元信息进行整合封装,方便对外提供统一格式的分页数据结果。
return new PageUtils(page);
}
}

@ -19,21 +19,47 @@ import com.entity.view.NewsView;
/** /**
* *
* MyBatis Plus ServiceImpl
* NewsService
* Spring @Service
* @Transactional
*/ */
@Service("newsService") @Service("newsService")
@Transactional @Transactional
public class NewsServiceImpl extends ServiceImpl<NewsDao, NewsEntity> implements NewsService { public class NewsServiceImpl extends ServiceImpl<NewsDao, NewsEntity> implements NewsService {
/**
*
* 便使
*
* @param params Map
*
* @return PageUtils 便
*/
@Override @Override
public PageUtils queryPage(Map<String,Object> params) { public PageUtils queryPage(Map<String, Object> params) {
if(params != null && (params.get("limit") == null || params.get("page") == null)){ // 首先判断传入的参数是否不为空,并且在参数中没有设定
params.put("page","1"); // "limit"(表示每页显示的公告数量)或者 "page"(表示页码)这两个关键分页参数时,
params.put("limit","10"); // 则为其赋予默认值,即将页码设为 1每页显示的公告数量设为 10以此确保分页查询能正常进行。
if (params!= null && (params.get("limit") == null || params.get("page") == null)) {
params.put("page", "1");
params.put("limit", "10");
} }
Page<NewsView> page =new Query<NewsView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
// 通过传入的参数构建一个 Query<NewsView> 类型的对象,
// 并调用其 getPage 方法来获取一个 Page<NewsView> 类型的分页对象。
// 这里的 NewsView 大概率是一个专门为前端展示等需求而设计的视图实体类,
// 它包含了公告信息以及可能与之关联的其他需要展示的相关信息。
Page<NewsView> page = new Query<NewsView>(params).getPage();
// 调用 baseMapper它继承自 ServiceImpl 类,
// 实际上对应的是 NewsDao 接口中定义的与数据库操作相关的方法)的 selectListView 方法,
// 把前面获取到的分页对象以及查询参数传递进去,获取符合查询条件的分页数据列表,
// 然后将这些数据设置到 page 对象的 records 属性中,以便后续进行封装并返回。
page.setRecords(baseMapper.selectListView(page, params));
} // 最后,利用已经填充好数据的 page 对象来构建并返回一个 PageUtils 对象,
// 该对象会把分页数据以及与之相关的元数据进行整合封装,对外提供统一格式的分页数据结果,方便其他部分的代码进行使用。
return new PageUtils(page);
}
}

@ -1,7 +1,5 @@
package com.service.impl; package com.service.impl;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -21,60 +19,211 @@ import com.utils.CommonUtil;
import com.utils.PageUtils; import com.utils.PageUtils;
import com.utils.Query; import com.utils.Query;
/** /**
* token * token
* `TokenService`
* token MyBatis Plus `ServiceImpl`
*
* Spring `@Service`
* 便 Spring 使
* @author * @author
*/ */
@Service("tokenService") @Service("tokenService")
public class TokenServiceImpl extends ServiceImpl<TokenDao, TokenEntity> implements TokenService { public class TokenServiceImpl extends ServiceImpl<TokenDao, TokenEntity> implements TokenService {
/**
* token
* `TokenService`
* MyBatis Plus
* token
*
* @param params Map
* token
*
* @return `PageUtils`
* token
* 便
*/
@Override @Override
public PageUtils queryPage(Map<String, Object> params) { public PageUtils queryPage(Map<String, Object> params) {
// 通过传入的参数构建一个 `Query<TokenEntity>` 对象,
// 并调用其 `getPage` 方法获取一个 `Page<TokenEntity>` 类型的分页对象,
// 这个分页对象包含了基本的分页信息(如当前页码、每页显示数量等),用于后续的分页查询操作。
Page<TokenEntity> page = this.selectPage( Page<TokenEntity> page = this.selectPage(
new Query<TokenEntity>(params).getPage(), new Query<TokenEntity>(params).getPage(),
new EntityWrapper<TokenEntity>() new EntityWrapper<TokenEntity>()
); );
return new PageUtils(page); // 使用获取到的包含分页数据的 `page`
// 对象构建并返回一个 `PageUtils` 对象,将分页数据及相关元信息进行整合封装,
// 对外提供统一格式的分页数据结果,便于其他部分的代码使用。
return new PageUtils(page);
} }
/**
* Wrapper
* `TokenEntity` `TokenService`
* `baseMapper`
* `ServiceImpl` `TokenDao` `selectListView`
* token
*
* @param wrapper
* `TokenEntity`
* token
* token
* token
* @return `TokenEntity`
* `TokenEntity` token
* 便 token
*/
@Override @Override
public List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper) { public List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper) {
return baseMapper.selectListView(wrapper); return baseMapper.selectListView(wrapper);
} }
/**
* paramswrapper
* token `TokenService`
*
* `PageUtils`
*
* @param params Map
*
* `wrapper`
* @param wrapper token
* token
* `params`
* @return `PageUtils`
* token
*
*/
@Override @Override
public PageUtils queryPage(Map<String, Object> params, public PageUtils queryPage(Map<String, Object> params, Wrapper<TokenEntity> wrapper) {
Wrapper<TokenEntity> wrapper) { // 通过传入的参数构建一个 `Page<TokenEntity>` 类型的分页对象,该对象包含了基本的分页设置信息,为后续查询做准备。
Page<TokenEntity> page =new Query<TokenEntity>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper)); Page<TokenEntity> page = new Query<TokenEntity>(params).getPage();
PageUtils pageUtil = new PageUtils(page); // 调用 `baseMapper` 的 `selectListView` 方法,传入分页对象和条件包装器,获取符合条件的分页数据列表,
return pageUtil; // 并将这些数据设置到 `page` 对象的 `records` 属性中,填充分页对象的具体数据内容。
page.setRecords(baseMapper.selectListView(page, wrapper));
// 使用填充好数据的 `page` 对象构建一个 `PageUtils` 对象,将分页数据及相关元信息进行整合封装,
// 然后返回这个 `PageUtils` 对象,以便向外提供统一格式的分页数据结果,供其他业务代码使用。
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
} }
/**
* token `TokenService` ID token
* token
* token token token
*
* @param userid
* ID token
* token
* @param username `userid` token
* @param tableName
*
* token token
* @param role
*
* token 便 token
* @return token
*
* 访
*/
@Override @Override
public String generateToken(Integer userid,String username, String tableName, String role) { public String generateToken(Integer userid, String username, String tableName, String role) {
// 首先尝试从数据库中查找是否已存在该用户
// (根据传入的 `userid` 和 `role`)对应的 token 记录,
// 通过构建一个 `EntityWrapper`
// 对象设置查询条件(使用 `eq` 方法表示相等条件,即查找 `userid` 和 `role` 与传入值相等的记录),
// 然后调用 `selectOne` 方法进行查询,
// 如果找到则返回对应的 `TokenEntity` 对象,否则返回 `null`。
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role)); TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
// 调用工具类 `CommonUtil` 的 `getRandomString`
// 方法生成一个长度为 32 的随机字符串,作为新的 token 值,
// 这个随机字符串将作为唯一标识用户身份的关键信息,用于后续的身份验证等操作。
String token = CommonUtil.getRandomString(32); String token = CommonUtil.getRandomString(32);
Calendar cal = Calendar.getInstance(); // 获取一个 `Calendar` 实例,
cal.setTime(new Date()); // 用于操作日期和时间,这里用于设置 token 的过期时间。
cal.add(Calendar.HOUR_OF_DAY, 1); Calendar cal = Calendar.getInstance();
if(tokenEntity!=null) { // 将 `Calendar`
// 的时间设置为当前时间,以此为基础来计算过期时间。
cal.setTime(new Date());
// 给当前时间加上 1 小时,
// 即设置 token 的过期时间为从当前时间起 1 小时后,
// 这样可以控制 token 的有效时长,
// 提高系统的安全性,避免 token 长期有效可能带来的安全风险。
cal.add(Calendar.HOUR_OF_DAY, 1);
// 如果之前查询到已存在该用户对应的 token 记录(即 `tokenEntity` 不为 `null`
// 则更新该记录的 `token` 值为新生成的 `token` 字符串,
// 并设置其 `expiratedtime`(过期时间)为刚才计算好的时间,
// 最后调用 `updateById` 方法将更新后的 `TokenEntity`
// 对象保存到数据库中,完成 token 的更新操作。
if (tokenEntity!= null) {
tokenEntity.setToken(token); tokenEntity.setToken(token);
tokenEntity.setExpiratedtime(cal.getTime()); tokenEntity.setExpiratedtime(cal.getTime());
this.updateById(tokenEntity); this.updateById(tokenEntity);
} else { } else {
this.insert(new TokenEntity(userid,username, tableName, role, token, cal.getTime())); // 如果之前不存在对应的 token 记录,
// 则创建一个新的 `TokenEntity` 对象,
// 将传入的用户相关信息(`userid`、`username`、`tableName`、`role`)、
// 新生成的 `token` 字符串以及计算好的过期时间作为参数传入构造函数,
// 然后调用 `insert` 方法将新的 `TokenEntity` 对象插入到数据库中,
// 完成新 token 的创建操作。
this.insert(new TokenEntity(userid, username, tableName, role, token, cal.getTime()));
} }
// 最后返回生成的 token 字符串,
// 该字符串将作为后续业务操作中用于验证用户身份的标识信息。
return token; return token;
} }
/**
* token `TokenEntity`
* `TokenService`
* token token
* `TokenEntity` `null` token
*
* @param token token
* `generateToken`
* `TokenEntity`
*
* @return token `TokenEntity`
*
* `token` `null` token
*/
@Override @Override
public TokenEntity getTokenEntity(String token) { public TokenEntity getTokenEntity(String token) {
// 通过构建一个 `EntityWrapper`
// 对象设置查询条件(使用 `eq` 方法表示相等条件,即查找 `token` 字段与传入的 `token` 值相等的记录),
// 然后调用 `selectOne`
// 方法从数据库中查找对应的 `TokenEntity` 对象,如果找到则返回该对象,否则返回 `null`。
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("token", token)); TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("token", token));
if(tokenEntity == null || tokenEntity.getExpiratedtime().getTime()<new Date().getTime()) { // 如果查询到的 `tokenEntity` 为 `null`,说明数据库中不存在对应的 token 记录,直接返回 `null`,表示该 token 无效;
// 或者如果查询到的 `tokenEntity` 的 `expiratedtime`(过期时间)早于当前时间(通过 `getTime` 方法获取时间的毫秒数进行比较),
// 说明 token 已经过期,同样返回 `null`,表示该 token 已失效,不能用于后续的身份验证等操作。
if (tokenEntity == null || tokenEntity.getExpiratedtime().getTime() < new Date().getTime()) {
return null; return null;
} }
// 如果 token 存在且未过期,则返回对应的 `TokenEntity` 对象,以便后续可以获取其中的详细信息(如关联用户、角色等)进行相应的业务操作,
// 例如基于该 token 进行权限验证、获取用户相关信息等。
return tokenEntity; return tokenEntity;
} }
} }
Loading…
Cancel
Save