diff --git a/backend/pom.xml b/backend/pom.xml index b0f45a3..daccb25 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -165,6 +165,22 @@ runtime + + + com.oracle.database.jdbc + ojdbc8 + 21.9.0.0 + runtime + + + + + com.oracle.database.nls + orai18n + 21.9.0.0 + runtime + + org.xerial diff --git a/backend/src/main/java/com/yfd/platform/config/GlobalExceptionHandler.java b/backend/src/main/java/com/yfd/platform/config/GlobalExceptionHandler.java index d9c7d7a..d241883 100644 --- a/backend/src/main/java/com/yfd/platform/config/GlobalExceptionHandler.java +++ b/backend/src/main/java/com/yfd/platform/config/GlobalExceptionHandler.java @@ -18,6 +18,7 @@ public class GlobalExceptionHandler { @ExceptionHandler(value = Throwable.class) public ResponseResult handleException(Throwable e) { log.error("message:{}", e.getMessage()); + e.printStackTrace(); return ResponseResult.error(e.getMessage()); } diff --git a/backend/src/main/java/com/yfd/platform/process_A/controller/QuartzJobController.java b/backend/src/main/java/com/yfd/platform/process_A/controller/QuartzJobController.java deleted file mode 100644 index 9da6c89..0000000 --- a/backend/src/main/java/com/yfd/platform/process_A/controller/QuartzJobController.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.yfd.platform.system.controller; - -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yfd.platform.annotation.Log; -import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.system.domain.QuartzJob; -import com.yfd.platform.system.service.IQuartzJobService; -import com.yfd.platform.system.service.impl.UserServiceImpl; -import com.yfd.platform.utils.QuartzManage; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.quartz.CronExpression; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; - -import jakarta.annotation.Resource; -import java.sql.Timestamp; -import java.time.LocalDateTime; - -/** - *

- * 定时任务 前端控制器 - *

- * - * @author TangWei - * @since 2023-03-19 - */ -@RestController -@RequestMapping("/system/quartzjob") -@Tag(name = "定时任务") -@Transactional -public class QuartzJobController { - - @Resource - private IQuartzJobService quartzJobService; - - @Resource - private UserServiceImpl currentUser; - - @Resource - private QuartzManage quartzManage; - - @Operation(summary = "查询定时任务") - @GetMapping("/getQuartzJobList") - public ResponseResult getQuartzJobList(Page page, - String jobName) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (StrUtil.isNotBlank(jobName)) { - queryWrapper.like(QuartzJob::getJobName, jobName); - } - queryWrapper.orderByAsc(QuartzJob::getOrderno); - Page pageList = quartzJobService.page(page, queryWrapper); - return ResponseResult.successData(pageList); - } - - @Log(module = "定时任务管理", value = "新增定时任务") - @Operation(summary = "新增定时任务") - @PostMapping("/addQuartzJob") - public ResponseResult addQuartzJob(@RequestBody QuartzJob quartzJob) { - if (quartzJob == null) { - return ResponseResult.error("参数为空"); - } - // 添加最近修改人 - quartzJob.setLastmodifier(currentUser.getUsername()); - // 添加最近修改时间 - quartzJob.setLastmodifydate(new Timestamp(System.currentTimeMillis())); - if (StrUtil.isBlank(quartzJob.getJobCron()) || !CronExpression.isValidExpression(quartzJob.getJobCron())) { - return ResponseResult.error("cron表达式格式错误"); - } - quartzJob.setStatus("0"); - boolean ok = quartzJobService.addQuartzJob(quartzJob); - quartzManage.addJob(quartzJob); - if (ok) { - return ResponseResult.success(); - } else { - return ResponseResult.error("新增失败"); - } - } - - @Log(module = "定时任务管理", value = "设置定时任务是否有效") - @Operation(summary = "设置定时任务是否有效") - @PostMapping("/setQuartzStatus") - public ResponseResult setQuartzStatus(@RequestParam String id, - @RequestParam String status) { - if (StrUtil.isBlank(id) || StrUtil.isBlank(status)) { - return ResponseResult.error("参数为空"); - } - LambdaUpdateWrapper updateWrapper = - new LambdaUpdateWrapper<>(); - //根据id 更新状态,最近修改人,最近修改时间 - updateWrapper.eq(QuartzJob::getId, id).set(QuartzJob::getStatus, - status).set( - QuartzJob::getLastmodifier, currentUser.getUsername()).set(QuartzJob::getLastmodifydate, - LocalDateTime.now()); - boolean ok = quartzJobService.update(updateWrapper); - QuartzJob quartzJob = quartzJobService.getById(id); - if ("0".equals(quartzJob.getStatus())) { - quartzManage.pauseJob(quartzJob); - } else { - quartzManage.resumeJob(quartzJob); - } - - if (ok) { - return ResponseResult.success(); - } else { - return ResponseResult.error(); - } - } - - @Operation(summary = "根据ID查询定时任务") - @GetMapping("/getQuartzJobById") - public ResponseResult getQuartzJobById(String id) { - QuartzJob quartzJob = quartzJobService.getById(id); - return ResponseResult.successData(quartzJob); - } - - @Log(module = "定时任务管理", value = "修改定时任务") - @Operation(summary = "修改定时任务") - @PostMapping("/updateQuartzJob") - @Transactional(rollbackFor = Exception.class) - public ResponseResult updateQuartzJob(@RequestBody QuartzJob quartzJob) { - // 添加最近修改人 - quartzJob.setLastmodifier(currentUser.getUsername()); - // 添加最近修改时间 - quartzJob.setLastmodifydate(new Timestamp(System.currentTimeMillis())); - if (StrUtil.isBlank(quartzJob.getJobCron()) || !CronExpression.isValidExpression(quartzJob.getJobCron())) { - return ResponseResult.error("cron表达式格式错误"); - } - boolean ok = quartzJobService.updateById(quartzJob); - quartzManage.updateJobCron(quartzJob); - if (ok) { - return ResponseResult.success(); - } else { - return ResponseResult.error("修改失败"); - } - } - - @Log(module = "定时任务管理", value = "删除定时任务") - @Operation(summary = "删除定时任务") - @PostMapping("/deleteQuartzJob") - public ResponseResult deleteQuartzJob(@RequestParam String id) { - if (StrUtil.isBlank(id)) { - return ResponseResult.error("参数为空"); - } - boolean ok = quartzJobService.deleteQuartzJob(id); - if (ok) { - return ResponseResult.success(); - } else { - return ResponseResult.error("删除失败"); - } - } - - @Log(module = "定时任务管理", value = "执行定时任务") - @Operation(summary = "执行定时任务") - @PostMapping("/execution") - public ResponseResult execution(@RequestParam String id) { - quartzJobService.execution(quartzJobService.getById(id)); - return ResponseResult.success(); - } - - /********************************** - * 用途说明: 拖动修改定时顺序 - * 参数说明 fromID 当前ID toID 到达ID - * 返回值说明: com.yfd.platform.config.ResponseResult 成功或者失败 - ***********************************/ - @Log(module = "定时任务管理", value = "拖动定时任务") - @PostMapping("/changeDictOrder") - @Operation(summary = "拖动修改定时任务顺序") - public ResponseResult changeQuartzOrder(@RequestParam String fromID, - @RequestParam String toID) { - - boolean ok = quartzJobService.changeDictOrder(fromID, toID); - if (ok) { - return ResponseResult.success(); - } else { - return ResponseResult.error(); - } - - } -} diff --git a/backend/src/main/java/com/yfd/platform/process_A/service/QuartzJobServiceImpl.java b/backend/src/main/java/com/yfd/platform/process_A/service/QuartzJobServiceImpl.java deleted file mode 100644 index d2a9030..0000000 --- a/backend/src/main/java/com/yfd/platform/process_A/service/QuartzJobServiceImpl.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.yfd.platform.system.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.yfd.platform.system.domain.QuartzJob; -import com.yfd.platform.system.domain.SysDictionary; -import com.yfd.platform.system.mapper.QuartzJobMapper; -import com.yfd.platform.system.service.IQuartzJobService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yfd.platform.utils.QuartzManage; -import org.springframework.stereotype.Service; - -import jakarta.annotation.Resource; -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -/** - *

- * 定时任务 服务实现类 - *

- * - * @author TangWei - * @since 2023-03-19 - */ -@Service -public class QuartzJobServiceImpl extends ServiceImpl implements IQuartzJobService { - - @Resource - private QuartzJobMapper quartzJobMapper; - - @Resource - private QuartzManage quartzManage; - - /********************************** - * 用途说明: 新增定时任务 - * 参数说明 quartzJob 定时对象 - * 返回值说明: boolean 是否成功 - ***********************************/ - @Override - public boolean addQuartzJob(QuartzJob quartzJob) { - // 生成序号 - long orderNo = this.count() + 1L; - quartzJob.setOrderno((int) orderNo); - return this.save(quartzJob); - } - - /********************************** - * 用途说明: 删除定时任务 - * 参数说明 id id - * 返回值说明: boolean 是否成功 - ***********************************/ - @Override - public boolean deleteQuartzJob(String id) { - String[] split = id.split(","); - Set ids = Arrays.stream(split).collect(Collectors.toSet()); - for (String s : ids) { - QuartzJob quartzJob = this.getById(s); - quartzManage.deleteJob(quartzJob); - this.removeById(s); - } - - // 查询所有定时任务 - List list = - this.list(new LambdaQueryWrapper().orderByAsc(QuartzJob::getOrderno)); - // 更新序号 - for (int i = 0; i < list.size(); i++) { - QuartzJob quartzJob = list.get(i); - quartzJob.setOrderno(i + 1); - this.updateById(quartzJob); - } - return true; - } - - /********************************** - * 用途说明: 拖动修改定时任务顺序 - * 参数说明 fromID 当前ID toID 到达ID - * 返回值说明: com.yfd.platform.config.ResponseResult 返回拖动成功或者失败 - ***********************************/ - @Override - public boolean changeDictOrder(String fromID, String toID) { - QuartzJob fromQuartzJob = - quartzJobMapper.selectById(fromID); - QuartzJob toQuartzJob = quartzJobMapper.selectById(toID); - // 如果数据字典不存在拖动失败 - if (fromQuartzJob == null || toQuartzJob == null) { - return false; - } - Integer fromOrderNo = fromQuartzJob.getOrderno(); - Integer toOrderNo = toQuartzJob.getOrderno(); - // 如果数据字典的顺序号不存在拖动失败 - if (fromOrderNo == null || toOrderNo == null) { - return false; - } - // 将顺序号放入字典对象中 - fromQuartzJob.setOrderno(toOrderNo); - toQuartzJob.setOrderno(fromOrderNo); - // 更改顺序号 - boolean fromBool = this.updateById(fromQuartzJob); - boolean toBool = this.updateById(toQuartzJob); - return fromBool && toBool; - } - - /********************************** - * 用途说明: 执行定时任务 - * 参数说明 id id - * 返回值说明: void - ***********************************/ - @Override - public void execution(QuartzJob quartzJob) { - quartzManage.runJobNow(quartzJob); - } -} diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java b/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java index 1818365..a359769 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java @@ -31,8 +31,8 @@ public class SysLog implements Serializable { /** * ID */ - @TableId(value = "ID", type = IdType.AUTO) - private Long id; + @TableId(value = "ID", type = IdType.ASSIGN_UUID) + private String id; /** * 用户账号 diff --git a/backend/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java b/backend/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java index f57b35e..061feeb 100644 --- a/backend/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java +++ b/backend/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java @@ -41,7 +41,7 @@ public interface SysMenuMapper extends BaseMapper { List selectPermsByUserId(String userId); //List selectMenuByUserId(String userId); - List> selectMenuByUserId(String userId); + List selectMenuByUserId(String userId); /*********************************** * 用途说明:根据权限id查找系统类型 diff --git a/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java b/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java index acb7a81..654d347 100644 --- a/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java +++ b/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java @@ -86,4 +86,19 @@ public interface SysRoleMapper extends BaseMapper { void addRoleMenu(@Param("id") String id, @Param("roleid") String roleid, @Param("menuid") String menuid); + + + /********************************** + * 用途说明:根据用户 id 获取角色信息 + * 参数说明 id 用户 id + * 返回值说明:角色列表 + ***********************************/ + List getRoleListByUserId(String id); + + /********************************** + * 用途说明:根据用户 id 获取角色 ID 列表 + * 参数说明 id 用户 id + * 返回值说明:角色 ID 列表 + ***********************************/ + List getRoleIdsByUserId(String id); } diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java index b53b789..56a1e02 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java @@ -14,6 +14,7 @@ import com.yfd.platform.system.mapper.SysRoleMapper; import com.yfd.platform.system.service.ISysMenuService; import com.yfd.platform.utils.FileUtil; import com.yfd.platform.config.FileSpaceProperties; +import com.yfd.platform.utils.ObjectConverterUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -64,12 +65,13 @@ public class SysMenuServiceImpl extends ServiceImpl impl public List> getMenuButtonTree(String systemcode, String name, String isdisplay) { - List> listMap=null; + List> mapList=null; + List> listMap =new ArrayList<>(); if(StrUtil.isEmpty(name)){//不带名称查询,返回树结构 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("parentid", "0").eq("systemcode", systemcode).orderByAsc("orderno"); - listMap = this.listMaps(queryWrapper); - + mapList = this.listMaps(queryWrapper); + listMap.addAll(ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList)); for (int i = 0; i < listMap.size(); i++) { //查询下一子集 List> childList = child(listMap.get(i).get( @@ -79,11 +81,9 @@ public class SysMenuServiceImpl extends ServiceImpl impl }else{ //根据菜单名称查询,直接返回类别 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like("name", name).eq("systemcode", systemcode).orderByAsc("name"); - listMap = this.listMaps(queryWrapper); + mapList = this.listMaps(queryWrapper); + listMap.addAll(ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList)); } - - - return listMap; } @@ -129,7 +129,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl private List> child(String parentid, String systemcode, String name, String isdisplay, String type) { - List> listMap = new ArrayList<>(); + List> mapList; QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("parentid", parentid).eq("systemcode", systemcode); //根据上级id 系统 查询 @@ -140,8 +140,9 @@ public class SysMenuServiceImpl extends ServiceImpl impl if (StrUtil.isNotEmpty(name)) { //根据菜单名称查询 queryWrapper.like("name", name); } - listMap = this.listMaps(queryWrapper.orderByAsc("orderno")); - if (listMap.size() > 0) { //判断是否存在子集 + mapList = this.listMaps(queryWrapper.orderByAsc("orderno")); + List> listMap = ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList); + if (!listMap.isEmpty()) { //判断是否存在子集 for (int i = 0; i < listMap.size(); i++) { //遍历表数据 List> childList = child(listMap.get(i).get("id").toString(), systemcode @@ -170,14 +171,16 @@ public class SysMenuServiceImpl extends ServiceImpl impl sysMenu.setOrderno((int) orderno); // 生成编号 QueryWrapper queryMaxCode = new QueryWrapper<>(); - queryMaxCode.eq("parentid", - parentId); - // 查询最大的编号 - List maxList = this.listObjs(queryMaxCode.select("max(code) " + - "code").eq("systemcode", sysMenu.getSystemcode())); + queryMaxCode.eq("parentid", parentId); + + // 使用 Oracle 兼容的 NVL 函数处理空值 + List maxList = this.listObjs( + queryMaxCode.select("NVL(MAX(code), '0') as code") + .eq("systemcode", sysMenu.getSystemcode()) + ); SysMenu parentMenu = sysMenuMapper.selectById(parentId); // 最大编号转换成int类型 - String maxCode = maxList.size() > 0 ? maxList.get(0).toString() : "0"; + String maxCode = !maxList.isEmpty() ? maxList.getFirst().toString() : "0"; int max = ObjectUtil.isEmpty(maxList) ? 0 : Integer.parseInt(maxCode); DecimalFormat df; @@ -409,14 +412,31 @@ public class SysMenuServiceImpl extends ServiceImpl impl public List> getMenuTree(String id) { // 根据id获取菜单 //List sysMenus = sysMenuMapper.selectMenuByUserId(id); - List> list; + List sysMenuList; if (StrUtil.isBlank(id)) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - list = this.listMaps(queryWrapper.eq(SysMenu::getIsdisplay, "1").ne(SysMenu::getType, "2").eq(SysMenu::getSystemcode, "1").orderByAsc(SysMenu::getOrderno)); + sysMenuList = this.list(queryWrapper.eq(SysMenu::getIsdisplay, "1").ne(SysMenu::getType, "2").eq(SysMenu::getSystemcode, "1").orderByAsc(SysMenu::getOrderno)); } else { - list = sysMenuMapper.selectMenuByUserId(id); + sysMenuList = sysMenuMapper.selectMenuByUserId(id); } + // 将 SysMenu 转换为 Map 并构建树 + List> list = sysMenuList.stream() + .map(menu -> { + Map map = new HashMap<>(); + map.put("id", menu.getId()); + map.put("parentid", menu.getParentid()); + map.put("name", menu.getName()); + map.put("opturl", menu.getOpturl()); + map.put("icon", menu.getIcon()); + map.put("type", menu.getType()); + map.put("systemcode", menu.getSystemcode()); + map.put("isdisplay", menu.getIsdisplay()); + map.put("orderno", menu.getOrderno()); + return map; + }) + .collect(Collectors.toList()); + // 将菜单转换成树 List> sysMenus = buildTreeLeft(list); return sysMenus; diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java index 01ea014..762612b 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java @@ -55,7 +55,7 @@ public class SysOrganizationServiceImpl extends ServiceImpl> getOrgTree(String parentid, String params) { - List> listMap = new ArrayList<>(); + List orgList = new ArrayList<>(); QueryWrapper queryWrapper = new QueryWrapper<>(); //根据父级id查询 queryWrapper.eq("parentid", parentid); @@ -88,11 +88,30 @@ public class SysOrganizationServiceImpl extends ServiceImpl> childList = child(listMap.get(i).get( + orgList = this.list(queryWrapper.orderByAsc("orgcode")); + // 将实体对象转换为 Map,确保字段名与实体类一致 + // 将实体对象转换为 Map,确保字段名与实体类一致 + List> listMap = orgList.stream().map(org -> { + Map map = new HashMap<>(); + map.put("id", org.getId()); + map.put("orgtype", org.getOrgtype()); + map.put("orgcode", org.getOrgcode()); + map.put("orgname", org.getOrgname()); + map.put("parentid", org.getParentid()); + map.put("manager", org.getManager()); + map.put("isvaild", org.getIsvaild()); + map.put("description", org.getDescription()); + map.put("lastmodifier", org.getLastmodifier()); + map.put("lastmodifydate", org.getLastmodifydate()); + map.put("custom1", org.getCustom1()); + map.put("custom2", org.getCustom2()); + map.put("custom3", org.getCustom3()); + return map; + }).collect(Collectors.toList()); + for (Map map : listMap) { + List> childList = child(map.get( "id").toString());//查询下一子集 - listMap.get(i).put("childList", childList); //添加新列 子集 + map.put("childList", childList); //添加新列 子集 } return listMap; } @@ -109,7 +128,7 @@ public class SysOrganizationServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("parentid", parentid); //根据上级id 查询 listMap = this.listMaps(queryWrapper.orderByAsc("orgcode")); - if (listMap.size() > 0) { //判断是否存在子集 + if (!listMap.isEmpty()) { //判断是否存在子集 for (int i = 0; i < listMap.size(); i++) { //遍历表数据 List> childList = child(listMap.get(i).get("id").toString()); //循环获取下一子集 diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java index 566d608..73b1bf0 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -108,10 +108,9 @@ public class UserServiceImpl extends ServiceImpl impleme //根据用户ID获取组织 Map userInfo = sysUserMapper.getOrganizationByid(user.getId()); - List roles = - sysRoleMapper.selectList(new QueryWrapper().inSql( - "id ", "SELECT roleid FROM sys_role_users ru WHERE ru" + - ".userid = '" + user.getId() + "'")); + + // 使用 MyBatis 方式查询用户角色(Oracle 兼容) + List roles = sysRoleMapper.getRoleByUserId(user.getId()); List collect = roles.stream().map(SysRole::getRolename).collect(Collectors.toList()); ResponseResult responseResult = new ResponseResult(); diff --git a/backend/src/main/java/com/yfd/platform/utils/ObjectConverterUtil.java b/backend/src/main/java/com/yfd/platform/utils/ObjectConverterUtil.java new file mode 100644 index 0000000..da72785 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/utils/ObjectConverterUtil.java @@ -0,0 +1,149 @@ +package com.yfd.platform.utils; + +import java.lang.reflect.Field; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +public class ObjectConverterUtil { + + // 日期时间格式 + private static final DateTimeFormatter DATE_TIME_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + /** + * 将 List 中的大写字段名转换为与实体类一致的小写格式 + * 适用于 Oracle 数据库查询结果转换 + * 时间类型字段会转换为字符串格式 + * + * @param entityClass 实体类 Class 对象 + * @param sourceList 源数据列表(字段名为大写) + * @return 转换后的列表(字段名与实体类一致) + */ + public static List> convertMapFieldsToEntityFormat( + Class entityClass, + List> sourceList) { + + if (sourceList == null || sourceList.isEmpty()) { + return sourceList; + } + + // 获取实体类的所有字段及类型 + Map fieldMap = new HashMap<>(); + for (Field field : entityClass.getDeclaredFields()) { + fieldMap.put(field.getName(), field); + } + + // 转换每个 Map + return sourceList.stream().map(sourceMap -> { + Map targetMap = new HashMap<>(); + + for (Map.Entry entry : sourceMap.entrySet()) { + String dbColumnName = entry.getKey(); // 数据库列名(大写) + Object value = entry.getValue(); + + // 将大写列名转为小写 + String lowerCaseName = dbColumnName.toLowerCase(); + + // 如果实体类中有对应的字段 + if (fieldMap.containsKey(lowerCaseName)) { + Field field = fieldMap.get(lowerCaseName); + String fieldType = field.getType().getSimpleName(); + + // 处理时间类型,转换为字符串 + if ("Timestamp".equals(fieldType) || "Date".equals(fieldType) || + "LocalDateTime".equals(fieldType)) { + targetMap.put(lowerCaseName, formatDateTimeValue(value)); + } else { + targetMap.put(lowerCaseName, value); + } + } else { + // 如果实体类中没有对应字段,保留原列名(转小写) + targetMap.put(lowerCaseName, value); + } + } + + return targetMap; + }).collect(Collectors.toList()); + } + + /** + * 通用方法:将单个 Map 的大写字段转换为实体类格式 + * 时间类型字段会转换为字符串格式 + * + * @param entityClass 实体类 Class 对象 + * @param sourceMap 源 Map(字段名为大写) + * @return 转换后的 Map(字段名与实体类一致) + */ + public static Map convertSingleMapFieldsToEntityFormat( + Class entityClass, + Map sourceMap) { + + if (sourceMap == null) { + return sourceMap; + } + + // 获取实体类的所有字段及类型 + Map fieldMap = new HashMap<>(); + for (Field field : entityClass.getDeclaredFields()) { + fieldMap.put(field.getName(), field); + } + + Map targetMap = new HashMap<>(); + + for (Map.Entry entry : sourceMap.entrySet()) { + String dbColumnName = entry.getKey(); + Object value = entry.getValue(); + + // 将大写列名转为小写 + String lowerCaseName = dbColumnName.toLowerCase(); + + // 验证字段是否存在于实体类中 + if (fieldMap.containsKey(lowerCaseName)) { + Field field = fieldMap.get(lowerCaseName); + String fieldType = field.getType().getSimpleName(); + + // 处理时间类型,转换为字符串 + if ("Timestamp".equals(fieldType) || "Date".equals(fieldType) || + "LocalDateTime".equals(fieldType)) { + targetMap.put(lowerCaseName, formatDateTimeValue(value)); + } else { + targetMap.put(lowerCaseName, value); + } + } + } + + return targetMap; + } + + /** + * 格式化时间类型值为字符串 + * + * @param value 时间值(可能是 Timestamp、Date 或 LocalDateTime) + * @return 格式化后的字符串,如果为 null 则返回 null + */ + private static String formatDateTimeValue(Object value) { + if (value == null) { + return null; + } + + if (value instanceof Timestamp) { + LocalDateTime localDateTime = ((Timestamp) value).toLocalDateTime(); + return localDateTime.format(DATE_TIME_FORMATTER); + } else if (value instanceof java.util.Date) { + // 包括 java.sql.Date 和 java.util.Date + LocalDateTime localDateTime = ((java.util.Date) value).toInstant() + .atZone(java.time.ZoneId.systemDefault()) + .toLocalDateTime(); + return localDateTime.format(DATE_TIME_FORMATTER); + } else if (value instanceof LocalDateTime) { + return ((LocalDateTime) value).format(DATE_TIME_FORMATTER); + } else { + // 其他类型直接转字符串 + return value.toString(); + } + } + +} diff --git a/backend/src/main/java/com/yfd/platform/utils/RsaUtils.java b/backend/src/main/java/com/yfd/platform/utils/RsaUtils.java index 6638ac7..5c3e6c7 100644 --- a/backend/src/main/java/com/yfd/platform/utils/RsaUtils.java +++ b/backend/src/main/java/com/yfd/platform/utils/RsaUtils.java @@ -20,13 +20,22 @@ public class RsaUtils { public static void main(String[] args) throws Exception { System.out.println("\n"); - RsaKeyPair keyPair = generateKeyPair(); - System.out.println("公钥:" + keyPair.getPublicKey()); - System.out.println("私钥:" + keyPair.getPrivateKey()); +// RsaKeyPair keyPair = generateKeyPair(); + String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ=="; + String privateKey = "MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8\n" + + "mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9p\n" + + "B6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue\n" + + "/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZ\n" + + "UBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6\n" + + "vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha\n" + + "4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3\n" + + "tTbklZkD2A=="; + RsaKeyPair keyPair =new RsaKeyPair(publicKey, privateKey); + System.out.println("私钥:" + keyPair.getPrivateKey()); System.out.println("\n"); test1(keyPair); System.out.println("\n"); - test2(keyPair); +// test2(keyPair); System.out.println("\n"); } diff --git a/backend/src/main/resources/application-devtw.yml b/backend/src/main/resources/application-devtw.yml new file mode 100644 index 0000000..f59a149 --- /dev/null +++ b/backend/src/main/resources/application-devtw.yml @@ -0,0 +1,94 @@ +server: + port: 8093 + +spring: + #应用名称 + application: + name: Project-plateform + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + master: + driverClassName: oracle.jdbc.OracleDriver + url: "${DB_MASTER_URL:jdbc:oracle:thin:@172.16.21.134:1521/SDLYZ}" + username: "${DB_MASTER_USERNAME:QGC}" + password: "${DB_MASTER_PASSWORD:ar6Yr7Vxo5}" + slave: + driverClassName: oracle.jdbc.OracleDriver + url: "${DB_SLAVE_URL:jdbc:oracle:thin:@172.16.21.134:1521/SDLYZ}" + username: "${DB_SLAVE_USERNAME:QGC}" + password: "${DB_SLAVE_PASSWORD:ar6Yr7Vxo5}" + + mvc: + pathmatch: + matching-strategy: ant_path_matcher + servlet: + multipart: + max-file-size: 30MB + max-request-size: 100MB + +logging: + file: + name: logs/projectname.log + level: + com.genersoft.iot: debug + com.genersoft.iot.vmp.storager.dao: info + com.genersoft.iot.vmp.gb28181: info + +# 在线文档: swagger-ui(生产环境建议关闭) +swagger-ui: + enabled: true + + +# 登录相关配置 +login: + # 登录缓存 + cache-enable: true + # 是否限制单用户登录 + single-login: false + # 验证码 + login-code: + # 验证码类型配置 查看 LoginProperties 类 + code-type: arithmetic + +# 启动自动数据库初始化(仅 dev/server): +app: + init: + enabled: false + schema: classpath:db-init/sql/min-schema.sql + # data 文件可选;为避免复杂 dump 解析问题,先不导入 + # data: + marker-table: sys_user + marker-version: v1.0.0 + # 登录图形验证码有效时间/分钟 + expiration: 2 + # 验证码高度 + width: 111 + # 验证码宽度 + heigth: 36 + # 内容长度 + length: 2 + # 字体名称,为空则使用默认字体 + font-name: + # 字体大小 + font-size: 25 + +# IP 本地解析 +ip: + local-parsing: true + + +file-space: #项目文档空间 + files: D:\demoproject\files\ #单独上传的文件附件 + system: D:\demoproject\system\ #单独上传的文件 + +task: + pool: + # 核心线程池大小 + core-pool-size: 10 + # 最大线程数 + max-pool-size: 30 + # 活跃时间 + keep-alive-seconds: 60 + # 队列容量 + queue-capacity: 50 diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 5ed59cb..8f42778 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: dev + active: devtw jasypt: encryptor: @@ -8,7 +8,7 @@ jasypt: #密码加密传输,前端公钥加密,后端私钥解密 rsa: - private_key: ${RSA_PRIVATE_KEY:} + private_key: ${RSA_PRIVATE_KEY:MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==} # Actuator & Micrometer 默认配置 management: diff --git a/backend/src/main/resources/mapper/system/SysMenuMapper.xml b/backend/src/main/resources/mapper/system/SysMenuMapper.xml index febfab3..3eacc8e 100644 --- a/backend/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/backend/src/main/resources/mapper/system/SysMenuMapper.xml @@ -28,7 +28,7 @@ select userid from sys_role_users where roleid=#{roleid} + + + delete from sys_role_users where userid !=(select u.id from sys_user u where u.account="admin") and roleid=#{roleid} and userid=#{urserid}