田源
2024-10-23 52874e13b27f92bc21b0a3b079077739841ebdb3
Merge remote-tracking branch 'origin/master'
已修改15个文件
已删除1个文件
已添加5个文件
1007 ■■■■ 文件已修改
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ClonePortalVIDTOList.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/LogQueryCriteriaDTO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmUserQueryServiceI.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/LogBasicController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/LogBasicServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/api/system/fileManager/index.vue 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/api/system/log/logBasic.js 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/authority/ui/uiAuthorization/index.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/fileManage/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/Aciton/index.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/system/fileCab/index.vue 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/system/log/basicConf.vue 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/system/log/index.vue 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/system/user/index.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/systemModel/businessModel/index.vue 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/systemModel/mangeModel/index.vue 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/systemModel/operateType/index.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ClonePortalVIDTOList.java
@@ -1,7 +1,10 @@
package com.vci.dto;
import lombok.Data;
import java.util.List;
@Data
public class ClonePortalVIDTOList implements  java.io.Serializable{
  private List<ClonePortalVIDTO> clonePortalVIDTOList;
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/LogQueryCriteriaDTO.java
@@ -3,6 +3,7 @@
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
 * æ—¥å¿—查询传输对象
@@ -33,4 +34,12 @@
    int pageNo;
    //页面条数
    int pageSize;
    //查询类型(管理员日志1,普通日志2)
    String roleType;
    /**
     * æ ¹ç»roleType查询出来的用户名,后续根据这个参数查询指定的日志
     */
    private List<String> userNameList;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmUserQueryServiceI.java
@@ -160,14 +160,13 @@
     */
    List<Tree> refTreeUsers(TreeQueryObject treeQueryObject) throws VciBaseException;
    /***
    /**
     * äººå‘˜æƒé™é€‰æ‹©æ ‘
     * @param treeQueryObject
     * @return
     * @throws VciBaseException
     */
    List<Tree> refPersonOrgTree(TreeQueryObject treeQueryObject) throws VciBaseException;
    /**
     * æ ¡éªŒå¯†ç æ˜¯å¦ç›¸åŒï¼Œåœ¨æ–°å¹³å°ä¸­å­˜å‚¨çš„密码是两次md5
@@ -265,4 +264,11 @@
     */
    BaseResult importUser(File file) throws Exception;
    /**
     * æ ¹æ®è§’色类型查询用户名
     * @param roleType
     * @return
     */
    List<String> queryUserNameByRoleType(String roleType) throws PLException;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
@@ -975,7 +975,7 @@
        return rootTreeList;
    }
    /***
    /**
     *
     * @param dataType
     * @param orgType
@@ -1094,7 +1094,7 @@
        }
    }
    /***
    /**
     *
     * @param oid
     * @param text
@@ -1112,6 +1112,7 @@
        }
        return ObjectTreeNode;
    }
    /**
     * æ ¡éªŒå¯†ç æ˜¯å¦ç›¸åŒï¼Œåœ¨æ–°å¹³å°ä¸­å­˜å‚¨çš„密码是两次md5
     * @param userOid ç”¨æˆ·ä¸»é”®
@@ -1634,4 +1635,25 @@
        return BaseResult.success("用户导入成功!");
    }
    /**
     * æ ¹æ®è§’色类型查询用户名
     * @param roleType
     * @return
     */
    @Override
    public List<String> queryUserNameByRoleType(String roleType) throws PLException {
        List<String> userNameList = new ArrayList<>();
        if(Func.isBlank(roleType)){
            return userNameList;
        }
        String sql = "SELECT PLUSERNAME FROM PLUSER p WHERE PLUID IN " +
                "(SELECT PLUSERUID FROM PLUSERROLE p WHERE PLROLEUID IN " +
                "( SELECT PLUID FROM PLROLE p WHERE PLTYPE = "+ roleType + "))";
        List<BusinessObject> cbos = boService.queryBySql(sql, null);
        cbos.stream().forEach(cbo->{
            userNameList.add(ObjectTool.getNewBOAttributeValue(cbo,"plusername"));
        });
        return userNameList;
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/LogBasicController.java
@@ -88,6 +88,7 @@
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * æŸ¥è¯¢æ—¥å¿—
     * @param dto æŸ¥è¯¢æ¡ä»¶ä¼ è¾“对象
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java
@@ -142,7 +142,7 @@
            return portalVIServiceI.clone(portalVIDTOList) ? BaseResult.success("克隆成功!"):BaseResult.fail("克隆失败!");
        } catch (Throwable e) {
            e.printStackTrace();
            String exceptionMessage = "删除表单时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            String exceptionMessage = "克隆表单/表格时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/LogBasicServiceImpl.java
@@ -9,6 +9,7 @@
import com.vci.dto.LogInfoDTO;
import com.vci.dto.LogPeriodInfoDTO;
import com.vci.dto.LogQueryCriteriaDTO;
import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
import com.vci.starter.web.pagemodel.BaseResult;
import com.vci.web.service.*;
import com.vci.web.util.*;
@@ -41,6 +42,10 @@
     */
    @Autowired
    private PlatformClientUtil platformClientUtil;
    @Autowired
    private SmUserQueryServiceI userQueryServiceI;
    public static final String UTF8_BOM="\uFEFF";
    private final String LOG_SAVE_PERIOD = "logSavePeriod";//日志保存期限
@@ -131,8 +136,11 @@
     */
    @Override
    public BaseResult getLogListByContion(LogQueryCriteriaDTO queryDto) throws PLException {
        List<String> userNameList = userQueryServiceI.queryUserNameByRoleType(queryDto.getRoleType());
        queryDto.setUserNameList(userNameList);
        String querySql = getSQL(queryDto);
        LogInfo[] logInfos = platformClientUtil.getLogService().getLogListByContion(queryDto.getPageNo(),queryDto.getPageSize(),querySql);
        List<LogInfoDTO> dtos = new ArrayList<>();
        for (LogInfo logInfo : logInfos) {
            LogInfoDTO dto = new LogInfoDTO();
@@ -160,6 +168,7 @@
        result.setTotal(sumLogRows);
        return result;
    }
    /**
     * æ“ä½œç”¨æˆ·èŽ·å–
     */
@@ -233,6 +242,7 @@
        }
        return userNames;
    }
    /**
     * èŽ·å–æŸ¥è¯¢æ¡ä»¶å¹¶æ‹¼æˆSQL,只拼where子句后面的SQL
     * @return
@@ -274,6 +284,21 @@
            }
            sql.append("PLLOGTYPE in('" + getLogTypeString(LogType.General) + "')");
        }
        if(Func.isNotEmpty(dto.getUserNameList())){
            if(!sql.toString().equals("")){
                sql.append(" and ");
            }
            if(dto.getUserNameList().size()<=1){
                sql.append(" PLUSER = '").append(dto.getUserNameList().get(0).trim()).append("'");
            }else{
                sql.append(" PLUSER in (");
                String inWhere = dto.getUserNameList().stream()
                        .map(item -> "'" + item + "'")
                        .collect(Collectors.joining(","));
                sql.append(inWhere).append(")");
            }
        }
        if(StringUtils.isNotBlank(dto.getUserName())){//操作用户
            if(!dto.getUserName().trim().equals("")){//如果用户名为空格则不加用户条件
                if(!sql.toString().equals("")){
@@ -320,6 +345,7 @@
        }
        return sql.toString();
    }
    protected String getLogTypeString(LogType logType){
        String res = "";
        if(logType == LogType.Login) {
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java
@@ -1,5 +1,7 @@
package com.vci.web.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.vci.common.utility.ObjectUtility;
import com.vci.corba.common.PLException;
import com.vci.corba.common.data.UserEntityInfo;
@@ -1776,18 +1778,29 @@
        treeQueryObject.setConditionMap(conditionMap);
        List<Tree> treeList = this.getUIAuthor(treeQueryObject);
        HashMap<String,Tree> allTreeMap = new HashMap<>();
        Map<String,RoleRightDTO> roleRightVOMap = new HashMap<>();
        //Map<String,RoleRightDTO> roleRightVOMap = new HashMap<>();
        if(!CollectionUtil.isEmpty(treeList)){
            if(StringUtils.isNotBlank(uiAuthorDTO.getRoleId())){
            /*if(StringUtils.isNotBlank(uiAuthorDTO.getRoleId())){
                String userName = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
                RoleRightInfo[] rightInfos = platformClientUtil.getFrameworkService().getRoleRightList(uiAuthorDTO.getRoleId(),userName);
                List<RoleRightVO> roleRightVOList = roleRightDOO2VOS(Arrays.asList(rightInfos));
                roleRightVOMap = roleRightVOList.stream().collect(Collectors.toMap(RoleRightVO::getFuncId,roleRightVO ->roleRightVOO2DTO(roleRightVO),(oldValue,newValue)->oldValue));
            }
            }*/
            convertTreeDOO2Map(treeList,allTreeMap);
            List<RoleRightDTO> roleRightDTOList = new ArrayList<>();
            List<Tree> selectTreeList = uiAuthorDTO.getSelectTreeList();
            getSelectedRoleRightObjs(uiAuthorDTO.getRoleId(),selectTreeList,allTreeMap,roleRightVOMap,roleRightDTOList);
            List<Tree> filterSelectTreeList = this.authTreeListConvert(selectTreeList);
            //过滤出选择的按钮
            List<String> checkButtonList = new ArrayList<>();
            selectTreeList.stream().forEach(item->{
                Object data = item.getData();
                if(data instanceof PLTabButton || item.isLeaf()){
                    checkButtonList.add(item.getOid());
                }
            });
            getSelectedRoleRightObjs(uiAuthorDTO.getRoleId(),filterSelectTreeList,checkButtonList,allTreeMap,roleRightDTOList);
            SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
            String currentUserName = sessionInfo.getUserId();
            //boolean isDeveloper = rightControlUtil.isDeveloper(currentUserName);
@@ -1805,15 +1818,31 @@
    }
    /**
     * èŽ·å–ç­›é€‰åŽçš„æ•°æ®
     * @param selectTreeList
     */
    private List<Tree> authTreeListConvert(List<Tree> selectTreeList){
        // åˆ›å»ºä¸€ä¸ªåŒ…含另一个集合中满足条件的 oid çš„集合
        List<String> validOids = selectTreeList.stream()
                .filter(Tree::isChecked) // checked ä¸º true
                .map(Tree::getOid)      // æå– oid
                .collect(Collectors.toList());
        return selectTreeList.stream()
                .filter(tree -> tree.isChecked() && !validOids.contains(tree.getParentId())) // è¿‡æ»¤æ¡ä»¶
                .collect(Collectors.toList());
    }
    /**
     *根据权限计算上下权限
     * @param roleOid
     * @param selectTreeList
     * @param allTreeMap
     * @param roleRightDTOList
     */
    private void getSelectedRoleRightObjs(String roleOid, List<Tree> selectTreeList, HashMap<String,Tree> allTreeMap, Map<String,RoleRightDTO> allRoleRightDTOMap, List<RoleRightDTO> roleRightDTOList){
        //Date date=new Date();
    private void getSelectedRoleRightObjs(String roleOid, List<Tree> selectTreeList, List<String> checkButtonList, HashMap<String,Tree> allTreeMap, List<RoleRightDTO> roleRightDTOList){
        Map<String,RoleRightDTO> roleRightDTOMap = new HashMap<>();
        if(!CollectionUtil.isEmpty(selectTreeList)){
            selectTreeList.stream().forEach(tree -> {
                String oid = tree.getOid();
@@ -1821,10 +1850,10 @@
                    tree = allTreeMap.get(oid);
                   Object data = tree.getData();
                    if (data instanceof String) {
                        getRightValue(roleOid, tree, allTreeMap, false, roleRightDTOMap);//向下获取所有模块的权限值
                        getRightValue(roleOid, tree, allTreeMap, checkButtonList,false, roleRightDTOMap);//向下获取所有模块的权限值
                    } else if (!(data instanceof PLTabButton)) {//业务类型
                        getRightValue(roleOid, tree, allTreeMap, true, roleRightDTOMap);//向上处理
                        getRightValue(roleOid, tree, allTreeMap, false, roleRightDTOMap);//向下处理(包含当前节点)
                        getRightValue(roleOid, tree, allTreeMap, checkButtonList, true, roleRightDTOMap);//向上处理
                        getRightValue(roleOid, tree, allTreeMap, checkButtonList, false, roleRightDTOMap);//向下处理(包含当前节点)
                    } else if (data instanceof PLTabButton) {//按钮
                        String parrentId=tree.getParentId();
                        if(allTreeMap.containsKey(parrentId)){
@@ -1833,7 +1862,7 @@
                            boolean isDeveloper = rightControlUtil.isDeveloper(currentUserName);
                            Tree parentNode= allTreeMap.get(parrentId);
                            String funcId = parentNode.getOid();
                            getRightValue(roleOid, tree, allTreeMap, true, roleRightDTOMap);//向上处理该操作父级的上级模块权限(不包含父节点)
                            getRightValue(roleOid, parentNode, allTreeMap, checkButtonList, true, roleRightDTOMap);//向上处理该操作父级的上级模块权限(不包含父节点)
                            if(!roleRightDTOMap.containsKey(funcId)){
                                RoleRightDTO roleRightDTO = new RoleRightDTO();
                                roleRightDTO.setId(ObjectUtility.getNewObjectID36());//主键
@@ -1844,7 +1873,7 @@
                                }else{
                                    roleRightDTO.setRightType((short) 2);
                                }
                                roleRightDTO.setRightValue(1);// æƒé™å€¼ï¼Œæ²¡æœ‰æ“ä½œçš„æ¨¡å—权限值存储为0
                                roleRightDTO.setRightValue(countRightValue(parentNode,checkButtonList,false));// æƒé™å€¼ï¼Œæ²¡æœ‰æ“ä½œçš„æ¨¡å—权限值存储为0
                                roleRightDTO.setRoleId(roleOid);//角色ID
                                roleRightDTO.setCreateUser(currentUserName);//创建者
                                roleRightDTO.setCreateTime(VciDateUtil.date2Str(new Date(),""));//创建时间
@@ -1873,16 +1902,18 @@
     * èŽ·å–æƒé™
     * @param isUp æ˜¯å¦æ˜¯å‘上获取,如果是向上获取,传进来的必然是模块节点,且上级模块必然是没有选中
     */
    private void getRightValue(String roleId,Tree node,HashMap<String,Tree> allTreeMap,boolean isUp,Map<String,RoleRightDTO> rightMap){
    private void getRightValue(String roleId,Tree node,Map<String,Tree> allTreeMap,List<String> checkButton,boolean isUp,Map<String,RoleRightDTO> rightMap){
        SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
        String currentUserName = sessionInfo.getUserId();
        boolean isDeveloper= rightControlUtil.isDeveloper(currentUserName);
        String id=ObjectUtility.getNewObjectID36();
        Object data=node.getData();
        if(isUp) {//向上获取,存储每个上级模块的权限值
            while (!"root".equals(node.getData())){
                data=node.getData();
               String oid=node.getOid();
            String parentId = node.getParentId();
            Tree parentNode = allTreeMap.get(parentId);
            while (!"root".equals(parentNode.getData())){
                data=parentNode.getData();
                String oid=parentNode.getOid();
                if(allTreeMap.containsKey(oid)){
                    String funcId = "";
                    if (data instanceof BizType) {
@@ -1919,9 +1950,9 @@
                    if(!rightMap.containsKey(funcId)){
                        rightMap.put(funcId, roleRightDTO);
                    }
                    oid= node.getParentId();
                    oid = parentNode.getParentId();
                    if(allTreeMap.containsKey(oid)) {
                        node=allTreeMap.get(oid);
                        parentNode = allTreeMap.get(oid);
                    }
                }
            }
@@ -1965,14 +1996,14 @@
                }
                for (int i = 0; i < node.getChildren().size(); i++) {
                    //对每个子向下递归遍历
                    getRightValue(roleId, node.getChildren().get(i), allTreeMap, false, rightMap);
                    getRightValue(roleId, node.getChildren().get(i), allTreeMap, checkButton,false, rightMap);
                }
            } else {
                if (!rightMap.containsKey(funcId)) {
                    RoleRightDTO roleRightDTO = new RoleRightDTO();
                    roleRightDTO.setFuncId(funcId);
                    roleRightDTO.setRightType((short) 2); // è®¾ç½®UI权限
                    roleRightDTO.setRightValue(countRightValue(node, true));//没有操作的模块权限值存储为0
                    roleRightDTO.setRightValue(countRightValue(node, checkButton,true));//没有操作的模块权限值存储为0
                    roleRightDTO.setRoleId(roleId);
                    roleRightDTO.setCreateUser(currentUserName);
@@ -1992,12 +2023,13 @@
     * @param isAll æ˜¯å¦å­çº§å…¨éƒ¨é€‰ä¸­
     * @return
     */
    private long countRightValue(Tree node,boolean isAll){
    private long countRightValue(Tree node,List<String> checkButton,boolean isAll){
        long value = 0;
        for(int i = 0;i < node.getChildren().size();i++){
            Tree childNode = (Tree)node.getChildren().get(i);
            if(isAll && node.getData() instanceof PLTabButton ){
                PLTabButton obj = (PLTabButton)node.getData();
            //node.getData() instanceof PLTabButton这儿应该换成是否是选中的按钮节点
            if(isAll || checkButton.contains(node.getOid())){
                PLTabButton obj = (PLTabButton)childNode.getData();
                value += (long)Math.pow(2, obj.plSeq);//累计加上各个操作的权限值
            }
        }
Source/plt-web/plt-web-ui/src/api/system/fileManager/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,155 @@
<template>
  <!--文件柜管理-->
  <basic-container>
    <avue-crud
      ref="fileCrud"
      :data="tableData"
      :option="option"
      :page.sync="page"
      :table-loading="tableLoading"
      @on-load="getTableList"
      @refresh-change="handleRefresh"
      @search-change="handleSearch"
      @search-reset="handleReset"
      @size-change="sizeChange"
      @current-change="currentChange"
    >
      <template slot="menuLeft" slot-scope="scope">
        <el-button icon="el-icon-download" plain size="small" type="primary" @click="allDelHandler">导出</el-button>
      </template>
    </avue-crud>
  </basic-container>
</template>
<script>
import basicOption from "@/util/basic-option";
import {getLogListByContion} from "@/api/system/log/logBasic";
export default {
  name: "index",
  data: function () {
    return {
      tableLoading: false,
      tableData: [],
      option: {
        ...basicOption,
        addBtn:false,
        editBtn: false,
        delBtn: false,
        calcHeight: -60,
        align:'left',
        headerAlign:'center',
        menu:false,
        searchMenuSpan: 6,
        searchIcon:false,
        column: [
          {
            label: '用户名',
            prop: 'truename',
            search:true,
            searchSpan: 4,
            searchLabel:'操作用户',
            type:'select',
            dicUrl:'/api/loginBasicController/getOperatingUsers',
            sortable:true,
            width: 150
          }, {
            label: '姓名',
            prop: 'username',
            sortable:true,
            width: 150
          },{
            label: '用户IP',
            prop: 'userIp',
            search:true,
            searchSpan: 4,
            sortable:true,
            width: 150
          },{
            label: '模块',
            prop: 'moduleName',
            sortable:true,
            overHidden: true,
          },{
            label: '操作',
            prop: 'type',
            sortable:true,
            width: 150
          },{
            label: '时间',
            prop: 'date',
            type:'date',
            search:true,
            searchOrder: 1,
            searchSpan: 8,
            searchRange: true,
            searchLabel:'查询日期',
            valueFormat:'yyyy-MM-dd',
            width: 160
          },{
            label: '描述',
            prop: 'result',
            overHidden: true,
            width:380,
          },
        ]
      },
      page: {
        currentPage: 1,
        pageSize: 50,
        total: 0,
        pageSizes: [10, 30, 50, 100],
      },
      searchParams: {}
    }
  },
  methods: {
    // è¡¨æ ¼è¯·æ±‚
    getTableList() {
      this.tableLoading = true;
      getLogListByContion(this.page.currentPage, this.page.pageSize, {'logType':this.$route.query.logType,...this.searchParams}).then(res => {
        this.tableData = res.data.data;
        this.page.total = res.data.total;
        this.tableLoading = false;
      })
    },
    // æœç´¢æŸ¥è¯¢
    handleSearch(params, done) {
      this.searchParams = {
        userName:params.truename,
        ipText:params.userIp,
        startDate:params.date[0],
        endDate:params.date[1]
      };
      this.getTableList();
      done();
    },
    // é‡ç½®æœç´¢æ¡ä»¶
    handleReset() {
      this.searchParams = {};
      this.getTableList();
    },
    // æ¡æ•°
    sizeChange(val) {
      this.page.pageSize = val;
    },
    // é¡µç 
    currentChange(val) {
      this.page.currentPage = val;
    },
    handleRefresh(){
      this.getTableList();
    }
  }
}
</script>
<style scoped>
</style>
Source/plt-web/plt-web-ui/src/api/system/log/logBasic.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
import request from '@/router/axios';
// æ—¥å¿—保存期限查询
export function getPeroid(params) {
  return request({
    url: "/api/loginBasicController/getPeroid",
    method: "get",
    params
  });
}
// ä¿å­˜æœŸé™ä¿å­˜
export function savePeriod(params) {
  return request({
    url: "/api/loginBasicController/savePeriod",
    method: "post",
    params: params
  });
}
export function deleteLog(params) {
  return request({
    url: "/api/loginBasicController/deleteLog",
    method: "delete",
    params
  })
}
//获取操作用户
export function getOperatingUsers( params) {
  return request({
    url: "/api/loginBasicController/getOperatingUsers",
    method: "get",
    params
  });
}
export function getLogListByContion(page, limit, params) {
  return request({
    url: "/api/loginBasicController/getLogListByContion",
    method: "post",
    data: {
      'pageNo':page,
      'pageSize':limit,
      ...params
    }
  });
}
// å¯¼å‡º
export const exportLog = (params) => {
  return request({
    url: '/api/loginBasicController/exportLog',
    method: 'get',
    headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'},
    responseType: 'blob',
    params
  })
}
Source/plt-web/plt-web-ui/src/views/authority/ui/uiAuthorization/index.vue
@@ -250,26 +250,30 @@
          checked: true,
          expanded: true,
          data:item.data,
          parentId:item.parentId,
          level: item.level,
          leaf:item.leaf,
          oid: item.oid,
          text: item.text
        }
      })
      // const parentData = selectParentList.map(item => {
      //   return {
      //     checked: false,
      //     expanded: true,
      //     data:item.data,
      //     level: item.level,
      //     oid: item.oid,
      //     text: item.text
      //   }
      // })
      // // åœ¨åŠé€‰çŠ¶æ€ä¸­è¿‡æ»¤æŽ‰é¡¶çº§èŠ‚ç‚¹ oid ä¸º root
      // const filterSelectTreeData = parentData.filter(item => item.oid !== 'root');
      const parentData = selectParentList.map(item => {
        return {
          checked: false,
          expanded: true,
          data:item.data,
          parentId:item.parentId,
          level: item.level,
          leaf:item.leaf,
          oid: item.oid,
          text: item.text
        }
      })
      // åœ¨åŠé€‰çŠ¶æ€ä¸­è¿‡æ»¤æŽ‰é¡¶çº§èŠ‚ç‚¹ oid ä¸º root
      const filterSelectTreeData = parentData.filter(item => item.oid !== 'root');
      const data = [...selectTreeData];
      const data = [...selectTreeData,...filterSelectTreeData];
      const formData = {
        roleId: this.nodeRow.oid,
        type: this.type,
Source/plt-web/plt-web-ui/src/views/fileManage/index.vue
ÎļþÒÑɾ³ý
Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/Aciton/index.vue
@@ -718,34 +718,6 @@
  .el-scrollbar__wrap {
    overflow: auto !important;
  }
  .headerCon {
    .el-button {
      width: 82px;
    }
  }
}
.headerCon {
  display: flex;
  flex-wrap: wrap;
  margin-bottom: 5px;
  .el-button + .el-button {
    margin-left: 5px;
  }
  .el-button {
    margin-top: 5px;
  }
}
.headerCon > .el-button:nth-child(4) {
  margin-left: 0;
}
.headerCon > .el-button:nth-child(7) {
  margin-left: 0;
}
.smallBtn {
Source/plt-web/plt-web-ui/src/views/system/fileCab/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,138 @@
<template>
  <!--文仓管理页面-->
  <basic-container>
    <avue-crud
      ref="logCrud"
      :data="tableData"
      :option="option"
      :page.sync="page"
      :table-loading="tableLoading"
      @on-load="getTableList"
      @refresh-change="handleRefresh"
      @search-change="handleSearch"
      @search-reset="handleReset"
      @size-change="sizeChange"
      @current-change="currentChange"
    >
      <template slot="menuLeft" slot-scope="scope">
        <el-button icon="el-icon-download" plain size="small" type="primary" @click="exportClickHandler">导出</el-button>
      </template>
    </avue-crud>
  </basic-container>
</template>
<script>
import {exportLog, getLogListByContion} from "@/api/system/log/logBasic";
import func from "@/util/func";
import basicOption from "@/util/basic-option";
export default {
  name: "index",
  data: function () {
    return {
      tableLoading: false,
      tableData: [],
      option: {
        ...basicOption,
        addBtn:false,
        editBtn: false,
        delBtn: false,
        calcHeight: -60,
        align:'left',
        headerAlign:'center',
        menu:false,
        searchMenuSpan: 6,
        searchIcon:false,
        column: [
          {
            label: '卷名',
            prop: 'truename',
            width: 300
          }, {
            label: '机器类型',
            prop: 'username',
            width: 150
          },{
            label: '路径名称',
            prop: 'userIp'
          },{
            label: '首选路径',
            prop: 'moduleName',
          },{
            label: '服务器',
            prop: 'type',
            width: 150
          },{
            label: '卷服务',
            prop: 'date',
          }]
      },
      page: {
        currentPage: 1,
        pageSize: 50,
        total: 0,
        pageSizes: [10, 30, 50, 100],
      },
      searchParams: {}
    }
  },
  methods: {
    // è¡¨æ ¼è¯·æ±‚
    getTableList() {
      this.tableLoading = true;
      getLogListByContion(this.page.currentPage, this.page.pageSize, {'logType':this.$route.query.logType,...this.searchParams}).then(res => {
        this.tableData = res.data.data;
        this.page.total = res.data.total;
        this.tableLoading = false;
      })
    },
    // æœç´¢æŸ¥è¯¢
    handleSearch(params, done) {
      this.searchParams = {
        userName:params.truename,
        ipText:params.userIp,
        startDate:params.date[0],
        endDate:params.date[1]
      };
      this.getTableList();
      done();
    },
    // é‡ç½®æœç´¢æ¡ä»¶
    handleReset() {
      this.searchParams = {};
      this.getTableList();
    },
    // æ¡æ•°
    sizeChange(val) {
      this.page.pageSize = val;
    },
    // é¡µç 
    currentChange(val) {
      this.page.currentPage = val;
    },
    handleRefresh(){
      this.getTableList();
    },
    // å¯¼å‡º
    exportClickHandler() {
      const loading = this.$loading({});
      exportLog().then(res => {
        func.downloadFileByBlobHandler(res);
        this.createdLoading = false
        this.$message.success('导出成功');
        loading.close();
      })
    },
  }
}
</script>
<style scoped>
</style>
Source/plt-web/plt-web-ui/src/views/system/log/basicConf.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,138 @@
<template>
  <!--日志基础配置-->
  <el-container>
    <el-main>
      <basic-container>
        <div style="margin: 0 0 10px 20px">
          <el-button v-if="form.delType==0" icon="el-icon-check" size="small" type="primary" @click="saveHandler">保存</el-button>
          <el-button v-else icon="el-icon-delete" size="small" type="danger" @click="delHandler">删除</el-button>
        </div>
        <avue-form ref="form" v-model="form" :option="formOption"></avue-form>
        <div class="tip">
          <div style="color: #D40000;margin-left: 0;">日志基础配置说明:</div>
          <div>1、日志删除包含手动删除和自动删除。</div>
          <div>2、自动删除会根据日志的保存期限来进行日志删除。</div>
          <div>3、手动删除根据选定的时间来进行日志删除。</div>
        </div>
      </basic-container>
    </el-main>
  </el-container>
</template>
<script>
import {getPeroid,savePeriod,deleteLog} from "@/api/system/log/logBasic";
export default {
  name: "basicConf",
  data: function () {
    return {
      form:{
        period:'',
      },
      periodData:[],
      formOption:{
        submitBtn: false,
        emptyBtn: false,
        column: [{
          label: '日志删除',
          prop: 'delType',
          span: 24,
          labelWidth:120,
          type: 'radio',
          value: 0,
          dicData: [
            { label: '自动删除', value: 0 },
            { label: '手动删除', value: 1 },
          ]
        }, {
          label: '保存日期',
          prop: 'period',
          type: 'select',
          labelWidth:120,
          dicData: this.periodData,
          props:{
            label:'value',
            value:'code'
          },
          rules: [{
            required: true,
            message: "请选择保存日期",
            trigger: "blur"
          }]
        }, {
          label: '请选择日期',
          prop: 'deleteDate',
          type: 'date',
          valueFormat:'yyyy-MM-dd',
          labelWidth:120,
          display: false,
          rules: [{
            required: true,
            message: "请选择日期",
            trigger: "blur"
          }]
        }]
      },
    }
  },
  created() {
    this.getPeroid();
  },
  watch: {
    'form.delType': {
      handler(newval) {
        if (newval ==0) {
          this.formOption.column[1].display=true;
          this.formOption.column[2].display=false;
        }else {
          this.formOption.column[1].display=false;
          this.formOption.column[2].display=true;
        }
      }
    },
  },
  methods:{
    getPeroid:function (){
      getPeroid().then(res => {
        this.$refs.form.updateDic('period', res.data.data);
        this.periodData=res.data.data;
        this.form.period=res.data.data.filter(item=>{
          return item.choose
        })[0].code
      }).catch(error => {
      })
    },
    saveHandler:function (){
      savePeriod({'period':this.form.period}).then(res => {
        if (res.data.success) {
          this.$message.success('保存成功')
        }
      });
    },
    delHandler() {
      this.$refs.form.validate((valid,done) => {
        if(valid){
          deleteLog({'deleteDate':this.form.deleteDate}).then(res => {
            if (res.data.success) {
              this.$message.success('删除成功')
            }
          });
          done()
        }
      })
    },
  }
}
</script>
<style scoped>
.tip{
  font-size: 12px;
  line-height: 24px;
  color: #909399;
  margin: 0 0 10px 20px;
}
.tip div{
  margin-left: 30px;
}
</style>
Source/plt-web/plt-web-ui/src/views/system/log/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,170 @@
<template>
  <basic-container>
    <avue-crud
      ref="logCrud"
      :data="tableData"
      :option="option"
      :page.sync="page"
      :table-loading="tableLoading"
      @on-load="getTableList"
      @refresh-change="handleRefresh"
      @search-change="handleSearch"
      @search-reset="handleReset"
      @size-change="sizeChange"
      @current-change="currentChange"
    >
      <template slot="menuLeft" slot-scope="scope">
        <el-button icon="el-icon-download" plain size="small" type="primary" @click="exportClickHandler">导出</el-button>
      </template>
    </avue-crud>
  </basic-container>
</template>
<script>
import basicOption from "@/util/basic-option";
import {getLogListByContion,getOperatingUsers,exportLog} from "@/api/system/log/logBasic";
import func from "@/util/func";
export default {
  name: "index",
  data: function () {
    return {
      tableLoading: false,
      tableData: [],
      option: {
        ...basicOption,
        addBtn: false,
        editBtn: false,
        delBtn: false,
        calcHeight: -60,
        align: 'left',
        headerAlign: 'center',
        menu: false,
        searchMenuSpan: 6,
        searchIcon: false,
        column: [
          {
            label: '用户名',
            prop: 'truename',
            search: true,
            searchSpan: 4,
            searchLabel: '操作用户',
            type: 'select',
            dicUrl: '/api/loginBasicController/getOperatingUsers',
            sortable: true,
            width: 150
          }, {
            label: '姓名',
            prop: 'username',
            sortable: true,
            width: 150
          }, {
            label: '用户IP',
            prop: 'userIp',
            search: true,
            searchSpan: 4,
            sortable: true,
            width: 150
          }, {
            label: '模块',
            prop: 'moduleName',
            sortable: true,
            overHidden: true,
          }, {
            label: '操作',
            prop: 'type',
            sortable: true,
            width: 150
          }, {
            label: '时间',
            prop: 'date',
            type: 'date',
            search: true,
            searchOrder: 1,
            searchSpan: 8,
            searchRange: true,
            searchLabel: '查询日期',
            valueFormat: 'yyyy-MM-dd',
            width: 160
          }, {
            label: '描述',
            prop: 'result',
            overHidden: true,
            width: 380,
          },
        ]
      },
      page: {
        currentPage: 1,
        pageSize: 50,
        total: 0,
        pageSizes: [10, 30, 50, 100],
      },
      searchParams: {}
    }
  },
  watch: {
    $route(to, from) {
      this.getTableList();
    }
  },
  methods: {
    // è¡¨æ ¼è¯·æ±‚
    getTableList() {
      this.tableLoading = true;
      getLogListByContion(this.page.currentPage, this.page.pageSize, {'logType': this.$route.query.logType, ...this.searchParams}).then(res => {
        this.tableData = res.data.data;
        this.page.total = res.data.total;
        this.tableLoading = false;
      })
    },
    // æœç´¢æŸ¥è¯¢
    handleSearch(params, done) {
      this.searchParams = {
        userName: params.truename,
        ipText: params.userIp,
        startDate: params.date[0],
        endDate: params.date[1]
      };
      this.getTableList();
      done();
    },
    // é‡ç½®æœç´¢æ¡ä»¶
    handleReset() {
      this.searchParams = {};
      this.getTableList();
    },
    // æ¡æ•°
    sizeChange(val) {
      this.page.pageSize = val;
    },
    // é¡µç 
    currentChange(val) {
      this.page.currentPage = val;
    },
    handleRefresh() {
      this.getTableList();
    },
    // å¯¼å‡º
    exportClickHandler() {
      const loading = this.$loading({});
      exportLog().then(res => {
        func.downloadFileByBlobHandler(res);
        this.createdLoading = false
        this.$message.success('导出成功');
        loading.close();
      })
    },
  }
}
</script>
<style scoped>
</style>
Source/plt-web/plt-web-ui/src/views/system/user/index.vue
@@ -238,9 +238,7 @@
        this.tableData = data;
        this.page.total = res.data.total;
        this.tableLoading = false;
      }).catch(err => {
        this.$message.error(err)
      });
      })
    },
    // è¡¨æ ¼å³ä¾§åˆ·æ–°å›¾æ ‡
Source/plt-web/plt-web-ui/src/views/systemModel/businessModel/index.vue
@@ -2,8 +2,8 @@
  <el-container v-loading="createdLoading">
    <el-aside>
      <basic-container>
        <div style="max-height: calc(100vh - 170px);overflow: auto">
          <avue-tree :key="refresh" ref="tree" :data="treeData" :option="treeOption" @node-click="nodeClick">
        <div style="max-height: calc(100vh - 150px);overflow: auto">
          <avue-tree :key="refresh" node-key="id" ref="tree" :data="treeData" :option="treeOption" @node-click="nodeClick">
          <span slot-scope="{ node, data }" class="el-tree-node__label">
           <span style="font-size: 15px">
              <i class="el-icon-s-promotion"></i>
@@ -17,7 +17,7 @@
    <el-main>
      <basic-container>
        <el-form ref="form" :model="form" label-width="85px" style="height: 79vh">
        <el-form ref="form" :model="form" label-width="85px" style="max-height: calc(100vh - 180px);overflow: auto;">
          <span v-if="form.childType !== 0">
            <el-form-item label="模块名:">
            <el-input v-model="form.name" placeholder="请输入模块名"></el-input>
@@ -202,6 +202,7 @@
      addStatus: false,
      editStatus: false,
      nodeRow: {},
      currentClickNode:null,
      form: {},
      treeData: [],
      treeOption: {
@@ -255,9 +256,10 @@
  },
  methods: {
    // æ ‘行点击
    nodeClick(row) {
    nodeClick(row,node) {
      this.form = {...row};
      this.nodeRow = {...row};
      this.currentClickNode=node;
      this.addStatus = false;
      this.editStatus = false;
    },
@@ -312,7 +314,7 @@
          this.addStatus = false;
          // this.resetFormValue();
          this.form.childType = null;
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          this.handleRefreshTree('add')
        }
      })
    },
@@ -356,7 +358,7 @@
          this.editStatus = false;
          // this.resetFormValue();
          this.form.childType = null;
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          this.handleRefreshTree('edit')
        }
      })
    },
@@ -371,7 +373,7 @@
        delModule(this.form).then(res => {
          if (res.data.code === 200) {
            this.$message.success(res.data.msg);
            this.resetFormValue();
            this.handleRefreshTree('del')
            this.addStatus = false;
            this.editStatus = false;
          }
@@ -389,8 +391,6 @@
      exportFunctionSql({isFunction: true}).then(res => {
        func.downloadFileByBlobHandler(res);
        this.$message.success('导出成功');
      }).catch(err => {
        this.$message.error(err);
      });
    },
@@ -425,12 +425,11 @@
        }
      })
      addOperationType(list).then(res => {
        console.log(res)
        if (res.data.code === 200) {
          this.methodsVisble = false;
          this.$message.success(res.data.msg);
          this.form.childType = null;
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          this.handleRefreshTree('add') // åˆ·æ–°å·¦ä¾§æ ‘
        }
      })
    },
@@ -460,7 +459,7 @@
      updateAlias(params).then(res => {
        if (res.data.code === 200) {
          this.$message.success(res.data.msg);
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          this.handleRefreshTree('edit')
        }
      })
    },
@@ -480,7 +479,7 @@
          console.log(res);
          if (res.data.code === 200) {
            this.$message.success(res.data.msg);
            this.resetFormValue();
            this.handleRefreshTree('del');
          }
        })
      }).catch(() => {
@@ -506,6 +505,23 @@
    // å¯¼å…¥
    upLoadClickHandler() {
      this.$refs.upload.visible = true;
    },
    handleRefreshTree(type) {
      //type:add\edit\del
      if(type=="del"){
        this.$refs.tree.remove(this.currentClickNode);
        this.currentClickNode=null;
        this.form={};
      }else{
        if (this.currentClickNode) {
          let node = this.currentClickNode.parent;
          node.loaded = false;
          node.expand();
          this.$refs.tree.setCurrentNode(this.currentClickNode);
        }else {
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
        }
      }
    }
  }
}
Source/plt-web/plt-web-ui/src/views/systemModel/mangeModel/index.vue
@@ -2,8 +2,8 @@
  <el-container v-loading="createdLoading">
    <el-aside>
      <basic-container>
        <div style="max-height: calc(100vh - 170px);overflow: auto">
          <avue-tree :key="refresh" ref="tree" :data="treeData" :option="treeOption" @node-click="nodeClick">
        <div style="max-height: calc(100vh - 150px);overflow: auto">
          <avue-tree :key="refresh" node-key="id" ref="tree" :data="treeData" :option="treeOption" @node-click="nodeClick">
          <span slot-scope="{ node, data }" class="el-tree-node__label">
           <span style="font-size: 15px">
              <i class="el-icon-s-promotion"></i>
@@ -17,7 +17,7 @@
    <el-main>
      <basic-container>
        <el-form ref="form" :model="form" label-width="85px" style="height: 79vh">
        <el-form ref="form" :model="form" label-width="85px" style="max-height: calc(100vh - 180px);overflow: auto;">
          <span v-if="form.childType !== 0">
            <el-form-item label="模块名:">
            <el-input v-model="form.name" placeholder="请输入模块名"></el-input>
@@ -202,6 +202,7 @@
      addStatus: false,
      editStatus: false,
      nodeRow: {},
      currentClickNode:null,
      form: {},
      treeData: [],
      treeOption: {
@@ -255,10 +256,11 @@
  },
  methods: {
    // æ ‘行点击
    nodeClick(row) {
    nodeClick(row,node) {
      console.log(row.childType);
      this.form = {...row};
      this.nodeRow = {...row};
      this.currentClickNode = node;
      this.addStatus = false;
      this.editStatus = false;
    },
@@ -313,7 +315,7 @@
          this.addStatus = false;
          // this.resetFormValue();
          this.form.childType = null;
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          this.handleRefreshTree('add')
        }
      })
    },
@@ -357,7 +359,7 @@
          this.editStatus = false;
          // this.resetFormValue();
          this.form.childType = null;
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          this.handleRefreshTree('edit')
        }
      })
    },
@@ -372,7 +374,7 @@
        delModule(this.form).then(res => {
          if (res.data.code === 200) {
            this.$message.success(res.data.msg);
            this.resetFormValue();
            this.handleRefreshTree('del')
            this.addStatus = false;
            this.editStatus = false;
          }
@@ -461,23 +463,21 @@
      updateAlias(params).then(res => {
        if (res.data.code === 200) {
          this.$message.success(res.data.msg);
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          this.handleRefreshTree('edit')
        }
      })
    },
    // åˆ é™¤æ¨¡å—下关联的操作类型
    deleteOperationClickHandler() {
      console.log(this.form);
      const params = {
        funcId: this.form.funcId,
        operId: this.form.operId
      }
      delFuncOperation(params).then(res => {
        console.log(res);
        if (res.data.code === 200) {
          this.$message.success(res.data.msg);
          this.resetFormValue();
          this.handleRefreshTree('del');
        }
      })
    },
@@ -489,14 +489,29 @@
        func.downloadFileByBlobHandler(res);
        this.createdLoading = false
        this.$message.success('导出成功');
      }).catch(err => {
        this.$message.error(err);
      })
    },
    // å¯¼å…¥
    upLoadClickHandler() {
      this.$refs.upload.visible = true;
    },
    handleRefreshTree(type) {
      //type:add\edit\del
      if(type=="del"){
        this.$refs.tree.remove(this.currentClickNode);
        this.currentClickNode=null;
        this.form={};
      }else{
        if (this.currentClickNode) {
          let node = this.currentClickNode.parent;
          node.loaded = false;
          node.expand();
          this.$refs.tree.setCurrentNode(this.currentClickNode);
        }else {
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
        }
      }
    }
  }
}
Source/plt-web/plt-web-ui/src/views/systemModel/operateType/index.vue
@@ -2,8 +2,8 @@
  <el-container>
    <el-aside>
      <basic-container>
        <div style="max-height: calc(100vh - 170px);overflow: auto">
          <avue-tree :key="refresh" ref="tree" :data="treeData" :option="treeOption" @node-click="nodeClick">
        <div style="max-height: calc(100vh - 150px);overflow: auto">
          <avue-tree :key="refresh" node-key="id" ref="tree" :data="treeData" :option="treeOption" @node-click="nodeClick">
          <span slot-scope="{ node, data }" class="el-tree-node__label">
           <span style="font-size: 15px">
              <i class="el-icon-s-promotion"></i>
@@ -17,7 +17,7 @@
    <el-main>
      <basic-container>
        <el-form ref="form" :model="form" label-width="85px" style="height: 79vh">
        <el-form ref="form" :model="form" label-width="85px" style="max-height: calc(100vh - 180px);overflow: auto;">
          <el-form-item label="名称:">
            <el-input v-model="form.name" placeholder="请输入名称"></el-input>
          </el-form-item>
@@ -73,6 +73,7 @@
      editStatus:false,
      addStatus: false,
      nodeRow: {},
      currentClickNode:null,
      form: {},
      treeData: [],
      treeOption: {
@@ -111,10 +112,11 @@
  },
  methods: {
    // æ ‘行点击
    nodeClick(row) {
    nodeClick(row,node) {
      console.log(row);
      this.form = {...row};
      this.nodeRow = {...row};
      this.currentClickNode=node;
      this.addStatus = false;
      this.editStatus = false;
    },
@@ -173,7 +175,7 @@
      addOperationType(params).then(res => {
        if(res.data.code === 200){
          this.$message.success(res.data.msg);
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          this.handleRefreshTree('add')
          this.addStatus = false;
        }
      })
@@ -227,7 +229,7 @@
      updateOperationType(params).then(res => {
        if(res.data.code === 200){
          this.$message.success(res.data.msg);
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          this.handleRefreshTree('edit')
          this.editStatus = false;
        }
      })
@@ -243,7 +245,7 @@
        delOperationType(this.form).then(res => {
          if (res.data.code === 200) {
            this.$message.success(res.data.msg);
            this.resetFormValue();
            this.handleRefreshTree('del')
            this.addStatus = false;
            this.editStatus = false;
            this.nodeRow = {};
@@ -262,10 +264,25 @@
      exportFunctionSql({isFunction: false}).then(res => {
        func.downloadFileByBlobHandler(res);
        this.$message.success('导出成功');
      }).catch(err => {
        this.$message.error(err);
      });
    },
    handleRefreshTree(type) {
      //type:add\edit\del
      if(type=="del"){
        this.$refs.tree.remove(this.currentClickNode);
        this.currentClickNode=null;
        this.form={};
      }else{
        if (this.currentClickNode) {
          let node = this.currentClickNode.parent;
          node.loaded = false;
          node.expand();
          this.$refs.tree.setCurrentNode(this.currentClickNode);
        }else {
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
        }
      }
    }
  }
}
</script>