Prechádzať zdrojové kódy

Merge branch 'master' of http://192.168.1.220:10080/esb/esb

Airhead 8 rokov pred
rodič
commit
298019d8e1
37 zmenil súbory, kde vykonal 2177 pridanie a 60 odobranie
  1. 8 0
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/HosArbiterApplication.java
  2. 6 0
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/configuration/ArbiterServerConfiguration.java
  3. 39 0
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/routers/MycatRouter.java
  4. 86 0
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/services/MycatProxy.java
  5. 146 0
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/services/MycatService.java
  6. 4 11
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/services/ShellService.java
  7. 2 0
      hos-arbiter/src/main/resources/application.yml
  8. 5 2
      hos-broker/src/main/java/com/yihu/hos/broker/common/shell/SSHLinuxTool.java
  9. 31 0
      hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBMycatlController.java
  10. 243 0
      hos-broker/src/main/java/com/yihu/hos/broker/services/MycatConfigService.java
  11. 28 0
      hos-broker/src/main/java/com/yihu/hos/broker/services/ServerShellService.java
  12. 167 0
      hos-broker/src/main/java/com/yihu/hos/broker/util/XMLUtil.java
  13. 2 0
      hos-broker/src/main/resources/application.yml
  14. 8 2
      hos-core/pom.xml
  15. 23 0
      hos-core/src/main/java/com/yihu/hos/core/file/FileUtil.java
  16. 16 0
      hos-web-framework/src/main/java/com/yihu/hos/web/framework/constant/MycatConstant.java
  17. 11 1
      hos-web-framework/src/main/java/com/yihu/hos/web/framework/constant/ServiceFlowConstant.java
  18. 69 0
      hos-web-framework/src/main/java/com/yihu/hos/web/framework/model/bo/ServiceMycat.java
  19. 5 0
      src/main/java/com/yihu/hos/ESBApplication.java
  20. 5 6
      src/main/java/com/yihu/hos/remoteManage/controller/RemoteShellController.java
  21. 4 11
      src/main/java/com/yihu/hos/remoteManage/service/RemoteShellService.java
  22. 56 0
      src/main/java/com/yihu/hos/services/ServiceMycatEventService.java
  23. 198 0
      src/main/java/com/yihu/hos/tenant/controller/DBInfoController.java
  24. 67 0
      src/main/java/com/yihu/hos/tenant/dao/DBInfoDao.java
  25. 114 0
      src/main/java/com/yihu/hos/tenant/model/DBInfoModel.java
  26. 10 0
      src/main/java/com/yihu/hos/tenant/model/TenantModel.java
  27. 97 0
      src/main/java/com/yihu/hos/tenant/service/DBInfoService.java
  28. 190 0
      src/main/java/com/yihu/hos/tenant/service/MySqlImportAndExport.java
  29. 62 14
      src/main/java/com/yihu/hos/tenant/service/TenantService.java
  30. 4 0
      src/main/resources/application.yml
  31. 16 11
      src/main/webapp/WEB-INF/ehr/jsp/common/indexJs.jsp
  32. 32 0
      src/main/webapp/WEB-INF/ehr/jsp/tenant/dataBase/dbInfo.jsp
  33. 152 0
      src/main/webapp/WEB-INF/ehr/jsp/tenant/dataBase/dbInfoJs.jsp
  34. 85 0
      src/main/webapp/WEB-INF/ehr/jsp/tenant/dataBase/editorDbInfo.jsp
  35. 131 0
      src/main/webapp/WEB-INF/ehr/jsp/tenant/dataBase/editorDbInfoJs.jsp
  36. 9 0
      src/main/webapp/WEB-INF/ehr/jsp/tenant/editorTenant.jsp
  37. 46 2
      src/main/webapp/WEB-INF/ehr/jsp/tenant/editorTenantJs.jsp

+ 8 - 0
hos-arbiter/src/main/java/com/yihu/hos/arbiter/HosArbiterApplication.java

@ -1,6 +1,7 @@
package com.yihu.hos.arbiter;
import com.yihu.hos.arbiter.configuration.ArbiterServerConfiguration;
import com.yihu.hos.arbiter.services.MycatProxy;
import com.yihu.hos.arbiter.services.ProxyService;
import com.yihu.hos.arbiter.services.ShellService;
import org.springframework.beans.factory.annotation.Autowired;
@ -16,6 +17,7 @@ public class HosArbiterApplication implements CommandLineRunner {
    private ArbiterServerConfiguration configuration;
    private ProxyService proxyService;
    private ShellService shellService;
    private MycatProxy mycatProxy;
    public static void main(String[] args) {
        SpringApplication.run(HosArbiterApplication.class, args);
@ -33,6 +35,7 @@ public class HosArbiterApplication implements CommandLineRunner {
        proxyService.start();
        shellService.start();
        mycatProxy.start();;
    }
    @Autowired
@ -49,4 +52,9 @@ public class HosArbiterApplication implements CommandLineRunner {
    public void setShellService(ShellService shellService) {
        this.shellService = shellService;
    }
    @Autowired
    public void setMycatProxy(MycatProxy mycatProxy) {
        this.mycatProxy = mycatProxy;
    }
}

+ 6 - 0
hos-arbiter/src/main/java/com/yihu/hos/arbiter/configuration/ArbiterServerConfiguration.java

@ -24,9 +24,15 @@ public class ArbiterServerConfiguration {
    private String terminalUrl;
    @Value("${arbiter.tenant.name}")
    private String tenant;
    @Value("${arbiter.mycat.name}")
    private String mycatName;
    private ZbusBroker zbusBroker;
    public String getMycatName() {
        return mycatName;
    }
    public String getCentralUrl() {
        return centralUrl;
    }

+ 39 - 0
hos-arbiter/src/main/java/com/yihu/hos/arbiter/routers/MycatRouter.java

@ -0,0 +1,39 @@
package com.yihu.hos.arbiter.routers;
import com.yihu.hos.arbiter.configuration.ActivemqConfiguration;
import com.yihu.hos.web.framework.constant.ServiceFlowConstant;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.jms.JmsComponent;
import org.apache.camel.model.ModelCamelContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.jms.ConnectionFactory;
/**
 * mycat操作  消息router
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/1/5.
 */
@Component
public class MycatRouter extends RouteBuilder {
    @Autowired
    private ActivemqConfiguration activemqConfiguration;
    @Override
    public void configure() throws Exception {
        ModelCamelContext context = this.getContext();
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                activemqConfiguration.getUser(), activemqConfiguration.getPassword(), activemqConfiguration.getBrokerURL());
        // Note we can explicit name the component
        context.addComponent("service.mycat.event", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
        from(ServiceFlowConstant.MYCAT_EVENT_SERVICE)
                .choice()
                .when(header("tenant").isNotNull()).to("bean:mycatService?method=proxy")
                .when(header("event").isEqualTo(ServiceFlowConstant.EXECUTE_MYCAT)).to("bean:mycatService?method=updateMycat")
                .endChoice();
    }
}

+ 86 - 0
hos-arbiter/src/main/java/com/yihu/hos/arbiter/services/MycatProxy.java

@ -0,0 +1,86 @@
package com.yihu.hos.arbiter.services;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.hos.arbiter.configuration.ArbiterServerConfiguration;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.web.framework.constant.ServiceFlowConstant;
import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.zbus.broker.ZbusBroker;
import org.zbus.mq.Consumer;
import org.zbus.net.http.Message;
import java.util.HashMap;
import java.util.Map;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/1/6.
 */
@Service
public class MycatProxy {
    private static final Logger logger = LoggerFactory.getLogger(MycatProxy.class);
    private CamelContext camelContext;
    private ArbiterServerConfiguration configuration;
    private ZbusBroker zbusBroker;
    private Consumer consumer;
    @Autowired
    private ObjectMapper objectMapper;
    private static Map<String,String> cunsumerNap = new HashMap<>();
    public void proxy(Message message, Consumer consumer) {
        Map<String, Object> header = new HashMap<>();
        header.put("event", message.getHead("event"));
        ProducerTemplate producerTemplate = camelContext.createProducerTemplate();
        producerTemplate.sendBodyAndHeaders(ServiceFlowConstant.MYCAT_EVENT_SERVICE, message.getBodyString(), header);
    }
    public void start() {
        if (zbusBroker == null) {
            logger.error("zbusBroker is null");
            return;
        }
        try {
            if (!cunsumerNap.containsKey(ServiceFlowConstant.MYCAT_UPDATE + "@" + configuration.getMycatName())){
                consumer = new Consumer(zbusBroker, ServiceFlowConstant.MYCAT_UPDATE + "@" + configuration.getMycatName());
                consumer.start(this::proxy);
                cunsumerNap.put(ServiceFlowConstant.MYCAT_UPDATE + "@" + configuration.getMycatName(),configuration.getMycatName());
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        }
    }
    @Autowired
    public void setZbusBroker(ZbusBroker zbusBroker) {
        this.zbusBroker = zbusBroker;
    }
    @Autowired
    public void setCamelContext(CamelContext camelContext) {
        this.camelContext = camelContext;
    }
    @Autowired
    public void setConfiguration(ArbiterServerConfiguration configuration) {
        this.configuration = configuration;
    }
    @Override
    protected void finalize() throws Throwable {
        consumer.close();
        super.finalize();
    }
}

+ 146 - 0
hos-arbiter/src/main/java/com/yihu/hos/arbiter/services/MycatService.java

@ -0,0 +1,146 @@
package com.yihu.hos.arbiter.services;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.hos.arbiter.models.BrokerServer;
import com.yihu.hos.core.http.HTTPResponse;
import com.yihu.hos.core.http.HttpClientKit;
import com.yihu.hos.web.framework.constant.ServiceFlowConstant;
import org.apache.camel.Body;
import org.apache.camel.Headers;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.zbus.broker.ZbusBroker;
import org.zbus.mq.Producer;
import org.zbus.net.http.Message;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/1/5.
 */
@Service("mycatService")
public class MycatService {
    private static final Logger logger = LogManager.getLogger(MycatService.class);
    @Autowired
    private BrokerServerService brokerServerService;
    private ZbusBroker zbusBroker;
    @Autowired
    private ObjectMapper objectMapper;
    private MycatProxy mycatProxy;
    /**
     * SAAS化的管理端过来的消息会被proxy进行中转,之后发送到终端的Arbiter对Broker进行实际的控制。
     *
     * @param header 消息头部信息
     * @param msg    消息
     */
    public void proxy(@Headers Map<String, String> header, @Body String msg) {
        if (zbusBroker == null) {
            logger.error("zbusBroker is null.");
            return;
        }
        try {
            // 设置mycat 配置修改的 消息生产者
            Producer producer = new Producer(zbusBroker, ServiceFlowConstant.MYCAT_UPDATE + "@" + header.get("tenant"));
            producer.createMQ();    //确定为创建消息队列需要显示调用
            Message message = new Message();
            message.setHead("event", header.get("event"));
            message.setHead("tenant", header.get("tenant"));
            message.setMethod("POST");
            message.setBody(msg);
            message = producer.sendSync(message);
            logger.debug(message);
            mycatProxy.start();
//            System.out.println("test");
        } catch (IOException | InterruptedException e) {
            logger.error(e.getMessage());
            e.printStackTrace();
        }
    }
    /**
     * 发送shell命令请求到broker
     * @param msg    命令消息内容
     */
    public void updateMycat(String msg) {
        try {
            List<BrokerServer> brokerServerList  = brokerServerService.get(false);
            for (BrokerServer broker : brokerServerList) {
                String result = sendMessage(broker, "post", "/esb/serviceMycat/update", msg);
                if (result==null) {
                    logger.error("sendMessage to broker server failed, broker:" + broker.getURL() + ", msg:" + msg);
                    continue;
                }else {
                    logger.debug("发送mycat修改请求到broker成功");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        }
    }
    private String sendMessage(BrokerServer brokerServer, String method, String path, String msg) {
        if (brokerServer == null) {
            return null;
        }
        switch (method) {
            case "post": {
                HTTPResponse response = HttpClientKit.post(brokerServer.getURL() + path, msg);
                if (response.getStatusCode() == 200) {
                    String body = response.getBody();
                    return body;
                }
                return null;
            }
            case "put": {
                HTTPResponse response = HttpClientKit.put(brokerServer.getURL() + path, msg);
                if (response.getStatusCode() == 200) {
                    String body = response.getBody();
                    logger.debug(body);
                    return body;
                }
                return null;
            }
            case "delete": {
                HTTPResponse response = HttpClientKit.delete(brokerServer.getURL() + path, msg);
                if (response.getStatusCode() == 200) {
                    String body = response.getBody();
                    logger.debug(body);
                    return body;
                }
                return null;
            }
            default:
                break;
        }
        return null;
    }
    @Autowired
    public void setZbusBroker(ZbusBroker zbusBroker) {
        this.zbusBroker = zbusBroker;
    }
    @Autowired
    public void setMycatProxy(MycatProxy mycatProxy) {
        this.mycatProxy = mycatProxy;
    }
}

+ 4 - 11
hos-arbiter/src/main/java/com/yihu/hos/arbiter/services/ShellService.java

@ -31,6 +31,8 @@ public class ShellService {
    private Consumer consumer;
    @Autowired
    private ObjectMapper objectMapper;
    private static Map<String,String> cunsumerNap = new HashMap<>();
    public void proxy(Message message, Consumer consumer) {
@ -48,19 +50,10 @@ public class ShellService {
        }
        try {
            if (consumer != null) {
                consumer = new Consumer(zbusBroker, ServiceFlowConstant.SHELL_REQUEST + "@" + configuration.getTenant());
                String messageBodyString = consumer.queryMQ().getBodyString();
                Map<String, Object> message = objectMapper.readValue(messageBodyString, Map.class);
                Integer consumerCount = (Integer) message.get("consumerCount");
                if (consumerCount < 1) {
                    consumer.start(this::proxy);
                }
            } else {
            if (!cunsumerNap.containsKey(ServiceFlowConstant.SHELL_REQUEST + "@" + configuration.getTenant())){
                consumer = new Consumer(zbusBroker, ServiceFlowConstant.SHELL_REQUEST + "@" + configuration.getTenant());
                consumer.start(this::proxy);
                cunsumerNap.put(ServiceFlowConstant.SHELL_REQUEST + "@" + configuration.getTenant(),configuration.getTenant());
            }
        } catch (Exception e) {

+ 2 - 0
hos-arbiter/src/main/resources/application.yml

@ -29,6 +29,8 @@ arbiter:
    url: 192.168.131.119:15555
  tenant:
    name: jkzl
  mycat:
    name: mycat192.168.75.128    ##mycat 服务器标识,规则:“mycat"+ 本机IP
---
spring:
  profiles: test

+ 5 - 2
hos-broker/src/main/java/com/yihu/hos/broker/common/shell/SSHLinuxTool.java

@ -96,8 +96,11 @@ public class SSHLinuxTool {
            outstream.write(shellCommand.getBytes());
            outstream.flush();
            //获取命令执行的结果
            Thread.sleep(1000);
            while (instream.available()<1){
                //获取命令执行的结果
                Thread.sleep(1000);
            }
            if (instream.available() > 0) {
                byte[] data = new byte[instream.available()];
                int nLen = instream.read(data);

+ 31 - 0
hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBMycatlController.java

@ -0,0 +1,31 @@
package com.yihu.hos.broker.controllers;
import com.yihu.hos.broker.services.MycatConfigService;
import com.yihu.hos.web.framework.model.Result;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
 * Created by lingfeng on 2016/8/4.
 */
@RestController
@RequestMapping("/esb")
public class ESBMycatlController {
    @Autowired
    private MycatConfigService mycatService;
    @RequestMapping(value = "/serviceMycat/update", produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
    @ApiOperation(value = "修改mycat", produces = "application/json", notes = "修改mycat的配置文件,并重新加载配置")
    public Result updateMycat(
            @ApiParam(name = "msg", value = "消息", required = true)
            @RequestBody() String msg) {
        return mycatService.addeMycat(msg);
    }
}

+ 243 - 0
hos-broker/src/main/java/com/yihu/hos/broker/services/MycatConfigService.java

@ -0,0 +1,243 @@
package com.yihu.hos.broker.services;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.hos.broker.common.shell.SSHLinuxTool;
import com.yihu.hos.broker.util.XMLUtil;
import com.yihu.hos.web.framework.constant.MycatConstant;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.model.bo.ServiceMycat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.annotation.Resource;
import java.util.Map;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/1/24.
 */
@Service("MycatConfigService")
public class MycatConfigService {
    public static final String BEAN_ID = "MycatConfigService";
    @Resource(name = SSHLinuxTool.BEAN_ID)
    private SSHLinuxTool sshLinuxTool;
    @Autowired
    private ObjectMapper objectMapper;
    @Value("${hos.mycat.path}")
    private String mycatPath;
    @Resource(name = ServerShellService.BEAN_ID)
    private ServerShellService serverShellService;
    //新增 mycat
    public Result addeMycat(String msg) {
        String result = "";
        try {
            ServiceMycat serviceMycat = objectMapper.readValue(msg, ServiceMycat.class);
            //mycat 修改操作
            System.out.println("修改mycat配置,并重载==================");
            //schema.xml修改
//            String schemaXmlPath =  "e:/conf/schema.xml";
            String schemaXmlPath = mycatPath + "/conf/schema.xml";
            Document schemaXML = XMLUtil.parseXml2Doc(schemaXmlPath);
            schemaXML = addMycatSchema(schemaXML, serviceMycat);
            boolean b1 = XMLUtil.writeToXml(schemaXML, schemaXmlPath);
            //server.mxl修改
//            String serverPath =  "e:/conf/server.xml";
            String serverPath = mycatPath + "/conf/server.xml";
            Document serverXML = XMLUtil.parseXml2Doc(serverPath);
            serverXML = addMycatServer(serverXML, serviceMycat);
            boolean b2 = XMLUtil.writeToXml(serverXML, serverPath);
            //TODO 修改完配置文件后,重启mycat
            mycatRestart(mycatPath + "/bin/");
            if (b1 && b2){
                //TODO  需要做灾难抢救处理
                return Result.success("mycat 修改,重启完成!");
            }else {
                return Result.error("mycat 修改配置失败!!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Result.error("mycat 修改异常,请处理!!");
    }
    public void mycatRestart( String mycatBinPath) throws Exception {
        StringBuffer command = new StringBuffer();
        command.append("cd ").append(mycatBinPath).append("\r\n");
        command.append("./mycat restart").append("\r\n");
        serverShellService.executeShell(command.toString(), false);
    }
    /***************************************   修改mycat 的schema.xml配置  ****************************************************/
    /**
     * 添加mycat schema.xml 配置
     * @param doc   mycat xml的dom对象
     * @param obj   租户信息
     * @return
     */
    public  Document addMycatSchema(Document doc, ServiceMycat obj) {
        Node stNode = doc.getElementsByTagName("mycat:schema").item(0);
        //获取数据库实例名,当前写死获取第一个
        Element dnElem = (Element)  doc.getElementsByTagName("dataHost").item(0);
        String dataHost = dnElem.getAttribute("name");//数据库实例名
        //添加schema节点
        Element firstSchema = (Element)  doc.getElementsByTagName("schema").item(0);// 第一个schema节点;用于新节点的插入
        Element schemaElem = doc.createElement("schema");
        schemaElem.setAttribute("name", obj.getSchema());
        schemaElem.setAttribute("dataNode",  MycatConstant.DATA_NODE + obj.getSchema());
        schemaElem.setAttribute("checkSQLschema", "false");
        schemaElem.setAttribute("sqlMaxLimit", "100");
        stNode.insertBefore(schemaElem,firstSchema);
//        stNode.appendChild(schemaElem);
        //添加dataNode节点
        Element firstDataNode = (Element)  doc.getElementsByTagName("dataNode").item(0);//  第一个dataNode节点;用于新节点的插入
        Element dataNodeElem = doc.createElement("dataNode");
        dataNodeElem.setAttribute("dataHost", dataHost);
        dataNodeElem.setAttribute("name",  MycatConstant.DATA_NODE + obj.getSchema());
        dataNodeElem.setAttribute("database",  MycatConstant.DATA_BASE + obj.getSchema());
        stNode.insertBefore(dataNodeElem,firstDataNode);
//        stNode.appendChild(dataNodeElem);
        return doc;
    }
    /**
     * 删除schema相关的mycat配置
     * @param doc   mycat xml的dom对象
     * @param obj   租户信息
     * @return
     */
    public  Document delMycatSchema(Document doc, ServiceMycat obj) {
        Node stNode = doc.getElementsByTagName("mycat:schema").item(0);
        //删除schema节点
        Element schemaNode = doc.createElement("schema");
        schemaNode.setAttribute("name",obj.getSchema());
        stNode.removeChild(schemaNode);
        //删除dataNode节点
        Element dataNodeNode = doc.createElement("schema");
        dataNodeNode.setAttribute("name",MycatConstant.DATA_NODE + obj.getSchema());
        stNode.removeChild(dataNodeNode);
        return doc;
    }
    /***************************************   修改mycat server.xml配置  ****************************************************/
    /**
     * 添加mycat  server.xml配置
     * @param doc   mycat xml的dom对象
     * @param obj   租户信息
     * @return
     */
    public  Document addMycatServer(Document doc, ServiceMycat obj) {
        //获取数据库实例名,当前写死获取第一个
        Element stNode = (Element)  doc.getElementsByTagName("mycat:server").item(0);
        //添加user节点
        Element schemaElem = doc.createElement("user");
        schemaElem.setAttribute("name", obj.getLoginName());
        //添加user的属性子节点
        Element password = doc.createElement("property");
        password.setAttribute("name","password");
        password.setTextContent(obj.getPassword());
        Element schemas = doc.createElement("property");
        schemas.setAttribute("name","schemas");
        schemas.setTextContent(obj.getSchema());
        schemaElem.appendChild(password);
        schemaElem.appendChild(schemas);
        stNode.appendChild(schemaElem);
        //TODO 修改管理员节点,添加新的schema,使管理员可以看到所有的schema;
        Element firstUser = (Element)  doc.getElementsByTagName("user").item(0);// 第一个user节点;用于新节点的插入
        NodeList childNodes = firstUser.getElementsByTagName("property");
        for (int i=0;i<childNodes.getLength();i++){
            Element item = (Element)  childNodes.item(i);
            String name = item.getAttribute("name");
            if ("schemas".equals(name)){
                item.setTextContent(item.getTextContent() + "," + obj.getSchema());
            }
        }
        return doc;
    }
    /* **********************************  以下为具体操作方法;暂无用 *********************************************/
    /**
     *  添加schema节点
     * @param doc      xml DOM对象
     * @param childMap   schema节点
     * @return
     */
    public  Document addSchemaElement(Document doc, Map<String ,String> childMap) {
        Node stNode = doc.getElementsByTagName("mycat:schema").item(0);
        Element element = doc.createElement("schema");
        for (Map.Entry<String, String> entry : childMap.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            element.setAttribute(key,value);
        }
        stNode.appendChild(element);
        return doc;
    }
    /**
     * 删除Schema子节点
     * @param doc         xml DOM对象
     * @param schemaName  要删除的子节点名称
     */
    public  void deleteElement(Document doc, String schemaName) {
        Node stNode = doc.getElementsByTagName("mycat:schema").item(0);
        Element schemaNode = doc.createElement("schema");
        schemaNode.setAttribute("name", schemaName);
        stNode.removeChild(schemaNode);
    }
    /**
     * 修改节点属性
     * @param doc          mycat xmldom对象
     * @param schemaName   要修改的节点名称
     * @param childMap 修改的节点属性
     */
    public  Document updateAttributeValue(Document doc,String schemaName ,Map<String,String> childMap) {
        NodeList nodeList = doc.getElementsByTagName("schema");
        if (nodeList != null) {
            //所有schema节点
            for (int i = 0; i < nodeList.getLength(); i++) {
                Element elem = (Element) nodeList.item(i);
                String name = elem.getAttribute("name");
                if (schemaName.equals(name)){
                    //schema节点的所有属性
                    for (Map.Entry<String, String> entry : childMap.entrySet()) {
                        String key = entry.getKey();
                        String value = entry.getValue();
                        elem.setAttribute(key,value);
                    }
                }
            }
        }
        return doc;
    }
    public static void main(String[] args) throws Exception {
        MycatConfigService service = new MycatConfigService();
        service.mycatRestart("e://mycat");
    }
}

+ 28 - 0
hos-broker/src/main/java/com/yihu/hos/broker/services/ServerShellService.java

@ -58,4 +58,32 @@ public class ServerShellService {
        return Result.error("shell命令执行失败!");
    }
    public String executeShell(String command,boolean iskeep) {
        String result="";
        try {
            if (session==null){
                session = sshLinuxTool.getsessionConn();
            }
            if (!iskeep) {
                //保持通道连接
                System.out.println("执行命令,并保持当前会话==================");
                result = sshLinuxTool.sshShell(session, command, false);
                System.out.println("结果:"+result);
            } else {
                //断开通道连接,会话
                System.out.println("执行命令,并结束当前会话==================");
                result = sshLinuxTool.sshShell(session, command, true);
                session = null;
                System.out.println("结果:"+result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

+ 167 - 0
hos-broker/src/main/java/com/yihu/hos/broker/util/XMLUtil.java

@ -0,0 +1,167 @@
package com.yihu.hos.broker.util;
import org.w3c.dom.*;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.util.Map;
public class XMLUtil {
//    public static void main(String[] args) {
//        String filePath = "e://test.xml";
//        XMLUtil xmlUtil = new XMLUtil();
//        xmlUtil.parseXml(filePath);
//    }
    public static void parseXml(String filePath) {
        File xmlFile = new File(filePath);
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder;
        try {
            dBuilder = dbFactory.newDocumentBuilder();
            dBuilder.setEntityResolver(new IgnoreDTDEntityResolver());
            Document doc = dBuilder.parse(xmlFile);
            Element eltName = doc.createElement("schema");
            Attr attr = doc.createAttribute("name");
            attr.setValue("22222");
            Attr attr2 = doc.createAttribute("checkSQLschema");
            attr2.setValue("true");
            Attr attr3 = doc.createAttribute("sqlMaxLimit");
            attr3.setValue("10");
            Attr attr4 = doc.createAttribute("dataNode");
            attr4.setValue("T2222");
            eltName.setAttributeNode(attr);
            eltName.setAttributeNode(attr2);
            eltName.setAttributeNode(attr3);
            eltName.setAttributeNode(attr4);
            Node stNode = doc.getElementsByTagName("mycat:schema").item(0);
            stNode = addElement(stNode, eltName);
            writeToXml(doc, filePath);
            Element rootElement = doc.getDocumentElement();
            NodeList nodeList = rootElement.getElementsByTagName("schema");
            if (nodeList != null) {
                for (int i = 0; i < nodeList.getLength(); i++) {
                    Element element = (Element) nodeList.item(i);
                    String name = element.getAttribute("name");
                    System.out.println(name);
                }
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
    public static Document parseXml2Doc(String filePath) {
        Document doc = null;
        File xmlFile = new File(filePath);
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder;
        try {
            dBuilder = dbFactory.newDocumentBuilder();
            dBuilder.setEntityResolver(new IgnoreDTDEntityResolver());
            doc = dBuilder.parse(xmlFile);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return doc;
    }
    /**
     *  添加节点
     * @param stNode      基节点
     * @param childNode   要新增的子节点
     * @return
     */
    public static Node addElement(Node stNode, Element childNode) {
        stNode.appendChild(childNode);
        return stNode;
    }
    /**
     * 删除子节点
     * @param node        父节点
     * @param childNode  要删除的子节点
     */
    public static void deleteElement(Node node, Element childNode) {
        node.removeChild(childNode);
    }
    /**
     * //TODO 不需要
     * 修改子节点
     * @param doc
     */
    public static void updateElementValue(Document doc) {
        NodeList mycatNode = doc.getElementsByTagName("mycat:schema");
        Element emp = null;
        //loop for each employee
        for (int i = 0; i < mycatNode.getLength(); i++) {
            emp = (Element) mycatNode.item(i);
            Node name = emp.getElementsByTagName("name").item(0).getFirstChild();
            name.setNodeValue(name.getNodeValue().toUpperCase());
        }
    }
    /**
     * 修改节点属性
     * @param element   要修改的节点
     * @param updateMap 修改的节点属性
     */
    public static Element updateAttributeValue(Element element ,Map<String,String> updateMap) {
        for (Map.Entry<String, String> entry : updateMap.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            element.setAttribute(key,value);
        }
        return element;
    }
    /**
     * 将修改完的xml保存
     *
     * @param doc       修改后的xml
     * @param rptdesign xml的保存路径
     */
    public static boolean writeToXml(Document doc, String rptdesign) {
        boolean succ = false;
        try {
            OutputStream fileoutputStream = new FileOutputStream(rptdesign);
            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer = tFactory.newTransformer();
            transformer.setOutputProperty("indent" ,  "yes" );
            System.out.println(doc.getDoctype().getPublicId());
            DOMSource source = new DOMSource(doc);
            //添加解析时忽略的dtd引用
            transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());
            StreamResult result = new StreamResult(fileoutputStream);
            transformer.transform(source, result);
            succ = true;
        } catch (Exception e) {
            System.out.println("Can't write to file: " + rptdesign);
            e.printStackTrace();
        }
        return succ;
    }
   static class IgnoreDTDEntityResolver implements EntityResolver {
        @Override
        public InputSource resolveEntity(String arg0, String arg1) throws SAXException, IOException {
            return new InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8'?>".getBytes()));
        }
    }
}

+ 2 - 0
hos-broker/src/main/resources/application.yml

@ -58,6 +58,8 @@ hos:
      period: 10000
  tenant:
    name: jkzl
  mycat:
    path: /usr/local/mycat/   ##mycat的安装目录
  #jcraft shell操作
  jcraft:
    host: 172.19.103.57

+ 8 - 2
hos-core/pom.xml

@ -122,13 +122,19 @@
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.4.6</version>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.4.6</version>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.8.5</version>
        </dependency>
        <!--jackson end-->
        <!-- Log framework start-->

+ 23 - 0
hos-core/src/main/java/com/yihu/hos/core/file/FileUtil.java

@ -347,5 +347,28 @@ public class FileUtil {
        return stringBuilder.toString();
    }
    public static String readFileText(InputStream in) {
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
            String line = null;
            while ((line = br.readLine()) != null) {
                stringBuilder.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e1) {
                }
            }
        }
        return stringBuilder.toString();
    }
}

+ 16 - 0
hos-web-framework/src/main/java/com/yihu/hos/web/framework/constant/MycatConstant.java

@ -0,0 +1,16 @@
package com.yihu.hos.web.framework.constant;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/1/24.
 */
public class MycatConstant {
    public static final String MYCAT = "mycat";   // mycat dataNode前缀
    public static final String DATA_NODE = "dn_";   // mycat dataNode前缀
    public static final String DATA_BASE = "db_";   // mycat database前缀
}

+ 11 - 1
hos-web-framework/src/main/java/com/yihu/hos/web/framework/constant/ServiceFlowConstant.java

@ -40,10 +40,11 @@ public interface ServiceFlowConstant {
    //ArbiterServer MQ
    String SSH = "ssh";
    /* *******   shell相关  ******  */
    // shell 请求命令,对列名称
    String SHELL_EVENT_QUEUE = "configuration.service.shell";
    String SHELL_EVENT_SERVICE = "service.shell.event:queue:configuration.service.shell";
    //Arbiter shell
    String ARBITER_SHELL_SEND = "arbiterShellSend"; //shell 命令执行消息
    String ARBITER_SHELL_ACEPT = "arbiterShellAcept"; //shell 执行结果消息
@ -52,4 +53,13 @@ public interface ServiceFlowConstant {
    // hos-admin 接收shell执行结果
    String SHELL_RESPONSE = "shell_response";
    /* ********************** mycat相关  ************************ */
    // shell 请求命令,对列名称
    String MYCAT_EVENT_QUEUE = "configuration.service.mycat";
    String MYCAT_EVENT_SERVICE = "service.mycat.event:queue:configuration.service.mycat";
    //Arbiter mycat 操作事件
    String EXECUTE_MYCAT = "execute_mycat"; //shell 命令执行消息
    //arbiter mycat修改 消息队列
    String MYCAT_UPDATE = "mycat_update";
}

+ 69 - 0
hos-web-framework/src/main/java/com/yihu/hos/web/framework/model/bo/ServiceMycat.java

@ -0,0 +1,69 @@
package com.yihu.hos.web.framework.model.bo;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
/**
 *  租户表
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/12/2.
 */
@Document
public class ServiceMycat {
    @Id
    private String id;
    private String name;
    private String loginName;
    private String password;
    private String schema;
    private String tenant;
    public String getTenant() {
        return tenant;
    }
    public void setTenant(String tenant) {
        this.tenant = tenant;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLoginName() {
        return loginName;
    }
    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getSchema() {
        return schema;
    }
    public void setSchema(String schema) {
        this.schema = schema;
    }
}

+ 5 - 0
src/main/java/com/yihu/hos/ESBApplication.java

@ -52,6 +52,11 @@ public class ESBApplication extends WebMvcConfigurerAdapter  implements CommandL
        return new ActiveMQQueue(ServiceFlowConstant.SHELL_EVENT_QUEUE);
    }
    @Bean(name = "mycatQueue")
    public Queue mycatQueue() {
        return new ActiveMQQueue(ServiceFlowConstant.MYCAT_EVENT_QUEUE);
    }
    @Override
    public void run(String... strings) throws Exception {
        MqServerConfig config = new MqServerConfig();

+ 5 - 6
src/main/java/com/yihu/hos/remoteManage/controller/RemoteShellController.java

@ -51,10 +51,9 @@ public class RemoteShellController extends BaseController {
            @RequestParam(value = "disCon", required = true) boolean disCon) {
        String result = "";
        try {
            //TODO 发送shell命令 消息
            System.out.println("发送shell请求:" + command);
            //发送shell命令 消息
            remoteShellService.sendShell(command, disCon);
            return Result.success("shell请求发送成功!");
            return Result.success("shell请求发送成功:"+command);
        } catch (Exception e) {
            e.printStackTrace();
        }
@ -69,19 +68,19 @@ public class RemoteShellController extends BaseController {
        String result = "";
        try {
            //TODO 如何去除等待时间,目前添加sleep是因为需要等待zbus回调方法的返回结果;
            Thread.sleep(2000);
            String attachment = LocalContext.getContext().getAttachment(ContextAttributes.TENANT_NAME);
            result = LocalContext.getContext().getAttachment(ContextAttributes.SHELL_RESPONSE + attachment);
            int count = 0;
            while (result == null) {
                count++;
                Thread.sleep(2000);
                Thread.sleep(1000);
                result = LocalContext.getContext().getAttachment(ContextAttributes.SHELL_RESPONSE + attachment);
                //获取失败时,尝试再一次获取结果
                if (count > 2) {
                if (count > 5) {
                    break;
                }
            }
            LocalContext.getContext().removeAttachment(ContextAttributes.SHELL_RESPONSE + attachment);
            System.out.println("接口返回结果:" + result);
        } catch (InterruptedException e) {
            e.printStackTrace();

+ 4 - 11
src/main/java/com/yihu/hos/remoteManage/service/RemoteShellService.java

@ -16,6 +16,7 @@ import org.zbus.net.http.Message;
import java.io.IOException;
import java.net.InetAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
@ -33,6 +34,7 @@ public class RemoteShellService {
    private ServiceShellEventService serviceShellEventService;
    private ZbusBroker zbusBroker;
    private Consumer consumer;
    private static Map<String,String> cunsumerNap = new HashMap<>();
    @Autowired
    private ObjectMapper objectMapper;
@ -81,20 +83,11 @@ public class RemoteShellService {
        }
        try {
            if (consumer != null) {
                consumer = new Consumer(zbusBroker, ServiceFlowConstant.SHELL_RESPONSE + "@" + attachment);
                String messageBodyString = consumer.queryMQ().getBodyString();
                Map<String,Object> message = objectMapper.readValue(messageBodyString,Map.class);
                Integer consumerCount = (Integer) message.get("consumerCount");
                if (consumerCount<1) {
                    consumer.start(this::handle);
                }
            } else {
            if (!cunsumerNap.containsKey(ServiceFlowConstant.SHELL_RESPONSE + "@" + attachment)){
                consumer = new Consumer(zbusBroker, ServiceFlowConstant.SHELL_RESPONSE + "@" + attachment);
                consumer.start(this::handle);
                cunsumerNap.put(ServiceFlowConstant.SHELL_RESPONSE + "@" + attachment,attachment);
            }
            System.out.println("start success~");
        } catch (Exception e) {
            e.printStackTrace();

+ 56 - 0
src/main/java/com/yihu/hos/services/ServiceMycatEventService.java

@ -0,0 +1,56 @@
package com.yihu.hos.services;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.web.framework.constant.ServiceFlowConstant;
import com.yihu.hos.web.framework.model.bo.ServiceMycat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.jms.Queue;
import java.util.HashMap;
import java.util.Map;
/**
 *  mycat配置文件操作 消息到MQ
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/1/5.
 */
@Component
public class ServiceMycatEventService {
    static final Logger logger = LoggerFactory.getLogger(ServiceMycatEventService.class);
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Resource(name = "mycatQueue")
    private Queue mycatQueue;
    @Autowired
    private ObjectMapper objectMapper;
    public void executeMycatConfig(ServiceMycat servviceMycat, String tenant) {
        this.sendMsg(ServiceFlowConstant.EXECUTE_MYCAT, servviceMycat,tenant);
    }
    private void sendMsg(String event, ServiceMycat servviceMycat,String tenant) {
        try {
            Map<String, Object> header = new HashMap<>();
            String msg = objectMapper.writeValueAsString(servviceMycat);
            header.put("tenant", tenant);
            header.put("event", event);
            this.jmsMessagingTemplate.convertAndSend(this.mycatQueue, msg, header);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        }
    }
}

+ 198 - 0
src/main/java/com/yihu/hos/tenant/controller/DBInfoController.java

@ -0,0 +1,198 @@
package com.yihu.hos.tenant.controller;
import com.yihu.hos.tenant.model.DBInfoModel;
import com.yihu.hos.tenant.service.DBInfoService;
import com.yihu.hos.web.framework.model.DetailModelResult;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.util.controller.BaseController;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 *  数据库实例管理
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/12/16.
 */
@RequestMapping("/tenant/dataBase")
@Controller
public class DBInfoController extends BaseController{
    @Resource(name = DBInfoService.BEAN_ID)
    private DBInfoService dbInfoService;
    /**
     *   管理界面
     *
     * @param model
     * @return
     */
    @RequestMapping("/initial")
    public String dbInfoInitial(Model model) {
        model.addAttribute("contentPage", "tenant/dataBase/dbInfo");
        return "partView";
    }
    /**
     * 列表
     *
     * @param request
     * @return
     */
    @RequestMapping("/getDBList")
    @ResponseBody
    public Result getDBInfoList(HttpServletRequest request,String name,String valid) {
        try {
            Map<String, Object> params = new HashMap<>();
            params.put("name", name);
            params.put("valid", valid);
            String page = StringUtils.isEmpty(request.getParameter("page")) ? "1" : request.getParameter("page");
            String rows = StringUtils.isEmpty(request.getParameter("rows")) ? "10" : request.getParameter("rows");
            params.put("page", page);
            params.put("rows", rows);
            Result result = dbInfoService.getDBInfoList(params);
            return result;
        } catch (Exception ex) {
            ex.printStackTrace();
            return Result.error(ex.getMessage());
        }
    }
    /**
     *  修改页面
     * @param model
     * @param id
     * @param categoryId
     * @return
     */
    @RequestMapping("/editorDbInfo")
    public String editorDBInfo(Model model, Long id, String flag, String categoryId) {
        try {
            DBInfoModel dbInfoModel = null;
            if (id != null) {
                dbInfoModel = dbInfoService.getDBInfoById(id);
            }  else {
                dbInfoModel = new DBInfoModel();
            }
            model.addAttribute("model", dbInfoModel);
            model.addAttribute("flag", flag);
            model.addAttribute("categoryId", categoryId);
            model.addAttribute("contentPage", "/tenant/dataBase/editorDbInfo");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "pageView";
    }
    /**
     * 详情页
     * @param model
     * @param id
     * @return
     */
    @RequestMapping("/dbDetail")
    public String dBInfoDetail(Model model, Long id) {
        try {
            DBInfoModel dbInfoModel = null;
            if (id != null ) {
                dbInfoModel = dbInfoService.getDBInfoById(id);
            }  else {
                dbInfoModel = new DBInfoModel();
            }
            model.addAttribute("model", dbInfoModel);
            model.addAttribute("contentPage", "/tenant/dataBase/dbDetail");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "pageView";
    }
    /**
     * 新增
     * @param request
     * @return
     */
    @RequestMapping("addDBInfo")
    @ResponseBody
    public Result addDBInfo(HttpServletRequest request) {
        try {
            DBInfoModel obj = new DBInfoModel();
            BeanUtils.populate(obj, request.getParameterMap());
            obj.setCreated(new Date());
            return dbInfoService.addDBInfo(obj);
        } catch (Exception ex) {
            ex.printStackTrace();
            return Result.error(ex.getMessage());
        }
    }
    /**
     * 删除
     * @param request
     * @return
     */
    @RequestMapping("/deleteDBInfo")
    @ResponseBody
    public Result deleteDBInfo(HttpServletRequest request) {
        try {
            String id = request.getParameter("id");
            dbInfoService.deleteDBInfo(Long.parseLong(id));
            return Result.success("删除成功!");
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("删除失败!");
        }
    }
    /**
     * 修改租户信息
     */
    @RequestMapping("updateDBInfo")
    @ResponseBody
    public Result updateDBInfo(HttpServletRequest request) {
        try {
            DBInfoModel obj = new DBInfoModel();
            BeanUtils.populate(obj, request.getParameterMap());
            return dbInfoService.updateDBInfo(obj);
        } catch (Exception ex) {
            ex.printStackTrace();
            return Result.error(ex.getMessage());
        }
    }
    @RequestMapping(value="/getDataBaseValues" , method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "获取数据库实例下拉框信息", response = DetailModelResult.class, produces = "application/json", notes = "获取数据库实例下拉框信息")
    public DetailModelResult getSelectList(
            @ApiParam(name = "q", value = "数据库名称或实例名", required = false)
            @RequestParam(value = "q", required = false) String q,
            @ApiParam(name = "initVal", value = "初始化数据库名称", required = false)
            @RequestParam(value = "initVal", required = false) String initVal) {
        return dbInfoService.getDataBaseSelectList(q);
    }
}

+ 67 - 0
src/main/java/com/yihu/hos/tenant/dao/DBInfoDao.java

@ -0,0 +1,67 @@
package com.yihu.hos.tenant.dao;
import com.yihu.hos.tenant.model.DBInfoModel;
import com.yihu.hos.web.framework.dao.SQLGeneralDAO;
import com.yihu.hos.web.framework.model.Result;
import org.hibernate.Query;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Map;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/12/2.
 */
@Repository("dBInfoDao")
public class DBInfoDao extends SQLGeneralDAO {
    public static final String BEAN_ID = "dBInfoDao";
    public List<DBInfoModel> getDBInfoList(String name) throws Exception {
        List<DBInfoModel> list = (List<DBInfoModel>) super.hibernateTemplate.find("from DBInfoModel s where (s.name like ? or s.userName like ?) and s.valid = 1", name,name);
        return list;
    }
    public List<DBInfoModel> getAllList() throws Exception {
        List<DBInfoModel> list = (List<DBInfoModel>) super.hibernateTemplate.find("from DBInfoModel s where  s.valid = 1");
        return list;
    }
    /**\
     * 分页列表
     * @param params
     * @return
     * @throws Exception
     */
    public Result getDBInfoList(Map<String, Object> params) throws Exception {
        StringBuilder sb = new StringBuilder("from DBInfoModel t where 1=1 ");
        Object valid = params.get("valid");
        Object name = params.get("name");
        if (!StringUtils.isEmpty(valid)) //是否有效
        {
            sb.append(" and t.valid = :valid");
        }
        //用户名过滤
        if (!StringUtils.isEmpty(name)) {
            sb.append(" and (t.name like ? or t.userName like ?)");
        }
        sb.append(" order by t.created desc");
        Query query = super.hibernateTemplate.getSessionFactory().getCurrentSession().createQuery(sb.toString());
        if (!StringUtils.isEmpty(valid)) //是否有效
        {
            query.setInteger("valid",Integer.parseInt(valid.toString()));
        }
        if (!StringUtils.isEmpty(name)) {
            query.setString(0, "%" + name.toString() + "%");
            query.setString(1, "%" + name.toString() + "%");
        }
        return super.getDataGridResult(query, Integer.valueOf(params.get("page").toString()), Integer.valueOf(params.get("rows").toString()));
    }
}

+ 114 - 0
src/main/java/com/yihu/hos/tenant/model/DBInfoModel.java

@ -0,0 +1,114 @@
package com.yihu.hos.tenant.model;
import com.yihu.hos.web.framework.model.IdModel;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Date;
/**
 *  系统真实数据库实例
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/12/2.
 */
@Entity
@Table(name = "system_datasource_info")
public class DBInfoModel extends IdModel {
    private String name;
    private String userName;
    private String password;
    private String host;
    private Integer port;
    private Date created;
    private Date updated;
    private Integer valid;
    // @Transient 不映射
    private String dbName;
    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Column(name="user_name")
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    @Column(name="password")
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Column(name="host")
    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    @Column(name="port")
    public Integer getPort() {
        return port;
    }
    public void setPort(Integer port) {
        this.port = port;
    }
    @Column(name="created")
    public Date getCreated() {
        return created;
    }
    public void setCreated(Date created) {
        this.created = created;
    }
    @Column(name="updated")
    public Date getUpdated() {
        return updated;
    }
    public void setUpdated(Date updated) {
        this.updated = updated;
    }
    @Column(name="valid")
    public Integer getValid() {
        return valid;
    }
    public void setValid(Integer valid) {
        this.valid = valid;
    }
    public String getDbName() {
        return dbName;
    }
    public void setDbName(String dbName) {
        this.dbName = dbName;
    }
}

+ 10 - 0
src/main/java/com/yihu/hos/tenant/model/TenantModel.java

@ -28,6 +28,16 @@ public class TenantModel extends IdModel {
    private Integer updatedUnix;
    private Integer valid;
    private Long dataSourceId;
    @Column(name="datasource_id")
    public Long getDataSourceId() {
        return dataSourceId;
    }
    public void setDataSourceId(Long dataSourceId) {
        this.dataSourceId = dataSourceId;
    }
    @Column(name="code")
    public String getCode() {

+ 97 - 0
src/main/java/com/yihu/hos/tenant/service/DBInfoService.java

@ -0,0 +1,97 @@
package com.yihu.hos.tenant.service;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.tenant.dao.DBInfoDao;
import com.yihu.hos.tenant.model.DBInfoModel;
import com.yihu.hos.web.framework.model.DetailModelResult;
import com.yihu.hos.web.framework.model.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/12/2.
 */
@Service("dBInfoService")
public class DBInfoService {
    public static final String BEAN_ID = "dBInfoService";
    @Autowired
    private DBInfoDao dbInfoDao;
    
    @Value("${spring.data.mongodb.gridFsDatabase}")
    private String dbName;
    public List<DBInfoModel> findDBInfoByName(String name) throws Exception {
        if (name!=null && !StringUtil.isEmpty(name)){
            return dbInfoDao.getDBInfoList(name);
        }else {
            return dbInfoDao.getAllList();
        }
    }
    public Result getDBInfoList(Map<String, Object> params) throws Exception {
        return dbInfoDao.getDBInfoList(params);
    }
    public DBInfoModel getDBInfoById(Long id) throws Exception {
        return dbInfoDao.getEntity(DBInfoModel.class,id);
    }
    public Result addDBInfo(DBInfoModel obj) throws Exception {
        obj.setCreated(new Date());
        obj.setUpdated(new Date());
        dbInfoDao.saveEntity(obj);
        return Result.success("保存成功");
    }
    @Transactional
    public Result updateDBInfo(DBInfoModel obj) throws Exception {
        DBInfoModel DBInfo = dbInfoDao.getEntity(DBInfoModel.class, obj.getId());
        DBInfo.setName(obj.getName());
        DBInfo.setUserName(obj.getUserName());
        DBInfo.setPassword(obj.getPassword());
        DBInfo.setHost(obj.getHost());
        DBInfo.setPort(obj.getPort());
        DBInfo.setValid(obj.getValid());
        DBInfo.setUpdated(new Date());
        dbInfoDao.updateEntity(DBInfo);
        return Result.success("更新成功");
    }
    @Transactional
    public Result deleteDBInfo(Long id) throws Exception {
        DBInfoModel systemApp = dbInfoDao.getEntity(DBInfoModel.class, id);
        dbInfoDao.deleteEntity(systemApp);
        return Result.success("删除成功");
    }
    public DetailModelResult getDataBaseSelectList( String name) {
        try {
            List<DBInfoModel> dbList = findDBInfoByName(name);
            List<Map<String,Object>> detailModelList = new ArrayList<>();
            for (DBInfoModel dbInfoModel : dbList) {
                Map select2 = new HashMap<>();
                select2.put("code" ,dbInfoModel.getId().toString());
                select2.put("value",dbInfoModel.getName());
                detailModelList.add(select2);
            }
            DetailModelResult detailModelResult = DetailModelResult.success("获取数据库实例下拉列表成功");
            detailModelResult.setDetailModelList(detailModelList);
            detailModelResult.setTotalCount(detailModelList.size());
            return detailModelResult;
        } catch (Exception e) {
            return DetailModelResult.error("获取数据库实例下拉列表失败");
        }
    }
}

+ 190 - 0
src/main/java/com/yihu/hos/tenant/service/MySqlImportAndExport.java

@ -0,0 +1,190 @@
package com.yihu.hos.tenant.service;
import com.yihu.hos.tenant.model.DBInfoModel;
import org.springframework.stereotype.Component;
import java.io.*;
/**
 * MYSQL数据库导出/导入 (测试版)
 *
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/1/18.
 */
@Component
public class MySqlImportAndExport {
//    public static void main(String args[]) throws Exception {
//        DBInfoModel db = new DBInfoModel();
//        db.setUserName("root");
//        db.setPassword("xmjkzl");
//        db.setHost("172.19.103.57");
//        db.setPort(3306);
//        db.setDbName("ccc");
////
////        db.setUserName("root");
////        db.setPassword("123");
////        db.setHost("192.168.131.119");
////        db.setPort(3306);
////        db.setDbName("learn");
//        MySqlImportAndExport mySqlImportAndExport = new MySqlImportAndExport();
////      MySqlImportAndExport.export(db,"e://learn_copy.sql");//这里简单点异常我就直接往上抛
//        mySqlImportAndExport.importSql(db,"e://learn.sql");
//    }
    /**
     * 根据属性文件的配置导出指定位置的指定数据库到指定位置
     *
     * @param db         数据库信息
     * @param exportPath 导出的sql文件路径
     * @throws IOException
     */
    public void export(DBInfoModel db, String exportPath) throws Exception {
        Runtime runtime = Runtime.getRuntime();
//        String mysqlPath = getMysqlPath(db,runtime);
//        System.out.println("安装地址:"+mysqlPath);
        String command = getExportCommand(db, exportPath);
        System.out.println(command);
        runtime.exec(command);//这里简单一点异常我就直接往上抛
    }
    /**
     * 在命令窗口进行mysql的数据库导入一般分三步走:
     * 第一步是登到到mysql; mysql -uusername -ppassword -hhost -Pport -DdatabaseName;如果在登录的时候指定了数据库名则会
     * 直接转向该数据库,这样就可以跳过第二步,直接第三步;
     * 第二步是切换到导入的目标数据库;use 数据库名;
     * 第三步是开始从目标文件导入数据到目标数据库;source importPath;
     *
     * @param db         数据库信息
     * @param importPath 导入的sql文件路径
     * @throws IOException
     */
    public String importSql(DBInfoModel db, String importPath) {
        Runtime runtime = Runtime.getRuntime();
        //因为在命令窗口进行mysql数据库的导入一般分三步走,所以所执行的命令将以字符串数组的形式出现
        String cmdarray[] = getImportCommand(db, importPath);//根据属性文件的配置获取数据库导入所需的命令,组成一个数组
        try {
            //runtime.exec(cmdarray);//这里也是简单的直接抛出异常
            Process process = runtime.exec(cmdarray[0]);
            Thread.sleep(300);//没睡眠的话会出现问题:出现异常的时候不会被捕获;
            //执行了第一条命令以后已经登录到mysql了,所以之后就是利用mysql的命令窗口
            //进程执行后面的代码
            OutputStream os = process.getOutputStream();
            OutputStreamWriter writer = new OutputStreamWriter(os);
            //命令1和命令2要放在一起执行
            writer.write(cmdarray[1] + "\r\n" + cmdarray[2]);
            writer.flush();
            writer.close();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
            return e.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return e.toString();
        }
        return null;
    }
    /**
     * 生成导出sql命令
     * 在拼装命令语句的时候有一点是需要注意的:一般我们在命令窗口直接使用命令来
     * 进行导出的时候可以简单使用“>”来表示导出到什么地方,即mysqldump -uusername -ppassword databaseName > exportPath,
     * 但在Java中这样写是不行的,它需要你用-r明确的指出导出到什么地方,如:
     * mysqldump -uusername -ppassword databaseName -r exportPath。(经验证> 也是可以)
     *
     * @param exportPath 输出路径
     * @return
     */
    public String getExportCommand(DBInfoModel db, String exportPath) {
        StringBuffer command = new StringBuffer();
        //window需要进入mysql安装的bin目录
        if (System.getProperties().getProperty("os.name").contains("Windows")) {
            System.out.println("===========操作系统是:" + System.getProperties().getProperty("os.name"));
            //TODO 获取mysql的安装路径
            String mysqlPath = "C:\\Program Files\\MySQL\\MySQL Server 5.6\\bin";
            String cmd = "cmd /c C: && cd " + mysqlPath + " && ";
            command.append(cmd);
        }
        command.append("mysqldump -u").append(db.getUserName()).append(" -p").append(db.getPassword())//密码是用的小p,而端口是用的大P。
                .append(" -h").append(db.getHost()).append(" -P").append(db.getPort()).append(" ").append(db.getDbName()).append(" > ").append(exportPath);
        return command.toString();
    }
    /**
     * 生成导入文件的命令行
     * 如果在登录的时候指定了数据库名则会
     * 直接转向该数据库,这样就可以跳过第二步,直接第三步;
     *
     * @param db         数据库信息
     * @param importPath 导入的sql文件路径
     * @return
     */
    public String[] getImportCommand(DBInfoModel db, String importPath) {
        //第一步,获取登录命令语句
        StringBuffer loginCommand = new StringBuffer();
        //window需要进入mysql安装的bin目录
        if (System.getProperties().getProperty("os.name").contains("Windows")) {
            System.out.println("===========操作系统是:" + System.getProperties().getProperty("os.name"));
            //TODO 获取mysql的安装路径
            String mysqlPath = "C:\\Program Files\\MySQL\\MySQL Server 5.6\\bin ";
            String cmd = "cmd /c C: && cd " + mysqlPath + " && ";
            loginCommand.append(cmd);
        }
        loginCommand.append("mysql --default-character-set=utf8 -u").append(db.getUserName()).append(" -p").append(db.getPassword()).append(" -h").append(db.getHost())
                .append(" -P").append(db.getPort());
        //第二步,创建数据库 获取切换数据库到目标数据库的命令语句
        String switchCommand = new StringBuffer("CREATE DATABASE " + db.getDbName() + "; use ").append(db.getDbName()).append(";").toString();
        //第三步,获取导入的命令语句
        String importCommand = new StringBuffer("source ").append(importPath).toString();
        //需要返回的命令语句数组
        String[] commands = new String[]{loginCommand.toString(), switchCommand, importCommand};
        return commands;
    }
    public String getMysqlPath(DBInfoModel db, Runtime runtime) throws Exception {
        //第一步,获取登录命令语句
        StringBuffer loginCommand = new StringBuffer();
        //window需要进入mysql安装的bin目录
        if (System.getProperties().getProperty("os.name").contains("Windows")) {
            System.out.println("===========操作系统是:" + System.getProperties().getProperty("os.name"));
            //TODO 获取mysql的安装路径
            String mysqlPath = "C:\\Program Files\\MySQL\\MySQL Server 5.6\\bin ";
            String cmd = "cmd /c C: && cd " + mysqlPath + " && ";
            loginCommand.append(cmd);
        }
        loginCommand.append("mysql -u").append(db.getUserName()).append(" -p").append(db.getPassword()).append(" -h").append(db.getHost())
                .append(" -P").append(db.getPort());
        Process process = runtime.exec(loginCommand.toString());
        //执行了第一条命令以后已经登录到mysql了,所以之后就是利用mysql的命令窗口
        //进程执行后面的代码
        OutputStream os = process.getOutputStream();
        OutputStreamWriter writer = new OutputStreamWriter(os);
        //命令1和命令2要放在一起执行
        writer.write("select @@basedir as basePath from dual" + "\r\n");
        writer.flush();
        writer.close();
        //需要返回的命令语句数组
        InputStream is = process.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        process.waitFor();
        is.close();
        reader.close();
        process.destroy();
        os.close();
        return "";
    }
}

+ 62 - 14
src/main/java/com/yihu/hos/tenant/service/TenantService.java

@ -2,15 +2,20 @@ package com.yihu.hos.tenant.service;
import com.yihu.hos.config.MongoConfig;
import com.yihu.hos.core.encrypt.DES;
import com.yihu.hos.services.ServiceMycatEventService;
import com.yihu.hos.tenant.dao.TenantDao;
import com.yihu.hos.tenant.model.DBInfoModel;
import com.yihu.hos.tenant.model.TenantModel;
import com.yihu.hos.web.framework.constant.MycatConstant;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.model.bo.ServiceMycat;
import com.yihu.hos.web.framework.util.GridFSUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
@ -37,10 +42,22 @@ public class TenantService {
    @Value("${spring.data.mongodb.gridFsDatabase}")
    private String dbName;
    @Value("${hos.mysql.filePath}")
    private String sqlFilePath;
    @Autowired
    private DBInfoService dbInfoService;
    @Autowired
    private MySqlImportAndExport mySqlImportAndExport;
    @Autowired
    private ServiceMycatEventService serviceMycatEventService;
    public TenantModel findTenantByName(String name) throws Exception {
        List<TenantModel> list = tenantDao.getTenantList(name);
        if (list!=null && !list.isEmpty()){
        if (list != null && !list.isEmpty()) {
            return list.get(0);
        }
        return null;
@ -51,18 +68,49 @@ public class TenantService {
    }
    public TenantModel getTenantById(Long id) throws Exception {
        return tenantDao.getEntity(TenantModel.class,id);
        return tenantDao.getEntity(TenantModel.class, id);
    }
    public Result addTenant(TenantModel obj) throws Exception {
//    @Transactional(rollbackFor={RuntimeException.class, Exception.class})
    public Result addTenant(TenantModel obj) {
        String code = UUID.randomUUID().toString();
        obj.setCode(code);
        obj.setCreated(new Date());
        obj.setCreatedUnix(0);
        obj.setUpdated(new Date());
        obj.setUpdatedUnix(0);
        tenantDao.saveEntity(obj);
        return Result.success("保存成功");
        String errorMessage = null;
        try {
            // 建库建表操作
            DBInfoModel dbInfo = dbInfoService.getDBInfoById(obj.getDataSourceId());
            DBInfoModel db = new DBInfoModel();
            db.setUserName(dbInfo.getUserName());
            db.setPassword(dbInfo.getPassword());
            db.setHost(dbInfo.getHost());
            db.setPort(dbInfo.getPort());
            db.setDbName(MycatConstant.DATA_BASE + obj.getSchema());//新建的数据库命名规则为"db_"+ schema
            //建库,建表,数据复制操作
            errorMessage = mySqlImportAndExport.importSql(db, sqlFilePath);
            if (errorMessage ==null){
                //TODO  mycat操作消息发送;使用zbus;tenant: "mycat"+ IP
                ServiceMycat serrviceMycat = new ServiceMycat();
                serrviceMycat.setSchema(obj.getSchema());
                serrviceMycat.setTenant(MycatConstant.MYCAT+db.getHost());
                serrviceMycat.setLoginName(obj.getLoginName());
                serrviceMycat.setPassword(obj.getPassword());
                serviceMycatEventService.executeMycatConfig(serrviceMycat, MycatConstant.MYCAT+dbInfo.getHost());
                tenantDao.saveEntity(obj);
                return Result.success("保存成功");
            }else {
                return Result.error("建库建表操作失败,异常信息\r\n" + errorMessage);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Result.error("保存租户信息失败,异常信息\n" + errorMessage);
    }
    @Transactional
@ -90,9 +138,9 @@ public class TenantService {
        try {
            fileName = DES.decrypt(fileName, DES.COMMON_PASSWORD);
            boolean succ = GridFSUtil.readFile(mongoConfig.mongoClient().getDatabase(dbName), os, fileName);
            if (succ){
            if (succ) {
                return Result.success("读取文件成功");
            }else {
            } else {
                return Result.success("读取文件失败");
            }
        } catch (Exception e) {
@ -104,10 +152,10 @@ public class TenantService {
    public Result uploadFile(InputStream inputStream, String fileName) {
        try {
            fileName = DES.decrypt(fileName, DES.COMMON_PASSWORD);
            String saveFileName = GridFSUtil.uploadFile(inputStream,fileName,null);
            if (saveFileName != null){
            String saveFileName = GridFSUtil.uploadFile(inputStream, fileName, null);
            if (saveFileName != null) {
                return Result.success("上传文件成功");
            }else {
            } else {
                return Result.error("上传文件失败");
            }
        } catch (Exception e) {
@ -116,13 +164,13 @@ public class TenantService {
        }
    }
    public Result delFile( String fileName) {
    public Result delFile(String fileName) {
        try {
            fileName = DES.decrypt(fileName, DES.COMMON_PASSWORD);
            boolean succ = GridFSUtil.deleteFile( fileName);
            if (succ){
            boolean succ = GridFSUtil.deleteFile(fileName);
            if (succ) {
                return Result.success("删除文件成功");
            }else {
            } else {
                return Result.success("删除文件失败");
            }
        } catch (Exception e) {

+ 4 - 0
src/main/resources/application.yml

@ -59,6 +59,10 @@ spring:
hos:
  zbus:
    url: 192.168.131.119:15555
    port: 15555
    store: ./store
  mysql:
    filePath: e://learn.sql   #租户基础表 sql文件位置
---
spring:

+ 16 - 11
src/main/webapp/WEB-INF/ehr/jsp/common/indexJs.jsp

@ -102,15 +102,6 @@
                {id: 37, pid: 3, text: '维度类别配置', url: '${contextRoot}/dimension/dimensioncatetory'},
                //用户安全中心
                {id: 7, text: '用户安全', icon: '${staticRoot}/images/index/menu5_icon.png'},
            ];
            if(userRole=="admin"){
                //是管理中心用户,则添加租户管理模块
//                menu = menu.concat(tenantManager);
                 menu.push({id: 70, pid: 7, text: '租户管理', url: '${contextRoot}/tenant/initial'});
            }
            var menu_1 = [
                {id: 71, pid: 7, text: '机构管理', url: '${contextRoot}/org/initial'},
                {id: 72, pid: 7, text: '用户管理', url: '${contextRoot}/user/initial'},
                {id: 73, pid: 7, text: '角色管理', url: '${contextRoot}/role/initial'},
@ -122,9 +113,23 @@
                {id: 93, pid: 9, text: '菜单配置', url: '${contextRoot}/menu/initial'},
                {id: 94, pid: 9, text: '菜单按钮配置', url: '${contextRoot}/menu/menuAction/initial'},
                {id: 95, pid: 9, text: '数据源配置', url: '${contextRoot}/datasource/configSources'},
            ]
            ];
            if(userRole=="admin"){
                //是管理中心用户,则添加租户管理模块
//                menu = menu.concat(tenantManager);
                var menu_1 = [
                    {id: 10, text: '租户管理', icon: '${staticRoot}/images/index/menu1_icon.png'},
                    {id: 101, pid: 10, text: '租户管理', url: '${contextRoot}/tenant/initial'},
                    {id: 102, pid: 10, text: '数据库实例管理', url: '${contextRoot}/tenant/dataBase/initial'}
                ];
                menu =  menu.concat(menu_1);
            }
            menu =  menu.concat(menu_1);
//            var menu_1 = [
//            ]
//            menu =  menu.concat(menu_1);
            me.menuTree = $('#ulTree').ligerTree({
                data: menu,

+ 32 - 0
src/main/webapp/WEB-INF/ehr/jsp/tenant/dataBase/dbInfo.jsp

@ -0,0 +1,32 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!--######用户管理页面Title设置######-->
<!-- ####### 页面部分 ####### -->
<div class="m-content">
    <!-- ####### 查询条件部分 ####### -->
    <div class="m-form-inline">
        <div class="m-form-group">
            <div class="m-form-control">
                <input type="text" id="txtName" class="l-text-field" placeholder="请输入数据库实例名称"/>
            </div>
            <div class="m-form-control" >
                <label>状态:</label>
                <input type="text" id="valid" class="l-text-field" />
            </div>
            <div class="m-form-control right" >
                <div id="div_new_record" class="l-button">
                    <span><spring:message code="btn.create"/></span>
                </div>
            </div>
        </div>
    </div>
    <!--######菜单信息表######-->
    <div id="div_grid">
    </div>
</div>

+ 152 - 0
src/main/webapp/WEB-INF/ehr/jsp/tenant/dataBase/dbInfoJs.jsp

@ -0,0 +1,152 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<script>
    /* *************************** 模块初始化 ***************************** */
    var dbInfo = {
        grid: null,
        dialog: null,
        init: function () {
            this.bindEvents();
            this.initForm();
        },
        initForm: function () {
            var me = this;
            $('.m-retrieve-area').show();
            $("#txtName").ligerSearch({
                onClick:function(value){
                    me.reloadGrid();
            }});
            var dbInfoStatus = liger.get("valid").value;
            if(dbInfoStatus ==undefined || dbInfoStatus ==null || dbInfoStatus.length<=0){
                liger.get("valid").selectValue("");
            }
            me.grid = $("#div_grid").ligerGrid({
                url: '${contextRoot}/tenant/dataBase/getDBList',
                parms: {
                    name: $('#txtName').val(),
                    valid:dbInfoStatus
                },
                columns: [
                    {display: '实例名称', id: 'id', name: 'name', width: '20%'},
                    {display: '主机', name: 'host', width: '15%'},
                    {display: '端口', name: 'port', width: '10%'},
                    {display: '用户', name: 'usrName', width: '10%'},
                    {display: '状态', name: 'valid', width: '10%',align: 'center', render: function (rowdata, rowindex, value) {
                        if(rowdata.valid==1 ){
                            return ' <div style="vertical-align:middle;margin-top: 10px;"><span>有效  </span></div>';
                        }else if(rowdata.valid==0){
                            return ' <div style="vertical-align:middle;margin-top: 10px;"><span>无效 </span></div>';
                        }
                    }},
                    {
                        display: '操作', name: 'operator', width: '40%', render: function (row) {
                        var html = '<div class="m-inline-buttons" style="width:350px;">';
                        html += "<a class=\"m-btn\" style=\"padding-right:10px\" onclick=\"dbInfo.editorDialog('"+row.id+"','disabled')\">查看详情</a>";
                        html += "<a class=\"m-btn-edit\" onclick=\"dbInfo.editorDialog('"+row.id+"','')\"></a>";
                        html += "<a class=\"m-btn-delete\" onclick=\"dbInfo.delete('"+row.id+"')\"></a>";
                        html += '</div>';
                        return html;
                    }
                    }
                ],
                onDblClickRow: function (row) {
                    me.editorDialog(row.id);
                }
            });
        },
        bindEvents: function () {
            var me = this;
            var flag = false;
            $('#div_new_record').click(function () {
                me.editorDialog();
            });
            $("#valid").ligerComboBox({data : [{"value":"全部","code":""},{"value":"有效","code":"1"},{"value":"无效","code":"0"}],
                cancelable:false,
                initIsTriggerEvent: false,
                onSelected: function (value)
                {
                    if (flag) {
                        me.reloadGrid();
                    } else {
                        flag = true;
                    }
                },
                onSuccess:function(data){
                }});
            $(".l-text").css("display","inline-block");
            $(".l-text-wrapper").css("display","inline-block");
        },
        delete:function(id){
            var message = "确定要删除该应用信息吗?";
            jQuery.ligerDialog.confirm(message, function (confirm) {
                if (confirm)
                {
                    $.ajax({ //ajax处理
                        type: "POST",
                        url : "${contextRoot}/tenant/dataBase/deleteDBinfo",
                        dataType : "json",
                        data:{id:id},
                        cache:false,
                        success :function(data){
                            if(data.successFlg) {
                                $.ligerDialog.success(data.message);
                                dbInfo.grid.reload();
                            }
                            else{
                                $.ligerDialog.error(data.message);
                            }
                        },
                        error :function(data){
                            $.ligerDialog.error("Status:"+data.status +"(" +data.statusText+")");
                        }
                    });
                }
            });
        },
        //刷新列表数据
        reloadGrid: function () {
            this.grid.set({
                parms: {name: $('#txtName').val(),valid:$('#valid_val').val()}
            });
            this.grid.reload();
        },
        //编辑弹窗
        editorDialog: function (id, flag) {
            var me = this;
            var title = "新增数据库实例";
            var params = null;
            if (id != undefined && id != null) {
                title = "编辑数据库实例";
                params = {"id": id, "flag": flag};
            }
            me.dialog = $.ligerDialog.open({
                height: 600,
                width: 500,
                title: title,
                url: '${contextRoot}/tenant/dataBase/editorDbInfo',
                //load: true,
                urlParms: params
            });
        },
    anthorize: function (id) {
        },
        //弹窗返回
        dialogSuccess: function (message) {
            $.ligerDialog.success(message);
            dbInfo.reloadGrid();
            dbInfo.dialog.close();
        }
    };
    $(function () {
        dbInfo.init();
    });
</script>

+ 85 - 0
src/main/webapp/WEB-INF/ehr/jsp/tenant/dataBase/editorDbInfo.jsp

@ -0,0 +1,85 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<!--######应用管理页面 > 应用详情模板页######-->
<div id="div_info_form" class="m-form-inline" style="padding-top:10px;" data-role-form>
    <input id="flag" value="${flag}" style="display: none">
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>实例名称:</label>
        <div class="m-form-control ">
            <div class="l-text">
                <input type="text" class="l-text-field required" placeholder="请输入数据库实例名称" name="name"/>
            </div>
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>用户名:</label>
        <div class="m-form-control">
            <div class="l-text">
                <input type="text" class="l-text-field required" placeholder="请输入实例登录名" name="userName"/>
            </div>
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>登录密码:</label>
        <div class="m-form-control">
            <div class="l-text">
                <input type="text" class="l-text-field required" placeholder="请输入实例登录密码" name="password"/>
            </div>
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>主机名:</label>
        <div class="m-form-control">
            <div class="l-text">
                <input type="text" class="l-text-field required" placeholder="请输入实例主机名" name="host"/>
            </div>
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>端口:</label>
        <div class="m-form-control">
            <div class="l-text">
                <input type="text" class="l-text-field required" placeholder="请输入实例端口号" name="port"/>
            </div>
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>状态:</label>
        <div class="m-form-control ">
            <div class="l-text">
                <input type="text" id="valid"  class="l-text-field required" name="valid">
            </div>
        </div>
    </div>
    <!-- 隐藏字段 -->
    <div class="m-form-group" style="display: none;">
        <input name="id" hidden="hidden"/>
    </div>
    <div class="m-form-bottom">
        <div id="btnCancel" class="l-button l-button-no">
            <span>关闭</span>
        </div>
        <div id="btnEditor" class="l-button" style="display:none">
            <span>编辑</span>
        </div>
        <div id="btnSave" class="l-button">
            <span>保存</span>
        </div>
    </div>
</div>
<style>
    .m-form-group label{width: 135px;}
    .btnGrayUp.required{border: #FF7777 1px solid; float: left;}
</style>

+ 131 - 0
src/main/webapp/WEB-INF/ehr/jsp/tenant/dataBase/editorDbInfoJs.jsp

@ -0,0 +1,131 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<script type="text/javascript">
    /* *************************** 模块初始化 ***************************** */
    var editorParam = {
        //form
        actionUrl:"${contextRoot}/tenant/dataBase/addDBInfo",
        init: function () {
            this.toDisable();
            this.bindEvents();
            this.initForm();
        },
        toDisable: function () {
            if ($("#flag").val()=='disabled') {
                $("#btnEditor").show();
                $("#btnSave").hide();
                $("input[name='name']").attr("disabled", "disabled");
                $("input[name='userName']").attr("disabled", "disabled");
                $("input[name='passward']").attr("disabled", "disabled");
                $("input[name='host']").attr("disabled", "disabled");
                $("input[name='port']").attr("disabled", "disabled");
                $("input[name='valid']").attr("disabled", "disabled");
            }
        },
        initForm: function () {
            var me = this;
           var data;
            var modelString = "${model.id}";
            if(modelString!=undefined && modelString!=null && modelString.length>0)
            {
                var valid = "${model.valid}";
                liger.get("valid").selectValue(valid);
               data={
                    id: "${model.id}",
                    name: "${model.name}",
                   userName: "${model.userName}",
                   valid: valid,
                   password: "${model.password}",
                   host: "${model.host}",
                   port: "${model.port}",
                };
                me.actionUrl = "${contextRoot}/tenant/dataBase/updateDBInfo";
            }else{
                liger.get("valid").selectValue("1");//默认有效
            }
            $("#div_info_form").ligerAutoForm({
                data:data,
                validate:{
                    name:"required",
                    userName:"required",
                    password:"required",
                    host:"required",
                    port:"required",
                    valid: {
                        required:true
                    }
                },
            });
        },
        bindEvents: function () {
            var me = this;
            $(".m-form-bottom").on("click","#btnSave",function () {
                $("#btnSave").css("pointer-events","none");
                $("#name_icon").removeClass("required");
                if($("#name_icon").val()=="") {
                    $("#name_icon").addClass("required");
                    if(!$("#div_info_form").ligerAutoForm("validate")){
                        return;
                    }
                    return;
                }
                if(!$("#div_info_form").ligerAutoForm("validate")){
                    return;
                }
                var data = $("#div_info_form").ligerAutoForm("getData");
                $.ajax({ //ajax处理
                    type: "POST",
                    url : me.actionUrl,
                    dataType : "json",
                    data:data,
                    cache:false,
                    success :function(data){
                        if(data.successFlg) {
                            parent.dbInfo.dialogSuccess(data.message);
                        }
                        else{
                            $.ligerDialog.error(data.message);
                        }
                        $("#btnSave").css("pointer-events","");
                    },
                    error :function(data){
                        $.ligerDialog.error("Status:"+data.status +"(" +data.statusText+")");
                        $("#btnSave").css("pointer-events","");
                    }
                });
            });
            $(".m-form-bottom").on("click","#btnEditor",function () {
                        $("#btnEditor").hide();
                        $("#btnSave").show();
                        $("input[name='name']").removeAttr("disabled");
                        $("input[name='userName']").removeAttr("disabled");
                        $("input[name='password']").removeAttr("disabled");
                        $("input[name='host']").removeAttr("disabled");
                        $("input[name='port']").removeAttr("disabled");
                        $("input[name='valid']").removeAttr("disabled");
                        $("#flag").val("");
            });
            $(".m-form-bottom").on("click","#btnCancel",function () {
                parent.dbInfo.dialog.close();
            });
            $("#valid").ligerComboBox({data : [{"value":"有效","code":"1"},{"value":"无效","code":"0"}],
                cancelable:false,
                onSuccess:function(data){
                }});
        }
    };
    $(function () {
        editorParam.init();
    });
</script>
<script type="text/javascript" src="${staticRoot}/lib/jquery/jqueryform.js"></script>

+ 9 - 0
src/main/webapp/WEB-INF/ehr/jsp/tenant/editorTenant.jsp

@ -52,6 +52,15 @@
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>数据库实例:</label>
        <div class="m-form-control ">
            <div class="l-text">
                <input type="text" id="dataSourceId" class="l-text-field required" name="dataSourceId">
            </div>
        </div>
    </div>
    <!-- 隐藏字段 -->
    <div class="m-form-group" style="display: none;">
        <input name="id" hidden="hidden"/>

+ 46 - 2
src/main/webapp/WEB-INF/ehr/jsp/tenant/editorTenantJs.jsp

@ -5,12 +5,16 @@
    /* *************************** 模块初始化 ***************************** */
    var editorParam = {
        //form
        dbListUrl:"${contextRoot}/tenant/dataBase/getDataBaseValues",
        actionUrl:"${contextRoot}/tenant/addTenant",
        init: function () {
            var me = this;
            this.selectDBs("");
            this.toDisable();
            this.bindEvents();
            this.initForm();
        },
        toDisable: function () {
            if ($("#flag").val()=='disabled') {
@ -21,6 +25,8 @@
                $("input[name='passward']").attr("disabled", "disabled");
                $("input[name='schema']").attr("disabled", "disabled");
                $("input[name='valid']").attr("disabled", "disabled");
                $("input[name='datasourceId']").attr("disabled", "disabled");
            }
        },
        initForm: function () {
@ -30,19 +36,25 @@
            if(modelString!=undefined && modelString!=null && modelString.length>0)
            {
                var valid = "${model.valid}";
                var dataSourceId = "${model.dataSourceId}";
                liger.get("valid").selectValue(valid);
               data={
                liger.get("dataSourceId").selectValue(dataSourceId);
                data={
                    id: "${model.id}",
                    name: "${model.name}",
                   loginName: "${model.loginName}",
                   valid: valid,
                   password: "${model.password}",
                   schema: "${model.schema}",
                   dataSourceId: dataSourceId,
                };
                me.actionUrl = "${contextRoot}/tenant/updateTenant";
            }else{
                liger.get("valid").selectValue("1");//默认有效
                liger.get("dataSourceId").selectValue("1");//默认有效
            }
            $("#div_info_form").ligerAutoForm({
                data:data,
@ -58,6 +70,33 @@
            });
        },
        selectDBs: function (q) {
            var me = this;
            $.ajax({ //ajax处理
                type: "GET",
                url : me.dbListUrl,
                dataType : "json",
                async: false,
                data:{"q":q},
                cache:false,
                success :function(data){
                    if(data.successFlg) {
                        debugger
                        $("#dataSourceId").ligerComboBox({data : data.detailModelList,
                            cancelable:false,
                            onSuccess:function(data){
                                alert(1111);
                            }});
                    }
                    else{
                        $.ligerDialog.error(data.message);
                    }
                },
                error :function(data){
                    $.ligerDialog.error("Status:"+data.status +"(" +data.statusText+")");
                }
            });
        },
        bindEvents: function () {
            var me = this;
            $(".m-form-bottom").on("click","#btnSave",function () {
@ -103,12 +142,17 @@
                        $("input[name='password']").removeAttr("disabled");
                        $("input[name='schema']").removeAttr("disabled");
                        $("input[name='valid']").removeAttr("disabled");
                        $("input[name='datasourceId']").removeAttr("disabled");
                        $("#flag").val("");
            });
            $(".m-form-bottom").on("click","#btnCancel",function () {
                parent.tenant.dialog.close();
            });
//            $(".l-text").on("click","#dataSourceId",function () {
//                var q = $(this).val();
//               me.selectDBs(q);
//            });
            $("#valid").ligerComboBox({data : [{"value":"有效","code":"1"},{"value":"无效","code":"0"}],
                cancelable:false,
                onSuccess:function(data){