From 91a5d4ae48b684f16e6368b1e7d13cb25e7acea9 Mon Sep 17 00:00:00 2001 From: liao Date: Sat, 6 May 2023 15:22:24 +0800 Subject: [PATCH] =?UTF-8?q?fix=2068486=20=E3=80=90=E5=9E=82=E7=9B=B4?= =?UTF-8?q?=E8=B6=8A=E6=9D=83=E3=80=91=E7=B3=BB=E7=BB=9F=E7=AE=A1=E7=90=86?= =?UTF-8?q?-=E6=95=B0=E6=8D=AE=E5=AD=97=E5=85=B8=20=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=9C=AA=E5=A4=84=E7=90=86=E8=B6=8A=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jero-boot/db/20230506处理垂直越权.sql | 31 + .../system/controller/SysDictController.java | 1171 +++++++++-------- .../controller/SysPermissionController.java | 40 +- 3 files changed, 647 insertions(+), 595 deletions(-) create mode 100644 jero-boot/db/20230506处理垂直越权.sql 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-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 065b9d69..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 @@ -69,7 +69,7 @@ public class SysPermissionController { * @return */ @GetMapping("/page") - @RequiresPermissions("PermissionList:list") + @RequiresPermissions("permission:list") public Results> list() { long start = System.currentTimeMillis(); Results> result = new Results<>(); @@ -96,7 +96,7 @@ public class SysPermissionController { * @return */ @GetMapping("/getSystemMenuList") - @RequiresPermissions("PermissionList:list") + @RequiresPermissions("permission:list") public Results> getSystemMenuList() { long start = System.currentTimeMillis(); Results> result = new Results<>(); @@ -126,7 +126,7 @@ public class SysPermissionController { * @return */ @GetMapping("/getSystemSubmenu") - @RequiresPermissions("PermissionList:list") + @RequiresPermissions("permission:list") public Results> getSystemSubmenu(@RequestParam("parentId") String parentId){ Results> result = new Results<>(); try{ @@ -157,7 +157,7 @@ public class SysPermissionController { * @return 返回 key-value 的 Map */ @GetMapping("/getSystemSubmenuBatch") - @RequiresPermissions("PermissionList:list") + @RequiresPermissions("permission:list") public Results>> getSystemSubmenuBatch(@RequestParam("parentIds") String parentIds) { try { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); @@ -191,7 +191,7 @@ public class SysPermissionController { * @return */ @GetMapping("/getUserPermissionByToken") - @RequiresPermissions("PermissionList:list") + @RequiresPermissions("permission:list") public Results getUserPermissionByToken() { Results result = new Results<>(); try { @@ -236,7 +236,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/add") - @RequiresPermissions("PermissionList:add") + @RequiresPermissions("permission:add") public Results add(@RequestBody SysPermission permission) { try { permission = PermissionDataUtil.intelligentProcessData(permission); @@ -255,7 +255,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/edit") - @RequiresPermissions("PermissionList:edit") + @RequiresPermissions("permission:edit") public Results edit(@RequestBody SysPermission permission) { try { permission = PermissionDataUtil.intelligentProcessData(permission); @@ -274,7 +274,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/delete") - @RequiresPermissions("PermissionList:delete") + @RequiresPermissions("permission:delete") public Results delete(@RequestBody Map map) { String id = map.get("id"); if(StringUtils.isBlank(id)){ @@ -296,7 +296,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/deleteBatch") - @RequiresPermissions("PermissionList:delete") + @RequiresPermissions("permission:delete") public Results deleteBatch(@RequestBody Map map) { String ids = map.get("ids"); if(StringUtils.isBlank(ids)){ @@ -322,7 +322,7 @@ public class SysPermissionController { * @return */ @GetMapping("/queryTreeList") - @RequiresPermissions("PermissionList:list") + @RequiresPermissions("permission:list") public Results> queryTreeList() { Results> result = new Results<>(); // 全部权限ids @@ -355,7 +355,7 @@ public class SysPermissionController { * @return */ @GetMapping("/queryListAsync") - @RequiresPermissions("PermissionList:list") + @RequiresPermissions("permission:list") public Results> queryAsync(@RequestParam(name = "pid", required = false) String parentId) { Results> result = new Results<>(); try { @@ -379,7 +379,7 @@ public class SysPermissionController { * @return */ @GetMapping("/queryRolePermission") - @RequiresPermissions("PermissionList:list") + @RequiresPermissions("permission:list") public Results> queryRolePermission(@RequestParam(name = "roleId", required = true) String roleId) { Results> result = new Results<>(); try { @@ -398,7 +398,7 @@ public class SysPermissionController { * @return */ @PostMapping("/saveRolePermission") - @RequiresPermissions("PermissionList:add") + @RequiresPermissions("permission:add") //@RequiresRoles({ "admin" }) public Results saveRolePermission(@RequestBody JSONObject json) { long start = System.currentTimeMillis(); @@ -669,7 +669,7 @@ public class SysPermissionController { * @return */ @GetMapping("/getPermRuleListByPermId") - @RequiresPermissions("PermissionList:list") + @RequiresPermissions("permission:list") public Results> getPermRuleListByPermId(SysPermissionDataRule sysPermissionDataRule) { List permRuleList = sysPermissionDataRuleService.getPermRuleListByPermId(sysPermissionDataRule.getPermissionId()); Results> result = new Results<>(); @@ -686,7 +686,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/addPermissionRule") - @RequiresPermissions("PermissionList:add") + @RequiresPermissions("permission:add") public Results addPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) { try { sysPermissionDataRule.setCreateTime(new Date()); @@ -700,7 +700,7 @@ public class SysPermissionController { //@RequiresRoles({ "admin" }) @PostMapping("/editPermissionRule") - @RequiresPermissions("PermissionList:edit") + @RequiresPermissions("permission:edit") public Results editPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) { try { sysPermissionDataRuleService.saveOrUpdate(sysPermissionDataRule); @@ -719,7 +719,7 @@ public class SysPermissionController { */ //@RequiresRoles({ "admin" }) @PostMapping("/deletePermissionRule") - @RequiresPermissions("PermissionList:delete") + @RequiresPermissions("permission:delete") public Results deletePermissionRule(@RequestBody Map map) { try { String id = map.get("id"); @@ -741,7 +741,7 @@ public class SysPermissionController { * @return */ @GetMapping("/queryPermissionRule") - @RequiresPermissions("PermissionList:list") + @RequiresPermissions("permission:list") public Results> queryPermissionRule(SysPermissionDataRule sysPermissionDataRule) { try { List permRuleList = sysPermissionDataRuleService.queryPermissionRule(sysPermissionDataRule); @@ -758,7 +758,7 @@ public class SysPermissionController { * @return */ @GetMapping("/queryDepartPermission") - @RequiresPermissions("PermissionList:list") + @RequiresPermissions("permission:list") public Results> queryDepartPermission(@RequestParam(name = "departId", required = true) String departId) { Results> result = new Results<>(); try { @@ -777,7 +777,7 @@ public class SysPermissionController { * @return */ @PostMapping("/saveDepartPermission") - @RequiresPermissions("PermissionList:add") + @RequiresPermissions("permission:add") //@RequiresRoles({ "admin" }) public Results saveDepartPermission(@RequestBody JSONObject json) { long start = System.currentTimeMillis();