Authored by jimi

add 配置中心

... ... @@ -262,6 +262,9 @@ public class HttpUriContants {
public static final String GET_DBWORKJOB_ID = "/dbWork/getDBWorkJob";
public static final String CREATE_DBWORKJOB = "/dbWork/createDBWorkJob";
public static final String CHECK_DB_ROLE = "/dbWork/checkRole";
public static final String CREATE_CONFIG_WORKJOB = "/configWork/createConfigWorkJob";
public static final String GET_CONFIG_WORKJOB_ID = "/configWork/getConfigWorkJob";
public static final String CHECK_CONFIG_ROLE = "/configWork/checkRole";
public static final String GET_HANDLED_JOBS = "/handledWork/getHandledJobs";
public static final String HANDLE_JOB = "/handledWork/dealWorkJob";
public static final String GET_PENDING_JOBS = "/pendingWork/getPendingJobs";
... ...
package com.ui.model.req;
import lombok.Data;
import java.util.List;
@Data
public class ConfigWorkJob {
private String id;
private String title;
private String develop;
private String operatorer;
private String type;
private Integer status;
/**
* 工单操作记录
*/
private List<HandledJob> handleList;
private String createTime;
private String updateTime;
private String text;
}
\ No newline at end of file
... ...
... ... @@ -66,7 +66,7 @@ public class WorkSystemCtrl {
model.addAttribute("projectDeployTypes", ProjectEnvironment.getProjectDeployTypeMap());
BaseResponse<List<User>> resp = httpRestClient.exchangeForget(HttpUriContants.GET_All_USER, new ParameterizedTypeReference<BaseResponse<List<User>>>() {
}, null);
model.addAttribute("verifiers",resp.getData());//审核人列表
model.addAttribute("verifiers", resp.getData());//审核人列表
BaseResponse<List<User>> response = httpRestClient.exchangeForget(HttpUriContants.GET_USER_BY_ROLE + "?role=test", new ParameterizedTypeReference<BaseResponse<List<User>>>() {
}, null);
model.addAttribute("tests", response.getData());
... ... @@ -97,14 +97,15 @@ public class WorkSystemCtrl {
int count = 0;
if (isHandler.getData() != null) {
count = 1;
model.addAttribute("pendingJob",isHandler.getData());
model.addAttribute("pendingJob", isHandler.getData());
}
model.addAttribute("count", count);
if ("release".equals(type)) {
BaseResponse response = httpRestClient.defaultGet(HttpUriContants.GET_RELEASEWORKJOB_ID + "?id=" + workid, BaseResponse.class);
model.addAttribute("workJob", response.getData());
return new ModelAndView("worksystem/releaseWork");
}else if ("db".equals(type)){
}
if ("db".equals(type)) {
BaseResponse<List<User>> response = httpRestClient.exchangeForget(HttpUriContants.GET_USER_BY_ROLE + "?role=test", new ParameterizedTypeReference<BaseResponse<List<User>>>() {
}, null);
model.addAttribute("tests", response.getData());
... ... @@ -112,28 +113,33 @@ public class WorkSystemCtrl {
model.addAttribute("workJob", response2.getData());
return new ModelAndView("worksystem/dbWork");
}
if ("config".equals(type)) {
BaseResponse response3 = httpRestClient.defaultGet(HttpUriContants.GET_CONFIG_WORKJOB_ID + "?id=" + workid, BaseResponse.class);
model.addAttribute("workJob", response3.getData());
return new ModelAndView("worksystem/configWork");
}
return new ModelAndView("worksystem/workList");
}
@RequestMapping("/getProjectsByPlatform")
@ResponseBody
public List<Project> getProjectsByPlatform(String platform,String projectType) {
public List<Project> getProjectsByPlatform(String platform, String projectType) {
if (Platform.JAVA.equals(platform)) {
return projectsLoader.getProjectOnline().getJavaList();
} else if (Platform.PHP.equals(platform)) {
String result = httpRestClient.get("http://"+ ProjectConstant.DEPLOY_IP+":8883/php/getProjects", String.class, null);
return JSON.parseObject(result,List.class);
String result = httpRestClient.get("http://" + ProjectConstant.DEPLOY_IP + ":8883/php/getProjects", String.class, null);
return JSON.parseObject(result, List.class);
} else if (Platform.NODE.equals(platform)) {
String result = nodeBuildCtrl.getProjects();
return JSON.parseObject(result,List.class);
}else if (Platform.DOCKER.equals(platform)) {
BaseResponse response=dockerBuildCtrl.getDockerProjectsByType(projectType);
List<DockerProjectModel> models=JSONArray.parseArray(JSONArray.toJSON(response.getData()).toString(),DockerProjectModel.class);
List<Project> ls=new LinkedList<>();
if(models!=null&&models.size()>0){
for(DockerProjectModel model:models){
Project pro=new Project();
return JSON.parseObject(result, List.class);
} else if (Platform.DOCKER.equals(platform)) {
BaseResponse response = dockerBuildCtrl.getDockerProjectsByType(projectType);
List<DockerProjectModel> models = JSONArray.parseArray(JSONArray.toJSON(response.getData()).toString(), DockerProjectModel.class);
List<Project> ls = new LinkedList<>();
if (models != null && models.size() > 0) {
for (DockerProjectModel model : models) {
Project pro = new Project();
pro.setName(model.getProjectName());
pro.setDockerProjectModelId(model.getId());
pro.setSupportDeployType(model.getSupportDeployType());
... ... @@ -149,58 +155,58 @@ public class WorkSystemCtrl {
@RequestMapping(value = "getDeployImageList")
@ResponseBody
public String getDeployImageList(String projectId, String environment) {
return dockerBuildCtrl.getDeployImageList(projectId,environment);
return dockerBuildCtrl.getDeployImageList(projectId, environment);
}
@RequestMapping(value = "getEnvByProject")
@ResponseBody
public List<String> getEnvByProject(String platform ,String projects) {
List<String> projArray=new ArrayList<>();
for(String tmp:projects.split(",")){
if(StringUtils.isNotBlank(tmp)){
public List<String> getEnvByProject(String platform, String projects) {
List<String> projArray = new ArrayList<>();
for (String tmp : projects.split(",")) {
if (StringUtils.isNotBlank(tmp)) {
projArray.add(tmp);
}
}
List<String> envs=new ArrayList<>();
if(StringUtils.isBlank(platform)||StringUtils.isBlank(projects)||projArray.size()<=0){
List<String> envs = new ArrayList<>();
if (StringUtils.isBlank(platform) || StringUtils.isBlank(projects) || projArray.size() <= 0) {
return envs;
}
if (Platform.JAVA.equals(platform)) {
envs.addAll(projectBuildCtrl.getJavaProjectEnvList(projArray));
} else if (Platform.NODE.equals(platform)||Platform.PHP.equals(platform)) {
for(int i=0;i<projArray.size();i++){
List<String> ls= getProjectEnvByName(platform,projArray.get(i));
if(i==0){
} else if (Platform.NODE.equals(platform) || Platform.PHP.equals(platform)) {
for (int i = 0; i < projArray.size(); i++) {
List<String> ls = getProjectEnvByName(platform, projArray.get(i));
if (i == 0) {
envs.addAll(ls);
}else{
} else {
envs.retainAll(ls);
}
}
}else if (Platform.DOCKER.equals(platform)) {
} else if (Platform.DOCKER.equals(platform)) {
envs.addAll(ProjectEnvironment.getDockerEnvironments(projects));
}
return envs;
}
public List<String> getProjectEnvByName(String platform ,String project) {
List<String> ls=new ArrayList<>();
String jsonProjectDesc="";
if(Platform.PHP.equals(platform)){
jsonProjectDesc=phpBuildCtrl.getProjectByName(project);
public List<String> getProjectEnvByName(String platform, String project) {
List<String> ls = new ArrayList<>();
String jsonProjectDesc = "";
if (Platform.PHP.equals(platform)) {
jsonProjectDesc = phpBuildCtrl.getProjectByName(project);
} else if (Platform.NODE.equals(platform)) {
jsonProjectDesc=nodeBuildCtrl.getProjectByName(project);
jsonProjectDesc = nodeBuildCtrl.getProjectByName(project);
}
if(StringUtils.isNotBlank(jsonProjectDesc)&&!"failed".equals(jsonProjectDesc)){
JSONObject jo= JSON.parseObject(jsonProjectDesc);
if(jo!=null&&jo.getJSONArray("envs")!=null){
JSONArray ja=jo.getJSONArray("envs");
for(int i=0;i<ja.size();i++){
String evnName=ja.getJSONObject(i).getString("name");
if(StringUtils.isNotBlank(evnName)){
if (StringUtils.isNotBlank(jsonProjectDesc) && !"failed".equals(jsonProjectDesc)) {
JSONObject jo = JSON.parseObject(jsonProjectDesc);
if (jo != null && jo.getJSONArray("envs") != null) {
JSONArray ja = jo.getJSONArray("envs");
for (int i = 0; i < ja.size(); i++) {
String evnName = ja.getJSONObject(i).getString("name");
if (StringUtils.isNotBlank(evnName)) {
ls.add(evnName);
}
}
... ... @@ -217,7 +223,7 @@ public class WorkSystemCtrl {
if ("release".equals(type)) {//项目发布
BaseResponse<Integer> baseResponse = httpRestClient.defaultGet(HttpUriContants.CHECK_RELEASE_ROLE + "?role=" + user.getRole(), BaseResponse.class);
return baseResponse.getData();
}else if ("db".equals(type)){
} else if ("db".equals(type)) {
BaseResponse<Integer> baseResponse = httpRestClient.defaultGet(HttpUriContants.CHECK_DB_ROLE + "?role=" + user.getRole(), BaseResponse.class);
return baseResponse.getData();
}
... ... @@ -230,23 +236,23 @@ public class WorkSystemCtrl {
User user = (User) session.getAttribute("user");
releaseWorkJob.setDevelop(user.getName());
releaseWorkJob.setProject(releaseWorkJob.getProject().substring(1));
if(StringUtils.isNotBlank(releaseWorkJob.getTestProject()) && releaseWorkJob.getTestProject().length() > 1){
if (StringUtils.isNotBlank(releaseWorkJob.getTestProject()) && releaseWorkJob.getTestProject().length() > 1) {
releaseWorkJob.setTestProject(releaseWorkJob.getTestProject().substring(1));
}
if (Platform.JAVA.equals(releaseWorkJob.getPlatform())) {
List<Object> checkRtn=ProjectMutex.checkMutex(releaseWorkJob.getProject());
boolean mutex=(Boolean)checkRtn.get(0);
if(mutex){
List<Object> checkRtn = ProjectMutex.checkMutex(releaseWorkJob.getProject());
boolean mutex = (Boolean) checkRtn.get(0);
if (mutex) {
//存在互斥的项目
BaseResponse baseResponse = new BaseResponse();
baseResponse.setCode(200);
baseResponse.setData(-1);
baseResponse.setMessage((String)checkRtn.get(1));
baseResponse.setMessage((String) checkRtn.get(1));
return baseResponse;
}
}else if (Platform.NODE.equals(releaseWorkJob.getPlatform())) {
if(releaseWorkJob.getEnvironment().contains("az1")){
if(!"master".equals(releaseWorkJob.getBranch())){
} else if (Platform.NODE.equals(releaseWorkJob.getPlatform())) {
if (releaseWorkJob.getEnvironment().contains("az1")) {
if (!"master".equals(releaseWorkJob.getBranch())) {
BaseResponse baseResponse = new BaseResponse();
baseResponse.setCode(200);
baseResponse.setData(-1);
... ... @@ -269,11 +275,11 @@ public class WorkSystemCtrl {
@ResponseBody
public BaseResponse callbackTest(String testId, String testMessage) {
BaseResponse baseResponse = new BaseResponse();
if(StringUtils.isBlank(testId) || StringUtils.isBlank(testMessage)){
if (StringUtils.isBlank(testId) || StringUtils.isBlank(testMessage)) {
baseResponse.setCode(201);
baseResponse.setMessage("testId 且 testMessage 不能为空!");
}else{
baseResponse = httpRestClient.defaultPost(HttpUriContants.CREATE_CALLBACKTEST+"?testId="+testId+"&testMessage="+testMessage, null, BaseResponse.class);
} else {
baseResponse = httpRestClient.defaultPost(HttpUriContants.CREATE_CALLBACKTEST + "?testId=" + testId + "&testMessage=" + testMessage, null, BaseResponse.class);
}
return baseResponse;
}
... ... @@ -283,16 +289,27 @@ public class WorkSystemCtrl {
public BaseResponse createDBWorkJob(@RequestBody DBWorkJob dbWorkJob, HttpSession session) {
User user = (User) session.getAttribute("user");
dbWorkJob.setDevelop(user.getName());
BaseResponse<Integer> baseResponse =null;
if(dbWorkJob.getText()!=null&&dbWorkJob.getText().length()>5000){
baseResponse=new BaseResponse<Integer>(-2);
BaseResponse<Integer> baseResponse = null;
if (dbWorkJob.getText() != null && dbWorkJob.getText().length() > 5000) {
baseResponse = new BaseResponse<Integer>(-2);
baseResponse.setCode(201);
baseResponse.setMessage("SQL内容过长,一次不要超过5000字符");
}else{
} else {
baseResponse = httpRestClient.defaultPost(HttpUriContants.CREATE_DBWORKJOB, dbWorkJob, BaseResponse.class);
}
return baseResponse;
}
@RequestMapping("/createConfigWorkJob")
@ResponseBody
public BaseResponse createConfigWorkJob(@RequestBody ConfigWorkJob configWorkJob, HttpSession session) {
User user = (User) session.getAttribute("user");
configWorkJob.setDevelop(user.getName());
BaseResponse<Integer> baseResponse = null;
baseResponse = httpRestClient.defaultPost(HttpUriContants.CREATE_CONFIG_WORKJOB, configWorkJob, BaseResponse.class);
return baseResponse;
}
@RequestMapping("/getHandledJobs")
@ResponseBody
public BaseResponse getHandledJobs(HttpSession session, PageRequest req) {
... ...
... ... @@ -4,7 +4,7 @@ cluster_aws:
cluster_qcloud:
name: qcloud_zkAddress
connectString : 192.168.104.199:32226
connectString : 192.168.104.244:2181
cluster_platform:
name: platform_zkAddress
... ...
... ... @@ -56,6 +56,8 @@
&nbsp;
<a href="#" id="toAddDBJob" class="btn btn-success"
style="margin-top: 12px;margin-left: 0px;" onclick="toAddDBJob()">新建数据库工单</a>
<a href="#" id="toAddConfigJob" class="btn btn-success"
style="margin-top: 12px;margin-left: 0px;" onclick="toAddConfigJob()">新建配置工单</a>
</div>
</div>
</div>
... ... @@ -241,6 +243,51 @@
</form>
</div>
<div id="configWorkDiv" style="display: none">
<form class="form-horizontal form-bordered">
<div class="form-group">
<label class="col-sm-1 control-label"><strong>主题: </strong></label>
<div class="col-sm-8">
<input type="text" id="configtitle" name="configtitle" class="form-control"
placeholder="ex:修改XX配置"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label"><strong>内容: </strong></label>
<div id="config" class="col-sm-8">
<textarea rows="10" name="configtext" class="form-control" id="configtext" spellcheck="false"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label"><strong>配置类型: </strong></label>
<div class="col-sm-8">
<select id="coonfigtype" name = "coonfigtype" class="form-control" placeholder="" style="width:300px;" >
<%-- <option value="" ></option>--%>
<option value="NGINX" selected = "selected">NGINX</option>
<option value="CONFIG" >CONFIG</option>
<%-- <c:forEach items="${verifiers}" var="v">--%>
<%-- <option value="${v.name}">${v.name}</option>--%>
<%-- </c:forEach>--%>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label"><strong>操作: </strong></label>
<div class="col-sm-8">
<button type="button" class="btn btn-primary" onclick="addConfigJob()">提交</button>
</div>
</div>
<!-- form-group -->
</form>
</div>
</div>
</div>
</div>
... ... @@ -347,6 +394,7 @@
localAlert("权限不够", "你不能发起该工单");
} else {
$("#dbWorkDiv").hide();
$("#configWorkDiv").hide();
$("#releaseWorkDiv").show();
}
},
... ... @@ -365,6 +413,7 @@
localAlert("权限不够", "你不能发起该工单");
} else {
$("#releaseWorkDiv").hide();
$("#configWorkDiv").hide();
$("#dbWorkDiv").show();
}
},
... ... @@ -374,6 +423,25 @@
});
}
function toAddConfigJob() {
$.ajax({
url: contextPath + 'workSystem/checkRole?type=db',
type: 'POST',
success: function (data) {
if (data != 1) {
localAlert("权限不够", "你不能发起该工单");
} else {
$("#releaseWorkDiv").hide();
$("#configWorkDiv").show();
$("#dbWorkDiv").hide();
}
},
error: function (e) {
console.log(e);
}
});
}
function changePlatform() {
$("#projectDeployType").prop("disabled", true);//下拉不可用
$('#projectDeployType').val("git").trigger('change');//触发 type改变事件
... ... @@ -669,6 +737,49 @@
}
/**
*添加配置工单
*/
function addConfigJob() {
var title = $("input[name='configtitle']").val();
var text = $("textarea[name='configtext']").val();
var type = $("select[name='coonfigtype']").val();
if (title == null || title == "") {
localAlert("参数错误", "请输入标题");
return;
}
if (text == null || text == "") {
localAlert("参数错误", "请输入需求");
return;
}
var param = {
title: title,
text: text,
type : type
};
$.ajax({
url: contextPath + "/workSystem/createConfigWorkJob",
type: 'post',
data: JSON.stringify(param),
dataType: "json",
contentType: "application/json",
success: function (resp) {
if (resp.data < 0) {
localAlert('添加失败', resp.message);
} else {
window.location.href = contextPath + "/workSystem/toHandledWork";
}
},
error: function (e) {
localAlert('添加失败', e.responseText);
console.log(e);
}
});
}
/**
*添加项目发布工单
*/
function addReleaseJob() {
... ...
<%@page language="java" contentType="text/html;charset=utf-8" %>
<%@page import="com.ui.contants.ProjectConstant"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>工单</title>
<link rel="stylesheet" href="<%=basePath %>css/unicorn.main.css"/>
<link rel="stylesheet" href="<%=basePath %>css/unicorn.grey.css"/>
<link rel="stylesheet" href="<%=basePath %>css/bootstrap.min.css"/>
<link href="<%=basePath%>css/style.default.css" rel="stylesheet">
<link href="<%=basePath%>css/morris.css" rel="stylesheet">
<link href="<%=basePath%>css/select2.css" rel="stylesheet"/>
<script>
var contextPath = '<%=basePath %>';
</script>
</head>
<body style="background-color: #444444;font-size: 14px">
<!-- 头部 -->
<div id="head">
</div>
<div id="content" style="background-color: white">
<div id="breadcrumb">
<a href="#" title="Go to Home" class="tip-bottom"><i
class="icon-home"></i> Home</a> <a href="#" class="current">工单详情</a>
</div>
<div>
<form class="form-horizontal form-bordered">
<div class="form-group">
<label class="col-sm-6 control-label"><strong>工单ID: </strong></label>
<div class="col-sm-8">
<input type="text" class="form-control" value=" ${workJob.id}"
style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px '
readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-6 control-label"><strong>发布时间: </strong></label>
<div class="col-sm-8">
<input type="text" class="form-control" value=" ${workJob.createTime}"
style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px '
readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-6 control-label"><strong>主题: </strong></label>
<div class="col-sm-8">
<input type="text" class="form-control" value=" ${workJob.title}"
style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px '
readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-6 control-label"><strong>内容: </strong></label>
<div class="col-sm-8">
<textarea id="autoResizeTA" class="form-control" rows="10"
readonly="readonly">${workJob.text}</textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-6 control-label"><strong>类型: </strong></label>
<div class="col-sm-8">
<input type="text" class="form-control" value=" ${workJob.type}"
style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px '
readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-6 control-label"><strong>审批过程: </strong></label>
<div class="col-sm-8">
<table class="table table-striped mb30" style="width: 778px">
<thead>
<tr>
<th>职责</th>
<th>操作人</th>
<th>操作</th>
<th>时间</th>
</tr>
</thead>
<tbody>
<c:forEach items="${workJob.handleList }" var="handledJob">
<tr>
<td align="center">${handledJob.handlerRole}</td>
<td align="center">${handledJob.handler}</td>
<td align="center">${handledJob.handlecType}</td>
<td align="center">${handledJob.createTime}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
<c:if test="${count > 0}">
<div class="form-group">
<label class="col-sm-6 control-label"><strong>操作: </strong></label>
<div class="col-sm-8">
<c:choose>
<c:when test="${pendingJob.currentStatus == 0}">
<button type="button" class="btn btn-success"
onclick="editWork(${pendingJob.id},'${pendingJob.type}',2)">发起
</button>
</c:when>
<c:when test="${pendingJob.currentStatus == 10}"><%--待审核状态--%>
<button type="button" class="btn btn-success"
onclick="editWork(${pendingJob.id},'${pendingJob.type}',4,this)">审核通过
</button>
<%--<button type="button" class="btn btn-primary"
onclick="editWork(${pendingJob.id},'${pendingJob.type}',3)">拒绝
</button>--%>
</c:when>
<c:otherwise>
<button type="button" class="btn btn-success"
onclick="editWork(${pendingJob.id},'${pendingJob.type}',2,this)">通过
</button>
<%--<button type="button" class="btn btn-primary"
onclick="editWork(${pendingJob.id},'${pendingJob.type}',3)">拒绝
</button>--%>
</c:otherwise>
</c:choose>
<button type="button" class="btn btn-danger"
onclick="editWork(${pendingJob.id},'${pendingJob.type}',-1)">关闭
</button>
</div>
</div>
</c:if>
<!-- form-group -->
</form>
</div>
</div>
</div>
<script src="<%=basePath%>js/jquery-2.1.4.min.js"></script>
<script src="<%=basePath%>js/bootstrap.min.js"></script>
<script src="<%=basePath%>js/select2.min.js"></script>
<script src="<%=basePath%>js/custom.js"></script>
<script src="<%=basePath %>/js/unicorn.js"></script>
<script src="<%=basePath %>js/bootstrap-plugin/bootstrap.dialog.js" charset="UTF-8" type="text/javascript"></script>
<script src="<%=basePath %>script/common/genarate_left_panel.js?v=<%=ProjectConstant.MENU_VERSION %>"></script>
<script type="text/javascript">
$("#li_worksystem").addClass("active open");
/**
*
* 工单操作
* @param id
* @param handleType
*/
function editWork(id, type, handleType,obj) {
if(obj){
$(obj).prop('disabled', true);
}
var needTest = false;
var dbTestName = "";
if ($('input:radio[name="needTest"]').length != 0) {
needTest = $('input:radio[name="needTest"]:checked').val();
dbTestName = $("#test option:selected").val();
}
var param = {
id: id,
type: type,
handleType: handleType,
dbNeedTest: needTest,
dbTestName:dbTestName
};
$.ajax({
url: contextPath + "/workSystem/handleJobsJobs",
type: 'post',
data: JSON.stringify(param),
dataType: "json",
contentType: "application/json",
success: function (data) {
if (data != 1) {
localAlert('处理结果', "处理失败");
} else {
window.location.href = contextPath + "/workSystem/toHandledWork";
}
},
error: function (e) {
console.log(e);
}
});
}
</script>
</body>
</html>
... ...
... ... @@ -110,6 +110,8 @@
return '项目发布';
}else if(value == 'db'){
return '数据库';
} else if(value == 'config'){
return '配置中心';
} else {
return '其他';
}
... ...
... ... @@ -110,6 +110,8 @@
return '项目发布';
}else if(value == 'db'){
return '数据库';
} else if(value == 'config'){
return '配置中心';
} else {
return '其他';
}
... ...
... ... @@ -138,6 +138,8 @@
return '项目发布';
}else if(value == 'db'){
return '数据库';
}else if(value == 'config'){
return '配置中心';
} else{
return '其他';
}
... ...