diff --git a/jero-boot/db/20230506处理垂直越权.sql b/jero-boot/db/20230506处理垂直越权.sql new file mode 100644 index 00000000..c06ff518 --- /dev/null +++ b/jero-boot/db/20230506处理垂直越权.sql @@ -0,0 +1,31 @@ +-- ---------------------------- +-- 系统管理-菜单管理(增删查改权限) +-- ---------------------------- +-- 权限数据 -- +INSERT INTO `sys_permission` VALUES ('1654673897041223683', '54dd5457a3190740005c1bfec55b1c34', '查询', NULL, NULL, NULL, NULL, 2, 'permission:list', '1', NULL, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2023-05-06 10:26:14', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1654675497143033857', '54dd5457a3190740005c1bfec55b1c34', '添加', NULL, NULL, NULL, NULL, 2, 'permission:add', '1', NULL, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2023-05-06 10:32:36', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1654675694854135809', '54dd5457a3190740005c1bfec55b1c34', '删除', NULL, NULL, NULL, NULL, 2, 'permission:delete', '1', NULL, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2023-05-06 10:33:23', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1654675850508951554', '54dd5457a3190740005c1bfec55b1c34', '编辑', NULL, NULL, NULL, NULL, 2, 'permission:edit', '1', NULL, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2023-05-06 10:34:00', NULL, NULL, 0, 0, '1', 0); +-- 权限与admin角色关联数据 -- +INSERT INTO `sys_role_permission` VALUES ('1654675964954730498', 'f6817f48af4fb3af11b9e8bf182f618b', '1654673897041223683', NULL, '2023-05-06 10:34:27', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1654675964984090626', 'f6817f48af4fb3af11b9e8bf182f618b', '1654675497143033857', NULL, '2023-05-06 10:34:27', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1654675964988284929', 'f6817f48af4fb3af11b9e8bf182f618b', '1654675694854135809', NULL, '2023-05-06 10:34:27', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1654675964992479233', 'f6817f48af4fb3af11b9e8bf182f618b', '1654675850508951554', NULL, '2023-05-06 10:34:27', '127.0.0.1'); + +-- ---------------------------- +-- 系统管理-数据字典(增删查改、导出导入权限) +-- ---------------------------- +-- 权限数据 -- +INSERT INTO `sys_permission` VALUES ('1654744031105675265', 'f1cb187abf927c88b89470d08615f5ac', '查询', NULL, NULL, NULL, NULL, 2, 'dict:list', '1', NULL, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2023-05-06 15:04:55', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1654744160357347330', 'f1cb187abf927c88b89470d08615f5ac', '添加', NULL, NULL, NULL, NULL, 2, 'dict:add', '1', NULL, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2023-05-06 15:05:26', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1654744259787517954', 'f1cb187abf927c88b89470d08615f5ac', '删除', NULL, NULL, NULL, NULL, 2, 'dict:delete', '1', NULL, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2023-05-06 15:05:50', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1654744350615171074', 'f1cb187abf927c88b89470d08615f5ac', '编辑', NULL, NULL, NULL, NULL, 2, 'dict:edit', '1', NULL, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2023-05-06 15:06:12', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1654746352959123457', 'f1cb187abf927c88b89470d08615f5ac', '导出', NULL, NULL, NULL, NULL, 2, 'dict:export', '1', NULL, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2023-05-06 15:14:09', NULL, NULL, 0, 0, '1', 0); +INSERT INTO `sys_permission` VALUES ('1654746470756151297', 'f1cb187abf927c88b89470d08615f5ac', '导入', NULL, NULL, NULL, NULL, 2, 'dict:import', '1', NULL, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2023-05-06 15:14:37', NULL, NULL, 0, 0, '1', 0); +-- 权限与admin角色关联数据 -- +INSERT INTO `sys_role_permission` VALUES ('1654747707610263553', 'f6817f48af4fb3af11b9e8bf182f618b', '1654744031105675265', NULL, '2023-05-06 15:19:32', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1654747707627040770', 'f6817f48af4fb3af11b9e8bf182f618b', '1654744160357347330', NULL, '2023-05-06 15:19:32', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1654747707627040771', 'f6817f48af4fb3af11b9e8bf182f618b', '1654744259787517954', NULL, '2023-05-06 15:19:32', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1654747707631235073', 'f6817f48af4fb3af11b9e8bf182f618b', '1654744350615171074', NULL, '2023-05-06 15:19:32', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1654747707631235074', 'f6817f48af4fb3af11b9e8bf182f618b', '1654746352959123457', NULL, '2023-05-06 15:19:32', '127.0.0.1'); +INSERT INTO `sys_role_permission` VALUES ('1654747707635429378', 'f6817f48af4fb3af11b9e8bf182f618b', '1654746470756151297', NULL, '2023-05-06 15:19:32', '127.0.0.1'); \ No newline at end of file diff --git a/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/controller/JeroController.java b/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/controller/JeroController.java index 4c38ea8f..92a6da77 100644 --- a/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/controller/JeroController.java +++ b/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/base/controller/JeroController.java @@ -172,8 +172,8 @@ public class JeroController> { // 获取上传文件对象 MultipartFile file = entity.getValue(); ImportParams params = new ImportParams(); - params.setTitleRows(2); - params.setHeadRows(1); + /*params.setTitleRows(2); + params.setHeadRows(1);*/ params.setNeedSave(true); try { List list = ExcelImportUtil.importExcel(file.getInputStream(), clazz, params); diff --git a/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java b/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java index fbed7755..3f31bdf4 100644 --- a/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java +++ b/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java @@ -32,8 +32,8 @@ public class JwtUtil { } - // Token过期时间24小时(用户登录过期时间是此时间的两倍,以token在reids缓存时间为准) - public static final long EXPIRE_TIME = 1440 * 60 * 1000L; + // Token过期时间30分钟(用户登录过期时间也是30分钟,以token在reids缓存时间为准) + public static final long EXPIRE_TIME = 30 * 60 * 1000L; private static final String USERNAME_FIELD = "username"; @@ -79,6 +79,7 @@ public class JwtUtil { * @return 加密的token */ public static String sign(String username, String secret) { + // 24小时后过期 Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); Algorithm algorithm = Algorithm.HMAC256(secret); // 附带username信息 diff --git a/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroRealm.java b/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroRealm.java index 3c75aba4..3a05204c 100644 --- a/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroRealm.java +++ b/jero-boot/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroRealm.java @@ -158,7 +158,7 @@ public class ShiroRealm extends AuthorizingRealm { String newAuthorization = JwtUtil.sign(userName, passWord); // 设置超时时间 redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, newAuthorization); - redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 1000); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 1000 * 2); log.debug("——————————用户在线操作,更新token保证不掉线—————————jwtTokenRefresh——————— "+ token); } return true; diff --git a/jero-boot/jero-boot-base/jero-boot-base-generater-core/src/main/java/com/jero/codegenerate/database/DbReadTableUtil.java b/jero-boot/jero-boot-base/jero-boot-base-generater-core/src/main/java/com/jero/codegenerate/database/DbReadTableUtil.java index 54626c09..5f9d9b00 100644 --- a/jero-boot/jero-boot-base/jero-boot-base-generater-core/src/main/java/com/jero/codegenerate/database/DbReadTableUtil.java +++ b/jero-boot/jero-boot-base/jero-boot-base-generater-core/src/main/java/com/jero/codegenerate/database/DbReadTableUtil.java @@ -536,7 +536,7 @@ public class DbReadTableUtil { } //通过表名获取表备注 - public String remarks(String a) throws SQLException, ClassNotFoundException { + public String remarks(String tableName) throws SQLException, ClassNotFoundException { Connection connection = null; Statement statement = null; try { @@ -544,7 +544,15 @@ public class DbReadTableUtil { connection = DriverManager.getConnection(com.jero.codegenerate.properties.CodeConfigProperties.databaseUrl, com.jero.codegenerate.properties.CodeConfigProperties.username, com.jero.codegenerate.properties.CodeConfigProperties.password); statement = connection.createStatement(1005, 1007); - String sqlStr = "SELECT table_comment FROM information_schema.TABLES WHERE table_name = " + "'"+a+"'"; + String sqlStr = ""; + if (com.jero.codegenerate.properties.CodeConfigProperties.databaseType.equals(DbConvertDef.MYSQL)) { + // mysql获取表的列信息sql + sqlStr = "SELECT table_comment FROM information_schema.TABLES WHERE table_name = " + "'"+tableName+"'"; + } + // oracle获取表的列信息sql + if (com.jero.codegenerate.properties.CodeConfigProperties.databaseType.equals(DbConvertDef.ORACLE)) { + sqlStr = "SELECT comments FROM user_tab_comments WHERE table_name = '" + tableName.toUpperCase() + "'"; + } ResultSet resultSet = statement.executeQuery(sqlStr); while(resultSet.next()) { String name = resultSet.getString(1); diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessageTemplate.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessageTemplate.java index 9e531b7f..314f22e5 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessageTemplate.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/message/entity/SysMessageTemplate.java @@ -30,8 +30,8 @@ public class SysMessageTemplate extends JeroEntity { @Excel(name = "模板内容", width = 50) private java.lang.String templateContent; /**模板测试json*/ - @Excel(name = "模板测试json", width = 15) - private java.lang.String templateTestJson; + /*@Excel(name = "模板测试json", width = 15) + private java.lang.String templateTestJson;*/ /**模板类型*/ @Excel(name = "模板类型", width = 15) private java.lang.String templateType; diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/DuplicateCheckController.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/DuplicateCheckController.java index 04dc63b0..74e71fe8 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/DuplicateCheckController.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/DuplicateCheckController.java @@ -3,6 +3,7 @@ package com.jero.modules.system.controller; import javax.servlet.http.HttpServletRequest; import com.jero.common.api.vo.Results; +import com.jero.common.util.PasswordUtil; import org.apache.commons.lang.StringUtils; import com.jero.common.util.SqlInjectionUtil; import com.jero.modules.system.mapper.SysDictMapper; @@ -47,6 +48,11 @@ public class DuplicateCheckController { //SQL注入校验(只限制非法串改数据库) final String[] sqlInjCheck = {duplicateCheckVo.getTableName(),duplicateCheckVo.getFieldName()}; SqlInjectionUtil.filterContent(sqlInjCheck); + if ("phone".equals(duplicateCheckVo.getFieldName())) { + if (StringUtils.isNotBlank(duplicateCheckVo.getFieldVal())) { + duplicateCheckVo.setFieldVal(PasswordUtil.encrypt(duplicateCheckVo.getFieldVal())); + } + } if (StringUtils.isNotBlank(duplicateCheckVo.getDataId())) { // [2].编辑页面校验 num = sysDictMapper.duplicateCheckCountSql(duplicateCheckVo); diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementController.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementController.java index 7d9474e7..4e58069d 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementController.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysAnnouncementController.java @@ -90,18 +90,12 @@ public class SysAnnouncementController { HttpServletRequest req) { Results> result = new Results<>(); sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); - QueryWrapper queryWrapper = new QueryWrapper<>(sysAnnouncement); Page page = new Page<>(pageNo,pageSize); - //排序逻辑 处理 - String column = req.getParameter("column"); - String order = req.getParameter("order"); - if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { - if("asc".equals(order)) { - queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); - }else { - queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); - } - } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysAnnouncement::getDelFlag, sysAnnouncement.getDelFlag()); + queryWrapper.like(StringUtils.isNotBlank(sysAnnouncement.getTitile()) + ,SysAnnouncement::getTitile, sysAnnouncement.getTitile()); + queryWrapper.orderByDesc(SysAnnouncement::getCreateTime); IPage pageList = sysAnnouncementService.page(page, queryWrapper); result.setSuccess(true); result.setResult(pageList); diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictController.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictController.java index c0c2bf4d..2bb8832b 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictController.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysDictController.java @@ -1,575 +1,596 @@ -package com.jero.modules.system.controller; - - -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.jero.common.api.vo.Results; -import com.jero.common.constant.CacheConstant; -import com.jero.common.constant.CommonConstant; -import com.jero.common.exception.JeroBootException; -import com.jero.common.system.base.controller.JeroController; -import com.jero.common.system.query.QueryGenerator; -import com.jero.common.system.vo.DictModel; -import com.jero.common.system.vo.LoginUser; -import com.jero.common.util.ImportExcelUtil; -import com.jero.common.util.SqlInjectionUtil; -import com.jero.common.util.oConvertUtils; -import com.jero.modules.system.entity.SuccessAndErrorLines; -import com.jero.modules.system.entity.SysDict; -import com.jero.modules.system.entity.SysDictItem; -import com.jero.modules.system.model.SysDictTree; -import com.jero.modules.system.model.TreeSelectModel; -import com.jero.modules.system.service.ISysDictItemService; -import com.jero.modules.system.service.ISysDictService; -import com.jero.modules.system.vo.SysDictPage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang.StringUtils; -import org.apache.poi.ss.formula.functions.T; -import org.apache.shiro.SecurityUtils; -import org.jeecgframework.poi.excel.ExcelImportCheckUtil; -import org.jeecgframework.poi.excel.ExcelImportUtil; -import org.jeecgframework.poi.excel.def.NormalExcelConstants; -import org.jeecgframework.poi.excel.entity.ExportParams; -import org.jeecgframework.poi.excel.entity.ImportParams; -import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.multipart.MultipartHttpServletRequest; -import org.springframework.web.servlet.ModelAndView; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.util.*; - -/** - *

- * 字典表 前端控制器 - *

- * - * @Author zhangweijian - * @since 2018-12-28 - */ -@RestController -@Api(tags = "字典控制器") -@RequestMapping("/sys/dict") -@Slf4j -public class SysDictController { - - @Autowired - private ISysDictService sysDictService; - @Autowired - private ISysDictItemService sysDictItemService; - @Autowired - public RedisTemplate redisTemplate; - - private static final String DICT_CODE_ERROE = "字典Code格式不正确!"; - private static final String OPTION_SUCCESS = "操作成功!"; - private static final String DEL_SUCCESS = "删除成功!"; - - @GetMapping("/page") - @ApiOperation(value = "字典控制器-分页列表查询", notes = "字典控制器-分页列表查询") - public Results> queryPageList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, - @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { - Results> result = new Results<>(); - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDict, req.getParameterMap()); - Page page = new Page<>(pageNo, pageSize); - IPage pageList = sysDictService.page(page, queryWrapper); - log.debug("查询当前页:"+pageList.getCurrent()); - log.debug("查询当前页数量:"+pageList.getSize()); - log.debug("查询结果数量:"+pageList.getRecords().size()); - log.debug("数据总数:"+pageList.getTotal()); - result.setSuccess(true); - result.setResult(pageList); - return result; - } - - /** - * @功能:获取树形字典数据 - * @param sysDict - * @param pageNo - * @param pageSize - * @param req - * @return - */ - @ApiOperation(value = "字典控制器-树形字典数据", notes = "字典控制器-树形字典数据") - @GetMapping("/treeList") - public Results> treeList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, - @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { - Results> result = new Results<>(); - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - // 构造查询条件 - String dictName = sysDict.getDictName(); - if(oConvertUtils.isNotEmpty(dictName)) { - query.like(true, SysDict::getDictName, dictName); - } - query.orderByDesc(true, SysDict::getCreateTime); - List list = sysDictService.list(query); - List treeList = new ArrayList<>(); - for (SysDict node : list) { - treeList.add(new SysDictTree(node)); - } - result.setSuccess(true); - result.setResult(treeList); - return result; - } - - /** - * 获取全部字典数据 - * - * @return - */ - @ApiOperation(value = "字典控制器-获取全部字典数据", notes = "字典控制器-获取全部字典数据") - @GetMapping("/queryAllDictItems") - public Results>> queryAllDictItems(HttpServletRequest request) { - Map> res ; - res = sysDictService.queryAllDictItems(); - return Results.OK(res); - } - - /** - * 获取字典数据 - * @param dictCode - * @return - */ - @ApiOperation(value = "字典控制器-通过字典code和字典值key获取字典数据", notes = "字典控制器-通过字典code和字典值key获取字典数据") - @GetMapping("/getDictText/{dictCode}/{key}") - public Results getDictText(@PathVariable("dictCode") String dictCode, @PathVariable("key") String key) { - log.info(" dictCode : "+ dictCode); - Results result = new Results<>(); - String text = null; - try { - text = sysDictService.queryDictTextByKey(dictCode, key); - result.setSuccess(true); - result.setResult(text); - } catch (Exception e) { - log.error(e.getMessage(),e); - return Results.error("操作失败"); - } - return result; - } - - /** - * 获取字典数据 【接口签名验证】 - * @param dictCode 字典code - * @param dictCode 表名,文本字段,code字段 | 举例:sys_user,realname,id - * @return - */ - @GetMapping("/getDictItems/{dictCode}") - public Results> getDictItems(@PathVariable String dictCode, @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request) { - log.info(" dictCode : "+ dictCode); - Results> result = new Results<>(); - try { - List ls = sysDictService.getDictItems(dictCode); - if (ls == null) { - return Results.error(DICT_CODE_ERROE); - } - result.setSuccess(true); - result.setResult(ls); - log.debug(result.toString()); - } catch (Exception e) { - log.error(e.getMessage(), e); - return Results.error("操作失败"); - } - return result; - } - - /** - * 【接口签名验证】 - * 【JSearchSelectTag下拉搜索组件专用接口】 - * 大数据量的字典表 走异步加载 即前端输入内容过滤数据 - * @param dictCode 字典code格式:table,text,code - * @return - */ - @GetMapping("/loadDict/{dictCode}") - public Results> loadDict(@PathVariable String dictCode, - @RequestParam(name="keyword") String keyword, - @RequestParam(value = "sign",required = false) String sign, - @RequestParam(value = "pageSize", required = false) Integer pageSize) { - log.info(" 加载字典表数据,加载关键字: "+ keyword); - Results> result = new Results<>(); - try { - List ls = sysDictService.loadDict(dictCode, keyword, pageSize); - if (ls == null) { - return Results.error(DICT_CODE_ERROE); - } - result.setSuccess(true); - result.setResult(ls); - log.info(result.toString()); - return result; - } catch (Exception e) { - log.error(e.getMessage(),e); - return Results.error("操作失败"); - } - } - - /** - * 【给表单设计器的表字典使用】下拉搜索模式,有值时动态拼接数据 - * @param dictCode - * @param keyword 当前控件的值,可以逗号分割 - * @param sign - * @param pageSize - * @return - */ - @GetMapping("/loadDictOrderByValue/{dictCode}") - public Results> loadDictOrderByValue( - @PathVariable String dictCode, - @RequestParam(name = "keyword") String keyword, - @RequestParam(value = "sign", required = false) String sign, - @RequestParam(value = "pageSize", required = false) Integer pageSize) { - // 首次查询查出来用户选中的值,并且不分页 - Results> firstRes = this.loadDict(dictCode, keyword, sign, null); - if (!firstRes.isSuccess()) { - return firstRes; - } - // 然后再查询出第一页的数据 - Results> result = this.loadDict(dictCode, "", sign, pageSize); - if (!result.isSuccess()) { - return result; - } - // 合并两次查询的数据 - List firstList = firstRes.getResult(); - List list = result.getResult(); - for (DictModel firstItem : firstList) { - // anyMatch 表示:判断的条件里,任意一个元素匹配成功,返回true - // allMatch 表示:判断条件里的元素,所有的都匹配成功,返回true - // noneMatch 跟 allMatch 相反,表示:判断条件里的元素,所有的都匹配失败,返回true - boolean none = list.stream().noneMatch(item -> item.getValue().equals(firstItem.getValue())); - // 当元素不存在时,再添加到集合里 - if (none) { - list.add(0, firstItem); - } - } - return result; - } - - /** - *【接口签名验证】 - * 根据字典code加载字典text 返回 - * @param dictCode 顺序:tableName,text,code - * @param keys 要查询的key - * @param sign - * @param delNotExist 是否移除不存在的项,默认为true,设为false如果某个key不存在数据库中,则直接返回key本身 - * @param request - * @return - */ - @GetMapping("/loadDictItem/{dictCode}") - public Results> loadDictItem(@PathVariable String dictCode, @RequestParam(name="key") String keys, @RequestParam(value = "sign",required = false) String sign, @RequestParam(value = "delNotExist",required = false,defaultValue = "true") boolean delNotExist, HttpServletRequest request) { - Results> result = new Results<>(); - try { - if(dictCode.indexOf(",")!=-1) { - String[] params = dictCode.split(","); - if(params.length!=3) { - return Results.error(DICT_CODE_ERROE); - } - List texts = sysDictService.queryTableDictByKeys(params[0], params[1], params[2], keys, delNotExist); - - result.setSuccess(true); - result.setResult(texts); - log.info(result.toString()); - }else { - return Results.error(DICT_CODE_ERROE); - } - } catch (Exception e) { - log.error(e.getMessage(),e); - return Results.error("操作失败"); - } - - return result; - } - - /** - * 【接口签名验证】 - * 根据表名——显示字段-存储字段 pid 加载树形数据 - */ - @ApiOperation(value = "字典控制器-根据表名—显示字段-存储字段 pid 加载树形数据", notes = "字典控制器-根据表名—显示字段-存储字段 pid 加载树形数据") - @GetMapping("/loadTreeData") - public Results> loadTreeData(@RequestParam(name="pid") String pid, @RequestParam(name="pidField") String pidField, - @RequestParam(name="tableName") String tbname, - @RequestParam(name="text") String text, - @RequestParam(name="code") String code, - @RequestParam(name="hasChildField", required = false) String hasChildField, - @RequestParam(value = "sign", required = false) String sign, HttpServletRequest request) { - Results> result = new Results<>(); - - // SQL注入漏洞 sign签名校验(表名,label字段,val字段,条件) - String dictCode = tbname +","+ text +","+ code; - SqlInjectionUtil.filterContent(dictCode); - List ls = sysDictService.queryTreeList(null, tbname, text, code, pidField, pid, hasChildField); - result.setSuccess(true); - result.setResult(ls); - return result; - } - - /** - * 查询后返回树型数据 - */ - @ApiOperation(value = "字典控制器-根据表名—显示字段-存储字段 加载树形数据", notes = "字典控制器-根据表名—显示字段-存储字段 加载树形数据") - @GetMapping("/queryAllTreeData") - public Results> queryAllTreeData(@RequestParam(name="pidField") String pidField, - @RequestParam(name="tableName") String tbname, - @RequestParam(name="text") String text, - @RequestParam(name="code") String code, - HttpServletRequest request) { - Results> result = new Results<>(); - - // SQL注入漏洞 sign签名校验(表名,label字段,val字段,条件) - String dictCode = tbname +","+ text +","+ code; - SqlInjectionUtil.filterContent(dictCode); - List ls = sysDictService.queryAllTreeData(tbname, text, code, pidField); - result.setSuccess(true); - result.setResult(ls); - return result; - } - - /** - * @功能:新增 - * @param sysDict - * @return - */ - @ApiOperation(value = "字典控制器-新增字典", notes = "字典控制器-新增字典") - @PostMapping("/add") - public Results add(@RequestBody SysDict sysDict) { - try { - sysDict.setCreateTime(new Date()); - sysDict.setDelFlag(CommonConstant.DEL_FLAG_0); - sysDictService.save(sysDict); - //添加成功后需要刷新缓存 - sysDictService.refreshCache(); - return Results.OK(OPTION_SUCCESS); - } catch (Exception e) { - log.error(e.getMessage(),e); - return Results.error("操作失败"); - } - } - - /** - * @功能:编辑 - * @param sysDict - * @return - */ - @ApiOperation(value = "字典控制器-编辑字典", notes = "字典控制器-编辑字典") - @PostMapping("/edit") - public Results edit(@RequestBody SysDict sysDict) { - SysDict sysdict = sysDictService.getById(sysDict.getId()); - if(sysdict==null) { - return Results.error("未找到对应实体"); - }else { - sysDict.setUpdateTime(new Date()); - boolean ok = sysDictService.updateById(sysDict); - if(ok) { - //编辑成功后需要刷新缓存 - sysDictService.refreshCache(); - return Results.OK(OPTION_SUCCESS); - } - } - return Results.OK(); - } - - /** - * @功能:删除 - * @param map - * @return - */ - @ApiOperation(value = "字典控制器-删除字典", notes = "字典控制器-删除字典") - @PostMapping(value = "/delete") - @CacheEvict(value={CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true) - public Results delete(@RequestBody Map map) { - String id = map.get("id"); - if(StringUtils.isBlank(id)){ - return Results.error("参数不识别!"); - } - boolean ok = sysDictService.removeById(id); - if(ok) { - return Results.OK(DEL_SUCCESS); - }else{ - return Results.error("删除失败!"); - } - } - - /** - * @功能:批量删除 - * @param ids - * @return - */ - @ApiOperation(value = "字典控制器-批量字典", notes = "字典控制器-批量字典") - @PostMapping(value = "/deleteBatch") - @CacheEvict(value= {CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true) - public Results deleteBatch(@RequestParam(name="ids",required=true) String ids) { - if(oConvertUtils.isEmpty(ids)) { - return Results.error("参数不识别!"); - }else { - sysDictService.removeByIds(Arrays.asList(ids.split(","))); - return Results.OK(DEL_SUCCESS); - } - } - - /** - * @功能:刷新缓存 - * @date 修改时间 2021.4.8 - * @return - */ - @RequestMapping(value = "/refleshCache") - public Results refleshCache() { - Results result = new Results<>(); - sysDictService.refreshCache(); - return result; - } - - /** - * 导出excel - * - * @param request - */ - @RequestMapping(value = "/exportXls") - public ModelAndView exportXls(SysDict sysDict, HttpServletRequest request) { - // Step.1 组装查询条件 - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDict, request.getParameterMap()); - //Step.2 AutoPoi 导出Excel - ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); - List pageList = new ArrayList<>(); - - List sysDictList = sysDictService.list(queryWrapper); - for (SysDict dictMain : sysDictList) { - SysDictPage vo = new SysDictPage(); - BeanUtils.copyProperties(dictMain, vo); - // 查询机票 - List sysDictItemList = sysDictItemService.selectItemsByMainId(dictMain.getId()); - vo.setSysDictItemList(sysDictItemList); - pageList.add(vo); - } - - // 导出文件名称 - mv.addObject(JeroController.FILE_NAME, "数据字典"); - // 注解对象Class - mv.addObject(JeroController.CLASS, SysDictPage.class); - // 自定义表格参数 - LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - mv.addObject(JeroController.PARAMS, new ExportParams("数据字典列表", "导出人:"+user.getRealname(), "数据字典")); - // 导出数据列表 - mv.addObject(NormalExcelConstants.DATA_LIST, pageList); - return mv; - } - - - @PostMapping(value = "/importExcel") - public Results importExcel(HttpServletRequest request, HttpServletResponse response) { - MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; - Map fileMap = multipartRequest.getFileMap(); - for (Map.Entry entity : fileMap.entrySet()) { - MultipartFile file = entity.getValue();// 获取上传文件对象 - ImportParams params = new ImportParams(); - params.setTitleRows(2); - params.setHeadRows(2); - params.setNeedSave(true); - try { - //导入Excel格式校验,看匹配的字段文本概率 - Boolean t = ExcelImportCheckUtil.check(file.getInputStream(), SysDictPage.class, params); - if(Boolean.FALSE.equals(t)){ - throw new JeroBootException("导入Excel校验失败 !"); - } - List list = ExcelImportUtil.importExcel(file.getInputStream(), SysDictPage.class, params); - // 错误信息 - List errorMessage = new ArrayList<>(); - int successLines = 0; - int errorLines = 0; - for (int i=0;i< list.size();i++) { - SysDict po = new SysDict(); - BeanUtils.copyProperties(list.get(i), po); - po.setDelFlag(CommonConstant.DEL_FLAG_0); - SuccessAndErrorLines successAndErrorLines = getSuccessAndErrorLines(list, errorMessage, successLines, errorLines, i, po); - successLines = successAndErrorLines.getSuccessLines(); - errorLines = successAndErrorLines.getErrorLines(); - } - return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage); - } catch (Exception e) { - log.error(e.getMessage(),e); - return Results.error("文件导入失败:"+e.getMessage()); - } finally { - fileClose(file); - } - } - return Results.error("文件导入失败!"); - } - - private SuccessAndErrorLines getSuccessAndErrorLines(List list, List errorMessage, int successLines, int errorLines, int i, SysDict po) { - SuccessAndErrorLines successAndErrorLines = new SuccessAndErrorLines(); - successAndErrorLines.setSuccessLines(successLines); - successAndErrorLines.setErrorLines(errorLines); - try { - Integer integer = sysDictService.saveMain(po, list.get(i).getSysDictItemList()); - if(integer>0){ - successAndErrorLines.setSuccessLines(successLines + 1); - }else{ - successAndErrorLines.setErrorLines(errorLines + 1); - int lineNumber = i + 1; - errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。"); - } - } catch (Exception e) { - successAndErrorLines.setErrorLines(errorLines + 1); - int lineNumber = i + 1; - errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。"); - } - return successAndErrorLines; - } - - private void fileClose(MultipartFile file) { - try { - file.getInputStream().close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - /** - * 查询被删除的列表 - * @return - */ - @GetMapping(value = "/deleteList") - public Results> deleteList() { - List list = this.sysDictService.queryDeleteList(); - return Results.OK(list); - } - - /** - * 物理删除 - * @param id - * @return - */ - @PostMapping(value = "/deletePhysic/{id}") - public Results deletePhysic(@PathVariable String id) { - try { - sysDictService.deleteOneDictPhysically(id); - return Results.OK(DEL_SUCCESS); - } catch (Exception e) { - e.printStackTrace(); - return Results.error("删除失败!"); - } - } - - /** - * 逻辑删除的字段,进行取回 - * @param id - * @return - */ - @PostMapping(value = "/back/{id}") - public Results back(@PathVariable String id) { - try { - sysDictService.updateDictDelFlag(0,id); - return Results.OK(OPTION_SUCCESS); - } catch (Exception e) { - e.printStackTrace(); - return Results.error("操作失败!"); - } - } - -} +package com.jero.modules.system.controller; + + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jero.common.api.vo.Results; +import com.jero.common.constant.CacheConstant; +import com.jero.common.constant.CommonConstant; +import com.jero.common.exception.JeroBootException; +import com.jero.common.system.base.controller.JeroController; +import com.jero.common.system.query.QueryGenerator; +import com.jero.common.system.vo.DictModel; +import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.ImportExcelUtil; +import com.jero.common.util.SqlInjectionUtil; +import com.jero.common.util.oConvertUtils; +import com.jero.modules.system.entity.SuccessAndErrorLines; +import com.jero.modules.system.entity.SysDict; +import com.jero.modules.system.entity.SysDictItem; +import com.jero.modules.system.model.SysDictTree; +import com.jero.modules.system.model.TreeSelectModel; +import com.jero.modules.system.service.ISysDictItemService; +import com.jero.modules.system.service.ISysDictService; +import com.jero.modules.system.vo.SysDictPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.apache.poi.ss.formula.functions.T; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.jeecgframework.poi.excel.ExcelImportCheckUtil; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +/** + *

+ * 字典表 前端控制器 + *

+ * + * @Author zhangweijian + * @since 2018-12-28 + */ +@RestController +@Api(tags = "字典控制器") +@RequestMapping("/sys/dict") +@Slf4j +public class SysDictController { + + @Autowired + private ISysDictService sysDictService; + @Autowired + private ISysDictItemService sysDictItemService; + @Autowired + public RedisTemplate redisTemplate; + + private static final String DICT_CODE_ERROE = "字典Code格式不正确!"; + private static final String OPTION_SUCCESS = "操作成功!"; + private static final String DEL_SUCCESS = "删除成功!"; + + @GetMapping("/page") + @RequiresPermissions("dict:list") + @ApiOperation(value = "字典控制器-分页列表查询", notes = "字典控制器-分页列表查询") + public Results> queryPageList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { + Results> result = new Results<>(); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDict, req.getParameterMap()); + Page page = new Page<>(pageNo, pageSize); + IPage pageList = sysDictService.page(page, queryWrapper); + log.debug("查询当前页:"+pageList.getCurrent()); + log.debug("查询当前页数量:"+pageList.getSize()); + log.debug("查询结果数量:"+pageList.getRecords().size()); + log.debug("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * @功能:获取树形字典数据 + * @param sysDict + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @ApiOperation(value = "字典控制器-树形字典数据", notes = "字典控制器-树形字典数据") + @GetMapping("/treeList") + @RequiresPermissions("dict:list") + public Results> treeList(SysDict sysDict, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { + Results> result = new Results<>(); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + // 构造查询条件 + String dictName = sysDict.getDictName(); + if(oConvertUtils.isNotEmpty(dictName)) { + query.like(true, SysDict::getDictName, dictName); + } + query.orderByDesc(true, SysDict::getCreateTime); + List list = sysDictService.list(query); + List treeList = new ArrayList<>(); + for (SysDict node : list) { + treeList.add(new SysDictTree(node)); + } + result.setSuccess(true); + result.setResult(treeList); + return result; + } + + /** + * 获取全部字典数据 + * + * @return + */ + @ApiOperation(value = "字典控制器-获取全部字典数据", notes = "字典控制器-获取全部字典数据") + @GetMapping("/queryAllDictItems") + @RequiresPermissions("dict:list") + public Results>> queryAllDictItems(HttpServletRequest request) { + Map> res ; + res = sysDictService.queryAllDictItems(); + return Results.OK(res); + } + + /** + * 获取字典数据 + * @param dictCode + * @return + */ + @ApiOperation(value = "字典控制器-通过字典code和字典值key获取字典数据", notes = "字典控制器-通过字典code和字典值key获取字典数据") + @GetMapping("/getDictText/{dictCode}/{key}") + @RequiresPermissions("dict:list") + public Results getDictText(@PathVariable("dictCode") String dictCode, @PathVariable("key") String key) { + log.info(" dictCode : "+ dictCode); + Results result = new Results<>(); + String text = null; + try { + text = sysDictService.queryDictTextByKey(dictCode, key); + result.setSuccess(true); + result.setResult(text); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Results.error("操作失败"); + } + return result; + } + + /** + * 获取字典数据 【接口签名验证】 + * @param dictCode 字典code + * @param dictCode 表名,文本字段,code字段 | 举例:sys_user,realname,id + * @return + */ + @GetMapping("/getDictItems/{dictCode}") + @RequiresPermissions("dict:list") + public Results> getDictItems(@PathVariable String dictCode, @RequestParam(value = "sign",required = false) String sign, HttpServletRequest request) { + log.info(" dictCode : "+ dictCode); + Results> result = new Results<>(); + try { + List ls = sysDictService.getDictItems(dictCode); + if (ls == null) { + return Results.error(DICT_CODE_ERROE); + } + result.setSuccess(true); + result.setResult(ls); + log.debug(result.toString()); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Results.error("操作失败"); + } + return result; + } + + /** + * 【接口签名验证】 + * 【JSearchSelectTag下拉搜索组件专用接口】 + * 大数据量的字典表 走异步加载 即前端输入内容过滤数据 + * @param dictCode 字典code格式:table,text,code + * @return + */ + @GetMapping("/loadDict/{dictCode}") + @RequiresPermissions("dict:list") + public Results> loadDict(@PathVariable String dictCode, + @RequestParam(name="keyword") String keyword, + @RequestParam(value = "sign",required = false) String sign, + @RequestParam(value = "pageSize", required = false) Integer pageSize) { + log.info(" 加载字典表数据,加载关键字: "+ keyword); + Results> result = new Results<>(); + try { + List ls = sysDictService.loadDict(dictCode, keyword, pageSize); + if (ls == null) { + return Results.error(DICT_CODE_ERROE); + } + result.setSuccess(true); + result.setResult(ls); + log.info(result.toString()); + return result; + } catch (Exception e) { + log.error(e.getMessage(),e); + return Results.error("操作失败"); + } + } + + /** + * 【给表单设计器的表字典使用】下拉搜索模式,有值时动态拼接数据 + * @param dictCode + * @param keyword 当前控件的值,可以逗号分割 + * @param sign + * @param pageSize + * @return + */ + @GetMapping("/loadDictOrderByValue/{dictCode}") + @RequiresPermissions("dict:list") + public Results> loadDictOrderByValue( + @PathVariable String dictCode, + @RequestParam(name = "keyword") String keyword, + @RequestParam(value = "sign", required = false) String sign, + @RequestParam(value = "pageSize", required = false) Integer pageSize) { + // 首次查询查出来用户选中的值,并且不分页 + Results> firstRes = this.loadDict(dictCode, keyword, sign, null); + if (!firstRes.isSuccess()) { + return firstRes; + } + // 然后再查询出第一页的数据 + Results> result = this.loadDict(dictCode, "", sign, pageSize); + if (!result.isSuccess()) { + return result; + } + // 合并两次查询的数据 + List firstList = firstRes.getResult(); + List list = result.getResult(); + for (DictModel firstItem : firstList) { + // anyMatch 表示:判断的条件里,任意一个元素匹配成功,返回true + // allMatch 表示:判断条件里的元素,所有的都匹配成功,返回true + // noneMatch 跟 allMatch 相反,表示:判断条件里的元素,所有的都匹配失败,返回true + boolean none = list.stream().noneMatch(item -> item.getValue().equals(firstItem.getValue())); + // 当元素不存在时,再添加到集合里 + if (none) { + list.add(0, firstItem); + } + } + return result; + } + + /** + *【接口签名验证】 + * 根据字典code加载字典text 返回 + * @param dictCode 顺序:tableName,text,code + * @param keys 要查询的key + * @param sign + * @param delNotExist 是否移除不存在的项,默认为true,设为false如果某个key不存在数据库中,则直接返回key本身 + * @param request + * @return + */ + @GetMapping("/loadDictItem/{dictCode}") + @RequiresPermissions("dict:list") + public Results> loadDictItem(@PathVariable String dictCode, @RequestParam(name="key") String keys, @RequestParam(value = "sign",required = false) String sign, @RequestParam(value = "delNotExist",required = false,defaultValue = "true") boolean delNotExist, HttpServletRequest request) { + Results> result = new Results<>(); + try { + if(dictCode.indexOf(",")!=-1) { + String[] params = dictCode.split(","); + if(params.length!=3) { + return Results.error(DICT_CODE_ERROE); + } + List texts = sysDictService.queryTableDictByKeys(params[0], params[1], params[2], keys, delNotExist); + + result.setSuccess(true); + result.setResult(texts); + log.info(result.toString()); + }else { + return Results.error(DICT_CODE_ERROE); + } + } catch (Exception e) { + log.error(e.getMessage(),e); + return Results.error("操作失败"); + } + + return result; + } + + /** + * 【接口签名验证】 + * 根据表名——显示字段-存储字段 pid 加载树形数据 + */ + @ApiOperation(value = "字典控制器-根据表名—显示字段-存储字段 pid 加载树形数据", notes = "字典控制器-根据表名—显示字段-存储字段 pid 加载树形数据") + @GetMapping("/loadTreeData") + @RequiresPermissions("dict:list") + public Results> loadTreeData(@RequestParam(name="pid") String pid, @RequestParam(name="pidField") String pidField, + @RequestParam(name="tableName") String tbname, + @RequestParam(name="text") String text, + @RequestParam(name="code") String code, + @RequestParam(name="hasChildField", required = false) String hasChildField, + @RequestParam(value = "sign", required = false) String sign, HttpServletRequest request) { + Results> result = new Results<>(); + + // SQL注入漏洞 sign签名校验(表名,label字段,val字段,条件) + String dictCode = tbname +","+ text +","+ code; + SqlInjectionUtil.filterContent(dictCode); + List ls = sysDictService.queryTreeList(null, tbname, text, code, pidField, pid, hasChildField); + result.setSuccess(true); + result.setResult(ls); + return result; + } + + /** + * 查询后返回树型数据 + */ + @ApiOperation(value = "字典控制器-根据表名—显示字段-存储字段 加载树形数据", notes = "字典控制器-根据表名—显示字段-存储字段 加载树形数据") + @GetMapping("/queryAllTreeData") + @RequiresPermissions("dict:list") + public Results> queryAllTreeData(@RequestParam(name="pidField") String pidField, + @RequestParam(name="tableName") String tbname, + @RequestParam(name="text") String text, + @RequestParam(name="code") String code, + HttpServletRequest request) { + Results> result = new Results<>(); + + // SQL注入漏洞 sign签名校验(表名,label字段,val字段,条件) + String dictCode = tbname +","+ text +","+ code; + SqlInjectionUtil.filterContent(dictCode); + List ls = sysDictService.queryAllTreeData(tbname, text, code, pidField); + result.setSuccess(true); + result.setResult(ls); + return result; + } + + /** + * @功能:新增 + * @param sysDict + * @return + */ + @ApiOperation(value = "字典控制器-新增字典", notes = "字典控制器-新增字典") + @PostMapping("/add") + @RequiresPermissions("dict:add") + public Results add(@RequestBody SysDict sysDict) { + try { + sysDict.setCreateTime(new Date()); + sysDict.setDelFlag(CommonConstant.DEL_FLAG_0); + sysDictService.save(sysDict); + //添加成功后需要刷新缓存 + sysDictService.refreshCache(); + return Results.OK(OPTION_SUCCESS); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Results.error("操作失败"); + } + } + + /** + * @功能:编辑 + * @param sysDict + * @return + */ + @ApiOperation(value = "字典控制器-编辑字典", notes = "字典控制器-编辑字典") + @PostMapping("/edit") + @RequiresPermissions("dict:edit") + public Results edit(@RequestBody SysDict sysDict) { + SysDict sysdict = sysDictService.getById(sysDict.getId()); + if(sysdict==null) { + return Results.error("未找到对应实体"); + }else { + sysDict.setUpdateTime(new Date()); + boolean ok = sysDictService.updateById(sysDict); + if(ok) { + //编辑成功后需要刷新缓存 + sysDictService.refreshCache(); + return Results.OK(OPTION_SUCCESS); + } + } + return Results.OK(); + } + + /** + * @功能:删除 + * @param map + * @return + */ + @ApiOperation(value = "字典控制器-删除字典", notes = "字典控制器-删除字典") + @PostMapping(value = "/delete") + @RequiresPermissions("dict:delete") + @CacheEvict(value={CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true) + public Results delete(@RequestBody Map map) { + String id = map.get("id"); + if(StringUtils.isBlank(id)){ + return Results.error("参数不识别!"); + } + boolean ok = sysDictService.removeById(id); + if(ok) { + return Results.OK(DEL_SUCCESS); + }else{ + return Results.error("删除失败!"); + } + } + + /** + * @功能:批量删除 + * @param ids + * @return + */ + @ApiOperation(value = "字典控制器-批量字典", notes = "字典控制器-批量字典") + @PostMapping(value = "/deleteBatch") + @RequiresPermissions("dict:delete") + @CacheEvict(value= {CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true) + public Results deleteBatch(@RequestParam(name="ids",required=true) String ids) { + if(oConvertUtils.isEmpty(ids)) { + return Results.error("参数不识别!"); + }else { + sysDictService.removeByIds(Arrays.asList(ids.split(","))); + return Results.OK(DEL_SUCCESS); + } + } + + /** + * @功能:刷新缓存 + * @date 修改时间 2021.4.8 + * @return + */ + @RequestMapping(value = "/refleshCache") + @RequiresPermissions("dict:list") + public Results refleshCache() { + Results result = new Results<>(); + sysDictService.refreshCache(); + return result; + } + + /** + * 导出excel + * + * @param request + */ + @RequestMapping(value = "/exportXls") + @RequiresPermissions("dict:export") + public ModelAndView exportXls(SysDict sysDict, HttpServletRequest request) { + // Step.1 组装查询条件 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(sysDict, request.getParameterMap()); + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List pageList = new ArrayList<>(); + + List sysDictList = sysDictService.list(queryWrapper); + for (SysDict dictMain : sysDictList) { + SysDictPage vo = new SysDictPage(); + BeanUtils.copyProperties(dictMain, vo); + // 查询机票 + List sysDictItemList = sysDictItemService.selectItemsByMainId(dictMain.getId()); + vo.setSysDictItemList(sysDictItemList); + pageList.add(vo); + } + + // 导出文件名称 + mv.addObject(JeroController.FILE_NAME, "数据字典"); + // 注解对象Class + mv.addObject(JeroController.CLASS, SysDictPage.class); + // 自定义表格参数 + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + mv.addObject(JeroController.PARAMS, new ExportParams("数据字典列表", "导出人:"+user.getRealname(), "数据字典")); + // 导出数据列表 + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + + @PostMapping(value = "/importExcel") + @RequiresPermissions("dict:import") + public Results importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(2); + params.setNeedSave(true); + try { + //导入Excel格式校验,看匹配的字段文本概率 + Boolean t = ExcelImportCheckUtil.check(file.getInputStream(), SysDictPage.class, params); + if(Boolean.FALSE.equals(t)){ + throw new JeroBootException("导入Excel校验失败 !"); + } + List list = ExcelImportUtil.importExcel(file.getInputStream(), SysDictPage.class, params); + // 错误信息 + List errorMessage = new ArrayList<>(); + int successLines = 0; + int errorLines = 0; + for (int i=0;i< list.size();i++) { + SysDict po = new SysDict(); + BeanUtils.copyProperties(list.get(i), po); + po.setDelFlag(CommonConstant.DEL_FLAG_0); + SuccessAndErrorLines successAndErrorLines = getSuccessAndErrorLines(list, errorMessage, successLines, errorLines, i, po); + successLines = successAndErrorLines.getSuccessLines(); + errorLines = successAndErrorLines.getErrorLines(); + } + return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Results.error("文件导入失败:"+e.getMessage()); + } finally { + fileClose(file); + } + } + return Results.error("文件导入失败!"); + } + + private SuccessAndErrorLines getSuccessAndErrorLines(List list, List errorMessage, int successLines, int errorLines, int i, SysDict po) { + SuccessAndErrorLines successAndErrorLines = new SuccessAndErrorLines(); + successAndErrorLines.setSuccessLines(successLines); + successAndErrorLines.setErrorLines(errorLines); + try { + Integer integer = sysDictService.saveMain(po, list.get(i).getSysDictItemList()); + if(integer>0){ + successAndErrorLines.setSuccessLines(successLines + 1); + }else{ + successAndErrorLines.setErrorLines(errorLines + 1); + int lineNumber = i + 1; + errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。"); + } + } catch (Exception e) { + successAndErrorLines.setErrorLines(errorLines + 1); + int lineNumber = i + 1; + errorMessage.add("第 " + lineNumber + " 行:字典编码已经存在,忽略导入。"); + } + return successAndErrorLines; + } + + private void fileClose(MultipartFile file) { + try { + file.getInputStream().close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 查询被删除的列表 + * @return + */ + @GetMapping(value = "/deleteList") + @RequiresPermissions("dict:list") + public Results> deleteList() { + List list = this.sysDictService.queryDeleteList(); + return Results.OK(list); + } + + /** + * 物理删除 + * @param id + * @return + */ + @PostMapping(value = "/deletePhysic/{id}") + @RequiresPermissions("dict:delete") + public Results deletePhysic(@PathVariable String id) { + try { + sysDictService.deleteOneDictPhysically(id); + return Results.OK(DEL_SUCCESS); + } catch (Exception e) { + e.printStackTrace(); + return Results.error("删除失败!"); + } + } + + /** + * 逻辑删除的字段,进行取回 + * @param id + * @return + */ + @PostMapping(value = "/back/{id}") + @RequiresPermissions("dict:edit") + public Results back(@PathVariable String id) { + try { + sysDictService.updateDictDelFlag(0,id); + return Results.OK(OPTION_SUCCESS); + } catch (Exception e) { + e.printStackTrace(); + return Results.error("操作失败!"); + } + } + +} diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysPermissionController.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysPermissionController.java index 8d21d1ba..871c8316 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysPermissionController.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysPermissionController.java @@ -24,6 +24,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.apache.poi.ss.formula.functions.T; import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -68,6 +69,7 @@ public class SysPermissionController { * @return */ @GetMapping("/page") + @RequiresPermissions("permission:list") public Results> list() { long start = System.currentTimeMillis(); Results> result = new Results<>(); @@ -94,6 +96,7 @@ public class SysPermissionController { * @return */ @GetMapping("/getSystemMenuList") + @RequiresPermissions("permission:list") public Results> getSystemMenuList() { long start = System.currentTimeMillis(); Results> result = new Results<>(); @@ -123,6 +126,7 @@ public class SysPermissionController { * @return */ @GetMapping("/getSystemSubmenu") + @RequiresPermissions("permission:list") public Results> getSystemSubmenu(@RequestParam("parentId") String parentId){ Results> result = new Results<>(); try{ @@ -153,6 +157,7 @@ public class SysPermissionController { * @return 返回 key-value 的 Map */ @GetMapping("/getSystemSubmenuBatch") + @RequiresPermissions("permission:list") public Results>> getSystemSubmenuBatch(@RequestParam("parentIds") String parentIds) { try { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); @@ -186,6 +191,7 @@ public class SysPermissionController { * @return */ @GetMapping("/getUserPermissionByToken") + @RequiresPermissions("permission:list") public Results getUserPermissionByToken() { Results result = new Results<>(); try { @@ -230,6 +236,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/add") + @RequiresPermissions("permission:add") public Results add(@RequestBody SysPermission permission) { try { permission = PermissionDataUtil.intelligentProcessData(permission); @@ -248,6 +255,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/edit") + @RequiresPermissions("permission:edit") public Results edit(@RequestBody SysPermission permission) { try { permission = PermissionDataUtil.intelligentProcessData(permission); @@ -266,6 +274,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/delete") + @RequiresPermissions("permission:delete") public Results delete(@RequestBody Map map) { String id = map.get("id"); if(StringUtils.isBlank(id)){ @@ -287,6 +296,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/deleteBatch") + @RequiresPermissions("permission:delete") public Results deleteBatch(@RequestBody Map map) { String ids = map.get("ids"); if(StringUtils.isBlank(ids)){ @@ -312,6 +322,7 @@ public class SysPermissionController { * @return */ @GetMapping("/queryTreeList") + @RequiresPermissions("permission:list") public Results> queryTreeList() { Results> result = new Results<>(); // 全部权限ids @@ -344,6 +355,7 @@ public class SysPermissionController { * @return */ @GetMapping("/queryListAsync") + @RequiresPermissions("permission:list") public Results> queryAsync(@RequestParam(name = "pid", required = false) String parentId) { Results> result = new Results<>(); try { @@ -367,6 +379,7 @@ public class SysPermissionController { * @return */ @GetMapping("/queryRolePermission") + @RequiresPermissions("permission:list") public Results> queryRolePermission(@RequestParam(name = "roleId", required = true) String roleId) { Results> result = new Results<>(); try { @@ -385,6 +398,7 @@ public class SysPermissionController { * @return */ @PostMapping("/saveRolePermission") + @RequiresPermissions("permission:add") //@RequiresRoles({ "admin" }) public Results saveRolePermission(@RequestBody JSONObject json) { long start = System.currentTimeMillis(); @@ -655,6 +669,7 @@ public class SysPermissionController { * @return */ @GetMapping("/getPermRuleListByPermId") + @RequiresPermissions("permission:list") public Results> getPermRuleListByPermId(SysPermissionDataRule sysPermissionDataRule) { List permRuleList = sysPermissionDataRuleService.getPermRuleListByPermId(sysPermissionDataRule.getPermissionId()); Results> result = new Results<>(); @@ -671,6 +686,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/addPermissionRule") + @RequiresPermissions("permission:add") public Results addPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) { try { sysPermissionDataRule.setCreateTime(new Date()); @@ -684,6 +700,7 @@ public class SysPermissionController { //@RequiresRoles({ "admin" }) @PostMapping("/editPermissionRule") + @RequiresPermissions("permission:edit") public Results editPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) { try { sysPermissionDataRuleService.saveOrUpdate(sysPermissionDataRule); @@ -702,6 +719,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/deletePermissionRule") + @RequiresPermissions("permission:delete") public Results deletePermissionRule(@RequestBody Map map) { try { String id = map.get("id"); @@ -723,6 +741,7 @@ public class SysPermissionController { * @return */ @GetMapping("/queryPermissionRule") + @RequiresPermissions("permission:list") public Results> queryPermissionRule(SysPermissionDataRule sysPermissionDataRule) { try { List permRuleList = sysPermissionDataRuleService.queryPermissionRule(sysPermissionDataRule); @@ -739,6 +758,7 @@ public class SysPermissionController { * @return */ @GetMapping("/queryDepartPermission") + @RequiresPermissions("permission:list") public Results> queryDepartPermission(@RequestParam(name = "departId", required = true) String departId) { Results> result = new Results<>(); try { @@ -757,6 +777,7 @@ public class SysPermissionController { * @return */ @PostMapping("/saveDepartPermission") + @RequiresPermissions("permission:add") //@RequiresRoles({ "admin" }) public Results saveDepartPermission(@RequestBody JSONObject json) { long start = System.currentTimeMillis(); diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java index 83d587a7..77efd451 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java @@ -81,7 +81,7 @@ public class SysRoleController { * @param req * @return */ - //@RequiresPermissions("sys:role:list") + @RequiresPermissions("sys:role:list") @GetMapping("/page") public Results> queryPageList(SysRole role, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @@ -181,7 +181,7 @@ public class SysRoleController { * @param id * @return */ - //@RequiresPermissions("sys:role:list") + @RequiresPermissions("sys:role:list") @GetMapping("/queryById") public Results queryById(@RequestParam(name="id",required=true) String id) { SysRole sysRole = sysRoleService.getById(id); @@ -191,7 +191,7 @@ public class SysRoleController { return Results.OK(sysRole); } } - //@RequiresPermissions("sys:role:list") + @RequiresPermissions("sys:role:list") @GetMapping("/queryall") public Results> queryall() { List list = sysRoleService.list(); @@ -205,7 +205,7 @@ public class SysRoleController { /** * 校验角色编码唯一 */ - //@RequiresPermissions("sys:role:list") + @RequiresPermissions("sys:role:list") @GetMapping("/checkRoleCode") public Results checkUsername(String id, String roleCode) { Results result = new Results<>(); @@ -292,7 +292,7 @@ public class SysRoleController { /** * 查询数据规则数据 */ - //@RequiresPermissions("sys:role:list") + @RequiresPermissions("sys:role:list") @GetMapping(value = "/datarule/{permissionId}/{roleId}") public Results> loadDatarule(@PathVariable("permissionId") String permissionId, @PathVariable("roleId") String roleId) { List list = sysPermissionDataRuleService.getPermRuleListByPermId(permissionId); @@ -320,7 +320,7 @@ public class SysRoleController { /** * 保存数据规则至角色菜单关联表 */ - //@RequiresPermissions("sys:role:list") + @RequiresPermissions("sys:role:list") @PostMapping(value = "/datarule") public Results saveDatarule(@RequestBody JSONObject jsonObject) { try { @@ -351,7 +351,7 @@ public class SysRoleController { * @param request * @return */ - //@RequiresPermissions("sys:role:list") + @RequiresPermissions("sys:role:list") @GetMapping("/queryTreeList") public Results> queryTreeList(HttpServletRequest request) { Results> result = new Results<>(); @@ -377,7 +377,7 @@ public class SysRoleController { } return result; } - //@RequiresPermissions("sys:role:list") + @RequiresPermissions("sys:role:list") private void getTreeModelList(List treeList,List metaList,TreeModel temp) { for (SysPermission permission : metaList) { String tempPid = permission.getParentId(); diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserController.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserController.java index fc9b3fe2..15614156 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserController.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysUserController.java @@ -254,6 +254,7 @@ public class SysUserController { } @PostMapping("/delete") + @RequiresPermissions("sys:user:sel") public Results delete(@RequestBody Map map) { String id = map.get("id"); if(StringUtils.isBlank(id)){ @@ -265,6 +266,7 @@ public class SysUserController { } @PostMapping("/deleteBatch") + @RequiresPermissions("sys:user:sel") public Results deleteBatch(@RequestBody Map map) { String ids = map.get("ids"); if(StringUtils.isBlank(ids)){ @@ -276,7 +278,7 @@ public class SysUserController { } - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("user:edit") @PostMapping("/frozenBatch") public Results frozenBatch(@RequestBody JSONObject jsonObject) { try { @@ -296,11 +298,11 @@ public class SysUserController { return Results.OK(OPTION_SUCCESS); } - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") // @RequestMapping(value = "/queryById", method = RequestMethod.GET) @GetMapping("/queryById") public Results queryById(@RequestParam(name = "id", required = true) String id) { - SysUser sysUser = sysUserService.getById(id); + SysUser sysUser = sysUserService.queryById(id); if (sysUser == null) { return Results.error(INEXISTENCE); } else { @@ -308,7 +310,7 @@ public class SysUserController { } } - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") // @RequestMapping(value = "/queryUserRole", method = RequestMethod.GET) @GetMapping("/queryUserRole") public Results> queryUserRole(@RequestParam(name = "userid", required = true) String userid) { @@ -332,7 +334,7 @@ public class SysUserController { * @param sysUser * @return */ - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") // @RequestMapping(value = "/checkOnlyUser", method = RequestMethod.GET) @GetMapping("/checkOnlyUser") public Results checkOnlyUser(SysUser sysUser) { @@ -363,6 +365,7 @@ public class SysUserController { */ // @RequestMapping(value = "/changePassword", method = RequestMethod.PUT) @PostMapping("/changePassword") + @RequiresPermissions("user:edit") public Results changePassword(@RequestBody SysUser sysUser) { SysUser u = this.sysUserService.getOne(new LambdaQueryWrapper().eq(SysUser::getUsername, sysUser.getUsername())); if (u == null) { @@ -378,7 +381,7 @@ public class SysUserController { * @param userId * @return */ - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") // @RequestMapping(value = "/userDepartList", method = RequestMethod.GET) @GetMapping("/userDepartList") public Results> getUserDepartsList(@RequestParam(name = "userId", required = true) String userId) { @@ -408,7 +411,7 @@ public class SysUserController { * * @return */ - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") // @RequestMapping(value = "/generateUserId", method = RequestMethod.GET) @GetMapping("/generateUserId") public Results generateUserId() { @@ -426,7 +429,7 @@ public class SysUserController { * @param id * @return */ - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") // @RequestMapping(value = "/queryUserByDepId", method = RequestMethod.GET) @GetMapping("/queryUserByDepId") public Results> queryUserByDepId(@RequestParam(name = "id", required = true) String id, @RequestParam(name="realname",required=false) String realname , @RequestParam(name="username",required=false) String username) { @@ -451,6 +454,10 @@ public class SysUserController { item.setOrgCodeTxt(useDepNames.get(item.getId())) ); } + userList.forEach(user -> { + // 对手机号、邮箱进行解密处理 + sysUserService.proceedDecrypt(user); + }); try { result.setSuccess(true); @@ -471,6 +478,7 @@ public class SysUserController { */ // @RequestMapping(value = "/queryUserComponentData", method = RequestMethod.GET) @GetMapping("/queryUserComponentData") + @RequiresPermissions("sys:user:list") public Results> queryUserComponentData( @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, @@ -478,6 +486,10 @@ public class SysUserController { @RequestParam(name="realname",required=false) String realname, @RequestParam(name=USER_NAME,required=false) String username) { IPage pageList = sysUserDepartService.queryDepartUserPageList(departId, username, realname, pageSize, pageNo); + pageList.getRecords().forEach(user -> { + // 对手机号、邮箱进行解密处理 + sysUserService.proceedDecrypt(user); + }); return Results.OK(pageList); } @@ -501,6 +513,10 @@ public class SysUserController { } //update-end--Author:kangxiaolin Date:20180825 for:[03]用户导出,如果选择数据则只导出相关数据---------------------- List pageList = sysUserService.list(queryWrapper); + pageList.forEach(user -> { + // 对手机号、邮箱进行解密处理 + sysUserService.proceedDecrypt(user); + }); //导出文件名称 mv.addObject(JeroController.FILE_NAME, "用户列表"); @@ -577,6 +593,8 @@ public class SysUserController { successAndErrorLines.setSuccessLines(successLines); successAndErrorLines.setErrorLines(errorLines); try { + // 对手机号、邮箱进行加密处理 + sysUserService.proceedEncrypt(sysUserExcel); sysUserService.save(sysUserExcel); successAndErrorLines.setSuccessLines(successLines + 1); } catch (Exception e) { @@ -624,11 +642,15 @@ public class SysUserController { */ //@RequiresPermissions("sys:user:list") @GetMapping("/queryByIds") + @RequiresPermissions("sys:user:list") public Results> queryByIds(@RequestParam String userIds) { Results> result = new Results<>(); String[] userId = userIds.split(","); Collection idList = Arrays.asList(userId); Collection userRole = sysUserService.listByIds(idList); + userRole.forEach(user -> { + sysUserService.proceedDecrypt(user); + }); result.setSuccess(true); result.setResult(userRole); return result; @@ -638,6 +660,7 @@ public class SysUserController { * 首页用户重置密码 */ @PostMapping("/updatePassword") + @RequiresPermissions("user:edit") public Results updatePassword(@RequestBody JSONObject json) { String username = json.getString(USER_NAME); String oldpassword = json.getString("oldpassword"); @@ -666,7 +689,7 @@ public class SysUserController { } return sysUserService.resetPassword(username,oldpassword,password,confirmpassword); } - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") // @RequestMapping(value = "/userRoleList", method = RequestMethod.GET) @GetMapping("/userRoleList") public Results> userRoleList(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @@ -676,6 +699,9 @@ public class SysUserController { String roleId = req.getParameter("roleId"); String username = req.getParameter(USER_NAME); IPage pageList = sysUserService.getUserByRoleId(page,roleId,username); + pageList.getRecords().forEach(user -> { + sysUserService.proceedDecrypt(user); + }); result.setSuccess(true); result.setResult(pageList); return result; @@ -721,6 +747,7 @@ public class SysUserController { */ // @RequestMapping(value = "/deleteUserRole", method = RequestMethod.DELETE) @PostMapping("/deleteUserRole") + @RequiresPermissions("sys:user:sel") public Results deleteUserRole(@RequestParam(name="roleId") String roleId, @RequestParam(name="userId",required=true) String userId) { try { @@ -742,6 +769,7 @@ public class SysUserController { */ // @RequestMapping(value = "/deleteUserRoleBatch", method = RequestMethod.DELETE) @PostMapping("/deleteUserRoleBatch") + @RequiresPermissions("sys:user:sel") public Results deleteUserRoleBatch( @RequestParam(name="roleId") String roleId, @RequestParam(name="userIds",required=true) String userIds) { @@ -761,7 +789,7 @@ public class SysUserController { */ // @RequestMapping(value = "/departUserList", method = RequestMethod.GET) @GetMapping("/departUserList") - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") public Results> departUserList(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { Results> result = new Results<>(); @@ -793,6 +821,9 @@ public class SysUserController { item.setOrgCode(useDepNames.get(item.getId())) ); } + pageList.getRecords().forEach(user -> { + sysUserService.proceedDecrypt(user); + }); result.setSuccess(true); result.setResult(pageList); }else{ @@ -808,7 +839,7 @@ public class SysUserController { * 若某个用户包含多个部门,则会显示多条记录,可自行处理成单条记录 */ @GetMapping("/queryByOrgCode") - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") public Results> queryByDepartId( @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, @@ -854,6 +885,7 @@ public class SysUserController { */ // @RequestMapping(value = "/deleteUserInDepart", method = RequestMethod.DELETE) @PostMapping("/deleteUserInDepart") + @RequiresPermissions("sys:user:sel") public Results deleteUserInDepart(@RequestParam(name="depId") String depId, @RequestParam(name="userId",required=true) String userId) { try { @@ -874,6 +906,7 @@ public class SysUserController { // @RequestMapping(value = "/deleteUserInDepartBatch", method = RequestMethod.DELETE) @PostMapping("/deleteUserInDepartBatch") @Transactional + @RequiresPermissions("sys:user:sel") public Results deleteUserInDepartBatch( @RequestParam(name="depId") String depId, @RequestParam(name="userIds",required=true) String userIds) { @@ -897,7 +930,7 @@ public class SysUserController { * 查询当前用户的所有部门/当前部门编码 * @return */ - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") // @RequestMapping(value = "/getCurrentUserDeparts", method = RequestMethod.GET) @GetMapping("/getCurrentUserDeparts") public Results> getCurrentUserDeparts() { @@ -1110,7 +1143,7 @@ public class SysUserController { * @param pageSize * @return */ - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") @GetMapping("/appUserList") public Results> appUserList(@RequestParam(name = "keyword", required = false) String keyword, @RequestParam(name = USER_NAME, required = false) String username, @@ -1147,7 +1180,7 @@ public class SysUserController { * * @return logicDeletedUserList */ - //@RequiresPermissions("sys:user:list") + @RequiresPermissions("sys:user:list") @GetMapping("/recycleBin") public Results> getRecycleBin() { List logicDeletedUserList = sysUserService.queryLogicDeleted(); @@ -1171,6 +1204,7 @@ public class SysUserController { //@RequiresPermissions("sys:user:list") // @RequestMapping(value = "/putRecycleBin", method = RequestMethod.PUT) @PostMapping("/putRecycleBin") + @RequiresPermissions("user:edit") public Results putRecycleBin(@RequestBody JSONObject jsonObject, HttpServletRequest request) { String userIds = jsonObject.getString("userIds"); if (StringUtils.isNotBlank(userIds)) { @@ -1190,6 +1224,7 @@ public class SysUserController { */ // @RequestMapping(value = "/deleteRecycleBin", method = RequestMethod.DELETE) @PostMapping("/deleteRecycleBin") + @RequiresPermissions("sys:user:sel") public Results deleteRecycleBin(@RequestParam("userIds") String userIds) { if (StringUtils.isNotBlank(userIds)) { sysUserService.removeLogicDeleted(Arrays.asList(userIds.split(","))); diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java index bf1dc381..fb527f3b 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java @@ -278,4 +278,18 @@ public interface ISysUserService extends IService { /** userId转为username */ List userIdToUsername(Collection userIdList); + /** + * @Remarks: 根据id查询 + **/ + SysUser queryById(String id); + + /** + * @Remarks: 对手机号、邮箱进行解密处理 + **/ + void proceedDecrypt(SysUser user); + + /** + * @Remarks: 对手机号、邮箱进行加密处理 + **/ + void proceedEncrypt(SysUser user); } diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/LoginServiceImpl.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/LoginServiceImpl.java index bd32a184..c334d61b 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/LoginServiceImpl.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/LoginServiceImpl.java @@ -132,7 +132,8 @@ public class LoginServiceImpl implements ILoginService { // 重试登录次数加一 retryCount++; setRedis(username, retryCount); - String msg = retryCount == RETRY_LOGIN_MAX_COUNT ? "密码错误次数过多,请稍后重试":"用户名或密码错误,剩余可登录次数:"+(RETRY_LOGIN_MAX_COUNT - retryCount); + //String msg = retryCount == RETRY_LOGIN_MAX_COUNT ? "密码错误次数过多,请稍后重试":"用户名或密码错误,剩余可登录次数:"+(RETRY_LOGIN_MAX_COUNT - retryCount); + String msg = retryCount == RETRY_LOGIN_MAX_COUNT ? "密码错误次数过多,请稍后重试":"用户名或密码错误"; return Results.error(msg); } //登录成功,清除错误登录次数 diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java index b3022b74..7186de85 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java @@ -1,5 +1,6 @@ package com.jero.modules.system.service.impl; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -9,6 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.jero.common.api.vo.Results; import com.jero.common.constant.CacheConstant; import com.jero.common.constant.CommonConstant; +import com.jero.common.exception.JeroBootException; import com.jero.common.system.api.ISysBaseAPI; import com.jero.common.system.vo.LoginUser; import com.jero.common.system.vo.SysUserCacheInfo; @@ -23,6 +25,7 @@ import com.jero.modules.system.service.ISysUserService; import com.jero.modules.system.vo.SysUserDepNameVo; import com.jero.modules.system.vo.SysUserRoleNameVo; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; @@ -64,7 +67,12 @@ public class SysUserServiceImpl extends ServiceImpl impl @Override public IPage queryPage(Page page, List subDepIds, String roleId, QueryWrapper queryWrapper){ - return this.userMapper.queryPage(page, subDepIds, roleId, queryWrapper); + IPage sysUserIPage = this.userMapper.queryPage(page, subDepIds, roleId, queryWrapper); + sysUserIPage.getRecords().forEach(user -> { + // 对手机号、邮箱进行解密处理 + proceedDecrypt(user); + }); + return sysUserIPage; } @Override @@ -376,7 +384,8 @@ public class SysUserServiceImpl extends ServiceImpl impl //情况1:根据用户信息查询,该用户不存在 if (sysUser == null) { baseCommonService.addLog("用户登录失败,用户不存在!", CommonConstant.LOG_TYPE_1, null); - return Results.error("该用户不存在,请注册"); + //return Results.error("该用户不存在,请注册"); + return Results.error("用户名或密码错误"); } //情况2:根据用户信息查询,该用户已注销 //update-begin---author:王帅 Date:20200601 for:if条件永远为falsebug------------ @@ -458,6 +467,8 @@ public class SysUserServiceImpl extends ServiceImpl impl @Transactional(rollbackFor = Exception.class) public void saveUser(SysUser user, String selectedRoles, String selectedDeparts) { //step.1 保存用户 + // 对手机号、邮箱进行加密处理 + proceedEncrypt(user); this.save(user); //step.2 保存角色 if(oConvertUtils.isNotEmpty(selectedRoles)) { @@ -477,11 +488,67 @@ public class SysUserServiceImpl extends ServiceImpl impl } } + /** + * @Remarks: 对手机号、邮箱进行加密处理 + **/ + @Override + public void proceedEncrypt(SysUser user) { + if (user == null) { + return; + } + String email = user.getEmail(); + String phone = user.getPhone(); + if (StrUtil.isNotEmpty(email)){ + // 对邮箱地址进行加密 + email = PasswordUtil.encrypt(email); + user.setEmail(email); + } + + if (StrUtil.isNotEmpty(phone)){ + // 对手机号码进行加密 + phone = PasswordUtil.encrypt(phone); + user.setPhone(phone); + } + } + + /** + * @Remarks: 对手机号、邮箱进行解密处理 + **/ + @Override + public void proceedDecrypt(SysUser user) { + if (user == null) { + return; + } + String email = user.getEmail(); + String phone = user.getPhone(); + if (StrUtil.isNotEmpty(email)){ + // 对邮箱地址进行解密 + try { + email = PasswordUtil.decrypt(email); + } catch (Exception e) { + email = user.getEmail(); + } + user.setEmail(email); + } + + if (StrUtil.isNotEmpty(phone)){ + // 对手机号码进行解密 + try { + phone = PasswordUtil.decrypt(phone); + } catch (Exception e) { + phone = user.getPhone(); + } + user.setPhone(phone); + } + } + @Override @Transactional(rollbackFor = Exception.class) @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true) public void editUser(SysUser user, String roles, String departs) { //step.1 修改用户基础信息 + // 对手机号、邮箱进行加密处理 + proceedEncrypt(user); this.updateById(user); //step.2 修改角色 //处理用户角色 先删后加 @@ -523,5 +590,13 @@ public class SysUserServiceImpl extends ServiceImpl impl return userList.stream().map(SysUser::getUsername).collect(Collectors.toList()); } + @Override + public SysUser queryById(String id) { + SysUser user = getById(id); + // 对手机号、邮箱进行解密处理 + proceedDecrypt(user); + return user; + } + } diff --git a/jero-web/src/components/tools/UserPassword.vue b/jero-web/src/components/tools/UserPassword.vue index 6fab94aa..2f1bb0a9 100644 --- a/jero-web/src/components/tools/UserPassword.vue +++ b/jero-web/src/components/tools/UserPassword.vue @@ -58,14 +58,14 @@ export default { password: { rules: [ { required: true, message: '请输入新密码!' }, - { pattern: /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/, message: '密码由8-20位数字、大小写字母和特殊符号组成!' }, + { pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/, message: '密码由8-20位数字、大小写字母和特殊符号组成!' }, { validator: this.validateToNextPassword } ] }, confirmpassword: { rules: [ { required: true, message: '请确认新密码!' }, - { pattern: /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/, message: '密码由8-20位数字、大小写字母和特殊符号组成!' }, + { pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/, message: '密码由8-20位数字、大小写字母和特殊符号组成!' }, { validator: this.validateToNextPassword } ] } diff --git a/jero-web/src/views/system/DepartList.vue b/jero-web/src/views/system/DepartList.vue index f852a66b..937f8af1 100644 --- a/jero-web/src/views/system/DepartList.vue +++ b/jero-web/src/views/system/DepartList.vue @@ -320,7 +320,7 @@ export default { batchDel: function () { console.log(this.checkedKeys) if (this.checkedKeys.length <= 0) { - this.$message.warning('请选择一条记录!') + this.$message.warning('请至少选择一条记录!') } else { let ids = '' for (let a = 0; a < this.checkedKeys.length; a++) { diff --git a/jero-web/src/views/system/UserList.vue b/jero-web/src/views/system/UserList.vue index 02f79f12..09e99225 100644 --- a/jero-web/src/views/system/UserList.vue +++ b/jero-web/src/views/system/UserList.vue @@ -250,14 +250,14 @@ export default { scopedSlots: { customRender: 'avatarslot' } }, { - title: '用户账号', + title: '账号', align: 'center', dataIndex: 'username', width: 120, sorter: true }, { - title: '用户姓名', + title: '真实名字', align: 'center', width: 100, dataIndex: 'realname' @@ -276,7 +276,7 @@ export default { dataIndex: 'phone' }, { - title: '部门', + title: '组织机构', align: 'center', width: 180, dataIndex: 'orgCodeTxt' @@ -300,7 +300,7 @@ export default { // dataIndex: 'departIds_dictText' // }, { - title: '状态', + title: '用户状态', align: 'center', width: 80, dataIndex: 'status_dictText' diff --git a/jero-web/src/views/system/modules/UserModal.vue b/jero-web/src/views/system/modules/UserModal.vue index 85688dfe..dcbfe05f 100644 --- a/jero-web/src/views/system/modules/UserModal.vue +++ b/jero-web/src/views/system/modules/UserModal.vue @@ -164,7 +164,7 @@ export default { validatorRules: { username: [{ required: true, message: '请输入用户账号!' }, { validator: this.validateUsername }], - password: [{ required: true, pattern: /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/, message: '密码由8-20位数字、大小写字母和特殊符号组成!' }, + password: [{ required: true, pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/, message: '密码由8-20位数字、大小写字母和特殊符号组成!' }, { validator: this.validateToNextPassword, trigger: 'change' }], confirmpassword: [{ required: true, message: '请重新输入登录密码!' }, { validator: this.compareToFirstPassword }],