Commit 743ba7d90238779df3b0b2769e088b9ba558d30c

Authored by zhangdaiscott
1 parent d5e19d16

重构system模块代码规范,JeecgBoot 3.2.0 版本发布

Showing 80 changed files with 2257 additions and 409 deletions
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/config/init/SystemInitListener.java
@@ -28,7 +28,8 @@ public class SystemInitListener implements ApplicationListener<ApplicationReadyE @@ -28,7 +28,8 @@ public class SystemInitListener implements ApplicationListener<ApplicationReadyE
28 public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { 28 public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
29 29
30 log.info(" 服务已启动,初始化路由配置 ###################"); 30 log.info(" 服务已启动,初始化路由配置 ###################");
31 - if (applicationReadyEvent.getApplicationContext().getDisplayName().indexOf("AnnotationConfigServletWebServerApplicationContext") > -1) { 31 + String context = "AnnotationConfigServletWebServerApplicationContext";
  32 + if (applicationReadyEvent.getApplicationContext().getDisplayName().indexOf(context) > -1) {
32 sysGatewayRouteService.addRoute2Redis(CacheConstant.GATEWAY_ROUTES); 33 sysGatewayRouteService.addRoute2Redis(CacheConstant.GATEWAY_ROUTES);
33 } 34 }
34 35
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java 0 → 100644
  1 +package org.jeecg.modules.api.controller;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import lombok.extern.slf4j.Slf4j;
  5 +import org.jeecg.common.api.dto.OnlineAuthDTO;
  6 +import org.jeecg.common.api.dto.message.*;
  7 +import org.jeecg.common.system.vo.*;
  8 +import org.jeecg.modules.system.service.ISysUserService;
  9 +import org.jeecg.modules.system.service.impl.SysBaseApiImpl;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.web.bind.annotation.*;
  12 +
  13 +import java.util.List;
  14 +import java.util.Map;
  15 +import java.util.Set;
  16 +
  17 +
  18 +/**
  19 + * 服务化 system模块 对外接口请求类
  20 + * @author: jeecg-boot
  21 + */
  22 +@Slf4j
  23 +@RestController
  24 +@RequestMapping("/sys/api")
  25 +public class SystemApiController {
  26 +
  27 + @Autowired
  28 + private SysBaseApiImpl sysBaseApi;
  29 + @Autowired
  30 + private ISysUserService sysUserService;
  31 +
  32 +
  33 + /**
  34 + * 发送系统消息
  35 + * @param message 使用构造器赋值参数 如果不设置category(消息类型)则默认为2 发送系统消息
  36 + */
  37 + @PostMapping("/sendSysAnnouncement")
  38 + public void sendSysAnnouncement(@RequestBody MessageDTO message){
  39 + sysBaseApi.sendSysAnnouncement(message);
  40 + }
  41 +
  42 + /**
  43 + * 发送消息 附带业务参数
  44 + * @param message 使用构造器赋值参数
  45 + */
  46 + @PostMapping("/sendBusAnnouncement")
  47 + public void sendBusAnnouncement(@RequestBody BusMessageDTO message){
  48 + sysBaseApi.sendBusAnnouncement(message);
  49 + }
  50 +
  51 + /**
  52 + * 通过模板发送消息
  53 + * @param message 使用构造器赋值参数
  54 + */
  55 + @PostMapping("/sendTemplateAnnouncement")
  56 + public void sendTemplateAnnouncement(@RequestBody TemplateMessageDTO message){
  57 + sysBaseApi.sendTemplateAnnouncement(message);
  58 + }
  59 +
  60 + /**
  61 + * 通过模板发送消息 附带业务参数
  62 + * @param message 使用构造器赋值参数
  63 + */
  64 + @PostMapping("/sendBusTemplateAnnouncement")
  65 + public void sendBusTemplateAnnouncement(@RequestBody BusTemplateMessageDTO message){
  66 + sysBaseApi.sendBusTemplateAnnouncement(message);
  67 + }
  68 +
  69 + /**
  70 + * 通过消息中心模板,生成推送内容
  71 + * @param templateDTO 使用构造器赋值参数
  72 + * @return
  73 + */
  74 + @PostMapping("/parseTemplateByCode")
  75 + public String parseTemplateByCode(@RequestBody TemplateDTO templateDTO){
  76 + return sysBaseApi.parseTemplateByCode(templateDTO);
  77 + }
  78 +
  79 + /**
  80 + * 根据业务类型busType及业务busId修改消息已读
  81 + */
  82 + @GetMapping("/updateSysAnnounReadFlag")
  83 + public void updateSysAnnounReadFlag(@RequestParam("busType") String busType, @RequestParam("busId")String busId){
  84 + sysBaseApi.updateSysAnnounReadFlag(busType, busId);
  85 + }
  86 +
  87 + /**
  88 + * 根据用户账号查询用户信息
  89 + * @param username
  90 + * @return
  91 + */
  92 + @GetMapping("/getUserByName")
  93 + public LoginUser getUserByName(@RequestParam("username") String username){
  94 + return sysBaseApi.getUserByName(username);
  95 + }
  96 +
  97 + /**
  98 + * 根据用户id查询用户信息
  99 + * @param id
  100 + * @return
  101 + */
  102 + @GetMapping("/getUserById")
  103 + LoginUser getUserById(@RequestParam("id") String id){
  104 + return sysBaseApi.getUserById(id);
  105 + }
  106 +
  107 + /**
  108 + * 通过用户账号查询角色集合
  109 + * @param username
  110 + * @return
  111 + */
  112 + @GetMapping("/getRolesByUsername")
  113 + List<String> getRolesByUsername(@RequestParam("username") String username){
  114 + return sysBaseApi.getRolesByUsername(username);
  115 + }
  116 +
  117 + /**
  118 + * 通过用户账号查询部门集合
  119 + * @param username
  120 + * @return 部门 id
  121 + */
  122 + @GetMapping("/getDepartIdsByUsername")
  123 + List<String> getDepartIdsByUsername(@RequestParam("username") String username){
  124 + return sysBaseApi.getDepartIdsByUsername(username);
  125 + }
  126 +
  127 + /**
  128 + * 通过用户账号查询部门 name
  129 + * @param username
  130 + * @return 部门 name
  131 + */
  132 + @GetMapping("/getDepartNamesByUsername")
  133 + List<String> getDepartNamesByUsername(@RequestParam("username") String username){
  134 + return sysBaseApi.getDepartNamesByUsername(username);
  135 + }
  136 +
  137 +
  138 + /**
  139 + * 获取数据字典
  140 + * @param code
  141 + * @return
  142 + */
  143 + @GetMapping("/queryDictItemsByCode")
  144 + List<DictModel> queryDictItemsByCode(@RequestParam("code") String code){
  145 + return sysBaseApi.queryDictItemsByCode(code);
  146 + }
  147 +
  148 + /**
  149 + * 获取有效的数据字典
  150 + * @param code
  151 + * @return
  152 + */
  153 + @GetMapping("/queryEnableDictItemsByCode")
  154 + List<DictModel> queryEnableDictItemsByCode(@RequestParam("code") String code){
  155 + return sysBaseApi.queryEnableDictItemsByCode(code);
  156 + }
  157 +
  158 +
  159 + /** 查询所有的父级字典,按照create_time排序 */
  160 + @GetMapping("/queryAllDict")
  161 + List<DictModel> queryAllDict(){
  162 +// try{
  163 +// //睡10秒,gateway网关5秒超时,会触发熔断降级操作
  164 +// Thread.sleep(10000);
  165 +// }catch (Exception e){
  166 +// e.printStackTrace();
  167 +// }
  168 +
  169 + log.info("--我是jeecg-system服务节点,微服务接口queryAllDict被调用--");
  170 + return sysBaseApi.queryAllDict();
  171 + }
  172 +
  173 + /**
  174 + * 查询所有分类字典
  175 + * @return
  176 + */
  177 + @GetMapping("/queryAllSysCategory")
  178 + List<SysCategoryModel> queryAllSysCategory(){
  179 + return sysBaseApi.queryAllSysCategory();
  180 + }
  181 +
  182 +
  183 + /**
  184 + * 查询所有部门 作为字典信息 id -->value,departName -->text
  185 + * @return
  186 + */
  187 + @GetMapping("/queryAllDepartBackDictModel")
  188 + List<DictModel> queryAllDepartBackDictModel(){
  189 + return sysBaseApi.queryAllDepartBackDictModel();
  190 + }
  191 +
  192 + /**
  193 + * 获取所有角色 带参
  194 + * roleIds 默认选中角色
  195 + * @return
  196 + */
  197 + @GetMapping("/queryAllRole")
  198 + public List<ComboModel> queryAllRole(@RequestParam(name = "roleIds",required = false)String[] roleIds){
  199 + if(roleIds==null || roleIds.length==0){
  200 + return sysBaseApi.queryAllRole();
  201 + }else{
  202 + return sysBaseApi.queryAllRole(roleIds);
  203 + }
  204 + }
  205 +
  206 + /**
  207 + * 通过用户账号查询角色Id集合
  208 + * @param username
  209 + * @return
  210 + */
  211 + @GetMapping("/getRoleIdsByUsername")
  212 + public List<String> getRoleIdsByUsername(@RequestParam("username")String username){
  213 + return sysBaseApi.getRoleIdsByUsername(username);
  214 + }
  215 +
  216 + /**
  217 + * 通过部门编号查询部门id
  218 + * @param orgCode
  219 + * @return
  220 + */
  221 + @GetMapping("/getDepartIdsByOrgCode")
  222 + public String getDepartIdsByOrgCode(@RequestParam("orgCode")String orgCode){
  223 + return sysBaseApi.getDepartIdsByOrgCode(orgCode);
  224 + }
  225 +
  226 + /**
  227 + * 查询所有部门
  228 + * @return
  229 + */
  230 + @GetMapping("/getAllSysDepart")
  231 + public List<SysDepartModel> getAllSysDepart(){
  232 + return sysBaseApi.getAllSysDepart();
  233 + }
  234 +
  235 + /**
  236 + * 根据 id 查询数据库中存储的 DynamicDataSourceModel
  237 + *
  238 + * @param dbSourceId
  239 + * @return
  240 + */
  241 + @GetMapping("/getDynamicDbSourceById")
  242 + DynamicDataSourceModel getDynamicDbSourceById(@RequestParam("dbSourceId")String dbSourceId){
  243 + return sysBaseApi.getDynamicDbSourceById(dbSourceId);
  244 + }
  245 +
  246 +
  247 +
  248 + /**
  249 + * 根据部门Id获取部门负责人
  250 + * @param deptId
  251 + * @return
  252 + */
  253 + @GetMapping("/getDeptHeadByDepId")
  254 + public List<String> getDeptHeadByDepId(@RequestParam("deptId") String deptId){
  255 + return sysBaseApi.getDeptHeadByDepId(deptId);
  256 + }
  257 +
  258 + /**
  259 + * 查找父级部门
  260 + * @param departId
  261 + * @return
  262 + */
  263 + @GetMapping("/getParentDepartId")
  264 + public DictModel getParentDepartId(@RequestParam("departId")String departId){
  265 + return sysBaseApi.getParentDepartId(departId);
  266 + }
  267 +
  268 + /**
  269 + * 根据 code 查询数据库中存储的 DynamicDataSourceModel
  270 + *
  271 + * @param dbSourceCode
  272 + * @return
  273 + */
  274 + @GetMapping("/getDynamicDbSourceByCode")
  275 + public DynamicDataSourceModel getDynamicDbSourceByCode(@RequestParam("dbSourceCode") String dbSourceCode){
  276 + return sysBaseApi.getDynamicDbSourceByCode(dbSourceCode);
  277 + }
  278 +
  279 + /**
  280 + * 给指定用户发消息
  281 + * @param userIds
  282 + * @param cmd
  283 + */
  284 + @GetMapping("/sendWebSocketMsg")
  285 + public void sendWebSocketMsg(String[] userIds, String cmd){
  286 + sysBaseApi.sendWebSocketMsg(userIds, cmd);
  287 + }
  288 +
  289 +
  290 + /**
  291 + * 根据id获取所有参与用户
  292 + * userIds
  293 + * @return
  294 + */
  295 + @GetMapping("/queryAllUserByIds")
  296 + public List<LoginUser> queryAllUserByIds(@RequestParam("userIds") String[] userIds){
  297 + return sysBaseApi.queryAllUserByIds(userIds);
  298 + }
  299 +
  300 + /**
  301 + * 查询所有用户 返回ComboModel
  302 + * @return
  303 + */
  304 + @GetMapping("/queryAllUserBackCombo")
  305 + public List<ComboModel> queryAllUserBackCombo(){
  306 + return sysBaseApi.queryAllUserBackCombo();
  307 + }
  308 +
  309 + /**
  310 + * 分页查询用户 返回JSONObject
  311 + * @return
  312 + */
  313 + @GetMapping("/queryAllUser")
  314 + public JSONObject queryAllUser(@RequestParam(name="userIds",required=false)String userIds, @RequestParam(name="pageNo",required=false) Integer pageNo,@RequestParam(name="pageSize",required=false) int pageSize){
  315 + return sysBaseApi.queryAllUser(userIds, pageNo, pageSize);
  316 + }
  317 +
  318 +
  319 +
  320 + /**
  321 + * 将会议签到信息推动到预览
  322 + * userIds
  323 + * @return
  324 + * @param userId
  325 + */
  326 + @GetMapping("/meetingSignWebsocket")
  327 + public void meetingSignWebsocket(@RequestParam("userId")String userId){
  328 + sysBaseApi.meetingSignWebsocket(userId);
  329 + }
  330 +
  331 + /**
  332 + * 根据name获取所有参与用户
  333 + * userNames
  334 + * @return
  335 + */
  336 + @GetMapping("/queryUserByNames")
  337 + public List<LoginUser> queryUserByNames(@RequestParam("userNames")String[] userNames){
  338 + return sysBaseApi.queryUserByNames(userNames);
  339 + }
  340 +
  341 + /**
  342 + * 获取用户的角色集合
  343 + * @param username
  344 + * @return
  345 + */
  346 + @GetMapping("/getUserRoleSet")
  347 + public Set<String> getUserRoleSet(@RequestParam("username")String username){
  348 + return sysBaseApi.getUserRoleSet(username);
  349 + }
  350 +
  351 + /**
  352 + * 获取用户的权限集合
  353 + * @param username
  354 + * @return
  355 + */
  356 + @GetMapping("/getUserPermissionSet")
  357 + public Set<String> getUserPermissionSet(@RequestParam("username") String username){
  358 + return sysBaseApi.getUserPermissionSet(username);
  359 + }
  360 +
  361 + //-----
  362 +
  363 + /**
  364 + * 判断是否有online访问的权限
  365 + * @param onlineAuthDTO
  366 + * @return
  367 + */
  368 + @PostMapping("/hasOnlineAuth")
  369 + public boolean hasOnlineAuth(@RequestBody OnlineAuthDTO onlineAuthDTO){
  370 + return sysBaseApi.hasOnlineAuth(onlineAuthDTO);
  371 + }
  372 +
  373 + /**
  374 + * 查询用户角色信息
  375 + * @param username
  376 + * @return
  377 + */
  378 + @GetMapping("/queryUserRoles")
  379 + public Set<String> queryUserRoles(@RequestParam("username") String username){
  380 + return sysUserService.getUserRolesSet(username);
  381 + }
  382 +
  383 +
  384 + /**
  385 + * 查询用户权限信息
  386 + * @param username
  387 + * @return
  388 + */
  389 + @GetMapping("/queryUserAuths")
  390 + public Set<String> queryUserAuths(@RequestParam("username") String username){
  391 + return sysUserService.getUserPermissionsSet(username);
  392 + }
  393 +
  394 + /**
  395 + * 通过部门id获取部门全部信息
  396 + */
  397 + @GetMapping("/selectAllById")
  398 + public SysDepartModel selectAllById(@RequestParam("id") String id){
  399 + return sysBaseApi.selectAllById(id);
  400 + }
  401 +
  402 + /**
  403 + * 根据用户id查询用户所属公司下所有用户ids
  404 + * @param userId
  405 + * @return
  406 + */
  407 + @GetMapping("/queryDeptUsersByUserId")
  408 + public List<String> queryDeptUsersByUserId(@RequestParam("userId") String userId){
  409 + return sysBaseApi.queryDeptUsersByUserId(userId);
  410 + }
  411 +
  412 +
  413 + /**
  414 + * 查询数据权限
  415 + * @return
  416 + */
  417 + @GetMapping("/queryPermissionDataRule")
  418 + public List<SysPermissionDataRuleModel> queryPermissionDataRule(@RequestParam("component") String component, @RequestParam("requestPath")String requestPath, @RequestParam("username") String username){
  419 + return sysBaseApi.queryPermissionDataRule(component, requestPath, username);
  420 + }
  421 +
  422 + /**
  423 + * 查询用户信息
  424 + * @param username
  425 + * @return
  426 + */
  427 + @GetMapping("/getCacheUser")
  428 + public SysUserCacheInfo getCacheUser(@RequestParam("username") String username){
  429 + return sysBaseApi.getCacheUser(username);
  430 + }
  431 +
  432 + /**
  433 + * 普通字典的翻译
  434 + * @param code
  435 + * @param key
  436 + * @return
  437 + */
  438 + @GetMapping("/translateDict")
  439 + public String translateDict(@RequestParam("code") String code, @RequestParam("key") String key){
  440 + return sysBaseApi.translateDict(code, key);
  441 + }
  442 +
  443 +
  444 + /**
  445 + * 36根据多个用户账号(逗号分隔),查询返回多个用户信息
  446 + * @param usernames
  447 + * @return
  448 + */
  449 + @RequestMapping("/queryUsersByUsernames")
  450 + List<JSONObject> queryUsersByUsernames(@RequestParam("usernames") String usernames){
  451 + return this.sysBaseApi.queryUsersByUsernames(usernames);
  452 + }
  453 +
  454 + /**
  455 + * 37根据多个用户id(逗号分隔),查询返回多个用户信息
  456 + * @param ids
  457 + * @return
  458 + */
  459 + @RequestMapping("/queryUsersByIds")
  460 + List<JSONObject> queryUsersByIds(@RequestParam("ids") String ids){
  461 + return this.sysBaseApi.queryUsersByIds(ids);
  462 + }
  463 +
  464 + /**
  465 + * 38根据多个部门编码(逗号分隔),查询返回多个部门信息
  466 + * @param orgCodes
  467 + * @return
  468 + */
  469 + @GetMapping("/queryDepartsByOrgcodes")
  470 + List<JSONObject> queryDepartsByOrgcodes(@RequestParam("orgCodes") String orgCodes){
  471 + return this.sysBaseApi.queryDepartsByOrgcodes(orgCodes);
  472 + }
  473 +
  474 + /**
  475 + * 39根据多个部门ID(逗号分隔),查询返回多个部门信息
  476 + * @param ids
  477 + * @return
  478 + */
  479 + @GetMapping("/queryDepartsByIds")
  480 + List<JSONObject> queryDepartsByIds(@RequestParam("ids") String ids){
  481 + return this.sysBaseApi.queryDepartsByIds(ids);
  482 + }
  483 +
  484 + /**
  485 + * 40发送邮件消息
  486 + * @param email
  487 + * @param title
  488 + * @param content
  489 + */
  490 + @GetMapping("/sendEmailMsg")
  491 + public void sendEmailMsg(@RequestParam("email")String email,@RequestParam("title")String title,@RequestParam("content")String content){
  492 + this.sysBaseApi.sendEmailMsg(email,title,content);
  493 + };
  494 + /**
  495 + * 41 获取公司下级部门和公司下所有用户信息
  496 + * @param orgCode
  497 + */
  498 + @GetMapping("/getDeptUserByOrgCode")
  499 + List<Map> getDeptUserByOrgCode(@RequestParam("orgCode")String orgCode){
  500 + return this.sysBaseApi.getDeptUserByOrgCode(orgCode);
  501 + }
  502 +
  503 + /**
  504 + * 查询分类字典翻译
  505 + *
  506 + * @param ids 分类字典表id
  507 + * @return
  508 + */
  509 + @GetMapping("/loadCategoryDictItem")
  510 + public List<String> loadCategoryDictItem(@RequestParam("ids") String ids) {
  511 + return sysBaseApi.loadCategoryDictItem(ids);
  512 + }
  513 +
  514 + /**
  515 + * 根据字典code加载字典text
  516 + *
  517 + * @param dictCode 顺序:tableName,text,code
  518 + * @param keys 要查询的key
  519 + * @return
  520 + */
  521 + @GetMapping("/loadDictItem")
  522 + public List<String> loadDictItem(@RequestParam("dictCode") String dictCode, @RequestParam("keys") String keys) {
  523 + return sysBaseApi.loadDictItem(dictCode, keys);
  524 + }
  525 +
  526 + /**
  527 + * 根据字典code查询字典项
  528 + *
  529 + * @param dictCode 顺序:tableName,text,code
  530 + * @param dictCode 要查询的key
  531 + * @return
  532 + */
  533 + @GetMapping("/getDictItems")
  534 + public List<DictModel> getDictItems(@RequestParam("dictCode") String dictCode) {
  535 + return sysBaseApi.getDictItems(dictCode);
  536 + }
  537 +
  538 + /**
  539 + * 根据多个字典code查询多个字典项
  540 + *
  541 + * @param dictCodeList
  542 + * @return key = dictCode ; value=对应的字典项
  543 + */
  544 + @RequestMapping("/getManyDictItems")
  545 + public Map<String, List<DictModel>> getManyDictItems(@RequestParam("dictCodeList") List<String> dictCodeList) {
  546 + return sysBaseApi.getManyDictItems(dictCodeList);
  547 + }
  548 +
  549 + /**
  550 + * 【下拉搜索】
  551 + * 大数据量的字典表 走异步加载,即前端输入内容过滤数据
  552 + *
  553 + * @param dictCode 字典code格式:table,text,code
  554 + * @param keyword 过滤关键字
  555 + * @return
  556 + */
  557 + @GetMapping("/loadDictItemByKeyword")
  558 + public List<DictModel> loadDictItemByKeyword(@RequestParam("dictCode") String dictCode, @RequestParam("keyword") String keyword, @RequestParam(value = "pageSize", required = false) Integer pageSize) {
  559 + return sysBaseApi.loadDictItemByKeyword(dictCode, keyword, pageSize);
  560 + }
  561 +
  562 + /**
  563 + * 48 普通字典的翻译,根据多个dictCode和多条数据,多个以逗号分割
  564 + * @param dictCodes
  565 + * @param keys
  566 + * @return
  567 + */
  568 + @GetMapping("/translateManyDict")
  569 + public Map<String, List<DictModel>> translateManyDict(@RequestParam("dictCodes") String dictCodes, @RequestParam("keys") String keys){
  570 + return this.sysBaseApi.translateManyDict(dictCodes, keys);
  571 + }
  572 +
  573 +
  574 + /**
  575 + * 获取表数据字典 【接口签名验证】
  576 + * @param table
  577 + * @param text
  578 + * @param code
  579 + * @return
  580 + */
  581 + @GetMapping("/queryTableDictItemsByCode")
  582 + List<DictModel> queryTableDictItemsByCode(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code){
  583 + return sysBaseApi.queryTableDictItemsByCode(table, text, code);
  584 + }
  585 +
  586 + /**
  587 + * 查询表字典 支持过滤数据 【接口签名验证】
  588 + * @param table
  589 + * @param text
  590 + * @param code
  591 + * @param filterSql
  592 + * @return
  593 + */
  594 + @GetMapping("/queryFilterTableDictInfo")
  595 + List<DictModel> queryFilterTableDictInfo(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("filterSql") String filterSql){
  596 + return sysBaseApi.queryFilterTableDictInfo(table, text, code, filterSql);
  597 + }
  598 +
  599 + /**
  600 + * 【接口签名验证】
  601 + * 查询指定table的 text code 获取字典,包含text和value
  602 + * @param table
  603 + * @param text
  604 + * @param code
  605 + * @param keyArray
  606 + * @return
  607 + */
  608 + @Deprecated
  609 + @GetMapping("/queryTableDictByKeys")
  610 + public List<String> queryTableDictByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keyArray") String[] keyArray){
  611 + return sysBaseApi.queryTableDictByKeys(table, text, code, keyArray);
  612 + }
  613 +
  614 +
  615 + /**
  616 + * 字典表的 翻译【接口签名验证】
  617 + * @param table
  618 + * @param text
  619 + * @param code
  620 + * @param key
  621 + * @return
  622 + */
  623 + @GetMapping("/translateDictFromTable")
  624 + public String translateDictFromTable(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("key") String key){
  625 + return sysBaseApi.translateDictFromTable(table, text, code, key);
  626 + }
  627 +
  628 +
  629 + /**
  630 + * 【接口签名验证】
  631 + * 49 字典表的 翻译,可批量
  632 + *
  633 + * @param table
  634 + * @param text
  635 + * @param code
  636 + * @param keys 多个用逗号分割
  637 + * @return
  638 + */
  639 + @GetMapping("/translateDictFromTableByKeys")
  640 + public List<DictModel> translateDictFromTableByKeys(@RequestParam("table") String table, @RequestParam("text") String text, @RequestParam("code") String code, @RequestParam("keys") String keys) {
  641 + return this.sysBaseApi.translateDictFromTableByKeys(table, text, code, keys);
  642 + }
  643 +
  644 + /**
  645 + * 发送模板信息
  646 + * @param message
  647 + */
  648 + @PostMapping("/sendTemplateMessage")
  649 + public void sendTemplateMessage(@RequestBody MessageDTO message){
  650 + sysBaseApi.sendTemplateMessage(message);
  651 + }
  652 +
  653 + /**
  654 + * 获取消息模板内容
  655 + * @param code
  656 + * @return
  657 + */
  658 + @GetMapping("/getTemplateContent")
  659 + public String getTemplateContent(@RequestParam("code") String code){
  660 + return this.sysBaseApi.getTemplateContent(code);
  661 + }
  662 +
  663 +}
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java
@@ -5,21 +5,17 @@ import java.util.List; @@ -5,21 +5,17 @@ import java.util.List;
5 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletRequest;
6 import javax.servlet.http.HttpServletResponse; 6 import javax.servlet.http.HttpServletResponse;
7 7
8 -import cn.hutool.crypto.SecureUtil;  
9 import org.apache.commons.lang.StringUtils; 8 import org.apache.commons.lang.StringUtils;
10 import org.jeecg.common.api.vo.Result; 9 import org.jeecg.common.api.vo.Result;
11 -import org.jeecg.common.constant.CacheConstant;  
12 import org.jeecg.common.constant.CommonConstant; 10 import org.jeecg.common.constant.CommonConstant;
13 import org.jeecg.common.system.util.JwtUtil; 11 import org.jeecg.common.system.util.JwtUtil;
14 -import org.jeecg.common.system.vo.LoginUser;  
15 import org.jeecg.common.util.RedisUtil; 12 import org.jeecg.common.util.RedisUtil;
16 -import org.jeecg.modules.cas.util.CASServiceUtil; 13 +import org.jeecg.modules.cas.util.CasServiceUtil;
17 import org.jeecg.modules.cas.util.XmlUtils; 14 import org.jeecg.modules.cas.util.XmlUtils;
18 import org.jeecg.modules.system.entity.SysDepart; 15 import org.jeecg.modules.system.entity.SysDepart;
19 import org.jeecg.modules.system.entity.SysUser; 16 import org.jeecg.modules.system.entity.SysUser;
20 import org.jeecg.modules.system.service.ISysDepartService; 17 import org.jeecg.modules.system.service.ISysDepartService;
21 import org.jeecg.modules.system.service.ISysUserService; 18 import org.jeecg.modules.system.service.ISysUserService;
22 -import org.springframework.beans.BeanUtils;  
23 import org.springframework.beans.factory.annotation.Autowired; 19 import org.springframework.beans.factory.annotation.Autowired;
24 import org.springframework.beans.factory.annotation.Value; 20 import org.springframework.beans.factory.annotation.Value;
25 import org.springframework.http.HttpEntity; 21 import org.springframework.http.HttpEntity;
@@ -65,7 +61,7 @@ public class CasClientController { @@ -65,7 +61,7 @@ public class CasClientController {
65 log.info("Rest api login."); 61 log.info("Rest api login.");
66 try { 62 try {
67 String validateUrl = prefixUrl+"/p3/serviceValidate"; 63 String validateUrl = prefixUrl+"/p3/serviceValidate";
68 - String res = CASServiceUtil.getSTValidate(validateUrl, ticket, service); 64 + String res = CasServiceUtil.getStValidate(validateUrl, ticket, service);
69 log.info("res."+res); 65 log.info("res."+res);
70 final String error = XmlUtils.getTextForElement(res, "authenticationFailure"); 66 final String error = XmlUtils.getTextForElement(res, "authenticationFailure");
71 if(StringUtils.isNotEmpty(error)) { 67 if(StringUtils.isNotEmpty(error)) {
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/cas/util/CasServiceUtil.java 0 → 100644
  1 +package org.jeecg.modules.cas.util;
  2 +
  3 +import java.io.BufferedReader;
  4 +import java.io.IOException;
  5 +import java.io.InputStreamReader;
  6 +import java.security.cert.X509Certificate;
  7 +
  8 +import javax.net.ssl.SSLContext;
  9 +import javax.net.ssl.TrustManager;
  10 +import javax.net.ssl.X509TrustManager;
  11 +
  12 +import org.apache.http.HttpResponse;
  13 +import org.apache.http.client.methods.HttpGet;
  14 +import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
  15 +import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  16 +import org.apache.http.impl.client.CloseableHttpClient;
  17 +import org.apache.http.impl.client.HttpClients;
  18 +
  19 +/**
  20 + * @Description: CasServiceUtil
  21 + * @author: jeecg-boot
  22 + */
  23 +public class CasServiceUtil {
  24 +
  25 + public static void main(String[] args) {
  26 + String serviceUrl = "https://cas.8f8.com.cn:8443/cas/p3/serviceValidate";
  27 + String service = "http://localhost:3003/user/login";
  28 + String ticket = "ST-5-1g-9cNES6KXNRwq-GuRET103sm0-DESKTOP-VKLS8B3";
  29 + String res = getStValidate(serviceUrl,ticket, service);
  30 +
  31 + System.out.println("---------res-----"+res);
  32 + }
  33 +
  34 +
  35 + /**
  36 + * 验证ST
  37 + */
  38 + public static String getStValidate(String url, String st, String service){
  39 + try {
  40 + url = url+"?service="+service+"&ticket="+st;
  41 + CloseableHttpClient httpclient = createHttpClientWithNoSsl();
  42 + HttpGet httpget = new HttpGet(url);
  43 + HttpResponse response = httpclient.execute(httpget);
  44 + String res = readResponse(response);
  45 + return res == null ? null : (res == "" ? null : res);
  46 + } catch (Exception e) {
  47 + e.printStackTrace();
  48 + }
  49 + return "";
  50 + }
  51 +
  52 +
  53 + /**
  54 + * 读取 response body 内容为字符串
  55 + *
  56 + * @param response
  57 + * @return
  58 + * @throws IOException
  59 + */
  60 + private static String readResponse(HttpResponse response) throws IOException {
  61 + BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
  62 + String result = new String();
  63 + String line;
  64 + while ((line = in.readLine()) != null) {
  65 + result += line;
  66 + }
  67 + return result;
  68 + }
  69 +
  70 +
  71 + /**
  72 + * 创建模拟客户端(针对 https 客户端禁用 SSL 验证)
  73 + *
  74 + * @param cookieStore 缓存的 Cookies 信息
  75 + * @return
  76 + * @throws Exception
  77 + */
  78 + private static CloseableHttpClient createHttpClientWithNoSsl() throws Exception {
  79 + // Create a trust manager that does not validate certificate chains
  80 + TrustManager[] trustAllCerts = new TrustManager[]{
  81 + new X509TrustManager() {
  82 + @Override
  83 + public X509Certificate[] getAcceptedIssuers() {
  84 + return null;
  85 + }
  86 +
  87 + @Override
  88 + public void checkClientTrusted(X509Certificate[] certs, String authType) {
  89 + // don't check
  90 + }
  91 +
  92 + @Override
  93 + public void checkServerTrusted(X509Certificate[] certs, String authType) {
  94 + // don't check
  95 + }
  96 + }
  97 + };
  98 +
  99 + SSLContext ctx = SSLContext.getInstance("TLS");
  100 + ctx.init(null, trustAllCerts, null);
  101 + LayeredConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(ctx);
  102 + return HttpClients.custom()
  103 + .setSSLSocketFactory(sslSocketFactory)
  104 + .build();
  105 + }
  106 +
  107 +}
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/cas/util/XmlUtils.java
@@ -14,6 +14,7 @@ import javax.xml.parsers.DocumentBuilderFactory; @@ -14,6 +14,7 @@ import javax.xml.parsers.DocumentBuilderFactory;
14 import javax.xml.parsers.ParserConfigurationException; 14 import javax.xml.parsers.ParserConfigurationException;
15 import javax.xml.parsers.SAXParser; 15 import javax.xml.parsers.SAXParser;
16 import javax.xml.parsers.SAXParserFactory; 16 import javax.xml.parsers.SAXParserFactory;
  17 +import org.jeecg.common.constant.CommonConstant;
17 import org.w3c.dom.Document; 18 import org.w3c.dom.Document;
18 import org.xml.sax.Attributes; 19 import org.xml.sax.Attributes;
19 import org.xml.sax.InputSource; 20 import org.xml.sax.InputSource;
@@ -31,6 +32,11 @@ import lombok.extern.slf4j.Slf4j; @@ -31,6 +32,11 @@ import lombok.extern.slf4j.Slf4j;
31 public final class XmlUtils { 32 public final class XmlUtils {
32 33
33 /** 34 /**
  35 + * attributes
  36 + */
  37 + private static final String ATTRIBUTES = "attributes";
  38 +
  39 + /**
34 * Creates a new namespace-aware DOM document object by parsing the given XML. 40 * Creates a new namespace-aware DOM document object by parsing the given XML.
35 * 41 *
36 * @param xml XML content. 42 * @param xml XML content.
@@ -218,9 +224,9 @@ public final class XmlUtils { @@ -218,9 +224,9 @@ public final class XmlUtils {
218 } 224 }
219 225
220 @Override 226 @Override
221 - public void startElement(final String namespaceURI, final String localName, final String qName,  
222 - final Attributes attributes) throws SAXException {  
223 - if ("attributes".equals(localName)) { 227 + public void startElement(final String nameSpaceUri, final String localName, final String qName,
  228 + final Attributes attributes) throws SAXException {
  229 + if (ATTRIBUTES.equals(localName)) {
224 this.foundAttributes = true; 230 this.foundAttributes = true;
225 } else if (this.foundAttributes) { 231 } else if (this.foundAttributes) {
226 this.value = new StringBuilder(); 232 this.value = new StringBuilder();
@@ -236,9 +242,9 @@ public final class XmlUtils { @@ -236,9 +242,9 @@ public final class XmlUtils {
236 } 242 }
237 243
238 @Override 244 @Override
239 - public void endElement(final String namespaceURI, final String localName, final String qName) 245 + public void endElement(final String nameSpaceUri, final String localName, final String qName)
240 throws SAXException { 246 throws SAXException {
241 - if ("attributes".equals(localName)) { 247 + if (ATTRIBUTES.equals(localName)) {
242 this.foundAttributes = false; 248 this.foundAttributes = false;
243 this.currentAttribute = null; 249 this.currentAttribute = null;
244 } else if (this.foundAttributes) { 250 } else if (this.foundAttributes) {
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/controller/SysMessageTemplateController.java
@@ -6,9 +6,12 @@ import java.util.Map; @@ -6,9 +6,12 @@ import java.util.Map;
6 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletRequest;
7 import javax.servlet.http.HttpServletResponse; 7 import javax.servlet.http.HttpServletResponse;
8 8
  9 +import org.jeecg.common.api.dto.message.MessageDTO;
9 import org.jeecg.common.api.vo.Result; 10 import org.jeecg.common.api.vo.Result;
  11 +import org.jeecg.common.system.api.ISysBaseAPI;
10 import org.jeecg.common.system.base.controller.JeecgController; 12 import org.jeecg.common.system.base.controller.JeecgController;
11 import org.jeecg.common.system.query.QueryGenerator; 13 import org.jeecg.common.system.query.QueryGenerator;
  14 +import org.jeecg.common.util.oConvertUtils;
12 import org.jeecg.modules.message.entity.MsgParams; 15 import org.jeecg.modules.message.entity.MsgParams;
13 import org.jeecg.modules.message.entity.SysMessageTemplate; 16 import org.jeecg.modules.message.entity.SysMessageTemplate;
14 import org.jeecg.modules.message.service.ISysMessageTemplateService; 17 import org.jeecg.modules.message.service.ISysMessageTemplateService;
@@ -46,6 +49,9 @@ public class SysMessageTemplateController extends JeecgController&lt;SysMessageTemp @@ -46,6 +49,9 @@ public class SysMessageTemplateController extends JeecgController&lt;SysMessageTemp
46 @Autowired 49 @Autowired
47 private PushMsgUtil pushMsgUtil; 50 private PushMsgUtil pushMsgUtil;
48 51
  52 + @Autowired
  53 + private ISysBaseAPI sysBaseApi;
  54 +
49 /** 55 /**
50 * 分页列表查询 56 * 分页列表查询
51 * 57 *
@@ -152,19 +158,23 @@ public class SysMessageTemplateController extends JeecgController&lt;SysMessageTemp @@ -152,19 +158,23 @@ public class SysMessageTemplateController extends JeecgController&lt;SysMessageTemp
152 @PostMapping(value = "/sendMsg") 158 @PostMapping(value = "/sendMsg")
153 public Result<SysMessageTemplate> sendMessage(@RequestBody MsgParams msgParams) { 159 public Result<SysMessageTemplate> sendMessage(@RequestBody MsgParams msgParams) {
154 Result<SysMessageTemplate> result = new Result<SysMessageTemplate>(); 160 Result<SysMessageTemplate> result = new Result<SysMessageTemplate>();
155 - Map<String, String> map = null;  
156 try { 161 try {
157 - map = (Map<String, String>) JSON.parse(msgParams.getTestData()); 162 + MessageDTO md = new MessageDTO();
  163 + md.setToAll(false);
  164 + md.setTitle("消息发送测试");
  165 + md.setTemplateCode(msgParams.getTemplateCode());
  166 + md.setToUser(msgParams.getReceiver());
  167 + md.setType(msgParams.getMsgType());
  168 + String testData = msgParams.getTestData();
  169 + if(oConvertUtils.isNotEmpty(testData)){
  170 + Map<String, Object> data = JSON.parseObject(testData, Map.class);
  171 + md.setData(data);
  172 + }
  173 + sysBaseApi.sendTemplateMessage(md);
  174 + return result.success("消息发送成功!");
158 } catch (Exception e) { 175 } catch (Exception e) {
159 - result.error500("解析Json出错!");  
160 - return result;  
161 - }  
162 - boolean is_sendSuccess = pushMsgUtil.sendMessage(msgParams.getMsgType(), msgParams.getTemplateCode(), map, msgParams.getReceiver());  
163 - if (is_sendSuccess) {  
164 - result.success("发送消息任务添加成功!");  
165 - } else {  
166 - result.error500("发送消息任务添加失败!"); 176 + log.error("发送消息出错", e.getMessage());
  177 + return result.error500("发送消息出错!");
167 } 178 }
168 - return result;  
169 } 179 }
170 } 180 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/entity/SysMessage.java
@@ -50,9 +50,11 @@ public class SysMessage extends JeecgEntity { @@ -50,9 +50,11 @@ public class SysMessage extends JeecgEntity {
50 /**消息标题*/ 50 /**消息标题*/
51 @Excel(name = "消息标题", width = 15) 51 @Excel(name = "消息标题", width = 15)
52 private java.lang.String esTitle; 52 private java.lang.String esTitle;
53 - /**推送方式:1短信 2邮件 3微信*/  
54 - @Excel(name = "推送方式:1短信 2邮件 3微信", width = 15)  
55 - @Dict(dicCode = "msgType") 53 + /**
  54 + * 推送方式:参考枚举类MessageTypeEnum
  55 + */
  56 + @Excel(name = "推送方式", width = 15)
  57 + @Dict(dicCode = "messageType")
56 private java.lang.String esType; 58 private java.lang.String esType;
57 /**备注*/ 59 /**备注*/
58 @Excel(name = "备注", width = 15) 60 @Excel(name = "备注", width = 15)
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/entity/SysMessageTemplate.java
@@ -35,4 +35,9 @@ public class SysMessageTemplate extends JeecgEntity{ @@ -35,4 +35,9 @@ public class SysMessageTemplate extends JeecgEntity{
35 /**模板类型*/ 35 /**模板类型*/
36 @Excel(name = "模板类型", width = 15) 36 @Excel(name = "模板类型", width = 15)
37 private java.lang.String templateType; 37 private java.lang.String templateType;
  38 +
  39 + /**已经应用/未应用 1是0否*/
  40 + @Excel(name = "应用状态", width = 15)
  41 + private String useStatus;
  42 +
38 } 43 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/ISendMsgHandle.java
1 package org.jeecg.modules.message.handle; 1 package org.jeecg.modules.message.handle;
2 2
  3 +import org.jeecg.common.api.dto.message.MessageDTO;
  4 +
3 /** 5 /**
4 * @Description: 发送信息接口 6 * @Description: 发送信息接口
5 * @author: jeecg-boot 7 * @author: jeecg-boot
@@ -8,9 +10,17 @@ public interface ISendMsgHandle { @@ -8,9 +10,17 @@ public interface ISendMsgHandle {
8 10
9 /** 11 /**
10 * 发送信息 12 * 发送信息
11 - * @param es_receiver 发送人  
12 - * @param es_title 标题  
13 - * @param es_content 内容 13 + * @param esReceiver 发送人
  14 + * @param esTitle 标题
  15 + * @param esContent 内容
  16 + */
  17 + void sendMsg(String esReceiver, String esTitle, String esContent);
  18 +
  19 + /**
  20 + * 发送信息
  21 + * @param messageDTO
14 */ 22 */
15 - void SendMsg(String es_receiver, String es_title, String es_content); 23 + default void sendMessage(MessageDTO messageDTO){
  24 +
  25 + }
16 } 26 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/DdSendMsgHandle.java 0 → 100644
  1 +package org.jeecg.modules.message.handle.impl;
  2 +
  3 +import lombok.extern.slf4j.Slf4j;
  4 +import org.jeecg.common.api.dto.message.MessageDTO;
  5 +import org.jeecg.modules.message.handle.ISendMsgHandle;
  6 +import org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +/**
  11 + * @Description: 发钉钉消息模板
  12 + * @author: jeecg-boot
  13 + */
  14 +@Slf4j
  15 +@Component("ddSendMsgHandle")
  16 +public class DdSendMsgHandle implements ISendMsgHandle {
  17 +
  18 + @Autowired
  19 + private ThirdAppDingtalkServiceImpl dingtalkService;
  20 +
  21 + @Override
  22 + public void sendMsg(String esReceiver, String esTitle, String esContent) {
  23 + log.info("发微信消息模板");
  24 + MessageDTO messageDTO = new MessageDTO();
  25 + messageDTO.setToUser(esReceiver);
  26 + messageDTO.setTitle(esTitle);
  27 + messageDTO.setContent(esContent);
  28 + messageDTO.setToAll(false);
  29 + sendMessage(messageDTO);
  30 + }
  31 +
  32 + @Override
  33 + public void sendMessage(MessageDTO messageDTO) {
  34 + dingtalkService.sendMessage(messageDTO, true);
  35 + }
  36 +
  37 +}
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java
1 package org.jeecg.modules.message.handle.impl; 1 package org.jeecg.modules.message.handle.impl;
2 2
  3 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4 +import lombok.extern.slf4j.Slf4j;
  5 +import org.jeecg.common.api.dto.message.MessageDTO;
  6 +import org.jeecg.common.constant.CommonConstant;
  7 +import org.jeecg.common.system.util.JwtUtil;
  8 +import org.jeecg.common.util.RedisUtil;
3 import org.jeecg.common.util.SpringContextUtils; 9 import org.jeecg.common.util.SpringContextUtils;
4 import org.jeecg.common.util.oConvertUtils; 10 import org.jeecg.common.util.oConvertUtils;
5 import org.jeecg.config.StaticConfig; 11 import org.jeecg.config.StaticConfig;
6 import org.jeecg.modules.message.handle.ISendMsgHandle; 12 import org.jeecg.modules.message.handle.ISendMsgHandle;
7 -import org.springframework.mail.SimpleMailMessage; 13 +import org.jeecg.modules.system.entity.SysUser;
  14 +import org.jeecg.modules.system.mapper.SysUserMapper;
  15 +import org.springframework.beans.factory.annotation.Autowired;
8 import org.springframework.mail.javamail.JavaMailSender; 16 import org.springframework.mail.javamail.JavaMailSender;
9 import org.springframework.mail.javamail.MimeMessageHelper; 17 import org.springframework.mail.javamail.MimeMessageHelper;
  18 +import org.springframework.stereotype.Component;
10 19
11 import javax.mail.MessagingException; 20 import javax.mail.MessagingException;
12 import javax.mail.internet.MimeMessage; 21 import javax.mail.internet.MimeMessage;
  22 +import java.io.UnsupportedEncodingException;
  23 +import java.net.URLEncoder;
  24 +import java.util.List;
13 25
14 /** 26 /**
15 * @Description: 邮箱发送信息 27 * @Description: 邮箱发送信息
16 * @author: jeecg-boot 28 * @author: jeecg-boot
17 */ 29 */
  30 +@Slf4j
  31 +@Component("emailSendMsgHandle")
18 public class EmailSendMsgHandle implements ISendMsgHandle { 32 public class EmailSendMsgHandle implements ISendMsgHandle {
19 static String emailFrom; 33 static String emailFrom;
20 34
@@ -22,8 +36,16 @@ public class EmailSendMsgHandle implements ISendMsgHandle { @@ -22,8 +36,16 @@ public class EmailSendMsgHandle implements ISendMsgHandle {
22 EmailSendMsgHandle.emailFrom = emailFrom; 36 EmailSendMsgHandle.emailFrom = emailFrom;
23 } 37 }
24 38
  39 + @Autowired
  40 + SysUserMapper sysUserMapper;
  41 +
  42 + @Autowired
  43 + private RedisUtil redisUtil;
  44 +
  45 +
  46 +
25 @Override 47 @Override
26 - public void SendMsg(String es_receiver, String es_title, String es_content) { 48 + public void sendMsg(String esReceiver, String esTitle, String esContent) {
27 JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean("mailSender"); 49 JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean("mailSender");
28 MimeMessage message = mailSender.createMimeMessage(); 50 MimeMessage message = mailSender.createMimeMessage();
29 MimeMessageHelper helper = null; 51 MimeMessageHelper helper = null;
@@ -37,13 +59,53 @@ public class EmailSendMsgHandle implements ISendMsgHandle { @@ -37,13 +59,53 @@ public class EmailSendMsgHandle implements ISendMsgHandle {
37 helper = new MimeMessageHelper(message, true); 59 helper = new MimeMessageHelper(message, true);
38 // 设置发送方邮箱地址 60 // 设置发送方邮箱地址
39 helper.setFrom(emailFrom); 61 helper.setFrom(emailFrom);
40 - helper.setTo(es_receiver);  
41 - helper.setSubject(es_title);  
42 - helper.setText(es_content, true); 62 + helper.setTo(esReceiver);
  63 + helper.setSubject(esTitle);
  64 + helper.setText(esContent, true);
43 mailSender.send(message); 65 mailSender.send(message);
44 } catch (MessagingException e) { 66 } catch (MessagingException e) {
45 e.printStackTrace(); 67 e.printStackTrace();
46 } 68 }
47 69
48 } 70 }
  71 +
  72 + @Override
  73 + public void sendMessage(MessageDTO messageDTO) {
  74 + String[] arr = messageDTO.getToUser().split(",");
  75 + LambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<SysUser>().in(SysUser::getUsername, arr);
  76 + List<SysUser> list = sysUserMapper.selectList(query);
  77 + String content = messageDTO.getContent();
  78 + String title = messageDTO.getTitle();
  79 + for(SysUser user: list){
  80 + String email = user.getEmail();
  81 + if(email==null || "".equals(email)){
  82 + continue;
  83 + }
  84 +
  85 + if(content.indexOf(CommonConstant.LOGIN_TOKEN)>0){
  86 + String token = getToken(user);
  87 + try {
  88 + content = content.replace(CommonConstant.LOGIN_TOKEN, URLEncoder.encode(token, "UTF-8"));
  89 + } catch (UnsupportedEncodingException e) {
  90 + log.error("邮件消息token编码失败", e.getMessage());
  91 + }
  92 + }
  93 + log.info("邮件内容:"+ content);
  94 + sendMsg(email, title, content);
  95 + }
  96 + }
  97 +
  98 + /**
  99 + * 获取token
  100 + * @param user
  101 + * @return
  102 + */
  103 + private String getToken(SysUser user) {
  104 + // 生成token
  105 + String token = JwtUtil.sign(user.getUsername(), user.getPassword());
  106 + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
  107 + // 设置超时时间 1个小时
  108 + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 1 / 1000);
  109 + return token;
  110 + }
49 } 111 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/QywxSendMsgHandle.java 0 → 100644
  1 +package org.jeecg.modules.message.handle.impl;
  2 +
  3 +import lombok.extern.slf4j.Slf4j;
  4 +import org.jeecg.common.api.dto.message.MessageDTO;
  5 +import org.jeecg.modules.message.handle.ISendMsgHandle;
  6 +import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +/**
  11 + * @Description: 发企业微信消息模板
  12 + * @author: jeecg-boot
  13 + */
  14 +@Slf4j
  15 +@Component("qywxSendMsgHandle")
  16 +public class QywxSendMsgHandle implements ISendMsgHandle {
  17 +
  18 + @Autowired
  19 + private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
  20 +
  21 + @Override
  22 + public void sendMsg(String esReceiver, String esTitle, String esContent) {
  23 + log.info("发微信消息模板");
  24 + MessageDTO messageDTO = new MessageDTO();
  25 + messageDTO.setToUser(esReceiver);
  26 + messageDTO.setTitle(esTitle);
  27 + messageDTO.setContent(esContent);
  28 + messageDTO.setToAll(false);
  29 + sendMessage(messageDTO);
  30 + }
  31 +
  32 + @Override
  33 + public void sendMessage(MessageDTO messageDTO) {
  34 + wechatEnterpriseService.sendMessage(messageDTO, true);
  35 + }
  36 +
  37 +}
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/SmsSendMsgHandle.java
@@ -11,7 +11,7 @@ import org.jeecg.modules.message.handle.ISendMsgHandle; @@ -11,7 +11,7 @@ import org.jeecg.modules.message.handle.ISendMsgHandle;
11 public class SmsSendMsgHandle implements ISendMsgHandle { 11 public class SmsSendMsgHandle implements ISendMsgHandle {
12 12
13 @Override 13 @Override
14 - public void SendMsg(String es_receiver, String es_title, String es_content) { 14 + public void sendMsg(String esReceiver, String esTitle, String esContent) {
15 // TODO Auto-generated method stub 15 // TODO Auto-generated method stub
16 log.info("发短信"); 16 log.info("发短信");
17 } 17 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/SystemSendMsgHandle.java
1 package org.jeecg.modules.message.handle.impl; 1 package org.jeecg.modules.message.handle.impl;
2 2
  3 +import com.alibaba.fastjson.JSONObject;
3 import org.jeecg.common.api.dto.message.MessageDTO; 4 import org.jeecg.common.api.dto.message.MessageDTO;
  5 +import org.jeecg.common.constant.CommonConstant;
  6 +import org.jeecg.common.constant.WebsocketConst;
4 import org.jeecg.common.exception.JeecgBootException; 7 import org.jeecg.common.exception.JeecgBootException;
5 import org.jeecg.common.system.api.ISysBaseAPI; 8 import org.jeecg.common.system.api.ISysBaseAPI;
6 import org.jeecg.common.util.SpringContextUtils; 9 import org.jeecg.common.util.SpringContextUtils;
7 import org.jeecg.common.util.oConvertUtils; 10 import org.jeecg.common.util.oConvertUtils;
8 import org.jeecg.modules.message.handle.ISendMsgHandle; 11 import org.jeecg.modules.message.handle.ISendMsgHandle;
  12 +import org.jeecg.modules.message.websocket.WebSocket;
  13 +import org.jeecg.modules.system.entity.SysAnnouncement;
  14 +import org.jeecg.modules.system.entity.SysAnnouncementSend;
  15 +import org.jeecg.modules.system.entity.SysUser;
  16 +import org.jeecg.modules.system.mapper.SysAnnouncementMapper;
  17 +import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper;
  18 +import org.jeecg.modules.system.mapper.SysUserMapper;
  19 +import org.springframework.stereotype.Component;
  20 +
  21 +import javax.annotation.Resource;
  22 +import java.util.Date;
  23 +import java.util.Map;
9 24
10 /** 25 /**
11 * @Description: 发送系统消息 26 * @Description: 发送系统消息
12 * @Author: wangshuai 27 * @Author: wangshuai
13 * @Date: 2022年3月22日 18:48:20 28 * @Date: 2022年3月22日 18:48:20
14 */ 29 */
  30 +@Component("systemSendMsgHandle")
15 public class SystemSendMsgHandle implements ISendMsgHandle { 31 public class SystemSendMsgHandle implements ISendMsgHandle {
16 32
17 public static final String FROM_USER="system"; 33 public static final String FROM_USER="system";
18 34
  35 + @Resource
  36 + private SysAnnouncementMapper sysAnnouncementMapper;
  37 +
  38 + @Resource
  39 + private SysUserMapper userMapper;
  40 +
  41 + @Resource
  42 + private SysAnnouncementSendMapper sysAnnouncementSendMapper;
  43 +
  44 + @Resource
  45 + private WebSocket webSocket;
  46 +
  47 + /**
  48 + * 该方法会发送3种消息:系统消息、企业微信 钉钉
  49 + * @param esReceiver 发送人
  50 + * @param esTitle 标题
  51 + * @param esContent 内容
  52 + */
19 @Override 53 @Override
20 - public void SendMsg(String es_receiver, String es_title, String es_content) {  
21 - if(oConvertUtils.isEmpty(es_receiver)){ 54 + public void sendMsg(String esReceiver, String esTitle, String esContent) {
  55 + if(oConvertUtils.isEmpty(esReceiver)){
22 throw new JeecgBootException("被发送人不能为空"); 56 throw new JeecgBootException("被发送人不能为空");
23 } 57 }
24 - ISysBaseAPI sysBaseAPI = SpringContextUtils.getBean(ISysBaseAPI.class);  
25 - MessageDTO messageDTO = new MessageDTO(FROM_USER,es_receiver,es_title,es_content);  
26 - sysBaseAPI.sendSysAnnouncement(messageDTO); 58 + ISysBaseAPI sysBaseApi = SpringContextUtils.getBean(ISysBaseAPI.class);
  59 + MessageDTO messageDTO = new MessageDTO(FROM_USER,esReceiver,esTitle,esContent);
  60 + sysBaseApi.sendSysAnnouncement(messageDTO);
  61 + }
  62 +
  63 + /**
  64 + * 仅发送系统消息
  65 + * @param messageDTO
  66 + */
  67 + @Override
  68 + public void sendMessage(MessageDTO messageDTO) {
  69 + //原方法不支持 sysBaseApi.sendSysAnnouncement(messageDTO); 有企业微信消息逻辑,
  70 + String title = messageDTO.getTitle();
  71 + String content = messageDTO.getContent();
  72 + String fromUser = messageDTO.getFromUser();
  73 + Map<String,Object> data = messageDTO.getData();
  74 + String[] arr = messageDTO.getToUser().split(",");
  75 + for(String username: arr){
  76 + doSend(title, content, fromUser, username, data);
  77 + }
  78 + }
  79 +
  80 + private void doSend(String title, String msgContent, String fromUser, String toUser, Map<String, Object> data){
  81 + SysAnnouncement announcement = new SysAnnouncement();
  82 + if(data!=null){
  83 + //摘要信息
  84 + Object msgAbstract = data.get(CommonConstant.NOTICE_MSG_SUMMARY);
  85 + if(msgAbstract!=null){
  86 + announcement.setMsgAbstract(msgAbstract.toString());
  87 + }
  88 + // 任务节点ID
  89 + Object taskId = data.get(CommonConstant.NOTICE_MSG_BUS_ID);
  90 + if(taskId!=null){
  91 + announcement.setBusId(taskId.toString());
  92 + }
  93 + }
  94 + announcement.setTitile(title);
  95 + announcement.setMsgContent(msgContent);
  96 + announcement.setSender(fromUser);
  97 + announcement.setPriority(CommonConstant.PRIORITY_M);
  98 + announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);
  99 + announcement.setSendStatus(CommonConstant.HAS_SEND);
  100 + announcement.setSendTime(new Date());
  101 + //系统消息
  102 + announcement.setMsgCategory("2");
  103 + announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));
  104 + sysAnnouncementMapper.insert(announcement);
  105 + // 2.插入用户通告阅读标记表记录
  106 + String userId = toUser;
  107 + String[] userIds = userId.split(",");
  108 + String anntId = announcement.getId();
  109 + for(int i=0;i<userIds.length;i++) {
  110 + if(oConvertUtils.isNotEmpty(userIds[i])) {
  111 + SysUser sysUser = userMapper.getUserByName(userIds[i]);
  112 + if(sysUser==null) {
  113 + continue;
  114 + }
  115 + SysAnnouncementSend announcementSend = new SysAnnouncementSend();
  116 + announcementSend.setAnntId(anntId);
  117 + announcementSend.setUserId(sysUser.getId());
  118 + announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
  119 + sysAnnouncementSendMapper.insert(announcementSend);
  120 + JSONObject obj = new JSONObject();
  121 + obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);
  122 + obj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());
  123 + obj.put(WebsocketConst.MSG_ID, announcement.getId());
  124 + obj.put(WebsocketConst.MSG_TXT, announcement.getTitile());
  125 + webSocket.sendMessage(sysUser.getId(), obj.toJSONString());
  126 + }
  127 + }
27 } 128 }
28 } 129 }
29 \ No newline at end of file 130 \ No newline at end of file
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/handle/impl/WxSendMsgHandle.java
@@ -11,7 +11,7 @@ import org.jeecg.modules.message.handle.ISendMsgHandle; @@ -11,7 +11,7 @@ import org.jeecg.modules.message.handle.ISendMsgHandle;
11 public class WxSendMsgHandle implements ISendMsgHandle { 11 public class WxSendMsgHandle implements ISendMsgHandle {
12 12
13 @Override 13 @Override
14 - public void SendMsg(String es_receiver, String es_title, String es_content) { 14 + public void sendMsg(String esReceiver, String esTitle, String esContent) {
15 // TODO Auto-generated method stub 15 // TODO Auto-generated method stub
16 log.info("发微信消息模板"); 16 log.info("发微信消息模板");
17 } 17 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/message/job/SendMsgJob.java
1 package org.jeecg.modules.message.job; 1 package org.jeecg.modules.message.job;
2 2
3 -import java.util.List;  
4 - 3 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4 +import lombok.extern.slf4j.Slf4j;
  5 +import org.jeecg.common.api.dto.message.MessageDTO;
  6 +import org.jeecg.common.system.api.ISysBaseAPI;
5 import org.jeecg.common.util.DateUtils; 7 import org.jeecg.common.util.DateUtils;
6 import org.jeecg.modules.message.entity.SysMessage; 8 import org.jeecg.modules.message.entity.SysMessage;
7 -import org.jeecg.modules.message.handle.ISendMsgHandle;  
8 import org.jeecg.modules.message.handle.enums.SendMsgStatusEnum; 9 import org.jeecg.modules.message.handle.enums.SendMsgStatusEnum;
9 -import org.jeecg.modules.message.handle.enums.SendMsgTypeEnum;  
10 import org.jeecg.modules.message.service.ISysMessageService; 10 import org.jeecg.modules.message.service.ISysMessageService;
11 import org.quartz.Job; 11 import org.quartz.Job;
12 import org.quartz.JobExecutionContext; 12 import org.quartz.JobExecutionContext;
13 import org.quartz.JobExecutionException; 13 import org.quartz.JobExecutionException;
14 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.beans.factory.annotation.Autowired;
15 15
16 -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;  
17 -  
18 -import lombok.extern.slf4j.Slf4j; 16 +import java.util.List;
19 17
20 /** 18 /**
21 * 发送消息任务 19 * 发送消息任务
@@ -28,6 +26,9 @@ public class SendMsgJob implements Job { @@ -28,6 +26,9 @@ public class SendMsgJob implements Job {
28 @Autowired 26 @Autowired
29 private ISysMessageService sysMessageService; 27 private ISysMessageService sysMessageService;
30 28
  29 + @Autowired
  30 + private ISysBaseAPI sysBaseAPI;
  31 +
31 @Override 32 @Override
32 public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { 33 public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
33 34
@@ -41,32 +42,19 @@ public class SendMsgJob implements Job { @@ -41,32 +42,19 @@ public class SendMsgJob implements Job {
41 System.out.println(sysMessages); 42 System.out.println(sysMessages);
42 // 2.根据不同的类型走不通的发送实现类 43 // 2.根据不同的类型走不通的发送实现类
43 for (SysMessage sysMessage : sysMessages) { 44 for (SysMessage sysMessage : sysMessages) {
44 - ISendMsgHandle sendMsgHandle = null;  
45 - try {  
46 - if (sysMessage.getEsType().equals(SendMsgTypeEnum.EMAIL.getType())) {  
47 - sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.EMAIL.getImplClass()).newInstance();  
48 - } else if (sysMessage.getEsType().equals(SendMsgTypeEnum.SMS.getType())) {  
49 - sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.SMS.getImplClass()).newInstance();  
50 - } else if (sysMessage.getEsType().equals(SendMsgTypeEnum.WX.getType())) {  
51 - sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.WX.getImplClass()).newInstance();  
52 - } else if(sysMessage.getEsType().equals(SendMsgTypeEnum.SYSTEM_MESSAGE.getType())){  
53 - //update-begin---author:wangshuai ---date:20220323 for:[issues/I4X698]根据模板发送系统消息,发送失败------------  
54 - sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.SYSTEM_MESSAGE.getImplClass()).newInstance();  
55 - //update-end---author:wangshuai ---date:20220323 for:[issues/I4X698]根据模板发送系统消息,发送失败------------  
56 - }  
57 - } catch (Exception e) {  
58 - log.error(e.getMessage(),e);  
59 - } 45 + //update-begin-author:taoyan date:2022-7-8 for: 模板消息发送测试调用方法修改
60 Integer sendNum = sysMessage.getEsSendNum(); 46 Integer sendNum = sysMessage.getEsSendNum();
61 try { 47 try {
62 - //update-begin---author:wangshuai ---date:20220323 for:[issues/I4X698]模板管理发送消息出现NullPointerException 錯誤------------  
63 - if(null != sendMsgHandle){  
64 - sendMsgHandle.SendMsg(sysMessage.getEsReceiver(), sysMessage.getEsTitle(),  
65 - sysMessage.getEsContent().toString());  
66 - //发送消息成功  
67 - sysMessage.setEsSendStatus(SendMsgStatusEnum.SUCCESS.getCode());  
68 - }  
69 - //update-end---author:wangshuai ---date:20220323 for:[issues/I4X698]模板管理发送消息出现NullPointerException 錯誤------------ 48 + MessageDTO md = new MessageDTO();
  49 + md.setTitle(sysMessage.getEsTitle());
  50 + md.setContent(sysMessage.getEsContent());
  51 + md.setToUser(sysMessage.getEsReceiver());
  52 + md.setType(sysMessage.getEsType());
  53 + md.setToAll(false);
  54 + sysBaseAPI.sendTemplateMessage(md);
  55 + //发送消息成功
  56 + sysMessage.setEsSendStatus(SendMsgStatusEnum.SUCCESS.getCode());
  57 + //update-end-author:taoyan date:2022-7-8 for: 模板消息发送测试调用方法修改
70 } catch (Exception e) { 58 } catch (Exception e) {
71 e.printStackTrace(); 59 e.printStackTrace();
72 // 发送消息出现异常 60 // 发送消息出现异常
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java
@@ -12,6 +12,7 @@ import cn.hutool.core.date.DateUtil; @@ -12,6 +12,7 @@ import cn.hutool.core.date.DateUtil;
12 import com.alibaba.fastjson.JSONArray; 12 import com.alibaba.fastjson.JSONArray;
13 import com.alibaba.fastjson.JSONObject; 13 import com.alibaba.fastjson.JSONObject;
14 import com.google.common.collect.Maps; 14 import com.google.common.collect.Maps;
  15 +import org.jeecg.common.constant.CommonConstant;
15 import org.jeecg.common.util.oConvertUtils; 16 import org.jeecg.common.util.oConvertUtils;
16 import org.jeecg.modules.monitor.domain.RedisInfo; 17 import org.jeecg.modules.monitor.domain.RedisInfo;
17 import org.jeecg.modules.monitor.exception.RedisConnectException; 18 import org.jeecg.modules.monitor.exception.RedisConnectException;
@@ -34,6 +35,11 @@ public class RedisServiceImpl implements RedisService { @@ -34,6 +35,11 @@ public class RedisServiceImpl implements RedisService {
34 @Resource 35 @Resource
35 private RedisConnectionFactory redisConnectionFactory; 36 private RedisConnectionFactory redisConnectionFactory;
36 37
  38 + /**
  39 + * redis信息
  40 + */
  41 + private static final String REDIS_MESSAGE = "3";
  42 +
37 /** 43 /**
38 * Redis详细信息 44 * Redis详细信息
39 */ 45 */
@@ -88,7 +94,7 @@ public class RedisServiceImpl implements RedisService { @@ -88,7 +94,7 @@ public class RedisServiceImpl implements RedisService {
88 public Map<String, JSONArray> getMapForReport(String type) throws RedisConnectException { 94 public Map<String, JSONArray> getMapForReport(String type) throws RedisConnectException {
89 Map<String,JSONArray> mapJson=new HashMap(5); 95 Map<String,JSONArray> mapJson=new HashMap(5);
90 JSONArray json = new JSONArray(); 96 JSONArray json = new JSONArray();
91 - if("3".equals(type)){ 97 + if(REDIS_MESSAGE.equals(type)){
92 List<RedisInfo> redisInfo = getRedisInfo(); 98 List<RedisInfo> redisInfo = getRedisInfo();
93 for(RedisInfo info:redisInfo){ 99 for(RedisInfo info:redisInfo){
94 Map<String, Object> map= Maps.newHashMap(); 100 Map<String, Object> map= Maps.newHashMap();
@@ -101,7 +107,8 @@ public class RedisServiceImpl implements RedisService { @@ -101,7 +107,8 @@ public class RedisServiceImpl implements RedisService {
101 mapJson.put("data",json); 107 mapJson.put("data",json);
102 return mapJson; 108 return mapJson;
103 } 109 }
104 - for(int i = 0; i < 5; i++){ 110 + int length = 5;
  111 + for(int i = 0; i < length; i++){
105 JSONObject jo = new JSONObject(); 112 JSONObject jo = new JSONObject();
106 Map<String, Object> map; 113 Map<String, Object> map;
107 if("1".equals(type)){ 114 if("1".equals(type)){
@@ -109,11 +116,11 @@ public class RedisServiceImpl implements RedisService { @@ -109,11 +116,11 @@ public class RedisServiceImpl implements RedisService {
109 jo.put("value",map.get("dbSize")); 116 jo.put("value",map.get("dbSize"));
110 }else{ 117 }else{
111 map = getMemoryInfo(); 118 map = getMemoryInfo();
112 - Integer used_memory = Integer.valueOf(map.get("used_memory").toString());  
113 - jo.put("value",used_memory/1000); 119 + Integer usedMemory = Integer.valueOf(map.get("used_memory").toString());
  120 + jo.put("value",usedMemory/1000);
114 } 121 }
115 - String create_time = DateUtil.formatTime(DateUtil.date((Long) map.get("create_time")-(4-i)*1000));  
116 - jo.put("name",create_time); 122 + String createTime = DateUtil.formatTime(DateUtil.date((Long) map.get("create_time")-(4-i)*1000));
  123 + jo.put("name",createTime);
117 json.add(jo); 124 json.add(jo);
118 } 125 }
119 mapJson.put("data",json); 126 mapJson.put("data",json);
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/ngalain/service/impl/NgAlainServiceImpl.java
@@ -2,6 +2,8 @@ package org.jeecg.modules.ngalain.service.impl; @@ -2,6 +2,8 @@ package org.jeecg.modules.ngalain.service.impl;
2 2
3 import com.alibaba.fastjson.JSONArray; 3 import com.alibaba.fastjson.JSONArray;
4 import com.alibaba.fastjson.JSONObject; 4 import com.alibaba.fastjson.JSONObject;
  5 +import org.jeecg.common.constant.CommonConstant;
  6 +import org.jeecg.common.constant.SymbolConstant;
5 import org.jeecg.common.util.oConvertUtils; 7 import org.jeecg.common.util.oConvertUtils;
6 import org.jeecg.modules.ngalain.service.NgAlainService; 8 import org.jeecg.modules.ngalain.service.NgAlainService;
7 import org.jeecg.modules.system.entity.SysPermission; 9 import org.jeecg.modules.system.entity.SysPermission;
@@ -123,12 +125,13 @@ public class NgAlainServiceImpl implements NgAlainService { @@ -123,12 +125,13 @@ public class NgAlainServiceImpl implements NgAlainService {
123 private JSONObject getPermissionJsonObject(SysPermission permission) { 125 private JSONObject getPermissionJsonObject(SysPermission permission) {
124 JSONObject json = new JSONObject(); 126 JSONObject json = new JSONObject();
125 //类型(0:一级菜单 1:子菜单 2:按钮) 127 //类型(0:一级菜单 1:子菜单 2:按钮)
126 - if(permission.getMenuType()==2) { 128 + if(CommonConstant.MENU_TYPE_2.equals(permission.getMenuType())) {
127 json.put("action", permission.getPerms()); 129 json.put("action", permission.getPerms());
128 json.put("describe", permission.getName()); 130 json.put("describe", permission.getName());
129 - }else if(permission.getMenuType()==0||permission.getMenuType()==1) { 131 + }else if(CommonConstant.MENU_TYPE_0.equals(permission.getMenuType()) || CommonConstant.MENU_TYPE_1.equals(permission.getMenuType())) {
130 json.put("id", permission.getId()); 132 json.put("id", permission.getId());
131 - if(permission.getUrl()!=null&&(permission.getUrl().startsWith("http://")||permission.getUrl().startsWith("https://"))) { 133 + boolean flag = permission.getUrl()!=null&&(permission.getUrl().startsWith(CommonConstant.HTTP_PROTOCOL)||permission.getUrl().startsWith(CommonConstant.HTTPS_PROTOCOL));
  134 + if(flag) {
132 String url= new String(Base64.getUrlEncoder().encode(permission.getUrl().getBytes())); 135 String url= new String(Base64.getUrlEncoder().encode(permission.getUrl().getBytes()));
133 json.put("path", "/sys/link/" +url.replaceAll("=","")); 136 json.put("path", "/sys/link/" +url.replaceAll("=",""));
134 }else { 137 }else {
@@ -156,7 +159,7 @@ public class NgAlainServiceImpl implements NgAlainService { @@ -156,7 +159,7 @@ public class NgAlainServiceImpl implements NgAlainService {
156 }else { 159 }else {
157 meta.put("icon", oConvertUtils.getString(permission.getIcon(), "")); 160 meta.put("icon", oConvertUtils.getString(permission.getIcon(), ""));
158 } 161 }
159 - if(permission.getUrl()!=null&&(permission.getUrl().startsWith("http://")||permission.getUrl().startsWith("https://"))) { 162 + if(flag) {
160 meta.put("url", permission.getUrl()); 163 meta.put("url", permission.getUrl());
161 } 164 }
162 json.put("meta", meta); 165 json.put("meta", meta);
@@ -172,7 +175,7 @@ public class NgAlainServiceImpl implements NgAlainService { @@ -172,7 +175,7 @@ public class NgAlainServiceImpl implements NgAlainService {
172 */ 175 */
173 private String urlToRouteName(String url) { 176 private String urlToRouteName(String url) {
174 if(oConvertUtils.isNotEmpty(url)) { 177 if(oConvertUtils.isNotEmpty(url)) {
175 - if(url.startsWith("/")) { 178 + if(url.startsWith(SymbolConstant.SINGLE_SLASH)) {
176 url = url.substring(1); 179 url = url.substring(1);
177 } 180 }
178 url = url.replace("/", "-"); 181 url = url.replace("/", "-");
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/controller/OssFileController.java 0 → 100644
  1 +package org.jeecg.modules.oss.controller;
  2 +
  3 +import javax.servlet.http.HttpServletRequest;
  4 +
  5 +import org.apache.shiro.authz.annotation.RequiresRoles;
  6 +import org.jeecg.common.api.vo.Result;
  7 +import org.jeecg.common.system.query.QueryGenerator;
  8 +import org.jeecg.modules.oss.entity.OssFile;
  9 +import org.jeecg.modules.oss.service.IOssFileService;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.stereotype.Controller;
  12 +import org.springframework.web.bind.annotation.*;
  13 +import org.springframework.web.multipart.MultipartFile;
  14 +
  15 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  16 +import com.baomidou.mybatisplus.core.metadata.IPage;
  17 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  18 +
  19 +import lombok.extern.slf4j.Slf4j;
  20 +
  21 +/**
  22 + * 云存储示例 DEMO
  23 + * @author: jeecg-boot
  24 + */
  25 +@Slf4j
  26 +@Controller
  27 +@RequestMapping("/sys/oss/file")
  28 +public class OssFileController {
  29 +
  30 + @Autowired
  31 + private IOssFileService ossFileService;
  32 +
  33 + @ResponseBody
  34 + @GetMapping("/list")
  35 + public Result<IPage<OssFile>> queryPageList(OssFile file,
  36 + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
  37 + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) {
  38 + Result<IPage<OssFile>> result = new Result<>();
  39 + QueryWrapper<OssFile> queryWrapper = QueryGenerator.initQueryWrapper(file, req.getParameterMap());
  40 + Page<OssFile> page = new Page<>(pageNo, pageSize);
  41 + IPage<OssFile> pageList = ossFileService.page(page, queryWrapper);
  42 + result.setSuccess(true);
  43 + result.setResult(pageList);
  44 + return result;
  45 + }
  46 +
  47 + @ResponseBody
  48 + @PostMapping("/upload")
  49 + //@RequiresRoles("admin")
  50 + public Result upload(@RequestParam("file") MultipartFile multipartFile) {
  51 + Result result = new Result();
  52 + try {
  53 + ossFileService.upload(multipartFile);
  54 + result.success("上传成功!");
  55 + }
  56 + catch (Exception ex) {
  57 + log.info(ex.getMessage(), ex);
  58 + result.error500("上传失败");
  59 + }
  60 + return result;
  61 + }
  62 +
  63 + @ResponseBody
  64 + @DeleteMapping("/delete")
  65 + public Result delete(@RequestParam(name = "id") String id) {
  66 + Result result = new Result();
  67 + OssFile file = ossFileService.getById(id);
  68 + if (file == null) {
  69 + result.error500("未找到对应实体");
  70 + }else {
  71 + boolean ok = ossFileService.delete(file);
  72 + result.success("删除成功!");
  73 + }
  74 + return result;
  75 + }
  76 +
  77 + /**
  78 + * 通过id查询.
  79 + */
  80 + @ResponseBody
  81 + @GetMapping("/queryById")
  82 + public Result<OssFile> queryById(@RequestParam(name = "id") String id) {
  83 + Result<OssFile> result = new Result<>();
  84 + OssFile file = ossFileService.getById(id);
  85 + if (file == null) {
  86 + result.error500("未找到对应实体");
  87 + }
  88 + else {
  89 + result.setResult(file);
  90 + result.setSuccess(true);
  91 + }
  92 + return result;
  93 + }
  94 +
  95 +}
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/entity/OssFile.java 0 → 100644
  1 +package org.jeecg.modules.oss.entity;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.TableName;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.experimental.Accessors;
  7 +import org.jeecg.common.system.base.entity.JeecgEntity;
  8 +import org.jeecgframework.poi.excel.annotation.Excel;
  9 +
  10 +/**
  11 + * @Description: oss云存储实体类
  12 + * @author: jeecg-boot
  13 + */
  14 +@Data
  15 +@TableName("oss_file")
  16 +@EqualsAndHashCode(callSuper = false)
  17 +@Accessors(chain = true)
  18 +public class OssFile extends JeecgEntity {
  19 +
  20 + private static final long serialVersionUID = 1L;
  21 +
  22 + @Excel(name = "文件名称")
  23 + private String fileName;
  24 +
  25 + @Excel(name = "文件地址")
  26 + private String url;
  27 +
  28 +}
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/mapper/OssFileMapper.java 0 → 100644
  1 +package org.jeecg.modules.oss.mapper;
  2 +
  3 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4 +import org.jeecg.modules.oss.entity.OssFile;
  5 +
  6 +/**
  7 + * @Description: oss云存储Mapper
  8 + * @author: jeecg-boot
  9 + */
  10 +public interface OssFileMapper extends BaseMapper<OssFile> {
  11 +
  12 +}
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/service/IOssFileService.java 0 → 100644
  1 +package org.jeecg.modules.oss.service;
  2 +
  3 +import java.io.IOException;
  4 +
  5 +import com.baomidou.mybatisplus.extension.service.IService;
  6 +import org.jeecg.modules.oss.entity.OssFile;
  7 +import org.springframework.web.multipart.MultipartFile;
  8 +
  9 +/**
  10 + * @Description: OOS云存储service接口
  11 + * @author: jeecg-boot
  12 + */
  13 +public interface IOssFileService extends IService<OssFile> {
  14 +
  15 + /**
  16 + * oss文件上传
  17 + * @param multipartFile
  18 + * @throws IOException
  19 + */
  20 + void upload(MultipartFile multipartFile) throws IOException;
  21 +
  22 + /**
  23 + * oss文件删除
  24 + * @param ossFile OSSFile对象
  25 + * @return
  26 + */
  27 + boolean delete(OssFile ossFile);
  28 +
  29 +}
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oss/service/impl/OssFileServiceImpl.java 0 → 100644
  1 +package org.jeecg.modules.oss.service.impl;
  2 +
  3 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4 +import org.jeecg.common.util.CommonUtils;
  5 +import org.jeecg.common.util.oss.OssBootUtil;
  6 +import org.jeecg.modules.oss.entity.OssFile;
  7 +import org.jeecg.modules.oss.mapper.OssFileMapper;
  8 +import org.jeecg.modules.oss.service.IOssFileService;
  9 +import org.springframework.stereotype.Service;
  10 +import org.springframework.web.multipart.MultipartFile;
  11 +
  12 +import java.io.IOException;
  13 +
  14 +/**
  15 + * @Description: OSS云存储实现类
  16 + * @author: jeecg-boot
  17 + */
  18 +@Service("ossFileService")
  19 +public class OssFileServiceImpl extends ServiceImpl<OssFileMapper, OssFile> implements IOssFileService {
  20 +
  21 + @Override
  22 + public void upload(MultipartFile multipartFile) throws IOException {
  23 + String fileName = multipartFile.getOriginalFilename();
  24 + fileName = CommonUtils.getFileName(fileName);
  25 + OssFile ossFile = new OssFile();
  26 + ossFile.setFileName(fileName);
  27 + String url = OssBootUtil.upload(multipartFile,"upload/test");
  28 + //update-begin--Author:scott Date:20201227 for:JT-361【文件预览】阿里云原生域名可以文件预览,自己映射域名kkfileview提示文件下载失败-------------------
  29 + // 返回阿里云原生域名前缀URL
  30 + ossFile.setUrl(OssBootUtil.getOriginalUrl(url));
  31 + //update-end--Author:scott Date:20201227 for:JT-361【文件预览】阿里云原生域名可以文件预览,自己映射域名kkfileview提示文件下载失败-------------------
  32 + this.save(ossFile);
  33 + }
  34 +
  35 + @Override
  36 + public boolean delete(OssFile ossFile) {
  37 + try {
  38 + this.removeById(ossFile.getId());
  39 + OssBootUtil.deleteUrl(ossFile.getUrl());
  40 + }
  41 + catch (Exception ex) {
  42 + log.error(ex.getMessage(),ex);
  43 + return false;
  44 + }
  45 + return true;
  46 + }
  47 +
  48 +}
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java
@@ -10,6 +10,7 @@ import org.apache.shiro.SecurityUtils; @@ -10,6 +10,7 @@ import org.apache.shiro.SecurityUtils;
10 import org.apache.shiro.authz.annotation.RequiresRoles; 10 import org.apache.shiro.authz.annotation.RequiresRoles;
11 import org.jeecg.common.api.vo.Result; 11 import org.jeecg.common.api.vo.Result;
12 import org.jeecg.common.constant.CommonConstant; 12 import org.jeecg.common.constant.CommonConstant;
  13 +import org.jeecg.common.constant.SymbolConstant;
13 import org.jeecg.common.system.query.QueryGenerator; 14 import org.jeecg.common.system.query.QueryGenerator;
14 import org.jeecg.common.system.vo.LoginUser; 15 import org.jeecg.common.system.vo.LoginUser;
15 import org.jeecg.common.util.ImportExcelUtil; 16 import org.jeecg.common.util.ImportExcelUtil;
@@ -132,7 +133,7 @@ public class QuartzJobController { @@ -132,7 +133,7 @@ public class QuartzJobController {
132 if (ids == null || "".equals(ids.trim())) { 133 if (ids == null || "".equals(ids.trim())) {
133 return Result.error("参数不识别!"); 134 return Result.error("参数不识别!");
134 } 135 }
135 - for (String id : Arrays.asList(ids.split(","))) { 136 + for (String id : Arrays.asList(ids.split(SymbolConstant.COMMA))) {
136 QuartzJob job = quartzJobService.getById(id); 137 QuartzJob job = quartzJobService.getById(id);
137 quartzJobService.deleteAndStopJob(job); 138 quartzJobService.deleteAndStopJob(job);
138 } 139 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/CommonController.java
@@ -5,8 +5,8 @@ import com.alibaba.fastjson.JSONObject; @@ -5,8 +5,8 @@ import com.alibaba.fastjson.JSONObject;
5 import lombok.extern.slf4j.Slf4j; 5 import lombok.extern.slf4j.Slf4j;
6 import org.jeecg.common.api.vo.Result; 6 import org.jeecg.common.api.vo.Result;
7 import org.jeecg.common.constant.CommonConstant; 7 import org.jeecg.common.constant.CommonConstant;
  8 +import org.jeecg.common.constant.SymbolConstant;
8 import org.jeecg.common.exception.JeecgBootException; 9 import org.jeecg.common.exception.JeecgBootException;
9 -import org.jeecg.common.system.api.ISysBaseAPI;  
10 import org.jeecg.common.util.CommonUtils; 10 import org.jeecg.common.util.CommonUtils;
11 import org.jeecg.common.util.RestUtil; 11 import org.jeecg.common.util.RestUtil;
12 import org.jeecg.common.util.TokenUtils; 12 import org.jeecg.common.util.TokenUtils;
@@ -72,8 +72,10 @@ public class CommonController { @@ -72,8 +72,10 @@ public class CommonController {
72 String bizPath = request.getParameter("biz"); 72 String bizPath = request.getParameter("biz");
73 73
74 //LOWCOD-2580 sys/common/upload接口存在任意文件上传漏洞 74 //LOWCOD-2580 sys/common/upload接口存在任意文件上传漏洞
75 - if (oConvertUtils.isNotEmpty(bizPath) && (bizPath.contains("../") || bizPath.contains("..\\"))) {  
76 - throw new JeecgBootException("上传目录bizPath,格式非法!"); 75 + if (oConvertUtils.isNotEmpty(bizPath)) {
  76 + if(bizPath.contains(SymbolConstant.SPOT_SINGLE_SLASH) || bizPath.contains(SymbolConstant.SPOT_DOUBLE_BACKSLASH)){
  77 + throw new JeecgBootException("上传目录bizPath,格式非法!");
  78 + }
77 } 79 }
78 80
79 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; 81 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
@@ -138,7 +140,7 @@ public class CommonController { @@ -138,7 +140,7 @@ public class CommonController {
138 // 获取文件名 140 // 获取文件名
139 String orgName = mf.getOriginalFilename(); 141 String orgName = mf.getOriginalFilename();
140 orgName = CommonUtils.getFileName(orgName); 142 orgName = CommonUtils.getFileName(orgName);
141 - if(orgName.indexOf(".")!=-1){ 143 + if(orgName.indexOf(SymbolConstant.SPOT)!=-1){
142 fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(".")); 144 fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));
143 }else{ 145 }else{
144 fileName = orgName+ "_" + System.currentTimeMillis(); 146 fileName = orgName+ "_" + System.currentTimeMillis();
@@ -152,8 +154,8 @@ public class CommonController { @@ -152,8 +154,8 @@ public class CommonController {
152 }else{ 154 }else{
153 dbpath = fileName; 155 dbpath = fileName;
154 } 156 }
155 - if (dbpath.contains("\\")) {  
156 - dbpath = dbpath.replace("\\", "/"); 157 + if (dbpath.contains(SymbolConstant.DOUBLE_BACKSLASH)) {
  158 + dbpath = dbpath.replace(SymbolConstant.DOUBLE_BACKSLASH, SymbolConstant.SINGLE_SLASH);
157 } 159 }
158 return dbpath; 160 return dbpath;
159 } catch (IOException e) { 161 } catch (IOException e) {
@@ -210,7 +212,7 @@ public class CommonController { @@ -210,7 +212,7 @@ public class CommonController {
210 public void view(HttpServletRequest request, HttpServletResponse response) { 212 public void view(HttpServletRequest request, HttpServletResponse response) {
211 // ISO-8859-1 ==> UTF-8 进行编码转换 213 // ISO-8859-1 ==> UTF-8 进行编码转换
212 String imgPath = extractPathFromPattern(request); 214 String imgPath = extractPathFromPattern(request);
213 - if(oConvertUtils.isEmpty(imgPath) || imgPath=="null"){ 215 + if(oConvertUtils.isEmpty(imgPath) || CommonConstant.STRING_NULL.equals(imgPath)){
214 return; 216 return;
215 } 217 }
216 // 其余处理略 218 // 其余处理略
@@ -218,7 +220,7 @@ public class CommonController { @@ -218,7 +220,7 @@ public class CommonController {
218 OutputStream outputStream = null; 220 OutputStream outputStream = null;
219 try { 221 try {
220 imgPath = imgPath.replace("..", "").replace("../",""); 222 imgPath = imgPath.replace("..", "").replace("../","");
221 - if (imgPath.endsWith(",")) { 223 + if (imgPath.endsWith(SymbolConstant.COMMA)) {
222 imgPath = imgPath.substring(0, imgPath.length() - 1); 224 imgPath = imgPath.substring(0, imgPath.length() - 1);
223 } 225 }
224 String filePath = uploadpath + File.separator + imgPath; 226 String filePath = uploadpath + File.separator + imgPath;
@@ -349,7 +351,7 @@ public class CommonController { @@ -349,7 +351,7 @@ public class CommonController {
349 * @return 351 * @return
350 */ 352 */
351 @RequestMapping("/transitRESTful") 353 @RequestMapping("/transitRESTful")
352 - public Result transitRESTful(@RequestParam("url") String url, HttpServletRequest request) { 354 + public Result transitRestful(@RequestParam("url") String url, HttpServletRequest request) {
353 try { 355 try {
354 ServletServerHttpRequest httpRequest = new ServletServerHttpRequest(request); 356 ServletServerHttpRequest httpRequest = new ServletServerHttpRequest(request);
355 // 中转请求method、body 357 // 中转请求method、body
@@ -368,8 +370,8 @@ public class CommonController { @@ -368,8 +370,8 @@ public class CommonController {
368 HttpHeaders headers = new HttpHeaders(); 370 HttpHeaders headers = new HttpHeaders();
369 headers.set("X-Access-Token", token); 371 headers.set("X-Access-Token", token);
370 // 发送请求 372 // 发送请求
371 - String httpURL = URLDecoder.decode(url, "UTF-8");  
372 - ResponseEntity<String> response = RestUtil.request(httpURL, method, headers , variables, params, String.class); 373 + String httpUrl = URLDecoder.decode(url, "UTF-8");
  374 + ResponseEntity<String> response = RestUtil.request(httpUrl, method, headers , variables, params, String.class);
373 // 封装返回结果 375 // 封装返回结果
374 Result<Object> result = new Result<>(); 376 Result<Object> result = new Result<>();
375 int statusCode = response.getStatusCodeValue(); 377 int statusCode = response.getStatusCodeValue();
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/LoginController.java
@@ -12,12 +12,14 @@ import org.apache.shiro.SecurityUtils; @@ -12,12 +12,14 @@ import org.apache.shiro.SecurityUtils;
12 import org.jeecg.common.api.vo.Result; 12 import org.jeecg.common.api.vo.Result;
13 import org.jeecg.common.constant.CacheConstant; 13 import org.jeecg.common.constant.CacheConstant;
14 import org.jeecg.common.constant.CommonConstant; 14 import org.jeecg.common.constant.CommonConstant;
  15 +import org.jeecg.common.constant.SymbolConstant;
15 import org.jeecg.common.system.util.JwtUtil; 16 import org.jeecg.common.system.util.JwtUtil;
16 import org.jeecg.common.system.vo.LoginUser; 17 import org.jeecg.common.system.vo.LoginUser;
17 import org.jeecg.common.util.*; 18 import org.jeecg.common.util.*;
18 import org.jeecg.common.util.encryption.EncryptedString; 19 import org.jeecg.common.util.encryption.EncryptedString;
19 import org.jeecg.modules.base.service.BaseCommonService; 20 import org.jeecg.modules.base.service.BaseCommonService;
20 import org.jeecg.modules.system.entity.SysDepart; 21 import org.jeecg.modules.system.entity.SysDepart;
  22 +import org.jeecg.modules.system.entity.SysRoleIndex;
21 import org.jeecg.modules.system.entity.SysTenant; 23 import org.jeecg.modules.system.entity.SysTenant;
22 import org.jeecg.modules.system.entity.SysUser; 24 import org.jeecg.modules.system.entity.SysUser;
23 import org.jeecg.modules.system.model.SysLoginModel; 25 import org.jeecg.modules.system.model.SysLoginModel;
@@ -26,6 +28,7 @@ import org.jeecg.modules.system.service.impl.SysBaseApiImpl; @@ -26,6 +28,7 @@ import org.jeecg.modules.system.service.impl.SysBaseApiImpl;
26 import org.jeecg.modules.system.util.RandImageUtil; 28 import org.jeecg.modules.system.util.RandImageUtil;
27 import org.springframework.beans.BeanUtils; 29 import org.springframework.beans.BeanUtils;
28 import org.springframework.beans.factory.annotation.Autowired; 30 import org.springframework.beans.factory.annotation.Autowired;
  31 +import org.springframework.http.HttpStatus;
29 import org.springframework.web.bind.annotation.*; 32 import org.springframework.web.bind.annotation.*;
30 33
31 import javax.annotation.Resource; 34 import javax.annotation.Resource;
@@ -59,6 +62,8 @@ public class LoginController { @@ -59,6 +62,8 @@ public class LoginController {
59 @Resource 62 @Resource
60 private BaseCommonService baseCommonService; 63 private BaseCommonService baseCommonService;
61 64
  65 + private final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890";
  66 +
62 @ApiOperation("登录接口") 67 @ApiOperation("登录接口")
63 @RequestMapping(value = "/login", method = RequestMethod.POST) 68 @RequestMapping(value = "/login", method = RequestMethod.POST)
64 public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel){ 69 public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel){
@@ -83,6 +88,8 @@ public class LoginController { @@ -83,6 +88,8 @@ public class LoginController {
83 if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) { 88 if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) {
84 log.warn("验证码错误,key= {} , Ui checkCode= {}, Redis checkCode = {}", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode); 89 log.warn("验证码错误,key= {} , Ui checkCode= {}, Redis checkCode = {}", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode);
85 result.error500("验证码错误"); 90 result.error500("验证码错误");
  91 + // 改成特殊的code 便于前端判断
  92 + result.setCode(HttpStatus.PRECONDITION_FAILED.value());
86 return result; 93 return result;
87 } 94 }
88 //update-end-author:taoyan date:20190828 for:校验验证码 95 //update-end-author:taoyan date:20190828 for:校验验证码
@@ -97,7 +104,7 @@ public class LoginController { @@ -97,7 +104,7 @@ public class LoginController {
97 if(!result.isSuccess()) { 104 if(!result.isSuccess()) {
98 return result; 105 return result;
99 } 106 }
100 - 107 +
101 //2. 校验用户名或密码是否正确 108 //2. 校验用户名或密码是否正确
102 String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt()); 109 String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt());
103 String syspassword = sysUser.getPassword(); 110 String syspassword = sysUser.getPassword();
@@ -130,6 +137,21 @@ public class LoginController { @@ -130,6 +137,21 @@ public class LoginController {
130 // 根据用户名查询用户信息 137 // 根据用户名查询用户信息
131 SysUser sysUser = sysUserService.getUserByName(username); 138 SysUser sysUser = sysUserService.getUserByName(username);
132 JSONObject obj=new JSONObject(); 139 JSONObject obj=new JSONObject();
  140 +
  141 + //update-begin---author:scott ---date:2022-06-20 for:vue3前端,支持自定义首页-----------
  142 + String version = request.getHeader(CommonConstant.VERSION);
  143 + //update-begin---author:liusq ---date:2022-06-29 for:接口返回值修改,同步修改这里的判断逻辑-----------
  144 + SysRoleIndex roleIndex = sysUserService.getDynamicIndexByUserRole(username, version);
  145 + if (oConvertUtils.isNotEmpty(version) && roleIndex != null && oConvertUtils.isNotEmpty(roleIndex.getUrl())) {
  146 + String homePath = roleIndex.getUrl();
  147 + if (!homePath.startsWith(SymbolConstant.SINGLE_SLASH)) {
  148 + homePath = SymbolConstant.SINGLE_SLASH + homePath;
  149 + }
  150 + sysUser.setHomePath(homePath);
  151 + }
  152 + //update-begin---author:liusq ---date:2022-06-29 for:接口返回值修改,同步修改这里的判断逻辑-----------
  153 + //update-end---author:scott ---date::2022-06-20 for:vue3前端,支持自定义首页--------------
  154 +
133 obj.put("userInfo",sysUser); 155 obj.put("userInfo",sysUser);
134 obj.put("sysAllDictItems", sysDictService.queryAllDictItems()); 156 obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
135 result.setResult(obj); 157 result.setResult(obj);
@@ -294,7 +316,8 @@ public class LoginController { @@ -294,7 +316,8 @@ public class LoginController {
294 result = sysUserService.checkUserIsEffective(sysUser); 316 result = sysUserService.checkUserIsEffective(sysUser);
295 if(!result.isSuccess()) { 317 if(!result.isSuccess()) {
296 String message = result.getMessage(); 318 String message = result.getMessage();
297 - if("该用户不存在,请注册".equals(message)){ 319 + String userNotExist="该用户不存在,请注册";
  320 + if(userNotExist.equals(message)){
298 result.error500("该用户不存在或未绑定手机号"); 321 result.error500("该用户不存在或未绑定手机号");
299 } 322 }
300 return result; 323 return result;
@@ -400,7 +423,7 @@ public class LoginController { @@ -400,7 +423,7 @@ public class LoginController {
400 String tenantIds = sysUser.getRelTenantIds(); 423 String tenantIds = sysUser.getRelTenantIds();
401 if (oConvertUtils.isNotEmpty(tenantIds)) { 424 if (oConvertUtils.isNotEmpty(tenantIds)) {
402 List<Integer> tenantIdList = new ArrayList<>(); 425 List<Integer> tenantIdList = new ArrayList<>();
403 - for(String id: tenantIds.split(",")){ 426 + for(String id: tenantIds.split(SymbolConstant.COMMA)){
404 tenantIdList.add(Integer.valueOf(id)); 427 tenantIdList.add(Integer.valueOf(id));
405 } 428 }
406 // 该方法仅查询有效的租户,如果返回0个就说明所有的租户均无效。 429 // 该方法仅查询有效的租户,如果返回0个就说明所有的租户均无效。
@@ -451,7 +474,6 @@ public class LoginController { @@ -451,7 +474,6 @@ public class LoginController {
451 Result<String> res = new Result<String>(); 474 Result<String> res = new Result<String>();
452 try { 475 try {
453 //生成验证码 476 //生成验证码
454 - final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890";  
455 String code = RandomUtil.randomString(BASE_CHECK_CODES,4); 477 String code = RandomUtil.randomString(BASE_CHECK_CODES,4);
456 478
457 //存到redis中 479 //存到redis中
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java
@@ -27,7 +27,7 @@ import org.jeecg.modules.system.service.ISysAnnouncementService; @@ -27,7 +27,7 @@ import org.jeecg.modules.system.service.ISysAnnouncementService;
27 import org.jeecg.modules.system.service.impl.SysBaseApiImpl; 27 import org.jeecg.modules.system.service.impl.SysBaseApiImpl;
28 import org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl; 28 import org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl;
29 import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl; 29 import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl;
30 -import org.jeecg.modules.system.util.XSSUtils; 30 +import org.jeecg.modules.system.util.XssUtils;
31 import org.jeecgframework.poi.excel.ExcelImportUtil; 31 import org.jeecgframework.poi.excel.ExcelImportUtil;
32 import org.jeecgframework.poi.excel.def.NormalExcelConstants; 32 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
33 import org.jeecgframework.poi.excel.entity.ExportParams; 33 import org.jeecgframework.poi.excel.entity.ExportParams;
@@ -125,7 +125,7 @@ public class SysAnnouncementController { @@ -125,7 +125,7 @@ public class SysAnnouncementController {
125 Result<SysAnnouncement> result = new Result<SysAnnouncement>(); 125 Result<SysAnnouncement> result = new Result<SysAnnouncement>();
126 try { 126 try {
127 // update-begin-author:liusq date:20210804 for:标题处理xss攻击的问题 127 // update-begin-author:liusq date:20210804 for:标题处理xss攻击的问题
128 - String title = XSSUtils.striptXSS(sysAnnouncement.getTitile()); 128 + String title = XssUtils.scriptXss(sysAnnouncement.getTitile());
129 sysAnnouncement.setTitile(title); 129 sysAnnouncement.setTitile(title);
130 // update-end-author:liusq date:20210804 for:标题处理xss攻击的问题 130 // update-end-author:liusq date:20210804 for:标题处理xss攻击的问题
131 sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); 131 sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString());
@@ -153,7 +153,7 @@ public class SysAnnouncementController { @@ -153,7 +153,7 @@ public class SysAnnouncementController {
153 result.error500("未找到对应实体"); 153 result.error500("未找到对应实体");
154 }else { 154 }else {
155 // update-begin-author:liusq date:20210804 for:标题处理xss攻击的问题 155 // update-begin-author:liusq date:20210804 for:标题处理xss攻击的问题
156 - String title = XSSUtils.striptXSS(sysAnnouncement.getTitile()); 156 + String title = XssUtils.scriptXss(sysAnnouncement.getTitile());
157 sysAnnouncement.setTitile(title); 157 sysAnnouncement.setTitile(title);
158 // update-end-author:liusq date:20210804 for:标题处理xss攻击的问题 158 // update-end-author:liusq date:20210804 for:标题处理xss攻击的问题
159 boolean ok = sysAnnouncementService.upDateAnnouncement(sysAnnouncement); 159 boolean ok = sysAnnouncementService.upDateAnnouncement(sysAnnouncement);
@@ -488,15 +488,15 @@ public class SysAnnouncementController { @@ -488,15 +488,15 @@ public class SysAnnouncementController {
488 public ModelAndView showContent(ModelAndView modelAndView, @PathVariable("id") String id, HttpServletRequest request) { 488 public ModelAndView showContent(ModelAndView modelAndView, @PathVariable("id") String id, HttpServletRequest request) {
489 SysAnnouncement announcement = sysAnnouncementService.getById(id); 489 SysAnnouncement announcement = sysAnnouncementService.getById(id);
490 if (announcement != null) { 490 if (announcement != null) {
491 - boolean tokenOK = false; 491 + boolean tokenOk = false;
492 try { 492 try {
493 // 验证Token有效性 493 // 验证Token有效性
494 - tokenOK = TokenUtils.verifyToken(request, sysBaseApi, redisUtil); 494 + tokenOk = TokenUtils.verifyToken(request, sysBaseApi, redisUtil);
495 } catch (Exception ignored) { 495 } catch (Exception ignored) {
496 } 496 }
497 // 判断是否传递了Token,并且Token有效,如果传了就不做查看限制,直接返回 497 // 判断是否传递了Token,并且Token有效,如果传了就不做查看限制,直接返回
498 // 如果Token无效,就做查看限制:只能查看已发布的 498 // 如果Token无效,就做查看限制:只能查看已发布的
499 - if (tokenOK || ANNOUNCEMENT_SEND_STATUS_1.equals(announcement.getSendStatus())) { 499 + if (tokenOk || ANNOUNCEMENT_SEND_STATUS_1.equals(announcement.getSendStatus())) {
500 modelAndView.addObject("data", announcement); 500 modelAndView.addObject("data", announcement);
501 modelAndView.setViewName("announcement/showContent"); 501 modelAndView.setViewName("announcement/showContent");
502 return modelAndView; 502 return modelAndView;
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementSendController.java
@@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletRequest; @@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletRequest;
8 import org.apache.shiro.SecurityUtils; 8 import org.apache.shiro.SecurityUtils;
9 import org.jeecg.common.api.vo.Result; 9 import org.jeecg.common.api.vo.Result;
10 import org.jeecg.common.constant.CommonConstant; 10 import org.jeecg.common.constant.CommonConstant;
  11 +import org.jeecg.common.constant.DataBaseConstant;
11 import org.jeecg.common.constant.WebsocketConst; 12 import org.jeecg.common.constant.WebsocketConst;
12 import org.jeecg.common.system.vo.LoginUser; 13 import org.jeecg.common.system.vo.LoginUser;
13 import org.jeecg.common.util.SqlInjectionUtil; 14 import org.jeecg.common.util.SqlInjectionUtil;
@@ -76,7 +77,7 @@ public class SysAnnouncementSendController { @@ -76,7 +77,7 @@ public class SysAnnouncementSendController {
76 SqlInjectionUtil.filterContent(order); 77 SqlInjectionUtil.filterContent(order);
77 78
78 if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { 79 if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) {
79 - if("asc".equals(order)) { 80 + if(DataBaseConstant.SQL_ASC.equals(order)) {
80 queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); 81 queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column));
81 }else { 82 }else {
82 queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); 83 queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column));
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java
@@ -14,6 +14,7 @@ import org.jeecg.common.system.query.QueryGenerator; @@ -14,6 +14,7 @@ import org.jeecg.common.system.query.QueryGenerator;
14 import org.jeecg.common.system.vo.DictModel; 14 import org.jeecg.common.system.vo.DictModel;
15 import org.jeecg.common.system.vo.LoginUser; 15 import org.jeecg.common.system.vo.LoginUser;
16 import org.jeecg.common.util.ImportExcelUtil; 16 import org.jeecg.common.util.ImportExcelUtil;
  17 +import org.jeecg.common.util.SqlInjectionUtil;
17 import org.jeecg.common.util.oConvertUtils; 18 import org.jeecg.common.util.oConvertUtils;
18 import org.jeecg.modules.system.entity.SysCategory; 19 import org.jeecg.modules.system.entity.SysCategory;
19 import org.jeecg.modules.system.model.TreeSelectModel; 20 import org.jeecg.modules.system.model.TreeSelectModel;
@@ -47,7 +48,12 @@ import java.util.stream.Collectors; @@ -47,7 +48,12 @@ import java.util.stream.Collectors;
47 public class SysCategoryController { 48 public class SysCategoryController {
48 @Autowired 49 @Autowired
49 private ISysCategoryService sysCategoryService; 50 private ISysCategoryService sysCategoryService;
50 - 51 +
  52 + /**
  53 + * 分类编码0
  54 + */
  55 + private static final String CATEGORY_ROOT_CODE = "0";
  56 +
51 /** 57 /**
52 * 分页列表查询 58 * 分页列表查询
53 * @param sysCategory 59 * @param sysCategory
@@ -294,7 +300,12 @@ public class SysCategoryController { @@ -294,7 +300,12 @@ public class SysCategoryController {
294 public Result<SysCategory> loadOne(@RequestParam(name="field") String field,@RequestParam(name="val") String val) { 300 public Result<SysCategory> loadOne(@RequestParam(name="field") String field,@RequestParam(name="val") String val) {
295 Result<SysCategory> result = new Result<SysCategory>(); 301 Result<SysCategory> result = new Result<SysCategory>();
296 try { 302 try {
297 - 303 + //update-begin-author:taoyan date:2022-5-6 for: issues/3663 sql注入问题
  304 + boolean isClassField = SqlInjectionUtil.isClassField(field, SysCategory.class);
  305 + if (!isClassField) {
  306 + return Result.error("字段无效,请检查!");
  307 + }
  308 + //update-end-author:taoyan date:2022-5-6 for: issues/3663 sql注入问题
298 QueryWrapper<SysCategory> query = new QueryWrapper<SysCategory>(); 309 QueryWrapper<SysCategory> query = new QueryWrapper<SysCategory>();
299 query.eq(field, val); 310 query.eq(field, val);
300 List<SysCategory> ls = this.sysCategoryService.list(query); 311 List<SysCategory> ls = this.sysCategoryService.list(query);
@@ -463,7 +474,7 @@ public class SysCategoryController { @@ -463,7 +474,7 @@ public class SysCategoryController {
463 public Result<List<DictModel>> loadAllData(@RequestParam(name="code",required = true) String code) { 474 public Result<List<DictModel>> loadAllData(@RequestParam(name="code",required = true) String code) {
464 Result<List<DictModel>> result = new Result<List<DictModel>>(); 475 Result<List<DictModel>> result = new Result<List<DictModel>>();
465 LambdaQueryWrapper<SysCategory> query = new LambdaQueryWrapper<SysCategory>(); 476 LambdaQueryWrapper<SysCategory> query = new LambdaQueryWrapper<SysCategory>();
466 - if(oConvertUtils.isNotEmpty(code) && !"0".equals(code)){ 477 + if(oConvertUtils.isNotEmpty(code) && !CATEGORY_ROOT_CODE.equals(code)){
467 query.likeRight(SysCategory::getCode,code); 478 query.likeRight(SysCategory::getCode,code);
468 } 479 }
469 List<SysCategory> list = this.sysCategoryService.list(query); 480 List<SysCategory> list = this.sysCategoryService.list(query);
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDataSourceController.java
1 package org.jeecg.modules.system.controller; 1 package org.jeecg.modules.system.controller;
2 2
3 -import cn.hutool.core.util.CharsetUtil;  
4 -import cn.hutool.core.util.HexUtil;  
5 -import cn.hutool.crypto.SecureUtil;  
6 -import cn.hutool.crypto.symmetric.SymmetricAlgorithm;  
7 -import cn.hutool.crypto.symmetric.SymmetricCrypto; 3 +
8 import com.alibaba.fastjson.JSONArray; 4 import com.alibaba.fastjson.JSONArray;
9 import com.alibaba.fastjson.JSONObject; 5 import com.alibaba.fastjson.JSONObject;
  6 +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
  7 +import com.baomidou.dynamic.datasource.creator.DruidDataSourceCreator;
  8 +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
10 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 9 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
11 import com.baomidou.mybatisplus.core.metadata.IPage; 10 import com.baomidou.mybatisplus.core.metadata.IPage;
12 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 11 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -29,6 +28,7 @@ import org.springframework.web.servlet.ModelAndView; @@ -29,6 +28,7 @@ import org.springframework.web.servlet.ModelAndView;
29 28
30 import javax.servlet.http.HttpServletRequest; 29 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse; 30 import javax.servlet.http.HttpServletResponse;
  31 +import javax.sql.DataSource;
32 import java.util.Arrays; 32 import java.util.Arrays;
33 import java.util.List; 33 import java.util.List;
34 34
@@ -69,18 +69,6 @@ public class SysDataSourceController extends JeecgController&lt;SysDataSource, ISys @@ -69,18 +69,6 @@ public class SysDataSourceController extends JeecgController&lt;SysDataSource, ISys
69 QueryWrapper<SysDataSource> queryWrapper = QueryGenerator.initQueryWrapper(sysDataSource, req.getParameterMap()); 69 QueryWrapper<SysDataSource> queryWrapper = QueryGenerator.initQueryWrapper(sysDataSource, req.getParameterMap());
70 Page<SysDataSource> page = new Page<>(pageNo, pageSize); 70 Page<SysDataSource> page = new Page<>(pageNo, pageSize);
71 IPage<SysDataSource> pageList = sysDataSourceService.page(page, queryWrapper); 71 IPage<SysDataSource> pageList = sysDataSourceService.page(page, queryWrapper);
72 - try {  
73 - List<SysDataSource> records = pageList.getRecords();  
74 - records.forEach(item->{  
75 - String dbPassword = item.getDbPassword();  
76 - if(StringUtils.isNotBlank(dbPassword)){  
77 - String decodedStr = SecurityUtil.jiemi(dbPassword);  
78 - item.setDbPassword(decodedStr);  
79 - }  
80 - });  
81 - } catch (Exception e) {  
82 - e.printStackTrace();  
83 - }  
84 return Result.ok(pageList); 72 return Result.ok(pageList);
85 } 73 }
86 74
@@ -109,17 +97,7 @@ public class SysDataSourceController extends JeecgController&lt;SysDataSource, ISys @@ -109,17 +97,7 @@ public class SysDataSourceController extends JeecgController&lt;SysDataSource, ISys
109 @ApiOperation(value = "多数据源管理-添加", notes = "多数据源管理-添加") 97 @ApiOperation(value = "多数据源管理-添加", notes = "多数据源管理-添加")
110 @PostMapping(value = "/add") 98 @PostMapping(value = "/add")
111 public Result<?> add(@RequestBody SysDataSource sysDataSource) { 99 public Result<?> add(@RequestBody SysDataSource sysDataSource) {
112 - try {  
113 - String dbPassword = sysDataSource.getDbPassword();  
114 - if(StringUtils.isNotBlank(dbPassword)){  
115 - String encrypt = SecurityUtil.jiami(dbPassword);  
116 - sysDataSource.setDbPassword(encrypt);  
117 - }  
118 - sysDataSourceService.save(sysDataSource);  
119 - } catch (Exception e) {  
120 - e.printStackTrace();  
121 - }  
122 - return Result.ok("添加成功!"); 100 + return sysDataSourceService.saveDataSource(sysDataSource);
123 } 101 }
124 102
125 /** 103 /**
@@ -132,19 +110,7 @@ public class SysDataSourceController extends JeecgController&lt;SysDataSource, ISys @@ -132,19 +110,7 @@ public class SysDataSourceController extends JeecgController&lt;SysDataSource, ISys
132 @ApiOperation(value = "多数据源管理-编辑", notes = "多数据源管理-编辑") 110 @ApiOperation(value = "多数据源管理-编辑", notes = "多数据源管理-编辑")
133 @RequestMapping(value = "/edit", method ={RequestMethod.PUT, RequestMethod.POST}) 111 @RequestMapping(value = "/edit", method ={RequestMethod.PUT, RequestMethod.POST})
134 public Result<?> edit(@RequestBody SysDataSource sysDataSource) { 112 public Result<?> edit(@RequestBody SysDataSource sysDataSource) {
135 - try {  
136 - SysDataSource d = sysDataSourceService.getById(sysDataSource.getId());  
137 - DataSourceCachePool.removeCache(d.getCode());  
138 - String dbPassword = sysDataSource.getDbPassword();  
139 - if(StringUtils.isNotBlank(dbPassword)){  
140 - String encrypt = SecurityUtil.jiami(dbPassword);  
141 - sysDataSource.setDbPassword(encrypt);  
142 - }  
143 - sysDataSourceService.updateById(sysDataSource);  
144 - } catch (Exception e) {  
145 - e.printStackTrace();  
146 - }  
147 - return Result.ok("编辑成功!"); 113 + return sysDataSourceService.editDataSource(sysDataSource);
148 } 114 }
149 115
150 /** 116 /**
@@ -157,10 +123,7 @@ public class SysDataSourceController extends JeecgController&lt;SysDataSource, ISys @@ -157,10 +123,7 @@ public class SysDataSourceController extends JeecgController&lt;SysDataSource, ISys
157 @ApiOperation(value = "多数据源管理-通过id删除", notes = "多数据源管理-通过id删除") 123 @ApiOperation(value = "多数据源管理-通过id删除", notes = "多数据源管理-通过id删除")
158 @DeleteMapping(value = "/delete") 124 @DeleteMapping(value = "/delete")
159 public Result<?> delete(@RequestParam(name = "id") String id) { 125 public Result<?> delete(@RequestParam(name = "id") String id) {
160 - SysDataSource sysDataSource = sysDataSourceService.getById(id);  
161 - DataSourceCachePool.removeCache(sysDataSource.getCode());  
162 - sysDataSourceService.removeById(id);  
163 - return Result.ok("删除成功!"); 126 + return sysDataSourceService.deleteDataSource(id);
164 } 127 }
165 128
166 /** 129 /**
@@ -191,8 +154,14 @@ public class SysDataSourceController extends JeecgController&lt;SysDataSource, ISys @@ -191,8 +154,14 @@ public class SysDataSourceController extends JeecgController&lt;SysDataSource, ISys
191 @AutoLog(value = "多数据源管理-通过id查询") 154 @AutoLog(value = "多数据源管理-通过id查询")
192 @ApiOperation(value = "多数据源管理-通过id查询", notes = "多数据源管理-通过id查询") 155 @ApiOperation(value = "多数据源管理-通过id查询", notes = "多数据源管理-通过id查询")
193 @GetMapping(value = "/queryById") 156 @GetMapping(value = "/queryById")
194 - public Result<?> queryById(@RequestParam(name = "id") String id) { 157 + public Result<?> queryById(@RequestParam(name = "id") String id) throws InterruptedException {
195 SysDataSource sysDataSource = sysDataSourceService.getById(id); 158 SysDataSource sysDataSource = sysDataSourceService.getById(id);
  159 + //密码解密
  160 + String dbPassword = sysDataSource.getDbPassword();
  161 + if(StringUtils.isNotBlank(dbPassword)){
  162 + String decodedStr = SecurityUtil.jiemi(dbPassword);
  163 + sysDataSource.setDbPassword(decodedStr);
  164 + }
196 return Result.ok(sysDataSource); 165 return Result.ok(sysDataSource);
197 } 166 }
198 167
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java
@@ -123,13 +123,14 @@ public class SysDepartController { @@ -123,13 +123,14 @@ public class SysDepartController {
123 * 异步查询部门list 123 * 异步查询部门list
124 * @param parentId 父节点 异步加载时传递 124 * @param parentId 父节点 异步加载时传递
125 * @param ids 前端回显是传递 125 * @param ids 前端回显是传递
  126 + * @param primaryKey 主键字段(id或者orgCode)
126 * @return 127 * @return
127 */ 128 */
128 @RequestMapping(value = "/queryDepartTreeSync", method = RequestMethod.GET) 129 @RequestMapping(value = "/queryDepartTreeSync", method = RequestMethod.GET)
129 - public Result<List<SysDepartTreeModel>> queryDepartTreeSync(@RequestParam(name = "pid", required = false) String parentId,@RequestParam(name = "ids", required = false) String ids) { 130 + public Result<List<SysDepartTreeModel>> queryDepartTreeSync(@RequestParam(name = "pid", required = false) String parentId,@RequestParam(name = "ids", required = false) String ids, @RequestParam(name = "primaryKey", required = false) String primaryKey) {
130 Result<List<SysDepartTreeModel>> result = new Result<>(); 131 Result<List<SysDepartTreeModel>> result = new Result<>();
131 try { 132 try {
132 - List<SysDepartTreeModel> list = sysDepartService.queryTreeListByPid(parentId,ids); 133 + List<SysDepartTreeModel> list = sysDepartService.queryTreeListByPid(parentId,ids, primaryKey);
133 result.setResult(list); 134 result.setResult(list);
134 result.setSuccess(true); 135 result.setSuccess(true);
135 } catch (Exception e) { 136 } catch (Exception e) {
@@ -460,7 +461,7 @@ public class SysDepartController { @@ -460,7 +461,7 @@ public class SysDepartController {
460 LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>(); 461 LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();
461 query.orderByAsc(SysDepart::getOrgCode); 462 query.orderByAsc(SysDepart::getOrgCode);
462 if(oConvertUtils.isNotEmpty(id)){ 463 if(oConvertUtils.isNotEmpty(id)){
463 - String arr[] = id.split(","); 464 + String[] arr = id.split(",");
464 query.in(SysDepart::getId,arr); 465 query.in(SysDepart::getId,arr);
465 } 466 }
466 List<SysDepart> ls = this.sysDepartService.list(query); 467 List<SysDepart> ls = this.sysDepartService.list(query);
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDepartPermissionController.java
@@ -237,7 +237,7 @@ public class SysDepartPermissionController extends JeecgController&lt;SysDepartPerm @@ -237,7 +237,7 @@ public class SysDepartPermissionController extends JeecgController&lt;SysDepartPerm
237 Result<List<String>> result = new Result<>(); 237 Result<List<String>> result = new Result<>();
238 try { 238 try {
239 List<SysDepartRolePermission> list = sysDepartRolePermissionService.list(new QueryWrapper<SysDepartRolePermission>().lambda().eq(SysDepartRolePermission::getRoleId, roleId)); 239 List<SysDepartRolePermission> list = sysDepartRolePermissionService.list(new QueryWrapper<SysDepartRolePermission>().lambda().eq(SysDepartRolePermission::getRoleId, roleId));
240 - result.setResult(list.stream().map(SysDepartRolePermission -> String.valueOf(SysDepartRolePermission.getPermissionId())).collect(Collectors.toList())); 240 + result.setResult(list.stream().map(sysDepartRolePermission -> String.valueOf(sysDepartRolePermission.getPermissionId())).collect(Collectors.toList()));
241 result.setSuccess(true); 241 result.setSuccess(true);
242 } catch (Exception e) { 242 } catch (Exception e) {
243 log.error(e.getMessage(), e); 243 log.error(e.getMessage(), e);
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysDictController.java
@@ -12,6 +12,7 @@ import org.apache.shiro.authz.annotation.RequiresRoles; @@ -12,6 +12,7 @@ import org.apache.shiro.authz.annotation.RequiresRoles;
12 import org.jeecg.common.api.vo.Result; 12 import org.jeecg.common.api.vo.Result;
13 import org.jeecg.common.constant.CacheConstant; 13 import org.jeecg.common.constant.CacheConstant;
14 import org.jeecg.common.constant.CommonConstant; 14 import org.jeecg.common.constant.CommonConstant;
  15 +import org.jeecg.common.constant.SymbolConstant;
15 import org.jeecg.common.system.query.QueryGenerator; 16 import org.jeecg.common.system.query.QueryGenerator;
16 import org.jeecg.common.system.vo.DictModel; 17 import org.jeecg.common.system.vo.DictModel;
17 import org.jeecg.common.system.vo.DictQuery; 18 import org.jeecg.common.system.vo.DictQuery;
@@ -277,8 +278,8 @@ public class SysDictController { @@ -277,8 +278,8 @@ public class SysDictController {
277 } 278 }
278 //update-end-author:taoyan date:20220317 for: VUEN-222【安全机制】字典接口、online报表、online图表等接口,加一些安全机制 279 //update-end-author:taoyan date:20220317 for: VUEN-222【安全机制】字典接口、online报表、online图表等接口,加一些安全机制
279 try { 280 try {
280 - if(dictCode.indexOf(",")!=-1) {  
281 - String[] params = dictCode.split(","); 281 + if(dictCode.indexOf(SymbolConstant.COMMA)!=-1) {
  282 + String[] params = dictCode.split(SymbolConstant.COMMA);
282 if(params.length!=3) { 283 if(params.length!=3) {
283 result.error500("字典Code格式不正确!"); 284 result.error500("字典Code格式不正确!");
284 return result; 285 return result;
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysLogController.java
@@ -6,6 +6,7 @@ import java.util.Arrays; @@ -6,6 +6,7 @@ import java.util.Arrays;
6 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletRequest;
7 7
8 import org.jeecg.common.api.vo.Result; 8 import org.jeecg.common.api.vo.Result;
  9 +import org.jeecg.common.constant.CommonConstant;
9 import org.jeecg.common.system.query.QueryGenerator; 10 import org.jeecg.common.system.query.QueryGenerator;
10 import org.jeecg.common.util.oConvertUtils; 11 import org.jeecg.common.util.oConvertUtils;
11 import org.jeecg.modules.system.entity.SysLog; 12 import org.jeecg.modules.system.entity.SysLog;
@@ -38,7 +39,12 @@ public class SysLogController { @@ -38,7 +39,12 @@ public class SysLogController {
38 39
39 @Autowired 40 @Autowired
40 private ISysLogService sysLogService; 41 private ISysLogService sysLogService;
41 - 42 +
  43 + /**
  44 + * 全部清除
  45 + */
  46 + private static final String ALL_ClEAR = "allclear";
  47 +
42 /** 48 /**
43 * @功能:查询日志记录 49 * @功能:查询日志记录
44 * @param syslog 50 * @param syslog
@@ -103,7 +109,7 @@ public class SysLogController { @@ -103,7 +109,7 @@ public class SysLogController {
103 if(ids==null || "".equals(ids.trim())) { 109 if(ids==null || "".equals(ids.trim())) {
104 result.error500("参数不识别!"); 110 result.error500("参数不识别!");
105 }else { 111 }else {
106 - if("allclear".equals(ids)) { 112 + if(ALL_ClEAR.equals(ids)) {
107 this.sysLogService.removeAll(); 113 this.sysLogService.removeAll();
108 result.success("清除成功!"); 114 result.success("清除成功!");
109 } 115 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java
1 package org.jeecg.modules.system.controller; 1 package org.jeecg.modules.system.controller;
2 2
  3 +import cn.hutool.core.util.ObjectUtil;
3 import com.alibaba.fastjson.JSONArray; 4 import com.alibaba.fastjson.JSONArray;
4 import com.alibaba.fastjson.JSONObject; 5 import com.alibaba.fastjson.JSONObject;
5 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 6 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -10,11 +11,12 @@ import org.apache.shiro.SecurityUtils; @@ -10,11 +11,12 @@ import org.apache.shiro.SecurityUtils;
10 import org.apache.shiro.authz.annotation.RequiresRoles; 11 import org.apache.shiro.authz.annotation.RequiresRoles;
11 import org.jeecg.common.api.vo.Result; 12 import org.jeecg.common.api.vo.Result;
12 import org.jeecg.common.constant.CommonConstant; 13 import org.jeecg.common.constant.CommonConstant;
  14 +import org.jeecg.common.constant.SymbolConstant;
13 import org.jeecg.common.constant.enums.RoleIndexConfigEnum; 15 import org.jeecg.common.constant.enums.RoleIndexConfigEnum;
14 import org.jeecg.common.system.vo.LoginUser; 16 import org.jeecg.common.system.vo.LoginUser;
15 import org.jeecg.common.util.Md5Util; 17 import org.jeecg.common.util.Md5Util;
16 import org.jeecg.common.util.oConvertUtils; 18 import org.jeecg.common.util.oConvertUtils;
17 -import org.jeecg.config.JeeccgBaseConfig; 19 +import org.jeecg.config.JeecgBaseConfig;
18 import org.jeecg.modules.base.service.BaseCommonService; 20 import org.jeecg.modules.base.service.BaseCommonService;
19 import org.jeecg.modules.system.entity.*; 21 import org.jeecg.modules.system.entity.*;
20 import org.jeecg.modules.system.model.SysPermissionTree; 22 import org.jeecg.modules.system.model.SysPermissionTree;
@@ -57,7 +59,7 @@ public class SysPermissionController { @@ -57,7 +59,7 @@ public class SysPermissionController {
57 private ISysUserService sysUserService; 59 private ISysUserService sysUserService;
58 60
59 @Autowired 61 @Autowired
60 - private JeeccgBaseConfig jeeccgBaseConfig; 62 + private JeecgBaseConfig jeecgBaseConfig;
61 63
62 @Autowired 64 @Autowired
63 private BaseCommonService baseCommonService; 65 private BaseCommonService baseCommonService;
@@ -65,6 +67,11 @@ public class SysPermissionController { @@ -65,6 +67,11 @@ public class SysPermissionController {
65 @Autowired 67 @Autowired
66 private ISysRoleIndexService sysRoleIndexService; 68 private ISysRoleIndexService sysRoleIndexService;
67 69
  70 + /**
  71 + * 子菜单
  72 + */
  73 + private static final String CHILDREN = "children";
  74 +
68 /** 75 /**
69 * 加载数据节点 76 * 加载数据节点
70 * 77 *
@@ -212,6 +219,7 @@ public class SysPermissionController { @@ -212,6 +219,7 @@ public class SysPermissionController {
212 * @return 219 * @return
213 */ 220 */
214 @RequestMapping(value = "/getUserPermissionByToken", method = RequestMethod.GET) 221 @RequestMapping(value = "/getUserPermissionByToken", method = RequestMethod.GET)
  222 + //@DynamicTable(value = DynamicTableConstant.SYS_ROLE_INDEX)
215 public Result<?> getUserPermissionByToken(HttpServletRequest request) { 223 public Result<?> getUserPermissionByToken(HttpServletRequest request) {
216 Result<JSONObject> result = new Result<JSONObject>(); 224 Result<JSONObject> result = new Result<JSONObject>();
217 try { 225 try {
@@ -229,14 +237,29 @@ public class SysPermissionController { @@ -229,14 +237,29 @@ public class SysPermissionController {
229 } 237 }
230 //update-end-author:taoyan date:20200211 for: TASK #3368 【路由缓存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存 238 //update-end-author:taoyan date:20200211 for: TASK #3368 【路由缓存】首页的缓存设置有问题,需要根据后台的路由配置来实现是否缓存
231 239
232 - //update-begin--Author:liusq Date:20210624 for:自定义首页地址LOWCOD-1578  
233 - List<String> roles = sysUserService.getRole(loginUser.getUsername());  
234 - String compUrl = RoleIndexConfigEnum.getIndexByRoles(roles);  
235 - if(StringUtils.isNotBlank(compUrl)){ 240 + //update-begin--Author:zyf Date:20220425 for:自定义首页地址 LOWCOD-1578
  241 + String version = request.getHeader(CommonConstant.VERSION);
  242 + //update-begin---author:liusq ---date:2022-06-29 for:接口返回值修改,同步修改这里的判断逻辑-----------
  243 + SysRoleIndex roleIndex= sysUserService.getDynamicIndexByUserRole(loginUser.getUsername(),version);
  244 + //update-end---author:liusq ---date:2022-06-29 for:接口返回值修改,同步修改这里的判断逻辑-----------
  245 + //update-end--Author:zyf Date:20220425 for:自定义首页地址 LOWCOD-1578
  246 +
  247 + if(roleIndex!=null){
236 List<SysPermission> menus = metaList.stream().filter(sysPermission -> "首页".equals(sysPermission.getName())).collect(Collectors.toList()); 248 List<SysPermission> menus = metaList.stream().filter(sysPermission -> "首页".equals(sysPermission.getName())).collect(Collectors.toList());
237 - menus.get(0).setComponent(compUrl); 249 + //update-begin---author:liusq ---date:2022-06-29 for:设置自定义首页地址和组件----------
  250 + String component = roleIndex.getComponent();
  251 + String routeUrl = roleIndex.getUrl();
  252 + boolean route = roleIndex.isRoute();
  253 + if(oConvertUtils.isNotEmpty(routeUrl)){
  254 + menus.get(0).setComponent(component);
  255 + menus.get(0).setRoute(route);
  256 + menus.get(0).setUrl(routeUrl);
  257 + }else{
  258 + menus.get(0).setComponent(component);
  259 + }
  260 + //update-end---author:liusq ---date:2022-06-29 for:设置自定义首页地址和组件-----------
238 } 261 }
239 - //update-end--Author:liusq Date:20210624 for:自定义首页地址LOWCOD-1578 262 +
240 JSONObject json = new JSONObject(); 263 JSONObject json = new JSONObject();
241 JSONArray menujsonArray = new JSONArray(); 264 JSONArray menujsonArray = new JSONArray();
242 this.getPermissionJsonArray(menujsonArray, metaList, null); 265 this.getPermissionJsonArray(menujsonArray, metaList, null);
@@ -259,7 +282,7 @@ public class SysPermissionController { @@ -259,7 +282,7 @@ public class SysPermissionController {
259 json.put("auth", authjsonArray); 282 json.put("auth", authjsonArray);
260 //全部权限配置集合(按钮权限,访问权限) 283 //全部权限配置集合(按钮权限,访问权限)
261 json.put("allAuth", allauthjsonArray); 284 json.put("allAuth", allauthjsonArray);
262 - json.put("sysSafeMode", jeeccgBaseConfig.getSafeMode()); 285 + json.put("sysSafeMode", jeecgBaseConfig.getSafeMode());
263 result.setResult(json); 286 result.setResult(json);
264 } catch (Exception e) { 287 } catch (Exception e) {
265 result.error500("查询失败:" + e.getMessage()); 288 result.error500("查询失败:" + e.getMessage());
@@ -306,7 +329,7 @@ public class SysPermissionController { @@ -306,7 +329,7 @@ public class SysPermissionController {
306 //全部权限配置集合(按钮权限,访问权限) 329 //全部权限配置集合(按钮权限,访问权限)
307 result.put("allAuth", allAuthArray); 330 result.put("allAuth", allAuthArray);
308 // 系统安全模式 331 // 系统安全模式
309 - result.put("sysSafeMode", jeeccgBaseConfig.getSafeMode()); 332 + result.put("sysSafeMode", jeecgBaseConfig.getSafeMode());
310 return Result.OK(result); 333 return Result.OK(result);
311 } catch (Exception e) { 334 } catch (Exception e) {
312 log.error(e.getMessage(), e); 335 log.error(e.getMessage(), e);
@@ -418,7 +441,7 @@ public class SysPermissionController { @@ -418,7 +441,7 @@ public class SysPermissionController {
418 List<TreeModel> treeList = new ArrayList<>(); 441 List<TreeModel> treeList = new ArrayList<>();
419 getTreeModelList(treeList, list, null); 442 getTreeModelList(treeList, list, null);
420 443
421 - Map<String, Object> resMap = new HashMap<String, Object>(); 444 + Map<String, Object> resMap = new HashMap<String, Object>(5);
422 // 全部树节点数据 445 // 全部树节点数据
423 resMap.put("treeList", treeList); 446 resMap.put("treeList", treeList);
424 // 全部树ids 447 // 全部树ids
@@ -464,7 +487,7 @@ public class SysPermissionController { @@ -464,7 +487,7 @@ public class SysPermissionController {
464 Result<List<String>> result = new Result<>(); 487 Result<List<String>> result = new Result<>();
465 try { 488 try {
466 List<SysRolePermission> list = sysRolePermissionService.list(new QueryWrapper<SysRolePermission>().lambda().eq(SysRolePermission::getRoleId, roleId)); 489 List<SysRolePermission> list = sysRolePermissionService.list(new QueryWrapper<SysRolePermission>().lambda().eq(SysRolePermission::getRoleId, roleId));
467 - result.setResult(list.stream().map(SysRolePermission -> String.valueOf(SysRolePermission.getPermissionId())).collect(Collectors.toList())); 490 + result.setResult(list.stream().map(sysRolePermission -> String.valueOf(sysRolePermission.getPermissionId())).collect(Collectors.toList()));
468 result.setSuccess(true); 491 result.setSuccess(true);
469 } catch (Exception e) { 492 } catch (Exception e) {
470 log.error(e.getMessage(), e); 493 log.error(e.getMessage(), e);
@@ -546,8 +569,8 @@ public class SysPermissionController { @@ -546,8 +569,8 @@ public class SysPermissionController {
546 jsonArray = jsonArray.stream().map(obj -> { 569 jsonArray = jsonArray.stream().map(obj -> {
547 JSONObject returnObj = new JSONObject(); 570 JSONObject returnObj = new JSONObject();
548 JSONObject jsonObj = (JSONObject)obj; 571 JSONObject jsonObj = (JSONObject)obj;
549 - if(jsonObj.containsKey("children")){  
550 - JSONArray childrens = jsonObj.getJSONArray("children"); 572 + if(jsonObj.containsKey(CHILDREN)){
  573 + JSONArray childrens = jsonObj.getJSONArray(CHILDREN);
551 childrens = childrens.stream().filter(arrObj -> !"true".equals(((JSONObject) arrObj).getString("hidden"))).collect(Collectors.toCollection(JSONArray::new)); 574 childrens = childrens.stream().filter(arrObj -> !"true".equals(((JSONObject) arrObj).getString("hidden"))).collect(Collectors.toCollection(JSONArray::new));
552 if(childrens==null || childrens.size()==0){ 575 if(childrens==null || childrens.size()==0){
553 jsonObj.put("hidden",true); 576 jsonObj.put("hidden",true);
@@ -675,7 +698,7 @@ public class SysPermissionController { @@ -675,7 +698,7 @@ public class SysPermissionController {
675 json.put("route", "0"); 698 json.put("route", "0");
676 } 699 }
677 700
678 - if (isWWWHttpUrl(permission.getUrl())) { 701 + if (isWwwHttpUrl(permission.getUrl())) {
679 json.put("path", Md5Util.md5Encode(permission.getUrl(), "utf-8")); 702 json.put("path", Md5Util.md5Encode(permission.getUrl(), "utf-8"));
680 } else { 703 } else {
681 json.put("path", permission.getUrl()); 704 json.put("path", permission.getUrl());
@@ -736,7 +759,7 @@ public class SysPermissionController { @@ -736,7 +759,7 @@ public class SysPermissionController {
736 meta.put("icon", permission.getIcon()); 759 meta.put("icon", permission.getIcon());
737 } 760 }
738 } 761 }
739 - if (isWWWHttpUrl(permission.getUrl())) { 762 + if (isWwwHttpUrl(permission.getUrl())) {
740 meta.put("url", permission.getUrl()); 763 meta.put("url", permission.getUrl());
741 } 764 }
742 // update-begin--Author:sunjianlei Date:20210918 for:新增适配vue3项目的隐藏tab功能 765 // update-begin--Author:sunjianlei Date:20210918 for:新增适配vue3项目的隐藏tab功能
@@ -756,8 +779,9 @@ public class SysPermissionController { @@ -756,8 +779,9 @@ public class SysPermissionController {
756 * 779 *
757 * @return 780 * @return
758 */ 781 */
759 - private boolean isWWWHttpUrl(String url) {  
760 - if (url != null && (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("{{"))) { 782 + private boolean isWwwHttpUrl(String url) {
  783 + boolean flag = url != null && (url.startsWith(CommonConstant.HTTP_PROTOCOL) || url.startsWith(CommonConstant.HTTPS_PROTOCOL) || url.startsWith(SymbolConstant.DOUBLE_LEFT_CURLY_BRACKET));
  784 + if (flag) {
761 return true; 785 return true;
762 } 786 }
763 return false; 787 return false;
@@ -771,7 +795,7 @@ public class SysPermissionController { @@ -771,7 +795,7 @@ public class SysPermissionController {
771 */ 795 */
772 private String urlToRouteName(String url) { 796 private String urlToRouteName(String url) {
773 if (oConvertUtils.isNotEmpty(url)) { 797 if (oConvertUtils.isNotEmpty(url)) {
774 - if (url.startsWith("/")) { 798 + if (url.startsWith(SymbolConstant.SINGLE_SLASH)) {
775 url = url.substring(1); 799 url = url.substring(1);
776 } 800 }
777 url = url.replace("/", "-"); 801 url = url.replace("/", "-");
@@ -883,7 +907,7 @@ public class SysPermissionController { @@ -883,7 +907,7 @@ public class SysPermissionController {
883 Result<List<String>> result = new Result<>(); 907 Result<List<String>> result = new Result<>();
884 try { 908 try {
885 List<SysDepartPermission> list = sysDepartPermissionService.list(new QueryWrapper<SysDepartPermission>().lambda().eq(SysDepartPermission::getDepartId, departId)); 909 List<SysDepartPermission> list = sysDepartPermissionService.list(new QueryWrapper<SysDepartPermission>().lambda().eq(SysDepartPermission::getDepartId, departId));
886 - result.setResult(list.stream().map(SysDepartPermission -> String.valueOf(SysDepartPermission.getPermissionId())).collect(Collectors.toList())); 910 + result.setResult(list.stream().map(sysDepartPermission -> String.valueOf(sysDepartPermission.getPermissionId())).collect(Collectors.toList()));
887 result.setSuccess(true); 911 result.setSuccess(true);
888 } catch (Exception e) { 912 } catch (Exception e) {
889 log.error(e.getMessage(), e); 913 log.error(e.getMessage(), e);
@@ -914,4 +938,5 @@ public class SysPermissionController { @@ -914,4 +938,5 @@ public class SysPermissionController {
914 } 938 }
915 return result; 939 return result;
916 } 940 }
  941 +
917 } 942 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysRoleIndexController.java
@@ -68,7 +68,8 @@ public class SysRoleIndexController extends JeecgController&lt;SysRoleIndex, ISysRo @@ -68,7 +68,8 @@ public class SysRoleIndexController extends JeecgController&lt;SysRoleIndex, ISysRo
68 @AutoLog(value = "角色首页配置-添加") 68 @AutoLog(value = "角色首页配置-添加")
69 @ApiOperation(value = "角色首页配置-添加", notes = "角色首页配置-添加") 69 @ApiOperation(value = "角色首页配置-添加", notes = "角色首页配置-添加")
70 @PostMapping(value = "/add") 70 @PostMapping(value = "/add")
71 - public Result<?> add(@RequestBody SysRoleIndex sysRoleIndex) { 71 + //@DynamicTable(value = DynamicTableConstant.SYS_ROLE_INDEX)
  72 + public Result<?> add(@RequestBody SysRoleIndex sysRoleIndex,HttpServletRequest request) {
72 sysRoleIndexService.save(sysRoleIndex); 73 sysRoleIndexService.save(sysRoleIndex);
73 return Result.OK("添加成功!"); 74 return Result.OK("添加成功!");
74 } 75 }
@@ -82,7 +83,8 @@ public class SysRoleIndexController extends JeecgController&lt;SysRoleIndex, ISysRo @@ -82,7 +83,8 @@ public class SysRoleIndexController extends JeecgController&lt;SysRoleIndex, ISysRo
82 @AutoLog(value = "角色首页配置-编辑") 83 @AutoLog(value = "角色首页配置-编辑")
83 @ApiOperation(value = "角色首页配置-编辑", notes = "角色首页配置-编辑") 84 @ApiOperation(value = "角色首页配置-编辑", notes = "角色首页配置-编辑")
84 @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST}) 85 @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
85 - public Result<?> edit(@RequestBody SysRoleIndex sysRoleIndex) { 86 + //@DynamicTable(value = DynamicTableConstant.SYS_ROLE_INDEX)
  87 + public Result<?> edit(@RequestBody SysRoleIndex sysRoleIndex,HttpServletRequest request) {
86 sysRoleIndexService.updateById(sysRoleIndex); 88 sysRoleIndexService.updateById(sysRoleIndex);
87 return Result.OK("编辑成功!"); 89 return Result.OK("编辑成功!");
88 } 90 }
@@ -161,7 +163,8 @@ public class SysRoleIndexController extends JeecgController&lt;SysRoleIndex, ISysRo @@ -161,7 +163,8 @@ public class SysRoleIndexController extends JeecgController&lt;SysRoleIndex, ISysRo
161 @AutoLog(value = "角色首页配置-通过code查询") 163 @AutoLog(value = "角色首页配置-通过code查询")
162 @ApiOperation(value = "角色首页配置-通过code查询", notes = "角色首页配置-通过code查询") 164 @ApiOperation(value = "角色首页配置-通过code查询", notes = "角色首页配置-通过code查询")
163 @GetMapping(value = "/queryByCode") 165 @GetMapping(value = "/queryByCode")
164 - public Result<?> queryByCode(@RequestParam(name = "roleCode", required = true) String roleCode) { 166 + //@DynamicTable(value = DynamicTableConstant.SYS_ROLE_INDEX)
  167 + public Result<?> queryByCode(@RequestParam(name = "roleCode", required = true) String roleCode,HttpServletRequest request) {
165 SysRoleIndex sysRoleIndex = sysRoleIndexService.getOne(new LambdaQueryWrapper<SysRoleIndex>().eq(SysRoleIndex::getRoleCode, roleCode)); 168 SysRoleIndex sysRoleIndex = sysRoleIndexService.getOne(new LambdaQueryWrapper<SysRoleIndex>().eq(SysRoleIndex::getRoleCode, roleCode));
166 return Result.OK(sysRoleIndex); 169 return Result.OK(sysRoleIndex);
167 } 170 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java
@@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; @@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j;
9 import org.apache.shiro.SecurityUtils; 9 import org.apache.shiro.SecurityUtils;
10 import org.jeecg.common.api.vo.Result; 10 import org.jeecg.common.api.vo.Result;
11 import org.jeecg.common.aspect.annotation.PermissionData; 11 import org.jeecg.common.aspect.annotation.PermissionData;
  12 +import org.jeecg.common.constant.SymbolConstant;
12 import org.jeecg.common.system.query.QueryGenerator; 13 import org.jeecg.common.system.query.QueryGenerator;
13 import org.jeecg.common.system.vo.LoginUser; 14 import org.jeecg.common.system.vo.LoginUser;
14 import org.jeecg.common.util.oConvertUtils; 15 import org.jeecg.common.util.oConvertUtils;
@@ -204,7 +205,7 @@ public class SysTenantController { @@ -204,7 +205,7 @@ public class SysTenantController {
204 Map<String,Object> map = new HashMap(5); 205 Map<String,Object> map = new HashMap(5);
205 if (oConvertUtils.isNotEmpty(tenantIds)) { 206 if (oConvertUtils.isNotEmpty(tenantIds)) {
206 List<Integer> tenantIdList = new ArrayList<>(); 207 List<Integer> tenantIdList = new ArrayList<>();
207 - for(String id: tenantIds.split(",")){ 208 + for(String id: tenantIds.split(SymbolConstant.COMMA)){
208 tenantIdList.add(Integer.valueOf(id)); 209 tenantIdList.add(Integer.valueOf(id));
209 } 210 }
210 // 该方法仅查询有效的租户,如果返回0个就说明所有的租户均无效。 211 // 该方法仅查询有效的租户,如果返回0个就说明所有的租户均无效。
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUploadController.java
@@ -6,8 +6,8 @@ import org.jeecg.common.exception.JeecgBootException; @@ -6,8 +6,8 @@ import org.jeecg.common.exception.JeecgBootException;
6 import org.jeecg.common.util.CommonUtils; 6 import org.jeecg.common.util.CommonUtils;
7 import org.jeecg.common.util.MinioUtil; 7 import org.jeecg.common.util.MinioUtil;
8 import org.jeecg.common.util.oConvertUtils; 8 import org.jeecg.common.util.oConvertUtils;
9 -import org.jeecg.modules.oss.entity.OSSFile;  
10 -import org.jeecg.modules.oss.service.IOSSFileService; 9 +import org.jeecg.modules.oss.entity.OssFile;
  10 +import org.jeecg.modules.oss.service.IOssFileService;
11 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.web.bind.annotation.PostMapping; 12 import org.springframework.web.bind.annotation.PostMapping;
13 import org.springframework.web.bind.annotation.RequestMapping; 13 import org.springframework.web.bind.annotation.RequestMapping;
@@ -26,7 +26,7 @@ import javax.servlet.http.HttpServletRequest; @@ -26,7 +26,7 @@ import javax.servlet.http.HttpServletRequest;
26 @RequestMapping("/sys/upload") 26 @RequestMapping("/sys/upload")
27 public class SysUploadController { 27 public class SysUploadController {
28 @Autowired 28 @Autowired
29 - private IOSSFileService ossFileService; 29 + private IOssFileService ossFileService;
30 30
31 /** 31 /**
32 * 上传 32 * 上传
@@ -38,7 +38,8 @@ public class SysUploadController { @@ -38,7 +38,8 @@ public class SysUploadController {
38 String bizPath = request.getParameter("biz"); 38 String bizPath = request.getParameter("biz");
39 39
40 //LOWCOD-2580 sys/common/upload接口存在任意文件上传漏洞 40 //LOWCOD-2580 sys/common/upload接口存在任意文件上传漏洞
41 - if (oConvertUtils.isNotEmpty(bizPath) && (bizPath.contains("../") || bizPath.contains("..\\"))) { 41 + boolean flag = oConvertUtils.isNotEmpty(bizPath) && (bizPath.contains("../") || bizPath.contains("..\\"));
  42 + if (flag) {
42 throw new JeecgBootException("上传目录bizPath,格式非法!"); 43 throw new JeecgBootException("上传目录bizPath,格式非法!");
43 } 44 }
44 45
@@ -51,16 +52,16 @@ public class SysUploadController { @@ -51,16 +52,16 @@ public class SysUploadController {
51 // 获取文件名 52 // 获取文件名
52 String orgName = file.getOriginalFilename(); 53 String orgName = file.getOriginalFilename();
53 orgName = CommonUtils.getFileName(orgName); 54 orgName = CommonUtils.getFileName(orgName);
54 - String file_url = MinioUtil.upload(file,bizPath);  
55 - if(oConvertUtils.isEmpty(file_url)){ 55 + String fileUrl = MinioUtil.upload(file,bizPath);
  56 + if(oConvertUtils.isEmpty(fileUrl)){
56 return Result.error("上传失败,请检查配置信息是否正确!"); 57 return Result.error("上传失败,请检查配置信息是否正确!");
57 } 58 }
58 //保存文件信息 59 //保存文件信息
59 - OSSFile minioFile = new OSSFile(); 60 + OssFile minioFile = new OssFile();
60 minioFile.setFileName(orgName); 61 minioFile.setFileName(orgName);
61 - minioFile.setUrl(file_url); 62 + minioFile.setUrl(fileUrl);
62 ossFileService.save(minioFile); 63 ossFileService.save(minioFile);
63 - result.setMessage(file_url); 64 + result.setMessage(fileUrl);
64 result.setSuccess(true); 65 result.setSuccess(true);
65 return result; 66 return result;
66 } 67 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java
@@ -18,6 +18,7 @@ import org.apache.shiro.authz.annotation.RequiresRoles; @@ -18,6 +18,7 @@ import org.apache.shiro.authz.annotation.RequiresRoles;
18 import org.jeecg.common.api.vo.Result; 18 import org.jeecg.common.api.vo.Result;
19 import org.jeecg.common.aspect.annotation.PermissionData; 19 import org.jeecg.common.aspect.annotation.PermissionData;
20 import org.jeecg.common.constant.CommonConstant; 20 import org.jeecg.common.constant.CommonConstant;
  21 +import org.jeecg.common.constant.SymbolConstant;
21 import org.jeecg.common.system.api.ISysBaseAPI; 22 import org.jeecg.common.system.api.ISysBaseAPI;
22 import org.jeecg.modules.base.service.BaseCommonService; 23 import org.jeecg.modules.base.service.BaseCommonService;
23 import org.jeecg.common.system.query.QueryGenerator; 24 import org.jeecg.common.system.query.QueryGenerator;
@@ -159,7 +160,7 @@ public class SysUserController { @@ -159,7 +160,7 @@ public class SysUserController {
159 } 160 }
160 161
161 //@RequiresRoles({"admin"}) 162 //@RequiresRoles({"admin"})
162 - //@RequiresPermissions("user:add") 163 + //Permissions("system:user:add")
163 @RequestMapping(value = "/add", method = RequestMethod.POST) 164 @RequestMapping(value = "/add", method = RequestMethod.POST)
164 public Result<SysUser> add(@RequestBody JSONObject jsonObject) { 165 public Result<SysUser> add(@RequestBody JSONObject jsonObject) {
165 Result<SysUser> result = new Result<SysUser>(); 166 Result<SysUser> result = new Result<SysUser>();
@@ -174,6 +175,8 @@ public class SysUserController { @@ -174,6 +175,8 @@ public class SysUserController {
174 user.setPassword(passwordEncode); 175 user.setPassword(passwordEncode);
175 user.setStatus(1); 176 user.setStatus(1);
176 user.setDelFlag(CommonConstant.DEL_FLAG_0); 177 user.setDelFlag(CommonConstant.DEL_FLAG_0);
  178 + //用户表字段org_code不能在这里设置他的值
  179 + user.setOrgCode(null);
177 // 保存用户走一个service 保证事务 180 // 保存用户走一个service 保证事务
178 sysUserService.saveUser(user, selectedRoles, selectedDeparts); 181 sysUserService.saveUser(user, selectedRoles, selectedDeparts);
179 baseCommonService.addLog("添加用户,username: " +user.getUsername() ,CommonConstant.LOG_TYPE_2, 2); 182 baseCommonService.addLog("添加用户,username: " +user.getUsername() ,CommonConstant.LOG_TYPE_2, 2);
@@ -186,7 +189,7 @@ public class SysUserController { @@ -186,7 +189,7 @@ public class SysUserController {
186 } 189 }
187 190
188 //@RequiresRoles({"admin"}) 191 //@RequiresRoles({"admin"})
189 - //@RequiresPermissions("user:edit") 192 + //Permissions("system:user:edit")
190 @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) 193 @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
191 public Result<SysUser> edit(@RequestBody JSONObject jsonObject) { 194 public Result<SysUser> edit(@RequestBody JSONObject jsonObject) {
192 Result<SysUser> result = new Result<SysUser>(); 195 Result<SysUser> result = new Result<SysUser>();
@@ -206,6 +209,8 @@ public class SysUserController { @@ -206,6 +209,8 @@ public class SysUserController {
206 //vue3.0前端只传递了departIds 209 //vue3.0前端只传递了departIds
207 departs=user.getDepartIds(); 210 departs=user.getDepartIds();
208 } 211 }
  212 + //用户表字段org_code不能在这里设置他的值
  213 + user.setOrgCode(null);
209 // 修改用户走一个service 保证事务 214 // 修改用户走一个service 保证事务
210 sysUserService.editUser(user, roles, departs); 215 sysUserService.editUser(user, roles, departs);
211 result.success("修改成功!"); 216 result.success("修改成功!");
@@ -439,8 +444,13 @@ public class SysUserController { @@ -439,8 +444,13 @@ public class SysUserController {
439 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, 444 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
440 @RequestParam(name = "departId", required = false) String departId, 445 @RequestParam(name = "departId", required = false) String departId,
441 @RequestParam(name="realname",required=false) String realname, 446 @RequestParam(name="realname",required=false) String realname,
442 - @RequestParam(name="username",required=false) String username) {  
443 - IPage<SysUser> pageList = sysUserDepartService.queryDepartUserPageList(departId, username, realname, pageSize, pageNo); 447 + @RequestParam(name="username",required=false) String username,
  448 + @RequestParam(name="id",required = false) String id) {
  449 + //update-begin-author:taoyan date:2022-7-14 for: VUEN-1702【禁止问题】sql注入漏洞
  450 + String[] arr = new String[]{departId, realname, username, id};
  451 + SqlInjectionUtil.filterContent(arr, SymbolConstant.SINGLE_QUOTATION_MARK);
  452 + //update-end-author:taoyan date:2022-7-14 for: VUEN-1702【禁止问题】sql注入漏洞
  453 + IPage<SysUser> pageList = sysUserDepartService.queryDepartUserPageList(departId, username, realname, pageSize, pageNo,id);
444 return Result.OK(pageList); 454 return Result.OK(pageList);
445 } 455 }
446 456
@@ -450,6 +460,8 @@ public class SysUserController { @@ -450,6 +460,8 @@ public class SysUserController {
450 * @param request 460 * @param request
451 * @param sysUser 461 * @param sysUser
452 */ 462 */
  463 + //@RequiresRoles({"admin"})
  464 + //@RequiresPermissions("system:user:export")
453 @RequestMapping(value = "/exportXls") 465 @RequestMapping(value = "/exportXls")
454 public ModelAndView exportXls(SysUser sysUser,HttpServletRequest request) { 466 public ModelAndView exportXls(SysUser sysUser,HttpServletRequest request) {
455 // Step.1 组装查询条件 467 // Step.1 组装查询条件
@@ -483,7 +495,7 @@ public class SysUserController { @@ -483,7 +495,7 @@ public class SysUserController {
483 * @return 495 * @return
484 */ 496 */
485 //@RequiresRoles({"admin"}) 497 //@RequiresRoles({"admin"})
486 - //@RequiresPermissions("user:import") 498 + //Permissions("system:user:import")
487 @RequestMapping(value = "/importExcel", method = RequestMethod.POST) 499 @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
488 public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response)throws IOException { 500 public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response)throws IOException {
489 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; 501 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
@@ -1267,6 +1279,15 @@ public class SysUserController { @@ -1267,6 +1279,15 @@ public class SysUserController {
1267 sysUser.setPhone(phone); 1279 sysUser.setPhone(phone);
1268 } 1280 }
1269 if(StringUtils.isNotBlank(email)){ 1281 if(StringUtils.isNotBlank(email)){
  1282 + //update-begin---author:wangshuai ---date:20220708 for:[VUEN-1528]积木官网邮箱重复,应该提示准确------------
  1283 + LambdaQueryWrapper<SysUser> emailQuery = new LambdaQueryWrapper<>();
  1284 + emailQuery.eq(SysUser::getEmail,email);
  1285 + long count = sysUserService.count(emailQuery);
  1286 + if (!email.equals(sysUser.getEmail()) && count!=0) {
  1287 + result.error500("保存失败,邮箱已存在!");
  1288 + return result;
  1289 + }
  1290 + //update-end---author:wangshuai ---date:20220708 for:[VUEN-1528]积木官网邮箱重复,应该提示准确--------------
1270 sysUser.setEmail(email); 1291 sysUser.setEmail(email);
1271 } 1292 }
1272 if(null != birthday){ 1293 if(null != birthday){
@@ -1277,7 +1298,7 @@ public class SysUserController { @@ -1277,7 +1298,7 @@ public class SysUserController {
1277 } 1298 }
1278 } catch (Exception e) { 1299 } catch (Exception e) {
1279 log.error(e.getMessage(), e); 1300 log.error(e.getMessage(), e);
1280 - result.error500("操作失败!"); 1301 + result.error500("保存失败!");
1281 } 1302 }
1282 return result; 1303 return result;
1283 } 1304 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java
@@ -246,7 +246,7 @@ public class ThirdAppController { @@ -246,7 +246,7 @@ public class ThirdAppController {
246 // 第三方app的类型 246 // 第三方app的类型
247 String app = params.getString("app"); 247 String app = params.getString("app");
248 // 消息id 248 // 消息id
249 - String msg_task_id = params.getString("msg_task_id"); 249 + String msgTaskId = params.getString("msg_task_id");
250 250
251 if (ThirdAppConfig.WECHAT_ENTERPRISE.equals(app)) { 251 if (ThirdAppConfig.WECHAT_ENTERPRISE.equals(app)) {
252 if (thirdAppConfig.isWechatEnterpriseEnabled()) { 252 if (thirdAppConfig.isWechatEnterpriseEnabled()) {
@@ -255,7 +255,7 @@ public class ThirdAppController { @@ -255,7 +255,7 @@ public class ThirdAppController {
255 return Result.error("企业微信已被禁用"); 255 return Result.error("企业微信已被禁用");
256 } else if (ThirdAppConfig.DINGTALK.equals(app)) { 256 } else if (ThirdAppConfig.DINGTALK.equals(app)) {
257 if (thirdAppConfig.isDingtalkEnabled()) { 257 if (thirdAppConfig.isDingtalkEnabled()) {
258 - Response<JSONObject> response = dingtalkService.recallMessageResponse(msg_task_id); 258 + Response<JSONObject> response = dingtalkService.recallMessageResponse(msgTaskId);
259 if (response.isSuccess()) { 259 if (response.isSuccess()) {
260 return Result.OK("撤回成功", response); 260 return Result.OK("撤回成功", response);
261 } else { 261 } else {
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java
@@ -332,7 +332,10 @@ public class ThirdLoginController { @@ -332,7 +332,10 @@ public class ThirdLoginController {
332 builder.append("&scope=openid"); 332 builder.append("&scope=openid");
333 // 跟随authCode原样返回。 333 // 跟随authCode原样返回。
334 builder.append("&state=").append(state); 334 builder.append("&state=").append(state);
335 - url = builder.toString(); 335 + //update-begin---author:wangshuai ---date:20220613 for:[issues/I5BOUF]oauth2 钉钉无法登录------------
  336 + builder.append("&prompt=").append("consent");
  337 + //update-end---author:wangshuai ---date:20220613 for:[issues/I5BOUF]oauth2 钉钉无法登录--------------
  338 + url = builder.toString();
336 } else { 339 } else {
337 return "不支持的source"; 340 return "不支持的source";
338 } 341 }
@@ -377,9 +380,28 @@ public class ThirdLoginController { @@ -377,9 +380,28 @@ public class ThirdLoginController {
377 return "不支持的source"; 380 return "不支持的source";
378 } 381 }
379 try { 382 try {
380 - String token = saveToken(loginUser); 383 +
  384 + //update-begin-author:taoyan date:2022-6-30 for: 工作流发送消息 点击消息链接跳转办理页面
  385 + String redirect = "";
  386 + if (state.indexOf("?") > 0) {
  387 + String[] arr = state.split("\\?");
  388 + state = arr[0];
  389 + if(arr.length>1){
  390 + redirect = arr[1];
  391 + }
  392 + }
  393 +
  394 + String token = saveToken(loginUser);
381 state += "/oauth2-app/login?oauth2LoginToken=" + URLEncoder.encode(token, "UTF-8"); 395 state += "/oauth2-app/login?oauth2LoginToken=" + URLEncoder.encode(token, "UTF-8");
382 - state += "&thirdType=" + "wechat_enterprise"; 396 + //update-begin---author:wangshuai ---date:20220613 for:[issues/I5BOUF]oauth2 钉钉无法登录------------
  397 + state += "&thirdType=" + source;
  398 + //state += "&thirdType=" + "wechat_enterprise";
  399 + if (redirect != null && redirect.length() > 0) {
  400 + state += "&" + redirect;
  401 + }
  402 + //update-end-author:taoyan date:2022-6-30 for: 工作流发送消息 点击消息链接跳转办理页面
  403 +
  404 + //update-end---author:wangshuai ---date:20220613 for:[issues/I5BOUF]oauth2 钉钉无法登录------------
383 log.info("OAuth2登录重定向地址: " + state); 405 log.info("OAuth2登录重定向地址: " + state);
384 try { 406 try {
385 response.sendRedirect(state); 407 response.sendRedirect(state);
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysRoleIndex.java
@@ -40,6 +40,17 @@ public class SysRoleIndex { @@ -40,6 +40,17 @@ public class SysRoleIndex {
40 @Excel(name = "路由地址", width = 15) 40 @Excel(name = "路由地址", width = 15)
41 @ApiModelProperty(value = "路由地址") 41 @ApiModelProperty(value = "路由地址")
42 private java.lang.String url; 42 private java.lang.String url;
  43 + /**路由地址*/
  44 + @Excel(name = "路由地址", width = 15)
  45 + @ApiModelProperty(value = "组件")
  46 + private java.lang.String component;
  47 + /**
  48 + * 是否路由菜单: 0:不是 1:是(默认值1)
  49 + */
  50 + @Excel(name = "是否路由菜单", width = 15)
  51 + @ApiModelProperty(value = "是否路由菜单")
  52 + @TableField(value="is_route")
  53 + private boolean route;
43 /**优先级*/ 54 /**优先级*/
44 @Excel(name = "优先级", width = 15) 55 @Excel(name = "优先级", width = 15)
45 @ApiModelProperty(value = "优先级") 56 @ApiModelProperty(value = "优先级")
@@ -72,4 +83,12 @@ public class SysRoleIndex { @@ -72,4 +83,12 @@ public class SysRoleIndex {
72 @Excel(name = "所属部门", width = 15) 83 @Excel(name = "所属部门", width = 15)
73 @ApiModelProperty(value = "所属部门") 84 @ApiModelProperty(value = "所属部门")
74 private java.lang.String sysOrgCode; 85 private java.lang.String sysOrgCode;
  86 +
  87 +
  88 + public SysRoleIndex() {
  89 +
  90 + }
  91 + public SysRoleIndex(String componentUrl){
  92 + this.component = componentUrl;
  93 + }
75 } 94 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/SysUser.java
@@ -2,6 +2,7 @@ package org.jeecg.modules.system.entity; @@ -2,6 +2,7 @@ package org.jeecg.modules.system.entity;
2 2
3 import java.util.Date; 3 import java.util.Date;
4 4
  5 +import com.baomidou.mybatisplus.annotation.TableField;
5 import com.baomidou.mybatisplus.annotation.TableLogic; 6 import com.baomidou.mybatisplus.annotation.TableLogic;
6 import com.fasterxml.jackson.annotation.JsonIgnore; 7 import com.fasterxml.jackson.annotation.JsonIgnore;
7 import com.fasterxml.jackson.annotation.JsonProperty; 8 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -182,4 +183,10 @@ public class SysUser implements Serializable { @@ -182,4 +183,10 @@ public class SysUser implements Serializable {
182 183
183 /**设备id uniapp推送用*/ 184 /**设备id uniapp推送用*/
184 private String clientId; 185 private String clientId;
  186 +
  187 + /**
  188 + * 登录首页地址
  189 + */
  190 + @TableField(exist = false)
  191 + private String homePath;
185 } 192 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java
@@ -124,28 +124,28 @@ public interface SysDictMapper extends BaseMapper&lt;SysDict&gt; { @@ -124,28 +124,28 @@ public interface SysDictMapper extends BaseMapper&lt;SysDict&gt; {
124 @Deprecated 124 @Deprecated
125 public String queryTableDictTextByKey(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("key") String key); 125 public String queryTableDictTextByKey(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("key") String key);
126 126
127 - /**  
128 - * 通过查询指定table的 text code key 获取字典值,可批量查询  
129 - *  
130 - * @param table  
131 - * @param text  
132 - * @param code  
133 - * @param keys  
134 - * @return  
135 - */  
136 - @Deprecated  
137 - List<DictModel> queryTableDictTextByKeys(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("keys") List<String> keys); 127 +// /**
  128 +// * 通过查询指定table的 text code key 获取字典值,可批量查询
  129 +// *
  130 +// * @param table
  131 +// * @param text
  132 +// * @param code
  133 +// * @param keys
  134 +// * @return
  135 +// */
  136 +// @Deprecated
  137 +// List<DictModel> queryTableDictTextByKeys(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("keys") List<String> keys);
138 138
139 - /**  
140 - * 通过查询指定table的 text code key 获取字典值,包含value  
141 - * @param table  
142 - * @param text  
143 - * @param code  
144 - * @param keyArray  
145 - * @return List<DictModel>  
146 - */  
147 - @Deprecated  
148 - public List<DictModel> queryTableDictByKeys(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("keyArray") String[] keyArray); 139 +// D /**
  140 +//// * 通过查询指定table的 text code key 获取字典值,包含value
  141 +//// * @param table
  142 +//// * @param text
  143 +//// * @param code
  144 +//// * @param keyArray
  145 +//// * @return List<DictModel>
  146 +//// */
  147 +//// @Deprecated
  148 +//// public List<DictModel> queryTableictByKeys(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("keyArray") String[] keyArray);
149 149
150 /** 150 /**
151 * 查询所有部门 作为字典信息 id -->value,departName -->text 151 * 查询所有部门 作为字典信息 id -->value,departName -->text
@@ -159,28 +159,28 @@ public interface SysDictMapper extends BaseMapper&lt;SysDict&gt; { @@ -159,28 +159,28 @@ public interface SysDictMapper extends BaseMapper&lt;SysDict&gt; {
159 */ 159 */
160 public List<DictModel> queryAllUserBackDictModel(); 160 public List<DictModel> queryAllUserBackDictModel();
161 161
162 - /**  
163 - * 通过关键字查询出字典表  
164 - * @param table  
165 - * @param text  
166 - * @param code  
167 - * @param keyword  
168 - * @return  
169 - */  
170 - @Deprecated  
171 - public List<DictModel> queryTableDictItems(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("keyword") String keyword); 162 +// /**
  163 +// * 通过关键字查询出字典表
  164 +// * @param table
  165 +// * @param text
  166 +// * @param code
  167 +// * @param keyword
  168 +// * @return
  169 +// */
  170 +// @Deprecated
  171 +// public List<DictModel> queryTableDictItems(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("keyword") String keyword);
172 172
173 173
174 - /**  
175 - * 通过关键字查询出字典表  
176 - * @param page  
177 - * @param table  
178 - * @param text  
179 - * @param code  
180 - * @param keyword  
181 - * @return  
182 - */  
183 - IPage<DictModel> queryTableDictItems(Page<DictModel> page, @Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("keyword") String keyword); 174 +// /**
  175 +// * 通过关键字查询出字典表
  176 +// * @param page
  177 +// * @param table
  178 +// * @param text
  179 +// * @param code
  180 +// * @param keyword
  181 +// * @return
  182 +// */
  183 +// //IPage<DictModel> queryTableDictItems(Page<DictModel> page, @Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("keyword") String keyword);
184 184
185 /** 185 /**
186 * 根据表名、显示字段名、存储字段名 查询树 186 * 根据表名、显示字段名、存储字段名 查询树
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java
@@ -18,16 +18,17 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -18,16 +18,17 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
18 public interface SysRoleMapper extends BaseMapper<SysRole> { 18 public interface SysRoleMapper extends BaseMapper<SysRole> {
19 19
20 /** 20 /**
21 - * @Description: 删除角色与用户关系 21 + * 删除角色与用户关系
22 * @Author scott 22 * @Author scott
23 * @Date 2019/12/13 16:12 23 * @Date 2019/12/13 16:12
  24 + * @param roleId
24 */ 25 */
25 @Delete("delete from sys_user_role where role_id = #{roleId}") 26 @Delete("delete from sys_user_role where role_id = #{roleId}")
26 void deleteRoleUserRelation(@Param("roleId") String roleId); 27 void deleteRoleUserRelation(@Param("roleId") String roleId);
27 28
28 29
29 /** 30 /**
30 - * @Description: 删除角色与权限关系 31 + * 删除角色与权限关系
31 * @Author scott 32 * @Author scott
32 * @param roleId 33 * @param roleId
33 * @Date 2019/12/13 16:12 34 * @Date 2019/12/13 16:12
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysCategoryMapper.xml
@@ -11,9 +11,25 @@ @@ -11,9 +11,25 @@
11 from sys_category 11 from sys_category
12 where pid = #{pid} 12 where pid = #{pid}
13 <if test="query!= null"> 13 <if test="query!= null">
14 - <foreach collection="query.entrySet()" item="value" index="key" >  
15 - and ${key} = #{value}  
16 - </foreach> 14 + <if test="query.code !=null and query.code != ''">
  15 + and code = #{query.code}
  16 + </if>
  17 +
  18 + <if test="query.name !=null and query.name != ''">
  19 + and name = #{query.name}
  20 + </if>
  21 +
  22 + <if test="query.id !=null and query.id != ''">
  23 + and id = #{query.id}
  24 + </if>
  25 +
  26 + <if test="query.createBy !=null and query.createBy != ''">
  27 + and create_by = #{query.createBy}
  28 + </if>
  29 +
  30 + <if test="query.sysOrgCode !=null and query.sysOrgCode != ''">
  31 + and sys_org_code = #{query.sysOrgCode}
  32 + </if>
17 </if> 33 </if>
18 </select> 34 </select>
19 35
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml
@@ -80,22 +80,22 @@ @@ -80,22 +80,22 @@
80 select ${text} as "text" from ${table} where ${code}= #{key} 80 select ${text} as "text" from ${table} where ${code}= #{key}
81 </select> 81 </select>
82 82
83 - <!--通过查询指定table的 text code key 获取字典值,可批量查询--> 83 + <!--通过查询指定table的 text code key 获取字典值,可批量查询
84 <select id="queryTableDictTextByKeys" parameterType="String" resultType="org.jeecg.common.system.vo.DictModel"> 84 <select id="queryTableDictTextByKeys" parameterType="String" resultType="org.jeecg.common.system.vo.DictModel">
85 select ${text} as "text", ${code} as "value" from ${table} where ${code} IN ( 85 select ${text} as "text", ${code} as "value" from ${table} where ${code} IN (
86 <foreach item="key" collection="keys" separator=","> 86 <foreach item="key" collection="keys" separator=",">
87 #{key} 87 #{key}
88 </foreach> 88 </foreach>
89 ) 89 )
90 - </select> 90 + </select>-->
91 91
92 - <!--通过查询指定table的 text code key 获取字典值,包含value--> 92 + <!--通过查询指定table的 text code key 获取字典值,包含value
93 <select id="queryTableDictByKeys" parameterType="String" resultType="org.jeecg.common.system.vo.DictModel"> 93 <select id="queryTableDictByKeys" parameterType="String" resultType="org.jeecg.common.system.vo.DictModel">
94 select ${text} as "text", ${code} as "value" from ${table} where ${code} in 94 select ${text} as "text", ${code} as "value" from ${table} where ${code} in
95 <foreach item="key" collection="keyArray" open="(" separator="," close=")"> 95 <foreach item="key" collection="keyArray" open="(" separator="," close=")">
96 #{key} 96 #{key}
97 </foreach> 97 </foreach>
98 - </select> 98 + </select>-->
99 99
100 <!-- 重复校验 sql语句 --> 100 <!-- 重复校验 sql语句 -->
101 <select id="duplicateCheckCountSql" resultType="Long" parameterType="org.jeecg.modules.system.model.DuplicateCheckVo"> 101 <select id="duplicateCheckCountSql" resultType="Long" parameterType="org.jeecg.modules.system.model.DuplicateCheckVo">
@@ -117,10 +117,10 @@ @@ -117,10 +117,10 @@
117 select username as "value",realname as "text" from sys_user where del_flag = '0' 117 select username as "value",realname as "text" from sys_user where del_flag = '0'
118 </select> 118 </select>
119 119
120 - <!--通过查询指定table的 text code 获取字典数据,且支持关键字查询 --> 120 + <!--通过查询指定table的 text code 获取字典数据,且支持关键字查询
121 <select id="queryTableDictItems" parameterType="String" resultType="org.jeecg.common.system.vo.DictModel"> 121 <select id="queryTableDictItems" parameterType="String" resultType="org.jeecg.common.system.vo.DictModel">
122 select ${text} as "text",${code} as "value" from ${table} where ${text} like #{keyword} 122 select ${text} as "text",${code} as "value" from ${table} where ${text} like #{keyword}
123 - </select> 123 + </select> -->
124 124
125 <!-- 根据表名、显示字段名、存储字段名、父ID查询树 --> 125 <!-- 根据表名、显示字段名、存储字段名、父ID查询树 -->
126 <select id="queryTreeList" parameterType="Object" resultType="org.jeecg.modules.system.model.TreeSelectModel"> 126 <select id="queryTreeList" parameterType="Object" resultType="org.jeecg.modules.system.model.TreeSelectModel">
@@ -150,6 +150,16 @@ @@ -150,6 +150,16 @@
150 <foreach collection="query.entrySet()" item="value" index="key" > 150 <foreach collection="query.entrySet()" item="value" index="key" >
151 and ${key} LIKE #{value} 151 and ${key} LIKE #{value}
152 </foreach> 152 </foreach>
  153 + <!-- udapte-end-author:sunjianlei date:20220615 for: 【issues/3709】自定义树查询条件没有处理父ID,没有树状结构了 -->
  154 + <choose>
  155 + <when test="pid != null and pid != ''">
  156 + and ${pidField} = #{pid}
  157 + </when>
  158 + <otherwise>
  159 + and (${pidField} = '' OR ${pidField} IS NULL)
  160 + </otherwise>
  161 + </choose>
  162 + <!-- udapte-end-author:sunjianlei date:20220615 for: 【issues/3709】自定义树查询条件没有处理父ID,没有树状结构了 -->
153 </if> 163 </if>
154 <!-- udapte-end-author:sunjianlei date:20220110 for: 【JTC-597】自定义树查询条件查不出数据 --> 164 <!-- udapte-end-author:sunjianlei date:20220110 for: 【JTC-597】自定义树查询条件查不出数据 -->
155 </select> 165 </select>
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java
@@ -52,6 +52,11 @@ public class SysPermissionTree implements Serializable { @@ -52,6 +52,11 @@ public class SysPermissionTree implements Serializable {
52 private String component; 52 private String component;
53 53
54 /** 54 /**
  55 + * 组件名字
  56 + */
  57 + private String componentName;
  58 +
  59 + /**
55 * 跳转网页链接 60 * 跳转网页链接
56 */ 61 */
57 private String url; 62 private String url;
@@ -141,6 +146,7 @@ public class SysPermissionTree implements Serializable { @@ -141,6 +146,7 @@ public class SysPermissionTree implements Serializable {
141 this.perms = permission.getPerms(); 146 this.perms = permission.getPerms();
142 this.permsType = permission.getPermsType(); 147 this.permsType = permission.getPermsType();
143 this.component = permission.getComponent(); 148 this.component = permission.getComponent();
  149 + this.componentName = permission.getComponentName();
144 this.createBy = permission.getCreateBy(); 150 this.createBy = permission.getCreateBy();
145 this.createTime = permission.getCreateTime(); 151 this.createTime = permission.getCreateTime();
146 this.delFlag = permission.getDelFlag(); 152 this.delFlag = permission.getDelFlag();
@@ -266,6 +272,14 @@ public class SysPermissionTree implements Serializable { @@ -266,6 +272,14 @@ public class SysPermissionTree implements Serializable {
266 this.component = component; 272 this.component = component;
267 } 273 }
268 274
  275 + public String getComponentName() {
  276 + return componentName;
  277 + }
  278 +
  279 + public void setComponentName(String componentName) {
  280 + this.componentName = componentName;
  281 + }
  282 +
269 public String getUrl() { 283 public String getUrl() {
270 return url; 284 return url;
271 } 285 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/security/DictQueryBlackListHandler.java
1 package org.jeecg.modules.system.security; 1 package org.jeecg.modules.system.security;
2 2
  3 +import org.jeecg.common.constant.CommonConstant;
3 import org.jeecg.common.constant.SymbolConstant; 4 import org.jeecg.common.constant.SymbolConstant;
4 import org.jeecg.common.util.oConvertUtils; 5 import org.jeecg.common.util.oConvertUtils;
5 import org.jeecg.common.util.security.AbstractQueryBlackListHandler; 6 import org.jeecg.common.util.security.AbstractQueryBlackListHandler;
@@ -32,8 +33,9 @@ public class DictQueryBlackListHandler extends AbstractQueryBlackListHandler { @@ -32,8 +33,9 @@ public class DictQueryBlackListHandler extends AbstractQueryBlackListHandler {
32 QueryTable table = new QueryTable(tableName, ""); 33 QueryTable table = new QueryTable(tableName, "");
33 // 无论什么场景 第二、三个元素一定是表的字段,直接add 34 // 无论什么场景 第二、三个元素一定是表的字段,直接add
34 table.addField(arr[1].trim()); 35 table.addField(arr[1].trim());
35 - if (oConvertUtils.isNotEmpty(arr[2].trim())) {  
36 - table.addField(arr[2].trim()); 36 + String filed = arr[2].trim();
  37 + if (oConvertUtils.isNotEmpty(filed)) {
  38 + table.addField(filed);
37 } 39 }
38 List<QueryTable> list = new ArrayList<>(); 40 List<QueryTable> list = new ArrayList<>();
39 list.add(table); 41 list.add(table);
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java
@@ -20,6 +20,11 @@ public interface ISysCategoryService extends IService&lt;SysCategory&gt; { @@ -20,6 +20,11 @@ public interface ISysCategoryService extends IService&lt;SysCategory&gt; {
20 public static final String ROOT_PID_VALUE = "0"; 20 public static final String ROOT_PID_VALUE = "0";
21 21
22 /** 22 /**
  23 + * 存在子节点
  24 + */
  25 + public static final String HAS_CHILD = "1";
  26 +
  27 + /**
23 * 添加分类字典 28 * 添加分类字典
24 * @param sysCategory 29 * @param sysCategory
25 */ 30 */
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDataSourceService.java
1 package org.jeecg.modules.system.service; 1 package org.jeecg.modules.system.service;
2 2
3 import com.baomidou.mybatisplus.extension.service.IService; 3 import com.baomidou.mybatisplus.extension.service.IService;
  4 +import org.jeecg.common.api.vo.Result;
4 import org.jeecg.modules.system.entity.SysDataSource; 5 import org.jeecg.modules.system.entity.SysDataSource;
5 6
6 /** 7 /**
@@ -11,4 +12,25 @@ import org.jeecg.modules.system.entity.SysDataSource; @@ -11,4 +12,25 @@ import org.jeecg.modules.system.entity.SysDataSource;
11 */ 12 */
12 public interface ISysDataSourceService extends IService<SysDataSource> { 13 public interface ISysDataSourceService extends IService<SysDataSource> {
13 14
  15 + /**
  16 + * 添加数据源
  17 + * @param sysDataSource
  18 + * @return
  19 + */
  20 + Result saveDataSource(SysDataSource sysDataSource);
  21 +
  22 + /**
  23 + * 修改数据源
  24 + * @param sysDataSource
  25 + * @return
  26 + */
  27 + Result editDataSource(SysDataSource sysDataSource);
  28 +
  29 +
  30 + /**
  31 + * 删除数据源
  32 + * @param id
  33 + * @return
  34 + */
  35 + Result deleteDataSource(String id);
14 } 36 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java
@@ -127,9 +127,10 @@ public interface ISysDepartService extends IService&lt;SysDepart&gt;{ @@ -127,9 +127,10 @@ public interface ISysDepartService extends IService&lt;SysDepart&gt;{
127 * 获取我的部门下级所有部门 127 * 获取我的部门下级所有部门
128 * @param parentId 父id 128 * @param parentId 父id
129 * @param ids 多个部门id 129 * @param ids 多个部门id
  130 + * @param primaryKey 主键字段(id或者orgCode)
130 * @return 131 * @return
131 */ 132 */
132 - List<SysDepartTreeModel> queryTreeListByPid(String parentId,String ids); 133 + List<SysDepartTreeModel> queryTreeListByPid(String parentId,String ids, String primaryKey);
133 134
134 /** 135 /**
135 * 获取某个部门的所有父级部门的ID 136 * 获取某个部门的所有父级部门的ID
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDictService.java
@@ -158,16 +158,16 @@ public interface ISysDictService extends IService&lt;SysDict&gt; { @@ -158,16 +158,16 @@ public interface ISysDictService extends IService&lt;SysDict&gt; {
158 */ 158 */
159 public List<DictModel> queryAllUserBackDictModel(); 159 public List<DictModel> queryAllUserBackDictModel();
160 160
161 - /**  
162 - * 通过关键字查询字典表  
163 - * @param table  
164 - * @param text  
165 - * @param code  
166 - * @param keyword  
167 - * @return  
168 - */  
169 - @Deprecated  
170 - public List<DictModel> queryTableDictItems(String table, String text, String code,String keyword); 161 +// /**
  162 +// * 通过关键字查询字典表
  163 +// * @param table
  164 +// * @param text
  165 +// * @param code
  166 +// * @param keyword
  167 +// * @return
  168 +// */
  169 +// @Deprecated
  170 +// public List<DictModel> queryTableDictItems(String table, String text, String code,String keyword);
171 171
172 /** 172 /**
173 * 查询字典表数据 只查询前10条 173 * 查询字典表数据 只查询前10条
@@ -179,6 +179,7 @@ public interface ISysDictService extends IService&lt;SysDict&gt; { @@ -179,6 +179,7 @@ public interface ISysDictService extends IService&lt;SysDict&gt; {
179 * @param pageSize 每页条数 179 * @param pageSize 每页条数
180 * @return 180 * @return
181 */ 181 */
  182 + @Deprecated
182 public List<DictModel> queryLittleTableDictItems(String table, String text, String code, String condition, String keyword, int pageSize); 183 public List<DictModel> queryLittleTableDictItems(String table, String text, String code, String condition, String keyword, int pageSize);
183 184
184 /** 185 /**
@@ -190,6 +191,7 @@ public interface ISysDictService extends IService&lt;SysDict&gt; { @@ -190,6 +191,7 @@ public interface ISysDictService extends IService&lt;SysDict&gt; {
190 * @param keyword 191 * @param keyword
191 * @return 192 * @return
192 */ 193 */
  194 + @Deprecated
193 public List<DictModel> queryAllTableDictItems(String table, String text, String code, String condition, String keyword); 195 public List<DictModel> queryAllTableDictItems(String table, String text, String code, String condition, String keyword);
194 /** 196 /**
195 * 根据表名、显示字段名、存储字段名 查询树 197 * 根据表名、显示字段名、存储字段名 查询树
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java
@@ -49,8 +49,10 @@ public interface ISysUserDepartService extends IService&lt;SysUserDepart&gt; { @@ -49,8 +49,10 @@ public interface ISysUserDepartService extends IService&lt;SysUserDepart&gt; {
49 * @param username 49 * @param username
50 * @param pageSize 50 * @param pageSize
51 * @param pageNo 51 * @param pageNo
  52 + * @param realname
  53 + * @param id
52 * @return 54 * @return
53 */ 55 */
54 - IPage<SysUser> queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo); 56 + IPage<SysUser> queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo,String id);
55 57
56 } 58 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
@@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage; @@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
6 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 6 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
7 import com.baomidou.mybatisplus.extension.service.IService; 7 import com.baomidou.mybatisplus.extension.service.IService;
8 import org.jeecg.common.api.vo.Result; 8 import org.jeecg.common.api.vo.Result;
  9 +import org.jeecg.common.system.vo.LoginUser;
9 import org.jeecg.common.system.vo.SysUserCacheInfo; 10 import org.jeecg.common.system.vo.SysUserCacheInfo;
  11 +import org.jeecg.modules.system.entity.SysRoleIndex;
10 import org.jeecg.modules.system.entity.SysUser; 12 import org.jeecg.modules.system.entity.SysUser;
11 import org.jeecg.modules.system.model.SysUserSysDepartModel; 13 import org.jeecg.modules.system.model.SysUserSysDepartModel;
12 import org.springframework.transaction.annotation.Transactional; 14 import org.springframework.transaction.annotation.Transactional;
@@ -87,12 +89,22 @@ public interface ISysUserService extends IService&lt;SysUser&gt; { @@ -87,12 +89,22 @@ public interface ISysUserService extends IService&lt;SysUser&gt; {
87 * @return 89 * @return
88 */ 90 */
89 public List<String> getRole(String username); 91 public List<String> getRole(String username);
  92 +
  93 + /**
  94 + * 获取根据登录用户的角色获取动态首页
  95 + *
  96 + * @param username
  97 + * @param version 前端UI版本
  98 + * @return
  99 + */
  100 + public SysRoleIndex getDynamicIndexByUserRole(String username,String version);
90 101
91 /** 102 /**
92 * 查询用户信息包括 部门信息 103 * 查询用户信息包括 部门信息
93 * @param username 104 * @param username
94 * @return 105 * @return
95 */ 106 */
  107 + @Deprecated
96 public SysUserCacheInfo getCacheUser(String username); 108 public SysUserCacheInfo getCacheUser(String username);
97 109
98 /** 110 /**
@@ -175,6 +187,7 @@ public interface ISysUserService extends IService&lt;SysUser&gt; { @@ -175,6 +187,7 @@ public interface ISysUserService extends IService&lt;SysUser&gt; {
175 /** 187 /**
176 * 根据手机号获取用户名和密码 188 * 根据手机号获取用户名和密码
177 * @param phone 手机号 189 * @param phone 手机号
  190 + * @return SysUser
178 */ 191 */
179 public SysUser getUserByPhone(String phone); 192 public SysUser getUserByPhone(String phone);
180 193
@@ -280,4 +293,12 @@ public interface ISysUserService extends IService&lt;SysUser&gt; { @@ -280,4 +293,12 @@ public interface ISysUserService extends IService&lt;SysUser&gt; {
280 */ 293 */
281 List<String> userIdToUsername(Collection<String> userIdList); 294 List<String> userIdToUsername(Collection<String> userIdList);
282 295
  296 +
  297 + /**
  298 + * 获取用户信息 字段信息是加密后的 【加密用户信息】
  299 + * @param username
  300 + * @return
  301 + */
  302 + LoginUser getEncodeUserInfo(String username);
  303 +
283 } 304 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java
1 package org.jeecg.modules.system.service.impl; 1 package org.jeecg.modules.system.service.impl;
  2 +
2 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
3 import com.alibaba.fastjson.JSONObject; 4 import com.alibaba.fastjson.JSONObject;
4 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -14,19 +15,22 @@ import org.apache.shiro.SecurityUtils; @@ -14,19 +15,22 @@ import org.apache.shiro.SecurityUtils;
14 import org.jeecg.common.api.dto.OnlineAuthDTO; 15 import org.jeecg.common.api.dto.OnlineAuthDTO;
15 import org.jeecg.common.api.dto.message.*; 16 import org.jeecg.common.api.dto.message.*;
16 import org.jeecg.common.aspect.UrlMatchEnum; 17 import org.jeecg.common.aspect.UrlMatchEnum;
17 -import org.jeecg.common.constant.CacheConstant;  
18 -import org.jeecg.common.constant.CommonConstant;  
19 -import org.jeecg.common.constant.DataBaseConstant;  
20 -import org.jeecg.common.constant.WebsocketConst; 18 +import org.jeecg.common.constant.*;
  19 +import org.jeecg.common.constant.enums.MessageTypeEnum;
  20 +import org.jeecg.common.desensitization.util.SensitiveInfoUtil;
21 import org.jeecg.common.exception.JeecgBootException; 21 import org.jeecg.common.exception.JeecgBootException;
22 import org.jeecg.common.system.api.ISysBaseAPI; 22 import org.jeecg.common.system.api.ISysBaseAPI;
23 import org.jeecg.common.system.query.QueryGenerator; 23 import org.jeecg.common.system.query.QueryGenerator;
24 import org.jeecg.common.system.vo.*; 24 import org.jeecg.common.system.vo.*;
25 import org.jeecg.common.util.SysAnnmentTypeEnum; 25 import org.jeecg.common.util.SysAnnmentTypeEnum;
26 import org.jeecg.common.util.YouBianCodeUtil; 26 import org.jeecg.common.util.YouBianCodeUtil;
  27 +import org.jeecg.common.util.dynamic.db.FreemarkerParseFactory;
27 import org.jeecg.common.util.oConvertUtils; 28 import org.jeecg.common.util.oConvertUtils;
28 import org.jeecg.modules.message.entity.SysMessageTemplate; 29 import org.jeecg.modules.message.entity.SysMessageTemplate;
  30 +import org.jeecg.modules.message.handle.impl.DdSendMsgHandle;
29 import org.jeecg.modules.message.handle.impl.EmailSendMsgHandle; 31 import org.jeecg.modules.message.handle.impl.EmailSendMsgHandle;
  32 +import org.jeecg.modules.message.handle.impl.QywxSendMsgHandle;
  33 +import org.jeecg.modules.message.handle.impl.SystemSendMsgHandle;
30 import org.jeecg.modules.message.service.ISysMessageTemplateService; 34 import org.jeecg.modules.message.service.ISysMessageTemplateService;
31 import org.jeecg.modules.message.websocket.WebSocket; 35 import org.jeecg.modules.message.websocket.WebSocket;
32 import org.jeecg.modules.system.entity.*; 36 import org.jeecg.modules.system.entity.*;
@@ -58,11 +62,10 @@ import java.util.*; @@ -58,11 +62,10 @@ import java.util.*;
58 public class SysBaseApiImpl implements ISysBaseAPI { 62 public class SysBaseApiImpl implements ISysBaseAPI {
59 /** 当前系统数据库类型 */ 63 /** 当前系统数据库类型 */
60 private static String DB_TYPE = ""; 64 private static String DB_TYPE = "";
  65 +
61 @Autowired 66 @Autowired
62 private ISysMessageTemplateService sysMessageTemplateService; 67 private ISysMessageTemplateService sysMessageTemplateService;
63 @Resource 68 @Resource
64 - private SysLogMapper sysLogMapper;  
65 - @Resource  
66 private SysUserMapper userMapper; 69 private SysUserMapper userMapper;
67 @Resource 70 @Resource
68 private SysUserRoleMapper sysUserRoleMapper; 71 private SysUserRoleMapper sysUserRoleMapper;
@@ -82,7 +85,6 @@ public class SysBaseApiImpl implements ISysBaseAPI { @@ -82,7 +85,6 @@ public class SysBaseApiImpl implements ISysBaseAPI {
82 private SysDepartMapper departMapper; 85 private SysDepartMapper departMapper;
83 @Resource 86 @Resource
84 private SysCategoryMapper categoryMapper; 87 private SysCategoryMapper categoryMapper;
85 -  
86 @Autowired 88 @Autowired
87 private ISysDataSourceService dataSourceService; 89 private ISysDataSourceService dataSourceService;
88 @Autowired 90 @Autowired
@@ -91,28 +93,33 @@ public class SysBaseApiImpl implements ISysBaseAPI { @@ -91,28 +93,33 @@ public class SysBaseApiImpl implements ISysBaseAPI {
91 private SysPermissionMapper sysPermissionMapper; 93 private SysPermissionMapper sysPermissionMapper;
92 @Autowired 94 @Autowired
93 private ISysPermissionDataRuleService sysPermissionDataRuleService; 95 private ISysPermissionDataRuleService sysPermissionDataRuleService;
94 -  
95 @Autowired 96 @Autowired
96 private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; 97 private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
97 @Autowired 98 @Autowired
98 private ThirdAppDingtalkServiceImpl dingtalkService; 99 private ThirdAppDingtalkServiceImpl dingtalkService;
99 -  
100 @Autowired 100 @Autowired
101 ISysCategoryService sysCategoryService; 101 ISysCategoryService sysCategoryService;
  102 + @Autowired
  103 + private ISysUserService sysUserService;
102 104
103 @Override 105 @Override
104 - @Cacheable(cacheNames=CacheConstant.SYS_USERS_CACHE, key="#username") 106 + //@SensitiveDecode
105 public LoginUser getUserByName(String username) { 107 public LoginUser getUserByName(String username) {
106 - if(oConvertUtils.isEmpty(username)) { 108 + //update-begin-author:taoyan date:2022-6-6 for: VUEN-1276 【v3流程图】测试bug 1、通过我发起的流程或者流程实例,查看历史,流程图预览问题
  109 + if (oConvertUtils.isEmpty(username)) {
107 return null; 110 return null;
108 } 111 }
109 - LoginUser loginUser = new LoginUser();  
110 - SysUser sysUser = userMapper.getUserByName(username);  
111 - if(sysUser==null) {  
112 - return null; 112 + //update-end-author:taoyan date:2022-6-6 for: VUEN-1276 【v3流程图】测试bug 1、通过我发起的流程或者流程实例,查看历史,流程图预览问题
  113 + LoginUser user = sysUserService.getEncodeUserInfo(username);
  114 +
  115 + //相同类中方法间调用时脱敏解密 Aop会失效,获取用户信息太重要,此处采用原生解密方法,不采用@SensitiveDecodeAble注解方式
  116 + try {
  117 + SensitiveInfoUtil.handlerObject(user, false);
  118 + } catch (IllegalAccessException e) {
  119 + e.printStackTrace();
113 } 120 }
114 - BeanUtils.copyProperties(sysUser, loginUser);  
115 - return loginUser; 121 +
  122 + return user;
116 } 123 }
117 124
118 @Override 125 @Override
@@ -204,6 +211,14 @@ public class SysBaseApiImpl implements ISysBaseAPI { @@ -204,6 +211,14 @@ public class SysBaseApiImpl implements ISysBaseAPI {
204 SysUserCacheInfo info = new SysUserCacheInfo(); 211 SysUserCacheInfo info = new SysUserCacheInfo();
205 info.setOneDepart(true); 212 info.setOneDepart(true);
206 LoginUser user = this.getUserByName(username); 213 LoginUser user = this.getUserByName(username);
  214 +
  215 +// try {
  216 +// //相同类中方法间调用时脱敏@SensitiveDecodeAble解密 Aop失效处理
  217 +// SensitiveInfoUtil.handlerObject(user, false);
  218 +// } catch (IllegalAccessException e) {
  219 +// e.printStackTrace();
  220 +// }
  221 +
207 if(user!=null) { 222 if(user!=null) {
208 info.setSysUserCode(user.getUsername()); 223 info.setSysUserCode(user.getUsername());
209 info.setSysUserName(user.getRealname()); 224 info.setSysUserName(user.getRealname());
@@ -290,7 +305,7 @@ public class SysBaseApiImpl implements ISysBaseAPI { @@ -290,7 +305,7 @@ public class SysBaseApiImpl implements ISysBaseAPI {
290 @Override 305 @Override
291 public List<DictModel> queryTableDictItemsByCode(String table, String text, String code) { 306 public List<DictModel> queryTableDictItemsByCode(String table, String text, String code) {
292 //update-begin-author:taoyan date:20200820 for:【Online+系统】字典表加权限控制机制逻辑,想法不错 LOWCOD-799 307 //update-begin-author:taoyan date:20200820 for:【Online+系统】字典表加权限控制机制逻辑,想法不错 LOWCOD-799
293 - if(table.indexOf("#{")>=0){ 308 + if(table.indexOf(SymbolConstant.SYS_VAR_PREFIX)>=0){
294 table = QueryGenerator.getSqlRuleValue(table); 309 table = QueryGenerator.getSqlRuleValue(table);
295 } 310 }
296 //update-end-author:taoyan date:20200820 for:【Online+系统】字典表加权限控制机制逻辑,想法不错 LOWCOD-799 311 //update-end-author:taoyan date:20200820 for:【Online+系统】字典表加权限控制机制逻辑,想法不错 LOWCOD-799
@@ -528,15 +543,15 @@ public class SysBaseApiImpl implements ISysBaseAPI { @@ -528,15 +543,15 @@ public class SysBaseApiImpl implements ISysBaseAPI {
528 try { 543 try {
529 DatabaseMetaData md = connection.getMetaData(); 544 DatabaseMetaData md = connection.getMetaData();
530 String dbType = md.getDatabaseProductName().toLowerCase(); 545 String dbType = md.getDatabaseProductName().toLowerCase();
531 - if(dbType.indexOf("mysql")>=0) { 546 + if(dbType.indexOf(DataBaseConstant.DB_TYPE_MYSQL.toLowerCase())>=0) {
532 DB_TYPE = DataBaseConstant.DB_TYPE_MYSQL; 547 DB_TYPE = DataBaseConstant.DB_TYPE_MYSQL;
533 - }else if(dbType.indexOf("oracle")>=0) { 548 + }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_ORACLE.toLowerCase())>=0) {
534 DB_TYPE = DataBaseConstant.DB_TYPE_ORACLE; 549 DB_TYPE = DataBaseConstant.DB_TYPE_ORACLE;
535 - }else if(dbType.indexOf("sqlserver")>=0||dbType.indexOf("sql server")>=0) { 550 + }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_SQLSERVER.toLowerCase())>=0||dbType.indexOf(DataBaseConstant.DB_TYPE_SQL_SERVER_BLANK)>=0) {
536 DB_TYPE = DataBaseConstant.DB_TYPE_SQLSERVER; 551 DB_TYPE = DataBaseConstant.DB_TYPE_SQLSERVER;
537 - }else if(dbType.indexOf("postgresql")>=0) { 552 + }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_POSTGRESQL.toLowerCase())>=0) {
538 DB_TYPE = DataBaseConstant.DB_TYPE_POSTGRESQL; 553 DB_TYPE = DataBaseConstant.DB_TYPE_POSTGRESQL;
539 - }else if(dbType.indexOf("mariadb")>=0) { 554 + }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_MARIADB.toLowerCase())>=0) {
540 DB_TYPE = DataBaseConstant.DB_TYPE_MARIADB; 555 DB_TYPE = DataBaseConstant.DB_TYPE_MARIADB;
541 }else { 556 }else {
542 log.error("数据库类型:[" + dbType + "]不识别!"); 557 log.error("数据库类型:[" + dbType + "]不识别!");
@@ -777,6 +792,8 @@ public class SysBaseApiImpl implements ISysBaseAPI { @@ -777,6 +792,8 @@ public class SysBaseApiImpl implements ISysBaseAPI {
777 if(userDepartList != null){ 792 if(userDepartList != null){
778 //查找所属公司 793 //查找所属公司
779 String orgCodes = ""; 794 String orgCodes = "";
  795 + StringBuilder orgCodesBuilder = new StringBuilder();
  796 + orgCodesBuilder.append(orgCodes);
780 for(SysUserDepart userDepart : userDepartList){ 797 for(SysUserDepart userDepart : userDepartList){
781 //查询所属公司编码 798 //查询所属公司编码
782 SysDepart depart = sysDepartService.getById(userDepart.getDepId()); 799 SysDepart depart = sysDepartService.getById(userDepart.getDepId());
@@ -785,10 +802,11 @@ public class SysBaseApiImpl implements ISysBaseAPI { @@ -785,10 +802,11 @@ public class SysBaseApiImpl implements ISysBaseAPI {
785 if(depart != null && depart.getOrgCode() != null){ 802 if(depart != null && depart.getOrgCode() != null){
786 compyOrgCode = depart.getOrgCode().substring(0,length); 803 compyOrgCode = depart.getOrgCode().substring(0,length);
787 if(orgCodes.indexOf(compyOrgCode) == -1){ 804 if(orgCodes.indexOf(compyOrgCode) == -1){
788 - orgCodes = orgCodes + "," + compyOrgCode; 805 + orgCodesBuilder.append(SymbolConstant.COMMA).append(compyOrgCode);
789 } 806 }
790 } 807 }
791 } 808 }
  809 + orgCodes = orgCodesBuilder.toString();
792 if(oConvertUtils.isNotEmpty(orgCodes)){ 810 if(oConvertUtils.isNotEmpty(orgCodes)){
793 orgCodes = orgCodes.substring(1); 811 orgCodes = orgCodes.substring(1);
794 List<String> listIds = departMapper.getSubDepIdsByOrgCodes(orgCodes.split(",")); 812 List<String> listIds = departMapper.getSubDepIdsByOrgCodes(orgCodes.split(","));
@@ -1037,7 +1055,7 @@ public class SysBaseApiImpl implements ISysBaseAPI { @@ -1037,7 +1055,7 @@ public class SysBaseApiImpl implements ISysBaseAPI {
1037 @Override 1055 @Override
1038 public void sendEmailMsg(String email, String title, String content) { 1056 public void sendEmailMsg(String email, String title, String content) {
1039 EmailSendMsgHandle emailHandle=new EmailSendMsgHandle(); 1057 EmailSendMsgHandle emailHandle=new EmailSendMsgHandle();
1040 - emailHandle.SendMsg(email, title, content); 1058 + emailHandle.sendMsg(email, title, content);
1041 } 1059 }
1042 1060
1043 /** 1061 /**
@@ -1154,4 +1172,54 @@ public class SysBaseApiImpl implements ISysBaseAPI { @@ -1154,4 +1172,54 @@ public class SysBaseApiImpl implements ISysBaseAPI {
1154 return sysDictService.queryTableDictTextByKeys(table, text, code, Arrays.asList(keys.split(","))); 1172 return sysDictService.queryTableDictTextByKeys(table, text, code, Arrays.asList(keys.split(",")));
1155 } 1173 }
1156 1174
  1175 + //-------------------------------------流程节点发送模板消息-----------------------------------------------
  1176 + @Autowired
  1177 + private QywxSendMsgHandle qywxSendMsgHandle;
  1178 +
  1179 + @Autowired
  1180 + private SystemSendMsgHandle systemSendMsgHandle;
  1181 +
  1182 + @Autowired
  1183 + private EmailSendMsgHandle emailSendMsgHandle;
  1184 +
  1185 + @Autowired
  1186 + private DdSendMsgHandle ddSendMsgHandle;
  1187 +
  1188 + @Override
  1189 + public void sendTemplateMessage(MessageDTO message) {
  1190 + String messageType = message.getType();
  1191 + //update-begin-author:taoyan date:2022-7-9 for: 将模板解析代码移至消息发送, 而不是调用的地方
  1192 + String templateCode = message.getTemplateCode();
  1193 + if(oConvertUtils.isNotEmpty(templateCode)){
  1194 + String content = getTemplateContent(templateCode);
  1195 + if(oConvertUtils.isNotEmpty(content) && null!=message.getData()){
  1196 + content = FreemarkerParseFactory.parseTemplateContent(content, message.getData());
  1197 + }
  1198 + message.setContent(content);
  1199 + }
  1200 + if(oConvertUtils.isEmpty(message.getContent())){
  1201 + throw new JeecgBootException("发送消息失败,消息内容为空!");
  1202 + }
  1203 + //update-end-author:taoyan date:2022-7-9 for: 将模板解析代码移至消息发送, 而不是调用的地方
  1204 + if(MessageTypeEnum.XT.getType().equals(messageType)){
  1205 + systemSendMsgHandle.sendMessage(message);
  1206 + }else if(MessageTypeEnum.YJ.getType().equals(messageType)){
  1207 + emailSendMsgHandle.sendMessage(message);
  1208 + }else if(MessageTypeEnum.DD.getType().equals(messageType)){
  1209 + ddSendMsgHandle.sendMessage(message);
  1210 + }else if(MessageTypeEnum.QYWX.getType().equals(messageType)){
  1211 + qywxSendMsgHandle.sendMessage(message);
  1212 + }
  1213 + }
  1214 +
  1215 + @Override
  1216 + public String getTemplateContent(String code) {
  1217 + List<SysMessageTemplate> list = sysMessageTemplateService.selectByCode(code);
  1218 + if(list==null || list.size()==0){
  1219 + return null;
  1220 + }
  1221 + return list.get(0).getTemplateContent();
  1222 + }
  1223 + //-------------------------------------流程节点发送模板消息-----------------------------------------------
  1224 +
1157 } 1225 }
1158 \ No newline at end of file 1226 \ No newline at end of file
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysCategoryServiceImpl.java
@@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
5 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 5 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
6 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 6 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
7 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8 +import org.jeecg.common.constant.CommonConstant;
8 import org.jeecg.common.constant.FillRuleConstant; 9 import org.jeecg.common.constant.FillRuleConstant;
  10 +import org.jeecg.common.constant.SymbolConstant;
9 import org.jeecg.common.exception.JeecgBootException; 11 import org.jeecg.common.exception.JeecgBootException;
10 import org.jeecg.common.util.FillRuleUtil; 12 import org.jeecg.common.util.FillRuleUtil;
11 import org.jeecg.common.util.oConvertUtils; 13 import org.jeecg.common.util.oConvertUtils;
@@ -43,8 +45,8 @@ public class SysCategoryServiceImpl extends ServiceImpl&lt;SysCategoryMapper, SysCa @@ -43,8 +45,8 @@ public class SysCategoryServiceImpl extends ServiceImpl&lt;SysCategoryMapper, SysCa
43 if(!ISysCategoryService.ROOT_PID_VALUE.equals(categoryPid)){ 45 if(!ISysCategoryService.ROOT_PID_VALUE.equals(categoryPid)){
44 SysCategory parent = baseMapper.selectById(categoryPid); 46 SysCategory parent = baseMapper.selectById(categoryPid);
45 parentCode = parent.getCode(); 47 parentCode = parent.getCode();
46 - if(parent!=null && !"1".equals(parent.getHasChild())){  
47 - parent.setHasChild("1"); 48 + if(parent!=null && !ISysCategoryService.HAS_CHILD.equals(parent.getHasChild())){
  49 + parent.setHasChild(ISysCategoryService.HAS_CHILD);
48 baseMapper.updateById(parent); 50 baseMapper.updateById(parent);
49 } 51 }
50 } 52 }
@@ -66,8 +68,8 @@ public class SysCategoryServiceImpl extends ServiceImpl&lt;SysCategoryMapper, SysCa @@ -66,8 +68,8 @@ public class SysCategoryServiceImpl extends ServiceImpl&lt;SysCategoryMapper, SysCa
66 }else{ 68 }else{
67 //如果当前节点父ID不为空 则设置父节点的hasChild 为1 69 //如果当前节点父ID不为空 则设置父节点的hasChild 为1
68 SysCategory parent = baseMapper.selectById(sysCategory.getPid()); 70 SysCategory parent = baseMapper.selectById(sysCategory.getPid());
69 - if(parent!=null && !"1".equals(parent.getHasChild())){  
70 - parent.setHasChild("1"); 71 + if(parent!=null && !ISysCategoryService.HAS_CHILD.equals(parent.getHasChild())){
  72 + parent.setHasChild(ISysCategoryService.HAS_CHILD);
71 baseMapper.updateById(parent); 73 baseMapper.updateById(parent);
72 } 74 }
73 } 75 }
@@ -170,14 +172,15 @@ public class SysCategoryServiceImpl extends ServiceImpl&lt;SysCategoryMapper, SysCa @@ -170,14 +172,15 @@ public class SysCategoryServiceImpl extends ServiceImpl&lt;SysCategoryMapper, SysCa
170 queryWrapper.eq(SysCategory::getPid,metaPid); 172 queryWrapper.eq(SysCategory::getPid,metaPid);
171 queryWrapper.notIn(SysCategory::getId,Arrays.asList(idArr)); 173 queryWrapper.notIn(SysCategory::getId,Arrays.asList(idArr));
172 List<SysCategory> dataList = this.baseMapper.selectList(queryWrapper); 174 List<SysCategory> dataList = this.baseMapper.selectList(queryWrapper);
173 - if((dataList == null || dataList.size()==0) && !Arrays.asList(idArr).contains(metaPid)  
174 - && !sb.toString().contains(metaPid)){ 175 + boolean flag = (dataList == null || dataList.size()==0) && !Arrays.asList(idArr).contains(metaPid)
  176 + && !sb.toString().contains(metaPid);
  177 + if(flag){
175 //如果当前节点原本有子节点 现在木有了,更新状态 178 //如果当前节点原本有子节点 现在木有了,更新状态
176 sb.append(metaPid).append(","); 179 sb.append(metaPid).append(",");
177 } 180 }
178 } 181 }
179 } 182 }
180 - if(sb.toString().endsWith(",")){ 183 + if(sb.toString().endsWith(SymbolConstant.COMMA)){
181 sb = sb.deleteCharAt(sb.length() - 1); 184 sb = sb.deleteCharAt(sb.length() - 1);
182 } 185 }
183 return sb.toString(); 186 return sb.toString();
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDataSourceServiceImpl.java
1 package org.jeecg.modules.system.service.impl; 1 package org.jeecg.modules.system.service.impl;
2 2
  3 +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
  4 +import com.baomidou.dynamic.datasource.creator.DruidDataSourceCreator;
  5 +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
  6 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
3 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8 +import org.apache.commons.lang.StringUtils;
  9 +import org.jeecg.common.api.vo.Result;
  10 +import org.jeecg.common.util.dynamic.db.DataSourceCachePool;
4 import org.jeecg.modules.system.entity.SysDataSource; 11 import org.jeecg.modules.system.entity.SysDataSource;
5 import org.jeecg.modules.system.mapper.SysDataSourceMapper; 12 import org.jeecg.modules.system.mapper.SysDataSourceMapper;
6 import org.jeecg.modules.system.service.ISysDataSourceService; 13 import org.jeecg.modules.system.service.ISysDataSourceService;
  14 +import org.jeecg.modules.system.util.SecurityUtil;
  15 +import org.springframework.beans.factory.annotation.Autowired;
7 import org.springframework.stereotype.Service; 16 import org.springframework.stereotype.Service;
8 17
  18 +import javax.sql.DataSource;
  19 +
9 /** 20 /**
10 * @Description: 多数据源管理 21 * @Description: 多数据源管理
11 * @Author: jeecg-boot 22 * @Author: jeecg-boot
@@ -15,4 +26,106 @@ import org.springframework.stereotype.Service; @@ -15,4 +26,106 @@ import org.springframework.stereotype.Service;
15 @Service 26 @Service
16 public class SysDataSourceServiceImpl extends ServiceImpl<SysDataSourceMapper, SysDataSource> implements ISysDataSourceService { 27 public class SysDataSourceServiceImpl extends ServiceImpl<SysDataSourceMapper, SysDataSource> implements ISysDataSourceService {
17 28
  29 + @Autowired
  30 + private DruidDataSourceCreator dataSourceCreator;
  31 +
  32 + @Autowired
  33 + private DataSource dataSource;
  34 +
  35 + @Override
  36 + public Result saveDataSource(SysDataSource sysDataSource) {
  37 + try {
  38 + long count = checkDbCode(sysDataSource.getCode());
  39 + if (count > 0) {
  40 + return Result.error("数据源编码已存在");
  41 + }
  42 + String dbPassword = sysDataSource.getDbPassword();
  43 + if (StringUtils.isNotBlank(dbPassword)) {
  44 + String encrypt = SecurityUtil.jiami(dbPassword);
  45 + sysDataSource.setDbPassword(encrypt);
  46 + }
  47 + boolean result = save(sysDataSource);
  48 + if (result) {
  49 + //动态创建数据源
  50 + //addDynamicDataSource(sysDataSource, dbPassword);
  51 + }
  52 + } catch (Exception e) {
  53 + e.printStackTrace();
  54 + }
  55 + return Result.OK("添加成功!");
  56 + }
  57 +
  58 + @Override
  59 + public Result editDataSource(SysDataSource sysDataSource) {
  60 + try {
  61 + SysDataSource d = getById(sysDataSource.getId());
  62 + DataSourceCachePool.removeCache(d.getCode());
  63 + String dbPassword = sysDataSource.getDbPassword();
  64 + if (StringUtils.isNotBlank(dbPassword)) {
  65 + String encrypt = SecurityUtil.jiami(dbPassword);
  66 + sysDataSource.setDbPassword(encrypt);
  67 + }
  68 + Boolean result=updateById(sysDataSource);
  69 + if(result){
  70 + //先删除老的数据源
  71 + // removeDynamicDataSource(d.getCode());
  72 + //添加新的数据源
  73 + //addDynamicDataSource(sysDataSource,dbPassword);
  74 + }
  75 + } catch (Exception e) {
  76 + e.printStackTrace();
  77 + }
  78 + return Result.OK("编辑成功!");
  79 + }
  80 +
  81 + @Override
  82 + public Result deleteDataSource(String id) {
  83 + SysDataSource sysDataSource = getById(id);
  84 + DataSourceCachePool.removeCache(sysDataSource.getCode());
  85 + removeById(id);
  86 + return Result.OK("删除成功!");
  87 + }
  88 +
  89 + /**
  90 + * 动态添加数据源 【注册mybatis动态数据源】
  91 + *
  92 + * @param sysDataSource 添加数据源数据对象
  93 + * @param dbPassword 未加密的密码
  94 + */
  95 + private void addDynamicDataSource(SysDataSource sysDataSource, String dbPassword) {
  96 + DataSourceProperty dataSourceProperty = new DataSourceProperty();
  97 + dataSourceProperty.setUrl(sysDataSource.getDbUrl());
  98 + dataSourceProperty.setPassword(dbPassword);
  99 + dataSourceProperty.setDriverClassName(sysDataSource.getDbDriver());
  100 + dataSourceProperty.setUsername(sysDataSource.getDbUsername());
  101 + DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
  102 + DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty);
  103 + try {
  104 + ds.addDataSource(sysDataSource.getCode(), dataSource);
  105 + } catch (Exception e) {
  106 + e.printStackTrace();
  107 + }
  108 + }
  109 +
  110 + /**
  111 + * 删除数据源
  112 + * @param code
  113 + */
  114 + private void removeDynamicDataSource(String code) {
  115 + DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
  116 + ds.removeDataSource(code);
  117 + }
  118 +
  119 + /**
  120 + * 检查数据源编码是否存在
  121 + *
  122 + * @param dbCode
  123 + * @return
  124 + */
  125 + private long checkDbCode(String dbCode) {
  126 + QueryWrapper<SysDataSource> qw = new QueryWrapper();
  127 + qw.lambda().eq(true, SysDataSource::getCode, dbCode);
  128 + return count(qw);
  129 + }
  130 +
18 } 131 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java
@@ -10,6 +10,7 @@ import org.apache.commons.lang.StringUtils; @@ -10,6 +10,7 @@ import org.apache.commons.lang.StringUtils;
10 import org.jeecg.common.constant.CacheConstant; 10 import org.jeecg.common.constant.CacheConstant;
11 import org.jeecg.common.constant.CommonConstant; 11 import org.jeecg.common.constant.CommonConstant;
12 import org.jeecg.common.constant.FillRuleConstant; 12 import org.jeecg.common.constant.FillRuleConstant;
  13 +import org.jeecg.common.constant.SymbolConstant;
13 import org.jeecg.common.util.FillRuleUtil; 14 import org.jeecg.common.util.FillRuleUtil;
14 import org.jeecg.common.util.YouBianCodeUtil; 15 import org.jeecg.common.util.YouBianCodeUtil;
15 import org.jeecg.common.util.oConvertUtils; 16 import org.jeecg.common.util.oConvertUtils;
@@ -469,14 +470,14 @@ public class SysDepartServiceImpl extends ServiceImpl&lt;SysDepartMapper, SysDepart @@ -469,14 +470,14 @@ public class SysDepartServiceImpl extends ServiceImpl&lt;SysDepartMapper, SysDepart
469 */ 470 */
470 private String getMinLengthNode(String[] str){ 471 private String getMinLengthNode(String[] str){
471 int min =str[0].length(); 472 int min =str[0].length();
472 - String orgCode = str[0]; 473 + StringBuilder orgCodeBuilder = new StringBuilder(str[0]);
473 for(int i =1;i<str.length;i++){ 474 for(int i =1;i<str.length;i++){
474 if(str[i].length()<=min){ 475 if(str[i].length()<=min){
475 min = str[i].length(); 476 min = str[i].length();
476 - orgCode = orgCode+","+str[i]; 477 + orgCodeBuilder.append(SymbolConstant.COMMA).append(str[i]);
477 } 478 }
478 } 479 }
479 - return orgCode; 480 + return orgCodeBuilder.toString();
480 } 481 }
481 /** 482 /**
482 * 获取部门树信息根据关键字 483 * 获取部门树信息根据关键字
@@ -504,13 +505,18 @@ public class SysDepartServiceImpl extends ServiceImpl&lt;SysDepartMapper, SysDepart @@ -504,13 +505,18 @@ public class SysDepartServiceImpl extends ServiceImpl&lt;SysDepartMapper, SysDepart
504 * 根据parentId查询部门树 505 * 根据parentId查询部门树
505 * @param parentId 506 * @param parentId
506 * @param ids 前端回显传递 507 * @param ids 前端回显传递
  508 + * @param primaryKey 主键字段(id或者orgCode)
507 * @return 509 * @return
508 */ 510 */
509 @Override 511 @Override
510 - public List<SysDepartTreeModel> queryTreeListByPid(String parentId,String ids) { 512 + public List<SysDepartTreeModel> queryTreeListByPid(String parentId,String ids, String primaryKey) {
511 Consumer<LambdaQueryWrapper<SysDepart>> square = i -> { 513 Consumer<LambdaQueryWrapper<SysDepart>> square = i -> {
512 if (oConvertUtils.isNotEmpty(ids)) { 514 if (oConvertUtils.isNotEmpty(ids)) {
513 - i.in(SysDepart::getId, ids.split(",")); 515 + if (CommonConstant.DEPART_KEY_ORG_CODE.equals(primaryKey)) {
  516 + i.in(SysDepart::getOrgCode, ids.split(SymbolConstant.COMMA));
  517 + } else {
  518 + i.in(SysDepart::getId, ids.split(SymbolConstant.COMMA));
  519 + }
514 } else { 520 } else {
515 if(oConvertUtils.isEmpty(parentId)){ 521 if(oConvertUtils.isEmpty(parentId)){
516 i.and(q->q.isNull(true,SysDepart::getParentId).or().eq(true,SysDepart::getParentId,"")); 522 i.and(q->q.isNull(true,SysDepart::getParentId).or().eq(true,SysDepart::getParentId,""));
@@ -519,10 +525,12 @@ public class SysDepartServiceImpl extends ServiceImpl&lt;SysDepartMapper, SysDepart @@ -519,10 +525,12 @@ public class SysDepartServiceImpl extends ServiceImpl&lt;SysDepartMapper, SysDepart
519 } 525 }
520 } 526 }
521 }; 527 };
522 - LambdaQueryWrapper<SysDepart> lqw=new LambdaQueryWrapper(); 528 + LambdaQueryWrapper<SysDepart> lqw=new LambdaQueryWrapper<>();
523 lqw.eq(true,SysDepart::getDelFlag,CommonConstant.DEL_FLAG_0.toString()); 529 lqw.eq(true,SysDepart::getDelFlag,CommonConstant.DEL_FLAG_0.toString());
524 lqw.func(square); 530 lqw.func(square);
525 - lqw.orderByDesc(SysDepart::getDepartOrder); 531 + //update-begin---author:wangshuai ---date:20220527 for:[VUEN-1143]排序不对,vue3和2应该都有问题,应该按照升序排------------
  532 + lqw.orderByAsc(SysDepart::getDepartOrder);
  533 + //update-end---author:wangshuai ---date:20220527 for:[VUEN-1143]排序不对,vue3和2应该都有问题,应该按照升序排--------------
526 List<SysDepart> list = list(lqw); 534 List<SysDepart> list = list(lqw);
527 //update-begin---author:wangshuai ---date:20220316 for:[JTC-119]在部门管理菜单下设置部门负责人 创建用户的时候不需要处理 535 //update-begin---author:wangshuai ---date:20220316 for:[JTC-119]在部门管理菜单下设置部门负责人 创建用户的时候不需要处理
528 //设置用户id,让前台显示 536 //设置用户id,让前台显示
@@ -549,7 +557,7 @@ public class SysDepartServiceImpl extends ServiceImpl&lt;SysDepartMapper, SysDepart @@ -549,7 +557,7 @@ public class SysDepartServiceImpl extends ServiceImpl&lt;SysDepartMapper, SysDepart
549 @Override 557 @Override
550 public JSONObject queryAllParentIdByDepartId(String departId) { 558 public JSONObject queryAllParentIdByDepartId(String departId) {
551 JSONObject result = new JSONObject(); 559 JSONObject result = new JSONObject();
552 - for (String id : departId.split(",")) { 560 + for (String id : departId.split(SymbolConstant.COMMA)) {
553 JSONObject all = this.queryAllParentId("id", id); 561 JSONObject all = this.queryAllParentId("id", id);
554 result.put(id, all); 562 result.put(id, all);
555 } 563 }
@@ -559,7 +567,7 @@ public class SysDepartServiceImpl extends ServiceImpl&lt;SysDepartMapper, SysDepart @@ -559,7 +567,7 @@ public class SysDepartServiceImpl extends ServiceImpl&lt;SysDepartMapper, SysDepart
559 @Override 567 @Override
560 public JSONObject queryAllParentIdByOrgCode(String orgCode) { 568 public JSONObject queryAllParentIdByOrgCode(String orgCode) {
561 JSONObject result = new JSONObject(); 569 JSONObject result = new JSONObject();
562 - for (String code : orgCode.split(",")) { 570 + for (String code : orgCode.split(SymbolConstant.COMMA)) {
563 JSONObject all = this.queryAllParentId("org_code", code); 571 JSONObject all = this.queryAllParentId("org_code", code);
564 result.put(code, all); 572 result.put(code, all);
565 } 573 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java
@@ -7,8 +7,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -7,8 +7,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
7 import lombok.extern.slf4j.Slf4j; 7 import lombok.extern.slf4j.Slf4j;
8 import org.jeecg.common.constant.CacheConstant; 8 import org.jeecg.common.constant.CacheConstant;
9 import org.jeecg.common.constant.CommonConstant; 9 import org.jeecg.common.constant.CommonConstant;
  10 +import org.jeecg.common.constant.DataBaseConstant;
  11 +import org.jeecg.common.constant.SymbolConstant;
10 import org.jeecg.common.system.query.QueryGenerator; 12 import org.jeecg.common.system.query.QueryGenerator;
11 import org.jeecg.common.system.util.JwtUtil; 13 import org.jeecg.common.system.util.JwtUtil;
  14 +import org.jeecg.common.system.util.ResourceUtil;
12 import org.jeecg.common.system.vo.DictModel; 15 import org.jeecg.common.system.vo.DictModel;
13 import org.jeecg.common.system.vo.DictModelMany; 16 import org.jeecg.common.system.vo.DictModelMany;
14 import org.jeecg.common.system.vo.DictQuery; 17 import org.jeecg.common.system.vo.DictQuery;
@@ -25,10 +28,7 @@ import org.springframework.cache.annotation.Cacheable; @@ -25,10 +28,7 @@ import org.springframework.cache.annotation.Cacheable;
25 import org.springframework.stereotype.Service; 28 import org.springframework.stereotype.Service;
26 import org.springframework.transaction.annotation.Transactional; 29 import org.springframework.transaction.annotation.Transactional;
27 30
28 -import java.util.ArrayList;  
29 -import java.util.HashMap;  
30 -import java.util.List;  
31 -import java.util.Map; 31 +import java.util.*;
32 import java.util.stream.Collectors; 32 import java.util.stream.Collectors;
33 33
34 /** 34 /**
@@ -97,6 +97,10 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -97,6 +97,10 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
97 }).collect(Collectors.toList()); 97 }).collect(Collectors.toList());
98 res.put(d.getDictCode(), dictModelList); 98 res.put(d.getDictCode(), dictModelList);
99 } 99 }
  100 + //update-begin-author:taoyan date:2022-7-8 for: 系统字典数据应该包括自定义的java类-枚举
  101 + Map<String, List<DictModel>> enumRes = ResourceUtil.getEnumDictData();
  102 + res.putAll(enumRes);
  103 + //update-end-author:taoyan date:2022-7-8 for: 系统字典数据应该包括自定义的java类-枚举
100 log.debug("-------登录加载系统字典-----" + res.toString()); 104 log.debug("-------登录加载系统字典-----" + res.toString());
101 return res; 105 return res;
102 } 106 }
@@ -123,6 +127,10 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -123,6 +127,10 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
123 List<DictModel> dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>()); 127 List<DictModel> dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>());
124 dictItemList.add(new DictModel(dict.getValue(), dict.getText())); 128 dictItemList.add(new DictModel(dict.getValue(), dict.getText()));
125 } 129 }
  130 + //update-begin-author:taoyan date:2022-7-8 for: 系统字典数据应该包括自定义的java类-枚举
  131 + Map<String, List<DictModel>> enumRes = ResourceUtil.queryManyDictByKeys(dictCodeList, keys);
  132 + dictMap.putAll(enumRes);
  133 + //update-end-author:taoyan date:2022-7-8 for: 系统字典数据应该包括自定义的java类-枚举
126 return dictMap; 134 return dictMap;
127 } 135 }
128 136
@@ -167,7 +175,7 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -167,7 +175,7 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
167 public List<DictModel> queryTableDictTextByKeys(String table, String text, String code, List<String> keys) { 175 public List<DictModel> queryTableDictTextByKeys(String table, String text, String code, List<String> keys) {
168 //update-begin-author:taoyan date:20220113 for: @dict注解支持 dicttable 设置where条件 176 //update-begin-author:taoyan date:20220113 for: @dict注解支持 dicttable 设置where条件
169 String filterSql = null; 177 String filterSql = null;
170 - if(table.toLowerCase().indexOf("where")>0){ 178 + if(table.toLowerCase().indexOf(DataBaseConstant.SQL_WHERE)>0){
171 String[] arr = table.split(" (?i)where "); 179 String[] arr = table.split(" (?i)where ");
172 table = arr[0]; 180 table = arr[0];
173 filterSql = arr[1]; 181 filterSql = arr[1];
@@ -200,7 +208,16 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -200,7 +208,16 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
200 return null; 208 return null;
201 } 209 }
202 String[] keyArray = keys.split(","); 210 String[] keyArray = keys.split(",");
203 - List<DictModel> dicts = sysDictMapper.queryTableDictByKeys(table, text, code, keyArray); 211 +
  212 + //update-begin-author:taoyan date:2022-4-24 for: 下拉搜索组件,表单编辑页面回显下拉搜索的文本的时候,因为表名后配置了条件,导致sql执行失败,
  213 + String filterSql = null;
  214 + if(table.toLowerCase().indexOf("where")!=-1){
  215 + String[] arr = table.split(" (?i)where ");
  216 + table = arr[0];
  217 + filterSql = arr[1];
  218 + }
  219 + List<DictModel> dicts = sysDictMapper.queryTableDictByKeysAndFilterSql(table, text, code, filterSql, Arrays.asList(keyArray));
  220 + //update-end-author:taoyan date:2022-4-24 for: 下拉搜索组件,表单编辑页面回显下拉搜索的文本的时候,因为表名后配置了条件,导致sql执行失败,
204 List<String> texts = new ArrayList<>(dicts.size()); 221 List<String> texts = new ArrayList<>(dicts.size());
205 222
206 // update-begin--author:sunjianlei--date:20210514--for:新增delNotExist参数,设为false不删除数据库里不存在的key ---- 223 // update-begin--author:sunjianlei--date:20210514--for:新增delNotExist参数,设为false不删除数据库里不存在的key ----
@@ -261,15 +278,19 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -261,15 +278,19 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
261 return baseMapper.queryAllUserBackDictModel(); 278 return baseMapper.queryAllUserBackDictModel();
262 } 279 }
263 280
264 - @Override  
265 - public List<DictModel> queryTableDictItems(String table, String text, String code, String keyword) {  
266 - return baseMapper.queryTableDictItems(table, text, code, "%"+keyword+"%");  
267 - } 281 +// @Override
  282 +// public List<DictModel> queryTableDictItems(String table, String text, String code, String keyword) {
  283 +// return baseMapper.queryTableDictItems(table, text, code, "%"+keyword+"%");
  284 +// }
268 285
269 @Override 286 @Override
270 public List<DictModel> queryLittleTableDictItems(String table, String text, String code, String condition, String keyword, int pageSize) { 287 public List<DictModel> queryLittleTableDictItems(String table, String text, String code, String condition, String keyword, int pageSize) {
271 Page<DictModel> page = new Page<DictModel>(1, pageSize); 288 Page<DictModel> page = new Page<DictModel>(1, pageSize);
272 page.setSearchCount(false); 289 page.setSearchCount(false);
  290 +
  291 + //【issues/3713】字典接口存在SQL注入风险
  292 + SqlInjectionUtil.specialFilterContentForDictSql(code);
  293 +
273 String filterSql = getFilterSql(table, text, code, condition, keyword); 294 String filterSql = getFilterSql(table, text, code, condition, keyword);
274 IPage<DictModel> pageList = baseMapper.queryTableDictWithFilter(page, table, text, code, filterSql); 295 IPage<DictModel> pageList = baseMapper.queryTableDictWithFilter(page, table, text, code, filterSql);
275 return pageList.getRecords(); 296 return pageList.getRecords();
@@ -284,15 +305,15 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -284,15 +305,15 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
284 * @return 305 * @return
285 */ 306 */
286 private String getFilterSql(String table, String text, String code, String condition, String keyword){ 307 private String getFilterSql(String table, String text, String code, String condition, String keyword){
287 - String keywordSql = null, filterSql = "", sql_where = " where "; 308 + String keywordSql = null, filterSql = "", sqlWhere = " where ";
288 // update-begin-author:sunjianlei date:20220112 for: 【JTC-631】判断如果 table 携带了 where 条件,那么就使用 and 查询,防止报错 309 // update-begin-author:sunjianlei date:20220112 for: 【JTC-631】判断如果 table 携带了 where 条件,那么就使用 and 查询,防止报错
289 - if (table.toLowerCase().contains(" where ")) {  
290 - sql_where = " and "; 310 + if (table.toLowerCase().contains(sqlWhere)) {
  311 + sqlWhere = " and ";
291 } 312 }
292 // update-end-author:sunjianlei date:20220112 for: 【JTC-631】判断如果 table 携带了 where 条件,那么就使用 and 查询,防止报错 313 // update-end-author:sunjianlei date:20220112 for: 【JTC-631】判断如果 table 携带了 where 条件,那么就使用 and 查询,防止报错
293 if(oConvertUtils.isNotEmpty(keyword)){ 314 if(oConvertUtils.isNotEmpty(keyword)){
294 // 判断是否是多选 315 // 判断是否是多选
295 - if (keyword.contains(",")) { 316 + if (keyword.contains(SymbolConstant.COMMA)) {
296 //update-begin--author:scott--date:20220105--for:JTC-529【表单设计器】 编辑页面报错,in参数采用双引号导致 ---- 317 //update-begin--author:scott--date:20220105--for:JTC-529【表单设计器】 编辑页面报错,in参数采用双引号导致 ----
297 String inKeywords = "'" + String.join("','", keyword.split(",")) + "'"; 318 String inKeywords = "'" + String.join("','", keyword.split(",")) + "'";
298 //update-end--author:scott--date:20220105--for:JTC-529【表单设计器】 编辑页面报错,in参数采用双引号导致---- 319 //update-end--author:scott--date:20220105--for:JTC-529【表单设计器】 编辑页面报错,in参数采用双引号导致----
@@ -302,11 +323,11 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -302,11 +323,11 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
302 } 323 }
303 } 324 }
304 if(oConvertUtils.isNotEmpty(condition) && oConvertUtils.isNotEmpty(keywordSql)){ 325 if(oConvertUtils.isNotEmpty(condition) && oConvertUtils.isNotEmpty(keywordSql)){
305 - filterSql+= sql_where + condition + " and " + keywordSql; 326 + filterSql+= sqlWhere + condition + " and " + keywordSql;
306 }else if(oConvertUtils.isNotEmpty(condition)){ 327 }else if(oConvertUtils.isNotEmpty(condition)){
307 - filterSql+= sql_where + condition; 328 + filterSql+= sqlWhere + condition;
308 }else if(oConvertUtils.isNotEmpty(keywordSql)){ 329 }else if(oConvertUtils.isNotEmpty(keywordSql)){
309 - filterSql+= sql_where + keywordSql; 330 + filterSql+= sqlWhere + keywordSql;
310 } 331 }
311 return filterSql; 332 return filterSql;
312 } 333 }
@@ -319,13 +340,7 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -319,13 +340,7 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
319 340
320 @Override 341 @Override
321 public List<TreeSelectModel> queryTreeList(Map<String, String> query,String table, String text, String code, String pidField,String pid,String hasChildField) { 342 public List<TreeSelectModel> queryTreeList(Map<String, String> query,String table, String text, String code, String pidField,String pid,String hasChildField) {
322 - List<TreeSelectModel> result = baseMapper.queryTreeList(query, table, text, code, pidField, pid, hasChildField);  
323 - // udapte-begin-author:sunjianlei date:20220110 for: 【JTC-597】如果 query 有值,就不允许展开子节点  
324 - if (query != null) {  
325 - result.forEach(r -> r.setLeaf(true));  
326 - }  
327 - return result;  
328 - // udapte-end-author:sunjianlei date:20220110 for: 【JTC-597】如果 query 有值,就不允许展开子节点 343 + return baseMapper.queryTreeList(query, table, text, code, pidField, pid, hasChildField);
329 } 344 }
330 345
331 @Override 346 @Override
@@ -354,7 +369,7 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -354,7 +369,7 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
354 @Override 369 @Override
355 public List<DictModel> getDictItems(String dictCode) { 370 public List<DictModel> getDictItems(String dictCode) {
356 List<DictModel> ls; 371 List<DictModel> ls;
357 - if (dictCode.contains(",")) { 372 + if (dictCode.contains(SymbolConstant.COMMA)) {
358 //关联表字典(举例:sys_user,realname,id) 373 //关联表字典(举例:sys_user,realname,id)
359 String[] params = dictCode.split(","); 374 String[] params = dictCode.split(",");
360 if (params.length < 3) { 375 if (params.length < 3) {
@@ -362,11 +377,16 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -362,11 +377,16 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
362 return null; 377 return null;
363 } 378 }
364 //SQL注入校验(只限制非法串改数据库) 379 //SQL注入校验(只限制非法串改数据库)
365 - final String[] sqlInjCheck = {params[0], params[1], params[2]}; 380 + //update-begin-author:taoyan date:2022-7-4 for: issues/I5BNY9 指定带过滤条件的字典table在生成代码后失效
  381 + // 表名后也有可能带条件and语句 不能走filterContent方法
  382 + SqlInjectionUtil.specialFilterContentForDictSql(params[0]);
  383 + final String[] sqlInjCheck = {params[1], params[2]};
  384 + //update-end-author:taoyan date:2022-7-4 for: issues/I5BNY9 指定带过滤条件的字典table在生成代码后失效
  385 + //【issues/3713】字典接口存在SQL注入风险
366 SqlInjectionUtil.filterContent(sqlInjCheck); 386 SqlInjectionUtil.filterContent(sqlInjCheck);
367 if (params.length == 4) { 387 if (params.length == 4) {
368 // SQL注入校验(查询条件SQL 特殊check,此方法仅供此处使用) 388 // SQL注入校验(查询条件SQL 特殊check,此方法仅供此处使用)
369 - SqlInjectionUtil.specialFilterContent(params[3]); 389 + SqlInjectionUtil.specialFilterContentForDictSql(params[3]);
370 ls = this.queryTableDictItemsByCodeAndFilter(params[0], params[1], params[2], params[3]); 390 ls = this.queryTableDictItemsByCodeAndFilter(params[0], params[1], params[2], params[3]);
371 } else if (params.length == 3) { 391 } else if (params.length == 3) {
372 ls = this.queryTableDictItemsByCode(params[0], params[1], params[2]); 392 ls = this.queryTableDictItemsByCode(params[0], params[1], params[2]);
@@ -383,7 +403,10 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -383,7 +403,10 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
383 403
384 @Override 404 @Override
385 public List<DictModel> loadDict(String dictCode, String keyword, Integer pageSize) { 405 public List<DictModel> loadDict(String dictCode, String keyword, Integer pageSize) {
386 - if (dictCode.contains(",")) { 406 + //【issues/3713】字典接口存在SQL注入风险
  407 + SqlInjectionUtil.specialFilterContentForDictSql(dictCode);
  408 +
  409 + if (dictCode.contains(SymbolConstant.COMMA)) {
387 //update-begin-author:taoyan date:20210329 for: 下拉搜索不支持表名后加查询条件 410 //update-begin-author:taoyan date:20210329 for: 下拉搜索不支持表名后加查询条件
388 String[] params = dictCode.split(","); 411 String[] params = dictCode.split(",");
389 String condition = null; 412 String condition = null;
@@ -393,11 +416,16 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl @@ -393,11 +416,16 @@ public class SysDictServiceImpl extends ServiceImpl&lt;SysDictMapper, SysDict&gt; impl
393 } else if (params.length == 4) { 416 } else if (params.length == 4) {
394 condition = params[3]; 417 condition = params[3];
395 // update-begin-author:taoyan date:20220314 for: online表单下拉搜索框表字典配置#{sys_org_code}报错 #3500 418 // update-begin-author:taoyan date:20220314 for: online表单下拉搜索框表字典配置#{sys_org_code}报错 #3500
396 - if(condition.indexOf("#{")>=0){ 419 + if(condition.indexOf(SymbolConstant.SYS_VAR_PREFIX)>=0){
397 condition = QueryGenerator.getSqlRuleValue(condition); 420 condition = QueryGenerator.getSqlRuleValue(condition);
398 } 421 }
399 // update-end-author:taoyan date:20220314 for: online表单下拉搜索框表字典配置#{sys_org_code}报错 #3500 422 // update-end-author:taoyan date:20220314 for: online表单下拉搜索框表字典配置#{sys_org_code}报错 #3500
400 } 423 }
  424 +
  425 + // 字典Code格式不正确 [表名为空]
  426 + if(oConvertUtils.isEmpty(params[0])){
  427 + return null;
  428 + }
401 List<DictModel> ls; 429 List<DictModel> ls;
402 if (pageSize != null) { 430 if (pageSize != null) {
403 ls = this.queryLittleTableDictItems(params[0], params[1], params[2], condition, keyword, pageSize); 431 ls = this.queryLittleTableDictItems(params[0], params[1], params[2], condition, keyword, pageSize);
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysGatewayRouteServiceImpl.java
@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
8 import lombok.extern.slf4j.Slf4j; 8 import lombok.extern.slf4j.Slf4j;
9 import org.jeecg.common.base.BaseMap; 9 import org.jeecg.common.base.BaseMap;
10 import org.jeecg.common.constant.CacheConstant; 10 import org.jeecg.common.constant.CacheConstant;
  11 +import org.jeecg.common.constant.CommonConstant;
11 import org.jeecg.common.constant.GlobalConstants; 12 import org.jeecg.common.constant.GlobalConstants;
12 import org.jeecg.common.util.oConvertUtils; 13 import org.jeecg.common.util.oConvertUtils;
13 import org.jeecg.modules.system.entity.SysGatewayRoute; 14 import org.jeecg.modules.system.entity.SysGatewayRoute;
@@ -35,6 +36,7 @@ public class SysGatewayRouteServiceImpl extends ServiceImpl&lt;SysGatewayRouteMappe @@ -35,6 +36,7 @@ public class SysGatewayRouteServiceImpl extends ServiceImpl&lt;SysGatewayRouteMappe
35 @Autowired 36 @Autowired
36 private RedisTemplate<String, Object> redisTemplate; 37 private RedisTemplate<String, Object> redisTemplate;
37 38
  39 + private static final String STRING_STATUS = "status";
38 40
39 @Override 41 @Override
40 public void addRoute2Redis(String key) { 42 public void addRoute2Redis(String key) {
@@ -75,10 +77,10 @@ public class SysGatewayRouteServiceImpl extends ServiceImpl&lt;SysGatewayRouteMappe @@ -75,10 +77,10 @@ public class SysGatewayRouteServiceImpl extends ServiceImpl&lt;SysGatewayRouteMappe
75 } 77 }
76 route.setFilters(filters); 78 route.setFilters(filters);
77 route.setUri(json.getString("uri")); 79 route.setUri(json.getString("uri"));
78 - if (json.get("status") == null) { 80 + if (json.get(STRING_STATUS) == null) {
79 route.setStatus(1); 81 route.setStatus(1);
80 } else { 82 } else {
81 - route.setStatus(json.getInteger("status")); 83 + route.setStatus(json.getInteger(STRING_STATUS));
82 } 84 }
83 this.saveOrUpdate(route); 85 this.saveOrUpdate(route);
84 resreshRouter(null); 86 resreshRouter(null);
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysLogServiceImpl.java
@@ -31,8 +31,6 @@ public class SysLogServiceImpl extends ServiceImpl&lt;SysLogMapper, SysLog&gt; impleme @@ -31,8 +31,6 @@ public class SysLogServiceImpl extends ServiceImpl&lt;SysLogMapper, SysLog&gt; impleme
31 31
32 @Resource 32 @Resource
33 private SysLogMapper sysLogMapper; 33 private SysLogMapper sysLogMapper;
34 - @Autowired  
35 - private SysBaseApiImpl sysBaseAPI;  
36 34
37 /** 35 /**
38 * @功能:清空所有日志记录 36 * @功能:清空所有日志记录
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java
@@ -88,7 +88,8 @@ public class SysPermissionDataRuleImpl extends ServiceImpl&lt;SysPermissionDataRule @@ -88,7 +88,8 @@ public class SysPermissionDataRuleImpl extends ServiceImpl&lt;SysPermissionDataRule
88 public void savePermissionDataRule(SysPermissionDataRule sysPermissionDataRule) { 88 public void savePermissionDataRule(SysPermissionDataRule sysPermissionDataRule) {
89 this.save(sysPermissionDataRule); 89 this.save(sysPermissionDataRule);
90 SysPermission permission = sysPermissionMapper.selectById(sysPermissionDataRule.getPermissionId()); 90 SysPermission permission = sysPermissionMapper.selectById(sysPermissionDataRule.getPermissionId());
91 - if(permission!=null && (permission.getRuleFlag()==null || permission.getRuleFlag().equals(CommonConstant.RULE_FLAG_0))) { 91 + boolean flag = permission != null && (permission.getRuleFlag() == null || permission.getRuleFlag().equals(CommonConstant.RULE_FLAG_0));
  92 + if(flag) {
92 permission.setRuleFlag(CommonConstant.RULE_FLAG_1); 93 permission.setRuleFlag(CommonConstant.RULE_FLAG_1);
93 sysPermissionMapper.updateById(permission); 94 sysPermissionMapper.updateById(permission);
94 } 95 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java
@@ -200,7 +200,8 @@ public class SysPermissionServiceImpl extends ServiceImpl&lt;SysPermissionMapper, S @@ -200,7 +200,8 @@ public class SysPermissionServiceImpl extends ServiceImpl&lt;SysPermissionMapper, S
200 200
201 //如果当前菜单的父菜单变了,则需要修改新父菜单和老父菜单的,叶子节点状态 201 //如果当前菜单的父菜单变了,则需要修改新父菜单和老父菜单的,叶子节点状态
202 String pid = sysPermission.getParentId(); 202 String pid = sysPermission.getParentId();
203 - if((oConvertUtils.isNotEmpty(pid) && !pid.equals(p.getParentId())) || oConvertUtils.isEmpty(pid)&&oConvertUtils.isNotEmpty(p.getParentId())) { 203 + boolean flag = (oConvertUtils.isNotEmpty(pid) && !pid.equals(p.getParentId())) || oConvertUtils.isEmpty(pid)&&oConvertUtils.isNotEmpty(p.getParentId());
  204 + if (flag) {
204 //a.设置新的父菜单不为叶子节点 205 //a.设置新的父菜单不为叶子节点
205 this.sysPermissionMapper.setMenuLeaf(pid, 0); 206 this.sysPermissionMapper.setMenuLeaf(pid, 0);
206 //b.判断老的菜单下是否还有其他子菜单,没有的话则设置为叶子节点 207 //b.判断老的菜单下是否还有其他子菜单,没有的话则设置为叶子节点
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java
@@ -44,13 +44,13 @@ public class SysUserDepartServiceImpl extends ServiceImpl&lt;SysUserDepartMapper, S @@ -44,13 +44,13 @@ public class SysUserDepartServiceImpl extends ServiceImpl&lt;SysUserDepartMapper, S
44 */ 44 */
45 @Override 45 @Override
46 public List<DepartIdModel> queryDepartIdsOfUser(String userId) { 46 public List<DepartIdModel> queryDepartIdsOfUser(String userId) {
47 - LambdaQueryWrapper<SysUserDepart> queryUDep = new LambdaQueryWrapper<SysUserDepart>(); 47 + LambdaQueryWrapper<SysUserDepart> queryUserDep = new LambdaQueryWrapper<SysUserDepart>();
48 LambdaQueryWrapper<SysDepart> queryDep = new LambdaQueryWrapper<SysDepart>(); 48 LambdaQueryWrapper<SysDepart> queryDep = new LambdaQueryWrapper<SysDepart>();
49 try { 49 try {
50 - queryUDep.eq(SysUserDepart::getUserId, userId); 50 + queryUserDep.eq(SysUserDepart::getUserId, userId);
51 List<String> depIdList = new ArrayList<>(); 51 List<String> depIdList = new ArrayList<>();
52 List<DepartIdModel> depIdModelList = new ArrayList<>(); 52 List<DepartIdModel> depIdModelList = new ArrayList<>();
53 - List<SysUserDepart> userDepList = this.list(queryUDep); 53 + List<SysUserDepart> userDepList = this.list(queryUserDep);
54 if(userDepList != null && userDepList.size() > 0) { 54 if(userDepList != null && userDepList.size() > 0) {
55 for(SysUserDepart userDepart : userDepList) { 55 for(SysUserDepart userDepart : userDepList) {
56 depIdList.add(userDepart.getDepId()); 56 depIdList.add(userDepart.getDepId());
@@ -78,10 +78,10 @@ public class SysUserDepartServiceImpl extends ServiceImpl&lt;SysUserDepartMapper, S @@ -78,10 +78,10 @@ public class SysUserDepartServiceImpl extends ServiceImpl&lt;SysUserDepartMapper, S
78 */ 78 */
79 @Override 79 @Override
80 public List<SysUser> queryUserByDepId(String depId) { 80 public List<SysUser> queryUserByDepId(String depId) {
81 - LambdaQueryWrapper<SysUserDepart> queryUDep = new LambdaQueryWrapper<SysUserDepart>();  
82 - queryUDep.eq(SysUserDepart::getDepId, depId); 81 + LambdaQueryWrapper<SysUserDepart> queryUserDep = new LambdaQueryWrapper<SysUserDepart>();
  82 + queryUserDep.eq(SysUserDepart::getDepId, depId);
83 List<String> userIdList = new ArrayList<>(); 83 List<String> userIdList = new ArrayList<>();
84 - List<SysUserDepart> uDepList = this.list(queryUDep); 84 + List<SysUserDepart> uDepList = this.list(queryUserDep);
85 if(uDepList != null && uDepList.size() > 0) { 85 if(uDepList != null && uDepList.size() > 0) {
86 for(SysUserDepart uDep : uDepList) { 86 for(SysUserDepart uDep : uDepList) {
87 userIdList.add(uDep.getUserId()); 87 userIdList.add(uDep.getUserId());
@@ -121,7 +121,7 @@ public class SysUserDepartServiceImpl extends ServiceImpl&lt;SysUserDepartMapper, S @@ -121,7 +121,7 @@ public class SysUserDepartServiceImpl extends ServiceImpl&lt;SysUserDepartMapper, S
121 } 121 }
122 122
123 @Override 123 @Override
124 - public IPage<SysUser> queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo) { 124 + public IPage<SysUser> queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo,String id) {
125 IPage<SysUser> pageList = null; 125 IPage<SysUser> pageList = null;
126 // 部门ID不存在 直接查询用户表即可 126 // 部门ID不存在 直接查询用户表即可
127 Page<SysUser> page = new Page<SysUser>(pageNo, pageSize); 127 Page<SysUser> page = new Page<SysUser>(pageNo, pageSize);
@@ -133,6 +133,11 @@ public class SysUserDepartServiceImpl extends ServiceImpl&lt;SysUserDepartMapper, S @@ -133,6 +133,11 @@ public class SysUserDepartServiceImpl extends ServiceImpl&lt;SysUserDepartMapper, S
133 if(oConvertUtils.isNotEmpty(username)){ 133 if(oConvertUtils.isNotEmpty(username)){
134 query.like(SysUser::getUsername, username); 134 query.like(SysUser::getUsername, username);
135 } 135 }
  136 + //update-begin---author:wangshuai ---date:20220608 for:[VUEN-1238]邮箱回复时,发送到显示的为用户id------------
  137 + if(oConvertUtils.isNotEmpty(id)){
  138 + query.eq(SysUser::getId, id);
  139 + }
  140 + //update-end---author:wangshuai ---date:20220608 for:[VUEN-1238]邮箱回复时,发送到显示的为用户id------------
136 pageList = sysUserMapper.selectPage(page, query); 141 pageList = sysUserMapper.selectPage(page, query);
137 }else{ 142 }else{
138 // 有部门ID 需要走自定义sql 143 // 有部门ID 需要走自定义sql
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
@@ -9,6 +9,9 @@ import lombok.extern.slf4j.Slf4j; @@ -9,6 +9,9 @@ import lombok.extern.slf4j.Slf4j;
9 import org.jeecg.common.api.vo.Result; 9 import org.jeecg.common.api.vo.Result;
10 import org.jeecg.common.constant.CacheConstant; 10 import org.jeecg.common.constant.CacheConstant;
11 import org.jeecg.common.constant.CommonConstant; 11 import org.jeecg.common.constant.CommonConstant;
  12 +import org.jeecg.common.constant.enums.RoleIndexConfigEnum;
  13 +import org.jeecg.common.desensitization.annotation.SensitiveEncode;
  14 +import org.jeecg.common.system.vo.LoginUser;
12 import org.jeecg.common.system.vo.SysUserCacheInfo; 15 import org.jeecg.common.system.vo.SysUserCacheInfo;
13 import org.jeecg.common.util.PasswordUtil; 16 import org.jeecg.common.util.PasswordUtil;
14 import org.jeecg.common.util.UUIDGenerator; 17 import org.jeecg.common.util.UUIDGenerator;
@@ -19,6 +22,7 @@ import org.jeecg.modules.system.mapper.*; @@ -19,6 +22,7 @@ import org.jeecg.modules.system.mapper.*;
19 import org.jeecg.modules.system.model.SysUserSysDepartModel; 22 import org.jeecg.modules.system.model.SysUserSysDepartModel;
20 import org.jeecg.modules.system.service.ISysUserService; 23 import org.jeecg.modules.system.service.ISysUserService;
21 import org.jeecg.modules.system.vo.SysUserDepVo; 24 import org.jeecg.modules.system.vo.SysUserDepVo;
  25 +import org.springframework.beans.BeanUtils;
22 import org.springframework.beans.factory.annotation.Autowired; 26 import org.springframework.beans.factory.annotation.Autowired;
23 import org.springframework.cache.annotation.CacheEvict; 27 import org.springframework.cache.annotation.CacheEvict;
24 import org.springframework.cache.annotation.Cacheable; 28 import org.springframework.cache.annotation.Cacheable;
@@ -65,6 +69,8 @@ public class SysUserServiceImpl extends ServiceImpl&lt;SysUserMapper, SysUser&gt; impl @@ -65,6 +69,8 @@ public class SysUserServiceImpl extends ServiceImpl&lt;SysUserMapper, SysUser&gt; impl
65 ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; 69 ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;
66 @Autowired 70 @Autowired
67 ThirdAppDingtalkServiceImpl dingtalkService; 71 ThirdAppDingtalkServiceImpl dingtalkService;
  72 + @Autowired
  73 + SysRoleIndexMapper sysRoleIndexMapper;
68 74
69 @Override 75 @Override
70 @CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true) 76 @CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true)
@@ -155,7 +161,40 @@ public class SysUserServiceImpl extends ServiceImpl&lt;SysUserMapper, SysUser&gt; impl @@ -155,7 +161,40 @@ public class SysUserServiceImpl extends ServiceImpl&lt;SysUserMapper, SysUser&gt; impl
155 public List<String> getRole(String username) { 161 public List<String> getRole(String username) {
156 return sysUserRoleMapper.getRoleByUserName(username); 162 return sysUserRoleMapper.getRoleByUserName(username);
157 } 163 }
158 - 164 +
  165 + /**
  166 + * 获取动态首页路由配置
  167 + * @param username
  168 + * @param version
  169 + * @return
  170 + */
  171 + @Override
  172 + public SysRoleIndex getDynamicIndexByUserRole(String username,String version) {
  173 + List<String> roles = sysUserRoleMapper.getRoleByUserName(username);
  174 + String componentUrl = RoleIndexConfigEnum.getIndexByRoles(roles);
  175 + SysRoleIndex roleIndex = new SysRoleIndex(componentUrl);
  176 + //只有 X-Version=v3 的时候,才读取sys_role_index表获取角色首页配置
  177 + if (oConvertUtils.isNotEmpty(version) && roles!=null && roles.size()>0) {
  178 + LambdaQueryWrapper<SysRoleIndex> routeIndexQuery = new LambdaQueryWrapper();
  179 + //用户所有角色
  180 + routeIndexQuery.in(SysRoleIndex::getRoleCode, roles);
  181 + //角色首页状态0:未开启 1:开启
  182 + routeIndexQuery.eq(SysRoleIndex::getStatus, CommonConstant.STATUS_1);
  183 + //优先级正序排序
  184 + routeIndexQuery.orderByAsc(SysRoleIndex::getPriority);
  185 + List<SysRoleIndex> list = sysRoleIndexMapper.selectList(routeIndexQuery);
  186 + if (null != list && list.size() > 0) {
  187 + roleIndex = list.get(0);
  188 + }
  189 + }
  190 +
  191 + //如果componentUrl为空,则返回空
  192 + if(oConvertUtils.isEmpty(roleIndex.getComponent())){
  193 + return null;
  194 + }
  195 + return roleIndex;
  196 + }
  197 +
159 /** 198 /**
160 * 通过用户名获取用户角色集合 199 * 通过用户名获取用户角色集合
161 * @param username 用户名 200 * @param username 用户名
@@ -200,7 +239,6 @@ public class SysUserServiceImpl extends ServiceImpl&lt;SysUserMapper, SysUser&gt; impl @@ -200,7 +239,6 @@ public class SysUserServiceImpl extends ServiceImpl&lt;SysUserMapper, SysUser&gt; impl
200 * @return 239 * @return
201 */ 240 */
202 @Override 241 @Override
203 - @Cacheable(cacheNames=CacheConstant.SYS_USERS_CACHE, key="#username")  
204 public SysUserCacheInfo getCacheUser(String username) { 242 public SysUserCacheInfo getCacheUser(String username) {
205 SysUserCacheInfo info = new SysUserCacheInfo(); 243 SysUserCacheInfo info = new SysUserCacheInfo();
206 info.setOneDepart(true); 244 info.setOneDepart(true);
@@ -558,4 +596,19 @@ public class SysUserServiceImpl extends ServiceImpl&lt;SysUserMapper, SysUser&gt; impl @@ -558,4 +596,19 @@ public class SysUserServiceImpl extends ServiceImpl&lt;SysUserMapper, SysUser&gt; impl
558 return userList.stream().map(SysUser::getUsername).collect(Collectors.toList()); 596 return userList.stream().map(SysUser::getUsername).collect(Collectors.toList());
559 } 597 }
560 598
  599 + @Override
  600 + @Cacheable(cacheNames=CacheConstant.SYS_USERS_CACHE, key="#username")
  601 + @SensitiveEncode
  602 + public LoginUser getEncodeUserInfo(String username){
  603 + if(oConvertUtils.isEmpty(username)) {
  604 + return null;
  605 + }
  606 + LoginUser loginUser = new LoginUser();
  607 + SysUser sysUser = userMapper.getUserByName(username);
  608 + if(sysUser==null) {
  609 + return null;
  610 + }
  611 + BeanUtils.copyProperties(sysUser, loginUser);
  612 + return loginUser;
  613 + }
561 } 614 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java
@@ -67,15 +67,20 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { @@ -67,15 +67,20 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService {
67 private SysAnnouncementSendMapper sysAnnouncementSendMapper; 67 private SysAnnouncementSendMapper sysAnnouncementSendMapper;
68 68
69 /** 69 /**
  70 + * errcode
  71 + */
  72 + private static final String ERR_CODE = "errcode";
  73 +
  74 + /**
70 * 第三方APP类型,当前固定为 wechat_enterprise 75 * 第三方APP类型,当前固定为 wechat_enterprise
71 */ 76 */
72 public final String THIRD_TYPE = ThirdAppConfig.WECHAT_ENTERPRISE.toLowerCase(); 77 public final String THIRD_TYPE = ThirdAppConfig.WECHAT_ENTERPRISE.toLowerCase();
73 78
74 @Override 79 @Override
75 public String getAccessToken() { 80 public String getAccessToken() {
76 - String CORP_ID = thirdAppConfig.getWechatEnterprise().getClientId();  
77 - String SECRET = thirdAppConfig.getWechatEnterprise().getClientSecret();  
78 - AccessToken accessToken = JwAccessTokenAPI.getAccessToken(CORP_ID, SECRET); 81 + String corpId = thirdAppConfig.getWechatEnterprise().getClientId();
  82 + String secret = thirdAppConfig.getWechatEnterprise().getClientSecret();
  83 + AccessToken accessToken = JwAccessTokenAPI.getAccessToken(corpId, secret);
79 if (accessToken != null) { 84 if (accessToken != null) {
80 return accessToken.getAccesstoken(); 85 return accessToken.getAccesstoken();
81 } 86 }
@@ -85,14 +90,14 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { @@ -85,14 +90,14 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService {
85 90
86 /** 获取APPToken,新版企业微信的秘钥是分开的 */ 91 /** 获取APPToken,新版企业微信的秘钥是分开的 */
87 public String getAppAccessToken() { 92 public String getAppAccessToken() {
88 - String CORP_ID = thirdAppConfig.getWechatEnterprise().getClientId();  
89 - String SECRET = thirdAppConfig.getWechatEnterprise().getAgentAppSecret(); 93 + String corpId = thirdAppConfig.getWechatEnterprise().getClientId();
  94 + String secret = thirdAppConfig.getWechatEnterprise().getAgentAppSecret();
90 // 如果没有配置APP秘钥,就说明是老企业,可以通用秘钥 95 // 如果没有配置APP秘钥,就说明是老企业,可以通用秘钥
91 - if (oConvertUtils.isEmpty(SECRET)) {  
92 - SECRET = thirdAppConfig.getWechatEnterprise().getClientSecret(); 96 + if (oConvertUtils.isEmpty(secret)) {
  97 + secret = thirdAppConfig.getWechatEnterprise().getClientSecret();
93 } 98 }
94 99
95 - AccessToken accessToken = JwAccessTokenAPI.getAccessToken(CORP_ID, SECRET); 100 + AccessToken accessToken = JwAccessTokenAPI.getAccessToken(corpId, secret);
96 if (accessToken != null) { 101 if (accessToken != null) {
97 return accessToken.getAccesstoken(); 102 return accessToken.getAccesstoken();
98 } 103 }
@@ -464,6 +469,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { @@ -464,6 +469,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService {
464 case 60104: 469 case 60104:
465 msg = "手机号码已存在"; 470 msg = "手机号码已存在";
466 break; 471 break;
  472 + default:
467 } 473 }
468 String str = String.format("用户 %s(%s) 同步失败!错误码:%s——%s", sysUser.getUsername(), sysUser.getRealname(), errCode, msg); 474 String str = String.format("用户 %s(%s) 同步失败!错误码:%s——%s", sysUser.getUsername(), sysUser.getRealname(), errCode, msg);
469 syncInfo.addFailInfo(str); 475 syncInfo.addFailInfo(str);
@@ -567,7 +573,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { @@ -567,7 +573,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService {
567 // 企业微信规则:1表示启用成员,0表示禁用成员 573 // 企业微信规则:1表示启用成员,0表示禁用成员
568 // JEECG规则:1正常,2冻结 574 // JEECG规则:1正常,2冻结
569 if (sysUser.getStatus() != null) { 575 if (sysUser.getStatus() != null) {
570 - if (sysUser.getStatus() == 1 || sysUser.getStatus() == 2) { 576 + if (CommonConstant.USER_UNFREEZE.equals(sysUser.getStatus()) || CommonConstant.USER_FREEZE.equals(sysUser.getStatus())) {
571 user.setEnable(sysUser.getStatus() == 1 ? 1 : 0); 577 user.setEnable(sysUser.getStatus() == 1 ? 1 : 0);
572 } else { 578 } else {
573 user.setEnable(1); 579 user.setEnable(1);
@@ -837,7 +843,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { @@ -837,7 +843,7 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService {
837 JSONObject response = JwUserAPI.getUserInfoByCode(code, accessToken); 843 JSONObject response = JwUserAPI.getUserInfoByCode(code, accessToken);
838 if (response != null) { 844 if (response != null) {
839 log.info("response: " + response.toJSONString()); 845 log.info("response: " + response.toJSONString());
840 - if (response.getIntValue("errcode") == 0) { 846 + if (response.getIntValue(ERR_CODE) == 0) {
841 return response.getString("UserId"); 847 return response.getString("UserId");
842 } 848 }
843 } 849 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/util/PermissionDataUtil.java
@@ -2,6 +2,8 @@ package org.jeecg.modules.system.util; @@ -2,6 +2,8 @@ package org.jeecg.modules.system.util;
2 2
3 import java.util.List; 3 import java.util.List;
4 4
  5 +import org.jeecg.common.constant.CommonConstant;
  6 +import org.jeecg.common.constant.SymbolConstant;
5 import org.jeecg.common.util.oConvertUtils; 7 import org.jeecg.common.util.oConvertUtils;
6 import org.jeecg.modules.system.entity.SysPermission; 8 import org.jeecg.modules.system.entity.SysPermission;
7 9
@@ -11,6 +13,21 @@ import org.jeecg.modules.system.entity.SysPermission; @@ -11,6 +13,21 @@ import org.jeecg.modules.system.entity.SysPermission;
11 */ 13 */
12 public class PermissionDataUtil { 14 public class PermissionDataUtil {
13 15
  16 + /**
  17 + * 路径:views/
  18 + */
  19 + private static final String PATH_VIEWS = "views/";
  20 +
  21 + /**
  22 + * 路径:src/views/
  23 + */
  24 + private static final String PATH_SRC_VIEWS = "src/views/";
  25 +
  26 + /**
  27 + * .vue后缀
  28 + */
  29 + private static final String VUE_SUFFIX = ".vue";
  30 +
14 /** 31 /**
15 * 智能处理错误数据,简化用户失误操作 32 * 智能处理错误数据,简化用户失误操作
16 * 33 *
@@ -24,17 +41,17 @@ public class PermissionDataUtil { @@ -24,17 +41,17 @@ public class PermissionDataUtil {
24 // 组件 41 // 组件
25 if (oConvertUtils.isNotEmpty(permission.getComponent())) { 42 if (oConvertUtils.isNotEmpty(permission.getComponent())) {
26 String component = permission.getComponent(); 43 String component = permission.getComponent();
27 - if (component.startsWith("/")) { 44 + if (component.startsWith(SymbolConstant.SINGLE_SLASH)) {
28 component = component.substring(1); 45 component = component.substring(1);
29 } 46 }
30 - if (component.startsWith("views/")) {  
31 - component = component.replaceFirst("views/", ""); 47 + if (component.startsWith(PATH_VIEWS)) {
  48 + component = component.replaceFirst(PATH_VIEWS, "");
32 } 49 }
33 - if (component.startsWith("src/views/")) {  
34 - component = component.replaceFirst("src/views/", ""); 50 + if (component.startsWith(PATH_SRC_VIEWS)) {
  51 + component = component.replaceFirst(PATH_SRC_VIEWS, "");
35 } 52 }
36 - if (component.endsWith(".vue")) {  
37 - component = component.replace(".vue", ""); 53 + if (component.endsWith(VUE_SUFFIX)) {
  54 + component = component.replace(VUE_SUFFIX, "");
38 } 55 }
39 permission.setComponent(component); 56 permission.setComponent(component);
40 } 57 }
@@ -42,11 +59,11 @@ public class PermissionDataUtil { @@ -42,11 +59,11 @@ public class PermissionDataUtil {
42 // 请求URL 59 // 请求URL
43 if (oConvertUtils.isNotEmpty(permission.getUrl())) { 60 if (oConvertUtils.isNotEmpty(permission.getUrl())) {
44 String url = permission.getUrl(); 61 String url = permission.getUrl();
45 - if (url.endsWith(".vue")) {  
46 - url = url.replace(".vue", ""); 62 + if (url.endsWith(VUE_SUFFIX)) {
  63 + url = url.replace(VUE_SUFFIX, "");
47 } 64 }
48 - if (!url.startsWith("http") && !url.startsWith("/")&&!url.trim().startsWith("{{")) {  
49 - url = "/" + url; 65 + if (!url.startsWith(CommonConstant.STR_HTTP) && !url.startsWith(SymbolConstant.SINGLE_SLASH)&&!url.trim().startsWith(SymbolConstant.DOUBLE_LEFT_CURLY_BRACKET)) {
  66 + url = SymbolConstant.SINGLE_SLASH + url;
50 } 67 }
51 permission.setUrl(url); 68 permission.setUrl(url);
52 } 69 }
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/util/RandImageUtil.java
@@ -15,26 +15,26 @@ import java.util.Random; @@ -15,26 +15,26 @@ import java.util.Random;
15 */ 15 */
16 public class RandImageUtil { 16 public class RandImageUtil {
17 17
18 - public static final String key = "JEECG_LOGIN_KEY"; 18 + public static final String KEY = "JEECG_LOGIN_KEY";
19 19
20 /** 20 /**
21 * 定义图形大小 21 * 定义图形大小
22 */ 22 */
23 - private static final int width = 105; 23 + private static final int WIDTH = 105;
24 /** 24 /**
25 * 定义图形大小 25 * 定义图形大小
26 */ 26 */
27 - private static final int height = 35; 27 + private static final int HEIGHT = 35;
28 28
29 /** 29 /**
30 * 定义干扰线数量 30 * 定义干扰线数量
31 */ 31 */
32 - private static final int count = 200; 32 + private static final int COUNT = 200;
33 33
34 /** 34 /**
35 * 干扰线的长度=1.414*lineWidth 35 * 干扰线的长度=1.414*lineWidth
36 */ 36 */
37 - private static final int lineWidth = 2; 37 + private static final int LINE_WIDTH = 2;
38 38
39 /** 39 /**
40 * 图片格式 40 * 图片格式
@@ -85,28 +85,28 @@ public class RandImageUtil { @@ -85,28 +85,28 @@ public class RandImageUtil {
85 85
86 private static BufferedImage getImageBuffer(String resultCode){ 86 private static BufferedImage getImageBuffer(String resultCode){
87 // 在内存中创建图象 87 // 在内存中创建图象
88 - final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 88 + final BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
89 // 获取图形上下文 89 // 获取图形上下文
90 final Graphics2D graphics = (Graphics2D) image.getGraphics(); 90 final Graphics2D graphics = (Graphics2D) image.getGraphics();
91 // 设定背景颜色 91 // 设定背景颜色
92 // ---1 92 // ---1
93 graphics.setColor(Color.WHITE); 93 graphics.setColor(Color.WHITE);
94 - graphics.fillRect(0, 0, width, height); 94 + graphics.fillRect(0, 0, WIDTH, HEIGHT);
95 // 设定边框颜色 95 // 设定边框颜色
96 // graphics.setColor(getRandColor(100, 200)); // ---2 96 // graphics.setColor(getRandColor(100, 200)); // ---2
97 - graphics.drawRect(0, 0, width - 1, height - 1); 97 + graphics.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);
98 98
99 final Random random = new Random(); 99 final Random random = new Random();
100 // 随机产生干扰线,使图象中的认证码不易被其它程序探测到 100 // 随机产生干扰线,使图象中的认证码不易被其它程序探测到
101 - for (int i = 0; i < count; i++) { 101 + for (int i = 0; i < COUNT; i++) {
102 // ---3 102 // ---3
103 graphics.setColor(getRandColor(150, 200)); 103 graphics.setColor(getRandColor(150, 200));
104 104
105 // 保证画在边框之内 105 // 保证画在边框之内
106 - final int x = random.nextInt(width - lineWidth - 1) + 1;  
107 - final int y = random.nextInt(height - lineWidth - 1) + 1;  
108 - final int xl = random.nextInt(lineWidth);  
109 - final int yl = random.nextInt(lineWidth); 106 + final int x = random.nextInt(WIDTH - LINE_WIDTH - 1) + 1;
  107 + final int y = random.nextInt(HEIGHT - LINE_WIDTH - 1) + 1;
  108 + final int xl = random.nextInt(LINE_WIDTH);
  109 + final int yl = random.nextInt(LINE_WIDTH);
110 graphics.drawLine(x, y, x + xl, y + yl); 110 graphics.drawLine(x, y, x + xl, y + yl);
111 } 111 }
112 // 取随机产生的认证码 112 // 取随机产生的认证码
@@ -129,11 +129,12 @@ public class RandImageUtil { @@ -129,11 +129,12 @@ public class RandImageUtil {
129 129
130 private static Color getRandColor(int fc, int bc) { // 取得给定范围随机颜色 130 private static Color getRandColor(int fc, int bc) { // 取得给定范围随机颜色
131 final Random random = new Random(); 131 final Random random = new Random();
132 - if (fc > 255) {  
133 - fc = 255; 132 + int length = 255;
  133 + if (fc > length) {
  134 + fc = length;
134 } 135 }
135 - if (bc > 255) {  
136 - bc = 255; 136 + if (bc > length) {
  137 + bc = length;
137 } 138 }
138 139
139 final int r = fc + random.nextInt(bc - fc); 140 final int r = fc + random.nextInt(bc - fc);
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/util/XssUtils.java 0 → 100644
  1 +package org.jeecg.modules.system.util;
  2 +
  3 +import org.springframework.web.util.HtmlUtils;
  4 +
  5 +import java.util.regex.Pattern;
  6 +
  7 +/**
  8 + * @Description: 工具类XSSUtils,现在的做法是替换成空字符,CSDN的是进行转义,比如文字开头的"<"转成&lt;
  9 + * @author: lsq
  10 + * @date: 2021年07月26日 19:13
  11 + */
  12 +public class XssUtils {
  13 +
  14 + private static Pattern[] patterns = new Pattern[]{
  15 + //Script fragments
  16 + Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE),
  17 + //src='...'
  18 + Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
  19 + Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
  20 + //script tags
  21 + Pattern.compile("</script>", Pattern.CASE_INSENSITIVE),
  22 + Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
  23 + //eval(...)
  24 + Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
  25 + //expression(...)
  26 + Pattern.compile("e­xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
  27 + //javascript:...
  28 + Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE),
  29 + //vbscript:...
  30 + Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE),
  31 + //onload(...)=...
  32 + Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
  33 + };
  34 +
  35 + public static String scriptXss(String value) {
  36 + if (value != null) {
  37 + value = value.replaceAll(" ", "");
  38 + for(Pattern scriptPattern: patterns){
  39 + value = scriptPattern.matcher(value).replaceAll("");
  40 + }
  41 + }
  42 + return HtmlUtils.htmlEscape(value);
  43 + }
  44 +
  45 + public static void main(String[] args) {
  46 + String s = scriptXss("<img src=x onload=alert(111).*?><script></script>javascript:eval()\\\\.");
  47 + System.err.println("s======>" + s);
  48 + }
  49 +}
jeecg-boot/jeecg-boot-module-system/src/main/resources/application-dev.yml
@@ -184,7 +184,11 @@ jeecg: @@ -184,7 +184,11 @@ jeecg:
184 # 签名密钥串(前后端要一致,正式发布请自行修改) 184 # 签名密钥串(前后端要一致,正式发布请自行修改)
185 signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a 185 signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a
186 # 本地:local\Minio:minio\阿里云:alioss 186 # 本地:local\Minio:minio\阿里云:alioss
187 - uploadType: local 187 + uploadType: minio
  188 + # 前端访问地址
  189 + domainUrl:
  190 + pc: http://localhost:3100
  191 + app: http://localhost:8051
188 path: 192 path:
189 #文件上传根目录 设置 193 #文件上传根目录 设置
190 upload: /opt/upFiles 194 upload: /opt/upFiles
@@ -328,4 +332,4 @@ third-app: @@ -328,4 +332,4 @@ third-app:
328 client-id: ?? 332 client-id: ??
329 # appSecret 333 # appSecret
330 client-secret: ?? 334 client-secret: ??
331 - agent-id: ??  
332 \ No newline at end of file 335 \ No newline at end of file
  336 + agent-id: ??
jeecg-boot/jeecg-boot-module-system/src/main/resources/application-prod.yml
@@ -39,10 +39,10 @@ spring: @@ -39,10 +39,10 @@ spring:
39 quartz: 39 quartz:
40 job-store-type: jdbc 40 job-store-type: jdbc
41 initialize-schema: embedded 41 initialize-schema: embedded
42 - #延迟1秒启动定时任务  
43 - startup-delay: 1s  
44 #定时任务启动开关,true-开 false-关 42 #定时任务启动开关,true-开 false-关
45 auto-startup: true 43 auto-startup: true
  44 + #延迟1秒启动定时任务
  45 + startup-delay: 1s
46 #启动时更新己存在的Job 46 #启动时更新己存在的Job
47 overwrite-existing-jobs: true 47 overwrite-existing-jobs: true
48 properties: 48 properties:
@@ -185,6 +185,10 @@ jeecg: @@ -185,6 +185,10 @@ jeecg:
185 signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a 185 signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a
186 # 本地:local\Minio:minio\阿里云:alioss 186 # 本地:local\Minio:minio\阿里云:alioss
187 uploadType: alioss 187 uploadType: alioss
  188 + # 前端访问地址
  189 + domainUrl:
  190 + pc: http://localhost:3100
  191 + app: http://localhost:8051
188 path: 192 path:
189 #文件上传根目录 设置 193 #文件上传根目录 设置
190 upload: /opt/jeecg-boot/upload 194 upload: /opt/jeecg-boot/upload
jeecg-boot/jeecg-boot-module-system/src/main/resources/application-test.yml
@@ -185,6 +185,10 @@ jeecg: @@ -185,6 +185,10 @@ jeecg:
185 signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a 185 signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a
186 # 本地:local\Minio:minio\阿里云:alioss 186 # 本地:local\Minio:minio\阿里云:alioss
187 uploadType: local 187 uploadType: local
  188 + # 前端访问地址
  189 + domainUrl:
  190 + pc: http://localhost:3100
  191 + app: http://localhost:8051
188 path: 192 path:
189 #文件上传根目录 设置 193 #文件上传根目录 设置
190 upload: D://opt//upFiles 194 upload: D://opt//upFiles
jeecg-boot/jeecg-boot-module-system/src/main/resources/banner.txt
@@ -9,6 +9,6 @@ ${AnsiColor.BRIGHT_BLUE} @@ -9,6 +9,6 @@ ${AnsiColor.BRIGHT_BLUE}
9 9
10 10
11 ${AnsiColor.BRIGHT_GREEN} 11 ${AnsiColor.BRIGHT_GREEN}
12 -Jeecg Boot Version: 3.2.0 12 +Jeecg Boot Version: 3.3.0
13 Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version} 13 Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
14 ${AnsiColor.BLACK} 14 ${AnsiColor.BLACK}
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/common/sql/menu_insert.ftl
1 -- 注意:该页面对应的前台目录为views/${entityPackage}文件夹下 1 -- 注意:该页面对应的前台目录为views/${entityPackage}文件夹下
2 -- 如果你想更改到其他目录,请修改sql中component字段对应的值 2 -- 如果你想更改到其他目录,请修改sql中component字段对应的值
3 3
  4 +<#assign id = '${.now?string["yyyyMMddhhmmSSsss"]}0'>
  5 +
4 INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external) 6 INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external)
5 -VALUES ('${.now?string["yyyyMMddhhmmSSsss"]}', NULL, '${tableVo.ftlDescription}', '/${entityPackage}/${entityName?uncap_first}List', '${entityPackage}/${entityName}List', NULL, NULL, 0, NULL, '1', 1.00, 0, NULL, 1, 1, 0, 0, 0, NULL, '1', 0, 0, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0);  
6 \ No newline at end of file 7 \ No newline at end of file
  8 +VALUES ('${id}', NULL, '${tableVo.ftlDescription}', '/${entityPackage}/${entityName?uncap_first}List', '${entityPackage}/${entityName}List', NULL, NULL, 0, NULL, '1', 1.00, 0, NULL, 1, 1, 0, 0, 0, NULL, '1', 0, 0, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0);
  9 +
  10 +-- 权限控制sql
  11 +-- 新增
  12 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
  13 +VALUES ('${.now?string["yyyyMMddhhmmSSsss"]}1', '${id}', '添加${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${bussiPackage}:${tableName}:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
  14 +-- 编辑
  15 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
  16 +VALUES ('${.now?string["yyyyMMddhhmmSSsss"]}2', '${id}', '编辑${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${bussiPackage}:${tableName}:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
  17 +-- 删除
  18 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
  19 +VALUES ('${.now?string["yyyyMMddhhmmSSsss"]}3', '${id}', '删除${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${bussiPackage}:${tableName}:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
  20 +-- 批量删除
  21 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
  22 +VALUES ('${.now?string["yyyyMMddhhmmSSsss"]}4', '${id}', '批量删除${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${bussiPackage}:${tableName}:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
  23 +-- 导出excel
  24 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
  25 +VALUES ('${.now?string["yyyyMMddhhmmSSsss"]}5', '${id}', '导出excel_${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${bussiPackage}:${tableName}:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
  26 +-- 导入excel
  27 +INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
  28 +VALUES ('${.now?string["yyyyMMddhhmmSSsss"]}6', '${id}', '导入excel_${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${bussiPackage}:${tableName}:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string["yyyy-MM-dd HH:mm:ss"]}', NULL, NULL, 0, 0, '1', 0);
7 \ No newline at end of file 29 \ No newline at end of file
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/core.ftl
@@ -32,7 +32,7 @@ @@ -32,7 +32,7 @@
32 { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}, 32 { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'},
33 <#-- 邮政编码 --> 33 <#-- 邮政编码 -->
34 <#elseif fieldValidType == 'p'> 34 <#elseif fieldValidType == 'p'>
35 - { pattern: /^[1-9]\d{5}$/, message: '请输入正确的邮政编码!'}, 35 + { pattern: /^[0-9]\d{5}$/, message: '请输入正确的邮政编码!'},
36 <#-- 字母 --> 36 <#-- 字母 -->
37 <#elseif fieldValidType == 's'> 37 <#elseif fieldValidType == 's'>
38 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}, 38 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/native/vue3CoreNative.ftl
@@ -28,7 +28,7 @@ @@ -28,7 +28,7 @@
28 { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}<#rt>, 28 { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}<#rt>,
29 <#-- 邮政编码 --> 29 <#-- 邮政编码 -->
30 <#elseif fieldValidType == 'p'> 30 <#elseif fieldValidType == 'p'>
31 - { pattern: /^[1-9]\d{5}$/, message: '请输入正确的邮政编码!'}<#rt>, 31 + { pattern: /^[0-9]\d{5}$/, message: '请输入正确的邮政编码!'}<#rt>,
32 <#-- 字母 --> 32 <#-- 字母 -->
33 <#elseif fieldValidType == 's'> 33 <#elseif fieldValidType == 's'>
34 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}<#rt>, 34 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}<#rt>,
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai
@@ -86,6 +86,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e @@ -86,6 +86,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e
86 */ 86 */
87 @AutoLog(value = "${tableVo.ftlDescription}-添加") 87 @AutoLog(value = "${tableVo.ftlDescription}-添加")
88 @ApiOperation(value="${tableVo.ftlDescription}-添加", notes="${tableVo.ftlDescription}-添加") 88 @ApiOperation(value="${tableVo.ftlDescription}-添加", notes="${tableVo.ftlDescription}-添加")
  89 + //@RequiresPermissions("${bussiPackage}:${tableName}:add")
89 @PostMapping(value = "/add") 90 @PostMapping(value = "/add")
90 public Result<String> add(@RequestBody ${entityName} ${entityName?uncap_first}) { 91 public Result<String> add(@RequestBody ${entityName} ${entityName?uncap_first}) {
91 <#if bpm_flag> 92 <#if bpm_flag>
@@ -103,6 +104,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e @@ -103,6 +104,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e
103 */ 104 */
104 @AutoLog(value = "${tableVo.ftlDescription}-编辑") 105 @AutoLog(value = "${tableVo.ftlDescription}-编辑")
105 @ApiOperation(value="${tableVo.ftlDescription}-编辑", notes="${tableVo.ftlDescription}-编辑") 106 @ApiOperation(value="${tableVo.ftlDescription}-编辑", notes="${tableVo.ftlDescription}-编辑")
  107 + //@RequiresPermissions("${bussiPackage}:${tableName}:edit")
106 @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) 108 @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
107 public Result<String> edit(@RequestBody ${entityName} ${entityName?uncap_first}) { 109 public Result<String> edit(@RequestBody ${entityName} ${entityName?uncap_first}) {
108 ${entityName?uncap_first}Service.updateById(${entityName?uncap_first}); 110 ${entityName?uncap_first}Service.updateById(${entityName?uncap_first});
@@ -117,6 +119,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e @@ -117,6 +119,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e
117 */ 119 */
118 @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") 120 @AutoLog(value = "${tableVo.ftlDescription}-通过id删除")
119 @ApiOperation(value="${tableVo.ftlDescription}-通过id删除", notes="${tableVo.ftlDescription}-通过id删除") 121 @ApiOperation(value="${tableVo.ftlDescription}-通过id删除", notes="${tableVo.ftlDescription}-通过id删除")
  122 + //@RequiresPermissions("${bussiPackage}:${tableName}:delete")
120 @DeleteMapping(value = "/delete") 123 @DeleteMapping(value = "/delete")
121 public Result<String> delete(@RequestParam(name="id",required=true) String id) { 124 public Result<String> delete(@RequestParam(name="id",required=true) String id) {
122 ${entityName?uncap_first}Service.removeById(id); 125 ${entityName?uncap_first}Service.removeById(id);
@@ -131,6 +134,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e @@ -131,6 +134,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e
131 */ 134 */
132 @AutoLog(value = "${tableVo.ftlDescription}-批量删除") 135 @AutoLog(value = "${tableVo.ftlDescription}-批量删除")
133 @ApiOperation(value="${tableVo.ftlDescription}-批量删除", notes="${tableVo.ftlDescription}-批量删除") 136 @ApiOperation(value="${tableVo.ftlDescription}-批量删除", notes="${tableVo.ftlDescription}-批量删除")
  137 + //@RequiresPermissions("${bussiPackage}:${tableName}:deleteBatch")
134 @DeleteMapping(value = "/deleteBatch") 138 @DeleteMapping(value = "/deleteBatch")
135 public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) { 139 public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
136 this.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(","))); 140 this.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(",")));
@@ -160,6 +164,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e @@ -160,6 +164,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e
160 * @param request 164 * @param request
161 * @param ${entityName?uncap_first} 165 * @param ${entityName?uncap_first}
162 */ 166 */
  167 + //@RequiresPermissions("${bussiPackage}:${tableName}:exportXls")
163 @RequestMapping(value = "/exportXls") 168 @RequestMapping(value = "/exportXls")
164 public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { 169 public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {
165 return super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, "${tableVo.ftlDescription}"); 170 return super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, "${tableVo.ftlDescription}");
@@ -172,6 +177,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e @@ -172,6 +177,7 @@ public class ${entityName}Controller extends JeecgController&lt;${entityName}, I${e
172 * @param response 177 * @param response
173 * @return 178 * @return
174 */ 179 */
  180 + //@RequiresPermissions("${tableName}:importExcel")
175 @RequestMapping(value = "/importExcel", method = RequestMethod.POST) 181 @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
176 public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { 182 public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
177 return super.importExcel(request, response, ${entityName}.class); 183 return super.importExcel(request, response, ${entityName}.class);
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei
@@ -55,7 +55,7 @@ @@ -55,7 +55,7 @@
55 <template v-if="toggleSearchStatus"> 55 <template v-if="toggleSearchStatus">
56 </#if> 56 </#if>
57 <#-- update-begin-author:taoyan date:20220303 for: /issues/3420 内嵌风格,datetime控件样式异常 --> 57 <#-- update-begin-author:taoyan date:20220303 for: /issues/3420 内嵌风格,datetime控件样式异常 -->
58 - <#if po.queryModel=='group' && po.classType=='datetime'> 58 + <#if po.queryMode?default("")?trim=='group' && po.classType=='datetime'>
59 ${indent}<a-col :xl="10" :lg="12" :md="12" :sm="24"> 59 ${indent}<a-col :xl="10" :lg="12" :md="12" :sm="24">
60 <#else> 60 <#else>
61 ${indent}<a-col :xl="6" :lg="7" :md="8" :sm="24"> 61 ${indent}<a-col :xl="6" :lg="7" :md="8" :sm="24">
jeecg-boot/jeecg-boot-module-system/src/test/java/org/jeecg/modules/system/test/SysUserTest.java
1 package org.jeecg.modules.system.test; 1 package org.jeecg.modules.system.test;
2 2
  3 +import com.alibaba.fastjson.JSONObject;
3 import org.jeecg.JeecgSystemApplication; 4 import org.jeecg.JeecgSystemApplication;
4 import org.jeecg.common.constant.CommonConstant; 5 import org.jeecg.common.constant.CommonConstant;
5 import org.jeecg.common.system.util.JwtUtil; 6 import org.jeecg.common.system.util.JwtUtil;
@@ -9,13 +10,11 @@ import org.junit.Test; @@ -9,13 +10,11 @@ import org.junit.Test;
9 import org.junit.runner.RunWith; 10 import org.junit.runner.RunWith;
10 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.boot.test.context.SpringBootTest; 12 import org.springframework.boot.test.context.SpringBootTest;
12 -import org.springframework.test.context.ActiveProfiles;  
13 -import org.springframework.test.context.junit4.SpringRunner;  
14 import org.springframework.http.HttpHeaders; 13 import org.springframework.http.HttpHeaders;
15 import org.springframework.http.HttpMethod; 14 import org.springframework.http.HttpMethod;
16 import org.springframework.http.MediaType; 15 import org.springframework.http.MediaType;
17 -import com.alibaba.fastjson.JSONObject;  
18 import org.springframework.http.ResponseEntity; 16 import org.springframework.http.ResponseEntity;
  17 +import org.springframework.test.context.junit4.SpringRunner;
19 18
20 /** 19 /**
21 * 系统用户单元测试 20 * 系统用户单元测试