diff --git a/api/v1/entries/hostheartbeat.php b/api/v1/entries/hostheartbeat.php index 1d54b4c9c2..100d5d0199 100644 --- a/api/v1/entries/hostheartbeat.php +++ b/api/v1/entries/hostheartbeat.php @@ -28,8 +28,8 @@ class hostHeartbeatEntry extends baseEntry /* Check param. */ $status = $this->requestBody->status; - $vms = $this->requestBody->Vms; - $zap = $this->requestBody->port; + $vms = !empty($this->requestBody->Vms) ? $this->requestBody->Vms : array(); + $zap = !empty($this->requestBody->port) ? $this->requestBody->port : 0; $now = helper::now(); if(!$status) return $this->sendError(400, 'Params error.'); @@ -37,7 +37,7 @@ class hostHeartbeatEntry extends baseEntry $conditionValue = $secret ? $secret : $token; $this->dao = $this->loadModel('common')->dao; - $hostInfo = $this->dao->select('id,tokenSN')->from(TABLE_ZAHOST) + $hostInfo = $this->dao->select('id,tokenSN,hostType,type')->from(TABLE_ZAHOST) ->beginIF($secret)->where('secret')->eq($secret)->fi() ->beginIF(!$secret)->where('tokenSN')->eq($token) ->andWhere('tokenTime')->gt($now)->fi() @@ -45,13 +45,15 @@ class hostHeartbeatEntry extends baseEntry if(empty($hostInfo->id)) { if(empty($token)) return $this->sendError(400, 'Secret error.'); - $hostInfo = $this->dao->select('id,tokenSN')->from(TABLE_ZAHOST) + $hostInfo = $this->dao->select('id,tokenSN,hostType,type')->from(TABLE_ZAHOST) ->where('oldTokenSN')->eq($token) ->andWhere('tokenTime')->gt(date(DT_DATETIME1, strtotime($now) - 30))->fi() ->fetch(); if(empty($hostInfo->id)) return $this->sendError(400, 'Secret error.'); } + $isPhysicsNode = $hostInfo->type == 'node' && $hostInfo->hostType == 'physics' ? true : false; + $host = new stdclass(); $host->status = $status; if($secret) @@ -69,7 +71,7 @@ class hostHeartbeatEntry extends baseEntry foreach($vms as $vm) { $heartbeat = strtotime(substr($vm->heartbeat, 0, 19)); - $vmData = array( + $vmData = array( 'vnc' => $vm->vncPortOnHost, 'zap' => $vm->agentPortOnHost, 'ztf' => $vm->ztfPortOnHost, @@ -80,14 +82,25 @@ class hostHeartbeatEntry extends baseEntry ); if(!$vm->sshPortOnHost) unset($vmData['ssh']); - if($heartbeat > 0) $vmData['heartbeat'] = date("Y-m-d H:i:s", $heartbeat); - $this->dao->update(TABLE_ZAHOST)->data($vmData)->where('mac')->eq($vm->macAddress)->exec(); + if($isPhysicsNode) + { + unset($vmData['extranet']); + $this->dao->update(TABLE_ZAHOST)->data($vmData)->where('id')->eq($hostInfo->id)->exec(); + } + else + { + $node = $this->loadModel('zanode')->getNodeByMac($vm->macAddress); + if(empty($node)) continue; + + if(in_array($node->status, array('restoring', 'creating_img', 'creating_snap'))) + $vmData->status = $vm->status = $node->status; + $this->dao->update(TABLE_ZAHOST)->data($vmData)->where('mac')->eq($vm->macAddress)->exec(); + } - if($vm->status == 'running') + if($vm->status == 'running' && !$isPhysicsNode) { - $node = $this->loadModel('zanode')->getNodeByMac($vm->macAddress); if(!empty($node)) { $snaps = $this->loadModel('zanode')->getSnapshotList($node->id); diff --git a/api/v1/entries/hostsubmit.php b/api/v1/entries/hostsubmit.php index 157d329ac1..00945ca704 100644 --- a/api/v1/entries/hostsubmit.php +++ b/api/v1/entries/hostsubmit.php @@ -31,6 +31,7 @@ class hostSubmitEntry extends baseEntry $image = new stdclass(); $task = $this->requestBody->task; $image->status = $this->requestBody->status; + $image->status == 'complete' && $image->status = "completed"; $this->dao = $this->loadModel('common')->dao; $id = $this->dao->select('id')->from(TABLE_ZAHOST) @@ -40,10 +41,11 @@ class hostSubmitEntry extends baseEntry if(!$id) return $this->sendError(400, 'Secret error.'); - $imageInfo = $this->dao->select('`status`,`from`', 'name')->from(TABLE_IMAGE) + $imageInfo = $this->dao->select('`status`,`from`,name,host')->from(TABLE_IMAGE) ->where('id')->eq($task) ->fetch(); if(empty($imageInfo)) return $this->sendSuccess(200, 'success'); + if($imageInfo->from == 'snapshot' && $imageInfo->status == 'restoring') { if(in_array($image->status, array('failed', 'completed'))) $image->status = $image->status == 'completed' ? 'restore_completed' : 'restore_failed'; @@ -59,6 +61,11 @@ class hostSubmitEntry extends baseEntry $this->dao->update(TABLE_IMAGE)->data($image)->where("id")->eq($task)->exec(); + if($imageInfo->from != 'zentao' && in_array($imageInfo->status, array('creating', 'restoring'))) + { + $this->dao->update(TABLE_ZAHOST)->data(array("status" => "wait"))->where("id")->eq($imageInfo->host)->exec(); + } + return $this->sendSuccess(200, 'success'); } } diff --git a/api/v1/entries/testcase.php b/api/v1/entries/testcase.php index 6d0c75cbde..e0a1bd7ab2 100644 --- a/api/v1/entries/testcase.php +++ b/api/v1/entries/testcase.php @@ -56,11 +56,16 @@ class testcaseEntry extends entry $stepType = array(); if(isset($this->requestBody->steps)) { - foreach($this->requestBody->steps as $step) + foreach($this->requestBody->steps as $key => $step) { + if(empty($step->type)) $step->type = 'step'; + if(!in_array($step->type, array('step', 'item', 'group'))) $step->type = 'step'; + + if($step->type == 'group' && (empty($this->requestBody->steps[$key + 1]->type) || $this->requestBody->steps[$key + 1]->type != 'item')) $step->type = 'step'; + $steps[] = $step->desc; $expects[] = $step->expect; - $stepType[] = 'item'; + $stepType[] = $step->type; } } diff --git a/api/v1/entries/testcases.php b/api/v1/entries/testcases.php index b56e78dc09..7931ea0379 100644 --- a/api/v1/entries/testcases.php +++ b/api/v1/entries/testcases.php @@ -33,9 +33,10 @@ class testcasesEntry extends entry $param = $moduleID; } - $this->app->cookie->caseModule = 0; - $this->app->cookie->caseSuite = 0; - $this->app->cookie->preBranch = $branch; + $this->app->cookie->caseModule = 0; + $this->app->cookie->caseSuite = 0; + $this->app->cookie->preBranch = $branch; + $this->app->cookie->showAutoCase = 1; $control = $this->loadController('testcase', 'browse'); $control->browse($productID, $this->param('branch', ''), $type, $param, $this->param('caseType', ''), $this->param('order', 'id_desc'), 0, $this->param('limit', 20), $this->param('page', 1)); diff --git a/api/v1/entries/testsuite.php b/api/v1/entries/testsuite.php index ab6047a9d2..a06fa5711b 100644 --- a/api/v1/entries/testsuite.php +++ b/api/v1/entries/testsuite.php @@ -21,7 +21,7 @@ class testsuiteEntry extends entry public function get($testsuiteID) { $control = $this->loadController('testsuite', 'view'); - $control->view($testsuiteID, $this->param('version', 0)); + $control->view($testsuiteID, $this->param('order', 'id_desc'), 0, $this->param('limit', 20), $this->param('page', 1)); $data = $this->getData(); if(!$data or (isset($data->message) and $data->message == '404 Not found')) return $this->send404(); diff --git a/api/v1/entries/testsuites.php b/api/v1/entries/testsuites.php index 22012099fc..ece087dc4e 100644 --- a/api/v1/entries/testsuites.php +++ b/api/v1/entries/testsuites.php @@ -24,7 +24,7 @@ class testsuitesEntry extends entry if(empty($productID)) return $this->sendError(400, 'Need product id.'); $control = $this->loadController('testsuite', 'browse'); - $control->browse($productID, $this->param('order', 'id_desc'), 0, $this->param('limit', 20), $this->param('page', 1)); + $control->browse($productID, 'all', $this->param('order', 'id_desc'), 0, $this->param('limit', 20), $this->param('page', 1)); $data = $this->getData(); if(isset($data->status) and $data->status == 'success') diff --git a/db/update18.3.sql b/db/update18.3.sql index 4543bbaf23..1aaae55173 100644 --- a/db/update18.3.sql +++ b/db/update18.3.sql @@ -236,7 +236,12 @@ CHANGE `resolvedDate` `resolvedDate` datetime NULL, CHANGE `closedDate` `closedDate` datetime NULL, CHANGE `lastEditedDate` `lastEditedDate` datetime NULL; +ALTER TABLE `zt_build` +CHANGE `project` `project` mediumint unsigned NOT NULL DEFAULT '0'; + ALTER TABLE `zt_case` +CHANGE `project` `project` mediumint unsigned NOT NULL DEFAULT '0', +CHANGE `execution` `execution` mediumint unsigned NOT NULL DEFAULT '0', CHANGE `scriptedBy` `scriptedBy` varchar(30) NOT NULL DEFAULT '', CHANGE `scriptedDate` `scriptedDate` date NULL, CHANGE `reviewedBy` `reviewedBy` varchar(255) NOT NULL DEFAULT '', @@ -277,7 +282,10 @@ CHANGE `assignedTo` `assignedTo` varchar(30) NOT NULL DEFAULT '', CHANGE `assignedBy` `assignedBy` varchar(30) NOT NULL DEFAULT '', CHANGE `assignedDate` `assignedDate` datetime NULL; +ALTER TABLE `zt_doc` ADD `editingDate` text NULL AFTER `editedDate`; ALTER TABLE `zt_doc` +CHANGE `views` `views` smallint unsigned NOT NULL DEFAULT '0', +CHANGE `collector` `collector` text NULL, CHANGE `assignedTo` `assignedTo` varchar(30) NOT NULL DEFAULT '', CHANGE `assignedDate` `assignedDate` datetime NULL, CHANGE `approvedDate` `approvedDate` date NULL, @@ -399,6 +407,8 @@ CHANGE `activatedBy` `activatedBy` char(30) NOT NULL DEFAULT '', CHANGE `activatedDate` `activatedDate` datetime NULL; ALTER TABLE `zt_kanbancard` +CHANGE `begin` `begin` date NULL, +CHANGE `end` `end` date NULL, CHANGE `lastEditedBy` `lastEditedBy` char(30) NOT NULL DEFAULT '', CHANGE `lastEditedDate` `lastEditedDate` datetime NULL, CHANGE `archivedBy` `archivedBy` char(30) NOT NULL DEFAULT '', @@ -447,6 +457,8 @@ CHANGE `editedBy` `editedBy` varchar(30) NOT NULL DEFAULT '', CHANGE `editedDate` `editedDate` datetime NULL; ALTER TABLE `zt_module` +CHANGE `owner` `owner` varchar(30) NOT NULL DEFAULT '', +CHANGE `collector` `collector` text NULL, CHANGE `short` `short` varchar(30) NOT NULL DEFAULT ''; ALTER TABLE `zt_mr` @@ -642,6 +654,12 @@ CHANGE `closedReason` `closedReason` varchar(30) NOT NULL DEFAULT '', CHANGE `activatedDate` `activatedDate` datetime NULL, CHANGE `feedbackBy` `feedbackBy` varchar(100) NOT NULL DEFAULT '', CHANGE `stagedBy` `stagedBy` char(30) NOT NULL DEFAULT '', +CHANGE `toBug` `toBug` mediumint unsigned NOT NULL DEFAULT '0', +CHANGE `childStories` `childStories` varchar(255) NOT NULL DEFAULT '', +CHANGE `linkStories` `linkStories` varchar(255) NOT NULL DEFAULT '', +CHANGE `linkRequirements` `linkRequirements` varchar(255) NOT NULL DEFAULT '', +CHANGE `twins` `twins` varchar(255) NOT NULL DEFAULT '', +CHANGE `duplicateStory` `duplicateStory` mediumint unsigned NOT NULL DEFAULT '0', CHANGE `notifyEmail` `notifyEmail` varchar(100) NOT NULL DEFAULT ''; ALTER TABLE `zt_storyreview` @@ -793,7 +811,6 @@ CREATE TABLE IF NOT EXISTS `zt_docaction` ( KEY `doc` (`doc`), KEY `actor` (`actor`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -ALTER TABLE `zt_doc` ADD `editingDate` text NULL AFTER `editedDate`; REPLACE INTO `zt_screen` (`id`, `dimension`, `name`, `desc`, `cover`, `scheme`, `status`, `createdBy`, `createdDate`, `editedBy`, `editedDate`, `deleted`) VALUES (6,1,'年度完成项目过程数据大屏','了解已完成项目的生产效率','static/images/screen1.png','{"editCanvasConfig":{"projectName":"2","width":1366,"height":2900,"size":0,"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","background":null,"backgroundImage":null,"selectColor":true,"chartThemeColor":"3wvajowr6l8000","chartCustomThemeColorInfo":[{"id":"3wvajowr6l8000","name":"未命名","color":["#6ae5bb","#69e3de","#5ac5ee","#6FB6F1FF","#4498ec","#3c7ddf","#1E6AEBFF"]}],"chartThemeSetting":{"title":{"show":true,"textStyle":{"color":"#BFBFBF","fontSize":18},"subtextStyle":{"color":"#A2A2A2","fontSize":14}},"xAxis":{"show":true,"name":"","nameGap":15,"nameTextStyle":{"color":"#B9B8CE","fontSize":12},"inverse":false,"axisLabel":{"show":true,"fontSize":12,"color":"#B9B8CE","rotate":0},"position":"bottom","axisLine":{"show":true,"lineStyle":{"color":"#B9B8CE","width":1},"onZero":true},"axisTick":{"show":true,"length":5},"splitLine":{"show":false,"lineStyle":{"color":"#484753","width":1,"type":"solid"}}},"yAxis":{"show":true,"name":"","nameGap":15,"nameTextStyle":{"color":"#B9B8CE","fontSize":12},"inverse":false,"axisLabel":{"show":true,"fontSize":12,"color":"#B9B8CE","rotate":0},"position":"left","axisLine":{"show":true,"lineStyle":{"color":"#B9B8CE","width":1},"onZero":true},"axisTick":{"show":true,"length":5},"splitLine":{"show":true,"lineStyle":{"color":"#484753","width":1,"type":"solid"}}},"legend":{"show":true,"top":"5%","textStyle":{"color":"#B9B8CE"}},"grid":{"show":false,"left":"10%","top":"60","right":"10%","bottom":"60"},"dataset":null,"renderer":"svg"},"previewScaleType":"fit", "globalFilter": []},"componentList":[{"id":"2uws0ytah1s000","isGroup":false,"attr":{"x":693,"y":726,"w":653,"h":490,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1089FF12"],"backgroundColor":"#1089FF12"}},{"id":"5nyrxc5w010000","isGroup":false,"attr":{"x":20,"y":726,"w":653,"h":490,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1089FF12"],"backgroundColor":"#1089FF12"}},{"id":"3mnttqgyc4o000","isGroup":false,"attr":{"x":253,"y":46,"w":860,"h":32,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#1089FF42","#1089FF00"],"backgroundColor":"#00000000"}},{"id":"4nir9d6n138000","isGroup":false,"attr":{"x":20,"y":106,"w":1326,"h":600,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1089FF12"],"backgroundColor":"#1089FF12"}},{"id":"3sdxo2ffqi0000","isGroup":false,"attr":{"x":50,"y":228,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":" 完成项目数 ","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":37,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":4,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"4nyo2dxv5yi000","isGroup":false,"attr":{"x":50,"y":194,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10000,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"","fontSize":18,"fontColor":"#ffffff","paddingX":56,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"2ev27p00xbpc00","isGroup":false,"attr":{"x":230,"y":228,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"按时完成项目数","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":20,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"lzaj0yorolc00","isGroup":false,"attr":{"x":410,"y":228,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"延期完成项目数","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":20,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"4jogna07yk8000","isGroup":false,"attr":{"x":771,"y":229,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成需求规模数","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":20,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"15j805dkq4ik00","isGroup":false,"attr":{"x":951,"y":228,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成发布数","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":36,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"ltddmmh5kkw00","isGroup":false,"attr":{"x":-1232,"y":613,"w":153,"h":84,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成项目数","fontSize":12,"fontColor":"#ffffff","paddingX":20,"paddingY":20,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"6p4ckgbvmx400","isGroup":false,"attr":{"x":-1232,"y":613,"w":153,"h":84,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成项目数","fontSize":12,"fontColor":"#ffffff","paddingX":20,"paddingY":20,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"5nkv71g8l9o000","isGroup":false,"attr":{"x":-1232,"y":613,"w":153,"h":84,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成项目数","fontSize":12,"fontColor":"#ffffff","paddingX":20,"paddingY":20,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"4q15hg06540000","isGroup":false,"attr":{"x":1131,"y":228,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"解决bug数","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":36,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"4l83s1sqlek000","isGroup":false,"attr":{"x":591,"y":228,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成需求条目数","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":20,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"5irrkthvdhc000","isGroup":false,"attr":{"x":61,"y":207,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"5f6dr2y034w000","isGroup":false,"attr":{"x":231,"y":194,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10001,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":56,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"1gw11ho3ev4w00","isGroup":false,"attr":{"x":410,"y":194,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10002,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":56,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"4ljohxdlzfs000","isGroup":false,"attr":{"x":591,"y":194,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10003,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":56,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"2dsxvobrqdes00","isGroup":false,"attr":{"x":771,"y":194,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10004,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":56,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"25j01jdzmrts00","isGroup":false,"attr":{"x":951,"y":194,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10005,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":56,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"poh8lbo2qc000","isGroup":false,"attr":{"x":1131,"y":194,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10006,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":56,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"17bvssn39zuk00","isGroup":false,"attr":{"x":242,"y":208,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"2klk0oo8kj8000","isGroup":false,"attr":{"x":421,"y":208,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"51idc736a5s000","isGroup":false,"attr":{"x":602,"y":208,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"5rjfkvfw4i8000","isGroup":false,"attr":{"x":782,"y":208,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"26hlsg2c15vk00","isGroup":false,"attr":{"x":962,"y":208,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"3as8najk6hg00","isGroup":false,"attr":{"x":1142,"y":208,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"4nkffa1hzc0000","isGroup":false,"attr":{"x":50,"y":338,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成执行数","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":34,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"43q8d7h9nlk000","isGroup":false,"attr":{"x":50,"y":304,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10007,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":56,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"5jexl1ycymg000","isGroup":false,"attr":{"x":230,"y":338,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"按时完成执行数","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":20,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"vgfp0juvuf400","isGroup":false,"attr":{"x":410,"y":338,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"延期完成执行数","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":20,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"3362s9jdoko000","isGroup":false,"attr":{"x":591,"y":338,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成任务条目数","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":20,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"5l9fr10ck94000","isGroup":false,"attr":{"x":772,"y":338,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成任务预计工时数","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":8,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":4,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"1zxjse36amv400","isGroup":false,"attr":{"x":952,"y":338,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成任务消耗工时数","fontSize":12,"fontColor":"#ffffff","paddingX":8,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":4,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"29iw7qg73bbw00","isGroup":false,"attr":{"x":1131,"y":338,"w":180,"h":100,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"投入的总人天","fontSize":12,"fontColor":"#B2D5E5FF","paddingX":28,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"1r8qfow1e45c00","isGroup":false,"attr":{"x":230,"y":304,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10008,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":57,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"2uqxi3e1y3u000","isGroup":false,"attr":{"x":411,"y":304,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10009,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":57,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"2bnzdjpcesg000","isGroup":false,"attr":{"x":591,"y":304,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10010,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":57,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"5rwyxojtmnw000","isGroup":false,"attr":{"x":772,"y":304,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10011,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":57,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"1ook02lf4ns000","isGroup":false,"attr":{"x":951,"y":304,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10012,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":57,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"3c1qy9alml2000","isGroup":false,"attr":{"x":1131,"y":304,"w":180,"h":80,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","sourceID":10013,"image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"100","fontSize":18,"fontColor":"#ffffff","paddingX":57,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":0,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#1089FF12"}},{"id":"4q65e0gqmlg000","isGroup":false,"attr":{"x":61,"y":320,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"48zdrnjvl0c000","isGroup":false,"attr":{"x":242,"y":320,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"rdnf6i797pc00","isGroup":false,"attr":{"x":421,"y":320,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"ffvurro4h4w00","isGroup":false,"attr":{"x":603,"y":320,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"5niqhm817gw000","isGroup":false,"attr":{"x":782,"y":320,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"5d6bo6dfzf4000","isGroup":false,"attr":{"x":962,"y":320,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"owvo5wyad9c00","isGroup":false,"attr":{"x":1142,"y":320,"w":156,"h":88,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1DC1F5FF"],"backgroundColor":"#00000000"}},{"id":"4v411wy0jam000","isGroup":false,"attr":{"x":68,"y":439,"w":332,"h":200,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"PieCircle","chartConfig":{"key":"PieCircle","chartKey":"VPieCircle","conKey":"VCPieCircle","title":"饼图-环形","category":"Pies","categoryName":"饼图","package":"Charts","chartFrame":"echarts","sourceID":10014,"image":"pie-circle.png"},"option":{"tooltip":{"show":true,"trigger":"item"},"legend":{"show":true},"dataset":0.25,"title":{"text":"25.00%","x":"center","y":"center","textStyle":{"color":"#4498ECFF","fontSize":30}},"series":[{"type":"pie","radius":["75%","80%"],"center":["50%","50%"],"hoverAnimation":true,"color":["#00bcd44a","transparent"],"label":{"show":false},"data":[{"value":[25],"itemStyle":{"color":"#4498ECFF","shadowBlur":10,"shadowColor":"#6FB6F1FF"}},{"value":[75],"itemStyle":{"color":"#6FB6F130","shadowBlur":0,"shadowColor":"#00bcd44a"}}]}],"backgroundColor":"rgba(0,0,0,0)"}},{"id":"455e6v96m36000","isGroup":false,"attr":{"x":347,"y":439,"w":332,"h":200,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"PieCircle","chartConfig":{"key":"PieCircle","chartKey":"VPieCircle","conKey":"VCPieCircle","title":"饼图-环形","category":"Pies","categoryName":"饼图","package":"Charts","chartFrame":"echarts","sourceID":10015,"image":"pie-circle.png"},"option":{"tooltip":{"show":true,"trigger":"item"},"legend":{"show":true},"dataset":0.25,"title":{"text":"25.00%","x":"center","y":"center","textStyle":{"color":"#4498ECFF","fontSize":30}},"series":[{"type":"pie","radius":["75%","80%"],"center":["50%","50%"],"hoverAnimation":true,"color":["#00bcd44a","transparent"],"label":{"show":false},"data":[{"value":[25],"itemStyle":{"color":"#4498ECFF","shadowBlur":10,"shadowColor":"#6FB6F1FF"}},{"value":[75],"itemStyle":{"color":"#6FB6F130","shadowBlur":0,"shadowColor":"#00bcd44a"}}]}],"backgroundColor":"rgba(0,0,0,0)"}},{"id":"1357hi74tghs00","isGroup":false,"attr":{"x":680,"y":439,"w":332,"h":200,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"PieCircle","chartConfig":{"key":"PieCircle","chartKey":"VPieCircle","conKey":"VCPieCircle","title":"饼图-环形","category":"Pies","categoryName":"饼图","package":"Charts","chartFrame":"echarts","sourceID":10016,"image":"pie-circle.png"},"option":{"tooltip":{"show":true,"trigger":"item"},"legend":{"show":true},"dataset":0.25,"title":{"text":"25.00%","x":"center","y":"center","textStyle":{"color":"#69E3DEE0","fontSize":30}},"series":[{"type":"pie","radius":["75%","80%"],"center":["50%","50%"],"hoverAnimation":true,"color":["#00bcd44a","transparent"],"label":{"show":false},"data":[{"value":[25],"itemStyle":{"color":"#69E3DEA1","shadowBlur":10,"shadowColor":"#69E3DEE0"}},{"value":[75],"itemStyle":{"color":"#69E3DE21","shadowBlur":0,"shadowColor":"#FFCE97FF"}}]}],"backgroundColor":"rgba(0,0,0,0)"}},{"id":"5czvzl4a3qs000","isGroup":false,"attr":{"x":959,"y":439,"w":332,"h":200,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"PieCircle","chartConfig":{"key":"PieCircle","chartKey":"VPieCircle","conKey":"VCPieCircle","title":"饼图-环形","category":"Pies","categoryName":"饼图","package":"Charts","chartFrame":"echarts","sourceID":10017,"image":"pie-circle.png"},"option":{"tooltip":{"show":true,"trigger":"item"},"legend":{"show":true},"dataset":0.25,"title":{"text":"25.00%","x":"center","y":"center","textStyle":{"color":"#69E3DEE0","fontSize":30}},"series":[{"type":"pie","radius":["75%","80%"],"center":["50%","50%"],"hoverAnimation":true,"color":["#00bcd44a","transparent"],"label":{"show":false},"data":[{"value":[25],"itemStyle":{"color":"#69E3DEA1","shadowBlur":10,"shadowColor":"#69E3DEE0"}},{"value":[75],"itemStyle":{"color":"#69E3DE21","shadowBlur":0,"shadowColor":"#6AE5BBFF"}}]}],"backgroundColor":"rgba(0,0,0,0)"}},{"id":"3rrf13x8aig000","isGroup":false,"attr":{"x":68,"y":626,"w":332,"h":50,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"项目按期完成率","fontSize":16,"fontColor":"#ffffff","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"2fj8shp4iww000","isGroup":false,"attr":{"x":349,"y":626,"w":332,"h":50,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"执行按期完成率","fontSize":16,"fontColor":"#ffffff","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"7c0kw504pfo00","isGroup":false,"attr":{"x":680,"y":626,"w":332,"h":50,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"项目延期率","fontSize":16,"fontColor":"#ffffff","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"3tdqudx15lm000","isGroup":false,"attr":{"x":959,"y":626,"w":332,"h":50,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"执行延期率","fontSize":16,"fontColor":"#ffffff","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"15v07f9mllz400","isGroup":false,"attr":{"x":56,"y":120,"w":242,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"年度完成项目数据盘点","fontSize":20,"fontColor":"#B2D5E5FF","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":2,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"12pr64gobork00","isGroup":false,"attr":{"x":314,"y":120,"w":990,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}},{"id":"5rscm33a7a0000","isGroup":false,"attr":{"x":916,"y":8,"w":450,"h":75,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates04","chartConfig":{"key":"Decorates04","chartKey":"VDecorates04","conKey":"VCDecorates04","title":"装饰-04","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates04.png"},"option":{"colors":["#1dc1f5","#1dc1f5"],"reverse":false}},{"id":"48vgwd3xywc000","isGroup":false,"attr":{"x":2,"y":8,"w":450,"h":75,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates04","chartConfig":{"key":"Decorates04","chartKey":"VDecorates04","conKey":"VCDecorates04","title":"装饰-04","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates04.png"},"option":{"colors":["#1dc1f5","#1dc1f5"],"reverse":true}},{"id":"34gsoca72ak000","isGroup":false,"attr":{"x":450,"y":55,"w":466,"h":50,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates05","chartConfig":{"key":"Decorates05","chartKey":"VDecorates05","conKey":"VCDecorates05","title":"装饰-05","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates05.png"},"option":{"colors":["#00c2ff","#00c2ff4d"],"dur":3}},{"id":"5emz0hdi03k000","isGroup":false,"attr":{"x":1,"y":1,"w":1365,"h":45,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#1089FF42","#1089FF00"],"backgroundColor":"#00000000"}},{"id":"afw1xcxn3ug00","isGroup":false,"attr":{"x":433,"y":5,"w":500,"h":64,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"年度完成项目过程数据大屏","fontSize":28,"fontColor":"#b2d5e5FF","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":5,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"4y002sh7oy8000","isGroup":false,"attr":{"x":36,"y":806,"w":621,"h":388,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"PieCommon","chartConfig":{"key":"PieCommon","chartKey":"VPieCommon","conKey":"VCPieCommon","title":"饼图","category":"Pies","categoryName":"饼图","package":"Charts","chartFrame":"echarts","image":"pie.png"},"option":{"legend":{"show":true,"top":"5%","textStyle":{"color":"#B9B8CE"}},"type":"nomal","tooltip":{"show":true,"trigger":"item"},"dataset":{"dimensions":["product","data1"],"source":[{"product":"Mon","data1":120},{"product":"Tue","data1":200},{"product":"Wed","data1":150},{"product":"Thu","data1":80},{"product":"Fri","data1":70},{"product":"Sat","data1":110},{"product":"Sun","data1":130}]},"series":[{"type":"pie","radius":"70%","center":["50%","60%"],"roseType":false,"avoidLabelOverlap":false,"itemStyle":{"show":true,"borderRadius":0,"borderColor":"#fff","borderWidth":1},"label":{"show":false,"position":"center","formatter":"{b}","fontSize":12},"emphasis":{"label":{"show":true,"fontSize":"40","fontWeight":"bold"}},"labelLine":{"show":false}}],"backgroundColor":"rgba(0,0,0,0)"}},{"id":"4tffv1d8mx4000","isGroup":false,"attr":{"x":709,"y":806,"w":621,"h":388,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"PieCommon","chartConfig":{"key":"PieCommon","chartKey":"VPieCommon","conKey":"VCPieCommon","title":"饼图","category":"Pies","categoryName":"饼图","package":"Charts","chartFrame":"echarts","image":"pie.png"},"option":{"legend":{"show":true,"top":"5%","textStyle":{"color":"#B9B8CE"}},"type":"nomal","tooltip":{"show":true,"trigger":"item"},"dataset":{"dimensions":["product","data1"],"source":[{"product":"Mon","data1":120},{"product":"Tue","data1":200},{"product":"Wed","data1":150},{"product":"Thu","data1":80},{"product":"Fri","data1":70},{"product":"Sat","data1":110},{"product":"Sun","data1":130}]},"series":[{"type":"pie","radius":"70%","center":["50%","60%"],"roseType":false,"avoidLabelOverlap":false,"itemStyle":{"show":true,"borderRadius":0,"borderColor":"#fff","borderWidth":1},"label":{"show":false,"position":"center","formatter":"{b}","fontSize":12},"emphasis":{"label":{"show":true,"fontSize":"40","fontWeight":"bold"}},"labelLine":{"show":true}}],"backgroundColor":"rgba(0,0,0,0)"}},{"id":"5jlquwudqjc000","isGroup":false,"attr":{"x":250,"y":742,"w":200,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"项目完成分布图","fontSize":20,"fontColor":"#B2D5E5FF","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":2,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"2sphsycadhc000","isGroup":false,"attr":{"x":924,"y":742,"w":200,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"执行完成分布图","fontSize":20,"fontColor":"#B2D5E5FF","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":2,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"1k6hl6r7tygw00","isGroup":false,"attr":{"x":1124,"y":742,"w":190,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}},{"id":"4hnhyvnfq5g000","isGroup":false,"attr":{"x":734,"y":742,"w":190,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}},{"id":"gpiyfioye2800","isGroup":false,"attr":{"x":450,"y":742,"w":190,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}},{"id":"54c0xx57r24000","isGroup":false,"attr":{"x":60,"y":742,"w":190,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}},{"id":"2v5j91if94k000","isGroup":false,"attr":{"x":20,"y":1236,"w":1326,"h":528,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1089FF12"],"backgroundColor":"#1089FF12"}},{"id":"1cs5x66ukh6o00","isGroup":false,"attr":{"x":58,"y":1328,"w":1246,"h":400,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TableScrollBoard","chartConfig":{"key":"TableScrollBoard","chartKey":"VTableScrollBoard","conKey":"VCTableScrollBoard","title":"轮播列表","category":"Tables","categoryName":"表格","package":"Tables","chartFrame":"common","image":"table_scrollboard.png"},"option":{"header":["列1","列2","列3","列4","列5","列6"],"dataset":[["行1列1","行1列2","行1列3"],["行2列1","行2列2","行2列3"],["行3列1","行3列2","行3列3"],["行4列1","行4列2","行4列3"],["行5列1","行5列2","行5列3"],["行6列1","行6列2","行6列3"],["行7列1","行7列2","行7列3"],["行8列1","行8列2","行8列3"],["行9列1","行9列2","行9列3"],["行10列1","行10列2","行10列3"]],"index":false,"columnWidth":["200","200","200","200","200","200","200"],"align":["center","center","center","center","center","center","center"],"rowNum":8,"waitTime":3,"headerHeight":35,"carousel":"single","headerBGC":"#4498EC85","oddRowBGC":"#1089FF1A","evenRowBGC":"#FFFFFF00"}},{"id":"3h6cqs958r6000","isGroup":false,"attr":{"x":284,"y":1252,"w":1018,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}},{"id":"4p2d6bkzx2m000","isGroup":false,"attr":{"x":39,"y":1252,"w":242,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成项目工期透视表","fontSize":20,"fontColor":"#B2D5E5FF","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":2,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"53verjpnwh8000","isGroup":false,"attr":{"x":18,"y":1786,"w":653,"h":490,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1089FF12"],"backgroundColor":"#1089FF12"}},{"id":"5rg2qtyfzno000","isGroup":false,"attr":{"x":693,"y":1786,"w":653,"h":490,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1089FF12"],"backgroundColor":"#1089FF12"}},{"id":"1j96xfpflgw000","isGroup":false,"attr":{"x":1124,"y":1800,"w":190,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}},{"id":"d47gaf5trhk00","isGroup":false,"attr":{"x":734,"y":1800,"w":190,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}},{"id":"50iv7knqqtk000","isGroup":false,"attr":{"x":924,"y":1800,"w":200,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"项目工时偏差率","fontSize":20,"fontColor":"#B2D5E5FF","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":2,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"4xtycre64bw000","isGroup":false,"attr":{"x":226,"y":1800,"w":240,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"完成项目工期偏差率","fontSize":20,"fontColor":"#B2D5E5FF","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":2,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"2o3vh7bn0k6000","isGroup":false,"attr":{"x":465,"y":1800,"w":160,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}},{"id":"gkc4fwuus2o0","isGroup":false,"attr":{"x":60,"y":1800,"w":160,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}},{"id":"4gf68m6chq4000","isGroup":false,"attr":{"x":20,"y":2296,"w":1326,"h":580,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Border06","chartConfig":{"key":"Border06","chartKey":"VBorder06","conKey":"VCBorder06","title":"边框-06","category":"Borders","categoryName":"边框","package":"Decorates","chartFrame":"static","image":"border06.png"},"option":{"colors":["#3140AD00","#1089FF12"],"backgroundColor":"#1089FF12"}},{"id":"2shxv2l3z5w000","isGroup":false,"attr":{"x":60,"y":2394,"w":1246,"h":480,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"LineGradientSingle","chartConfig":{"key":"LineGradientSingle","chartKey":"VLineGradientSingle","conKey":"VCLineGradientSingle","title":"单折线渐变面积图","category":"Lines","categoryName":"折线图","package":"Charts","chartFrame":"echarts","image":"line_gradient_single.png"},"option":{"legend":{"show":true,"top":"5%","textStyle":{"color":"#B9B8CE"}},"xAxis":{"show":true,"name":"","nameGap":15,"nameTextStyle":{"color":"#B9B8CE","fontSize":12},"inverse":false,"axisLabel":{"show":true,"fontSize":12,"color":"#B9B8CE","rotate":0},"position":"bottom","axisLine":{"show":true,"lineStyle":{"color":"#B9B8CE","width":1},"onZero":true},"axisTick":{"show":true,"length":5},"splitLine":{"show":false,"lineStyle":{"color":"#484753","width":1,"type":"solid"}},"type":"category"},"yAxis":{"show":true,"name":"","nameGap":15,"nameTextStyle":{"color":"#B9B8CE","fontSize":12},"inverse":false,"axisLabel":{"show":true,"fontSize":12,"color":"#B9B8CE","rotate":0},"position":"left","axisLine":{"show":true,"lineStyle":{"color":"#B9B8CE","width":1},"onZero":true},"axisTick":{"show":true,"length":5},"splitLine":{"show":true,"lineStyle":{"color":"#484753","width":1,"type":"solid"}},"type":"value"},"grid":{"show":false,"left":"10%","top":"60","right":"10%","bottom":"60"},"tooltip":{"show":true,"trigger":"axis","axisPointer":{"type":"line"}},"dataset":{"dimensions":["product","data1"],"source":[{"product":"Mon","data1":120},{"product":"Tue","data1":200},{"product":"Wed","data1":150},{"product":"Thu","data1":80},{"product":"Fri","data1":70},{"product":"Sat","data1":110},{"product":"Sun","data1":130}]},"series":[{"type":"line","smooth":false,"symbolSize":5,"label":{"show":true,"position":"top","color":"#FFFFFFFF","fontSize":12},"lineStyle":{"type":"solid","width":3},"areaStyle":{"opacity":0.8,"color":{"colorStops":[{"offset":0,"color":"rgba(106, 229, 187, 0.5)"},{"offset":1,"color":"rgba(0,0,0, 0)"}],"x":0,"y":0,"x2":0,"y2":1,"type":"linear","global":false}}}],"backgroundColor":"rgba(0,0,0,0)"}},{"id":"30k9wrjsjq0000","isGroup":false,"attr":{"x":707,"y":1872,"w":621,"h":400,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"CapsuleChart","chartConfig":{"key":"CapsuleChart","chartKey":"VCapsuleChart","conKey":"VCCapsuleChart","title":"胶囊柱图","category":"Bars","categoryName":"柱状图","package":"Charts","chartFrame":"common","image":"capsule.png"},"option":{"dataset":{"dimensions":["name","value"],"source":[{"name":"厦门","value":20},{"name":"南阳","value":40},{"name":"北京","value":60},{"name":"上海","value":80},{"name":"新疆","value":100}]},"colors":["#5AC5EEFF","#6FB6F1FF","#4498ECFF","#3C7DDFFF","#1E6AEBFF"],"unit":"","itemHeight":16,"valueFontSize":16,"paddingRight":50,"paddingLeft":30,"showValue":true}},{"id":"2c51bnwem3y800","isGroup":false,"attr":{"x":36,"y":1870,"w":621,"h":400,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"CapsuleChart","chartConfig":{"key":"CapsuleChart","chartKey":"VCapsuleChart","conKey":"VCCapsuleChart","title":"胶囊柱图","category":"Bars","categoryName":"柱状图","package":"Charts","chartFrame":"common","image":"capsule.png"},"option":{"dataset":{"dimensions":["name","value"],"source":[{"name":"厦门","value":20},{"name":"南阳","value":40},{"name":"北京","value":60},{"name":"上海","value":80},{"name":"新疆","value":100}]},"colors":["#5AC5EEFF","#6FB6F1FF","#4498ECFF","#3C7DDFFF","#1E6AEBFF"],"unit":"","itemHeight":16,"valueFontSize":16,"paddingRight":50,"paddingLeft":30,"showValue":true}},{"id":"2c9mbemsv4pw00","isGroup":false,"attr":{"x":583,"y":2316,"w":200,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"TextCommon","chartConfig":{"key":"TextCommon","chartKey":"VTextCommon","conKey":"VCTextCommon","title":"文字","category":"Texts","categoryName":"文本","package":"Informations","chartFrame":"common","image":"text_static.png"},"option":{"link":"","linkHead":"http://","dataset":"需求交付趋势图","fontSize":20,"fontColor":"#B2D5E5FF","paddingX":10,"paddingY":10,"textAlign":"center","fontWeight":"normal","borderWidth":0,"borderColor":"#ffffff","borderRadius":5,"letterSpacing":2,"writingMode":"horizontal-tb","backgroundColor":"#00000000"}},{"id":"1ipp04k1e74w00","isGroup":false,"attr":{"x":59,"y":2316,"w":518,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}},{"id":"3zx0v945nc2000","isGroup":false,"attr":{"x":786,"y":2316,"w":518,"h":60,"offsetX":0,"offsetY":0,"zIndex":-1},"styles":{"filterShow":false,"hueRotate":0,"saturate":1,"contrast":1,"brightness":1,"opacity":1,"rotateZ":0,"rotateX":0,"rotateY":0,"skewX":0,"skewY":0,"blendMode":"normal","animations":[]},"preview":{"overFlowHidden":false},"status":{"lock":false,"hide":false},"request":{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestInterval":null,"requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}},"filter":null,"events":{"baseEvent":{"click":null,"dblclick":null,"mouseenter":null,"mouseleave":null},"advancedEvents":{"vnodeMounted":null,"vnodeBeforeMount":null},"interactEvents":[]},"key":"Decorates02","chartConfig":{"key":"Decorates02","chartKey":"VDecorates02","conKey":"VCDecorates02","title":"装饰-02","category":"Decorates","categoryName":"装饰","package":"Decorates","chartFrame":"static","image":"decorates02.png"},"option":{"colors":["#A9CDF3FF","#1DC1F5FF"],"dur":3,"lineHeight":3}}],"requestGlobalConfig":{"requestDataPond":[],"requestOriginUrl":"","requestInterval":30,"requestIntervalUnit":"second","requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}}}','published','admin','2022-11-18 10:46:18','admin','2023-03-23 15:01:00','0'); diff --git a/db/zentao.sql b/db/zentao.sql index 24e304ddec..9241ccfa90 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -323,7 +323,7 @@ CREATE TABLE IF NOT EXISTS `zt_bug` ( -- DROP TABLE IF EXISTS `zt_build`; CREATE TABLE IF NOT EXISTS `zt_build` ( `id` mediumint(8) unsigned NOT NULL auto_increment, - `project` mediumint(8) unsigned NOT NULL, + `project` mediumint(8) unsigned NOT NULL default '0', `product` mediumint(8) unsigned NOT NULL default '0', `branch` varchar(255) NOT NULL DEFAULT '0', `execution` mediumint(8) unsigned NOT NULL default '0', @@ -358,9 +358,9 @@ CREATE TABLE IF NOT EXISTS `zt_burn` ( -- DROP TABLE IF EXISTS `zt_case`; CREATE TABLE IF NOT EXISTS `zt_case` ( `id` mediumint(8) unsigned NOT NULL auto_increment, - `project` mediumint(8) unsigned NOT NULL, + `project` mediumint(8) unsigned NOT NULL default '0', `product` mediumint(8) unsigned NOT NULL default '0', - `execution` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL default '0', `branch` mediumint(8) unsigned NOT NULL default '0', `lib` mediumint(8) unsigned NOT NULL default '0', `module` mediumint(8) unsigned NOT NULL default '0', @@ -661,13 +661,13 @@ CREATE TABLE IF NOT EXISTS `zt_doc` ( `path` char(255) NOT NULL DEFAULT '', `grade` tinyint(3) unsigned NOT NULL DEFAULT '0', `order` smallint(5) unsigned NOT NULL DEFAULT '0', - `views` smallint(5) unsigned NOT NULL, + `views` smallint(5) unsigned NOT NULL DEFAULT '0', `assetLib` mediumint(8) unsigned NOT NULL DEFAULT '0', `assetLibType` varchar(30) NOT NULL DEFAULT '', `from` mediumint(8) unsigned NOT NULL DEFAULT '0', `fromVersion` smallint(6) NOT NULL DEFAULT '1', `draft` longtext NOT NULL, - `collector` text NOT NULL, + `collector` text NULL, `addedBy` varchar(30) NOT NULL, `addedDate` datetime NOT NULL, `assignedTo` varchar(30) NOT NULL DEFAULT '', @@ -985,8 +985,8 @@ CREATE TABLE IF NOT EXISTS `zt_kanbancard` ( `pri` mediumint(8) unsigned NOT NULL, `assignedTo` text NOT NULL, `desc` mediumtext NOT NULL, - `begin` date NOT NULL, - `end` date NOT NULL, + `begin` date NULL, + `end` date NULL, `estimate` float unsigned NOT NULL, `progress` float unsigned NOT NULL DEFAULT '0', `color` char(7) NOT NULL, @@ -1095,8 +1095,8 @@ CREATE TABLE IF NOT EXISTS `zt_module` ( `order` smallint(5) unsigned NOT NULL default '0', `type` char(30) NOT NULL, `from` mediumint(8) unsigned NOT NULL default '0', - `owner` varchar(30) NOT NULL, - `collector` text NOT NULL, + `owner` varchar(30) NOT NULL DEFAULT '', + `collector` text NULL, `short` varchar(30) NOT NULL DEFAULT '', `deleted` enum('0','1') NOT NULL default '0', PRIMARY KEY (`id`), @@ -1592,12 +1592,12 @@ CREATE TABLE IF NOT EXISTS `zt_story` ( `closedDate` datetime NULL, `closedReason` varchar(30) NOT NULL DEFAULT '', `activatedDate` datetime NULL, - `toBug` mediumint(8) unsigned NOT NULL, - `childStories` varchar(255) NOT NULL, - `linkStories` varchar(255) NOT NULL, - `linkRequirements` varchar(255) NOT NULL, - `twins` varchar(255) NOT NULL, - `duplicateStory` mediumint(8) unsigned NOT NULL, + `toBug` mediumint(8) unsigned NOT NULL DEFAULT '0', + `childStories` varchar(255) NOT NULL DEFAULT '', + `linkStories` varchar(255) NOT NULL DEFAULT '', + `linkRequirements` varchar(255) NOT NULL DEFAULT '', + `twins` varchar(255) NOT NULL DEFAULT '', + `duplicateStory` mediumint(8) unsigned NOT NULL DEFAULT '0', `version` smallint(6) NOT NULL DEFAULT '1', `storyChanged` enum('0','1') NOT NULL DEFAULT '0', `feedbackBy` varchar(100) NOT NULL DEFAULT '', diff --git a/lib/dao/dm.class.php b/lib/dao/dm.class.php index ff8b494718..2d2056b581 100644 --- a/lib/dao/dm.class.php +++ b/lib/dao/dm.class.php @@ -135,7 +135,7 @@ class dm extends dao } /* Format alias. */ - if($alias and ctype_alnum($alias)) $alias = '"' . $alias . '"'; + if($alias and !is_numeric($alias) and ctype_alnum($alias)) $alias = '"' . $alias . '"'; return $originField . ' ' . $alias; } diff --git a/lib/scm/gitlab.class.php b/lib/scm/gitlab.class.php index 799b674608..a8f5b9d454 100644 --- a/lib/scm/gitlab.class.php +++ b/lib/scm/gitlab.class.php @@ -836,7 +836,7 @@ class gitlab return array(); } - if($httpCode == 500) return array(); + if($httpCode == 500 or $httpCode == 404) return array(); return json_decode($response); } } diff --git a/module/block/model.php b/module/block/model.php index 43f59e77f7..afca3fbe66 100644 --- a/module/block/model.php +++ b/module/block/model.php @@ -219,7 +219,7 @@ class blockModel extends model ->orWhere('t3.status')->ne('suspended') ->markRight(1) ->andWhere('t1.status')->in('wait,doing') - ->andWhere('t1.deadline')->ne('0000-00-00') + ->andWhere('t1.deadline')->notZeroDate() ->andWhere('t1.deadline')->lt($today) ->andWhere('t1.deleted')->eq(0) ->andWhere('t3.deleted')->eq(0) @@ -228,7 +228,7 @@ class blockModel extends model ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id') ->where('t1.assignedTo')->eq($this->app->user->account) ->andWhere('t1.status')->eq('active') - ->andWhere('t1.deadline')->ne('0000-00-00') + ->andWhere('t1.deadline')->notZeroDate() ->andWhere('t1.deadline')->lt($today) ->andWhere('t1.deleted')->eq(0) ->andWhere('t2.deleted')->eq(0) diff --git a/module/build/model.php b/module/build/model.php index 59063127c5..65ab63e19a 100644 --- a/module/build/model.php +++ b/module/build/model.php @@ -414,11 +414,8 @@ class buildModel extends model $build->bugs = ''; $build = fixer::input('post') - ->setDefault('project', 0) - ->setDefault('execution', 0) - ->setDefault('product', 0) - ->setDefault('branch', 0) - ->setDefault('builds', '') + ->setDefault('project,execution,product,branch', 0) + ->setDefault('builds,stories,bugs', '') ->cleanInt('product') ->add('createdBy', $this->app->user->account) ->add('createdDate', helper::now()) diff --git a/module/chart/lang/de.php b/module/chart/lang/de.php index ef7fc798b9..08b6301449 100644 --- a/module/chart/lang/de.php +++ b/module/chart/lang/de.php @@ -4,7 +4,7 @@ $lang->chart->query = 'Query'; $lang->chart->toDesign = 'To Design'; $lang->chart->group = 'Group'; -$lang->chart->field = 'Field'; +$lang->chart->field = 'Related Field'; $lang->chart->agg = 'Aggregate'; $lang->chart->chooseField = 'Choose field'; $lang->chart->aggType = 'Aggregate type'; diff --git a/module/chart/lang/en.php b/module/chart/lang/en.php index ef7fc798b9..08b6301449 100644 --- a/module/chart/lang/en.php +++ b/module/chart/lang/en.php @@ -4,7 +4,7 @@ $lang->chart->query = 'Query'; $lang->chart->toDesign = 'To Design'; $lang->chart->group = 'Group'; -$lang->chart->field = 'Field'; +$lang->chart->field = 'Related Field'; $lang->chart->agg = 'Aggregate'; $lang->chart->chooseField = 'Choose field'; $lang->chart->aggType = 'Aggregate type'; diff --git a/module/chart/lang/fr.php b/module/chart/lang/fr.php index ef7fc798b9..08b6301449 100644 --- a/module/chart/lang/fr.php +++ b/module/chart/lang/fr.php @@ -4,7 +4,7 @@ $lang->chart->query = 'Query'; $lang->chart->toDesign = 'To Design'; $lang->chart->group = 'Group'; -$lang->chart->field = 'Field'; +$lang->chart->field = 'Related Field'; $lang->chart->agg = 'Aggregate'; $lang->chart->chooseField = 'Choose field'; $lang->chart->aggType = 'Aggregate type'; diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php index 0b0061d814..e90cdd7e73 100644 --- a/module/common/lang/menu.php +++ b/module/common/lang/menu.php @@ -489,7 +489,7 @@ $lang->devops->menu->set['subMenu']->repo = array('link' => "{$lang->devops $lang->devops->menu->set['subMenu']->gitlab = array('link' => 'GitLab|gitlab|browse', 'subModule' => 'gitlab'); $lang->devops->menu->set['subMenu']->gogs = array('link' => 'Gogs|gogs|browse', 'subModule' => 'gogs'); $lang->devops->menu->set['subMenu']->gitea = array('link' => 'Gitea|gitea|browse', 'subModule' => 'gitea'); -$lang->devops->menu->set['subMenu']->jenkins = array('link' => 'Jenkins|jenkins|browse', 'subModule' => ''); +$lang->devops->menu->set['subMenu']->jenkins = array('link' => 'Jenkins|jenkins|browse', 'subModule' => 'jenkins'); $lang->devops->menu->set['subMenu']->sonarqube = array('link' => 'SonarQube|sonarqube|browse', 'subModule' => 'sonarqube'); $lang->devops->menu->set['subMenu']->setrules = array('link' => "{$lang->devops->rules}|repo|setrules"); diff --git a/module/doc/control.php b/module/doc/control.php index f77ebd5068..e7a596b74c 100755 --- a/module/doc/control.php +++ b/module/doc/control.php @@ -412,14 +412,15 @@ class doc extends control { $excludedModel = $this->config->vision == 'lite' ? '' : 'kanban'; $objects = $this->project->getPairsByProgram('', 'all', false, 'order_asc', $excludedModel); + $this->view->executions = array(); if($lib->type == 'execution') { $execution = $this->loadModel('execution')->getById($lib->execution); $objectID = $execution->project; $libs = $this->doc->getLibs('execution', $extra = "withObject,$unclosed", $libID, $lib->execution); - $this->view->execution = $execution; + $this->view->execution = $execution; + $this->view->executions = array(0 => '') + $this->execution->getPairs($objectID, 'sprint,stage', 'multiple,leaf,noprefix'); } - $this->view->executions = array(0 => '') + $this->loadModel('execution')->getPairs($objectID, 'sprint,stage', 'multiple,leaf,noprefix'); } elseif($linkType == 'execution') { @@ -1210,13 +1211,13 @@ class doc extends control $methodName = 'mySpace'; } - $crumbs[] = html::a(inLink($methodName, $linkParams), html::image("static/svg/wiki-file-lib.svg") . $lib->name); + $crumbs[] = html::a(inLink($methodName, $linkParams), html::image("static/svg/wiki-file-lib.svg") . $lib->name, '', 'title =' . $lib -> name); $moduleList = $this->loadModel('tree')->getParents($doc->module); foreach($moduleList as $module) { $withModuleParams = $linkParams . "&moduleID=$module->id"; - $crumbs[] = html::a(inLink($methodName, $withModuleParams), $module->name); + $crumbs[] = html::a(inLink($methodName, $withModuleParams), $module->name . ' ', '', 'title =' . $module->name); } $spaceType = $objectType . 'Space'; diff --git a/module/doc/css/common.css b/module/doc/css/common.css index 2c0e897f3a..3186c82db4 100644 --- a/module/doc/css/common.css +++ b/module/doc/css/common.css @@ -104,8 +104,9 @@ ol, ul {margin-bottom: 0} #subHeader .list-group>a.selected {color: #e9f2fb !important;} #pageNav #dropMenu .table-col .list-group .icon-move {display:block; float: left; font-size: 12px; padding: 3px 4px 3px 1px;} -#content .detail-content.article-content {overflow-y: auto; height: calc(100vh - 300px);} +#content .detail-content.article-content {overflow-y: auto; height: calc(100vh - 200px);} #aclBox .acl-tip {color: #838a9d;} .ajaxCollect > img.star-empty {margin-right: 0px;} -#outlineMenu {background: #fff; position: absolute; height: calc(100vh - 200px)!important; overflow-y: auto; top: 50px; right: 20px;} +#outlineMenu {background: #fff; position: absolute; height: calc(100vh - 180px)!important; overflow-y: auto; top: 50px; right: 25px;} .pl-0px {padding-left:0px !important;} +.icon {cursor: pointer;} diff --git a/module/doc/css/view.css b/module/doc/css/view.css index 8e2aca56cd..197edcba29 100644 --- a/module/doc/css/view.css +++ b/module/doc/css/view.css @@ -63,10 +63,13 @@ .info .version, .info .crumbs {float: left;} .crumbs img {margin-right: 3px; margin-bottom: 4px;} -.crumbs {float: left; display: flex;height: 32px; width: 670px; align-items: center; overflow: hidden;} +.crumbs {float: left; display: flex;height: 32px; width: 640px; align-items: center; overflow: hidden;} .crumbs .crumb-item {padding: 6px 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: none; display: flex;} .crumb-item .separator {flex: 0 0 15px; display: flex; justify-content: center; align-items: center;} .crumb-item a {flex: none} .main-col {position: relative;} #autoBox {display: flex; overflow: hidden; text-overflow: ellipsis; padding-right: 15px; position: relative;} #autoBox > .ellipsis {position: absolute; top: 3px; right: 0; width: 10px; background: #F4F5F7; height: 100%;} +.detail+.detail {padding-top: 0;} +.comment-edit-form .form-actions {display: flex;} + diff --git a/module/doc/js/common.js b/module/doc/js/common.js index 702aa5e71c..e452ecb301 100644 --- a/module/doc/js/common.js +++ b/module/doc/js/common.js @@ -29,7 +29,12 @@ function loadObjectModules(objectType, objectID, docType) function loadExecutions(projectID) { var link = createLink('project', 'ajaxGetExecutions', "projectID=" + projectID + "&executionID=0&mode=multiple,leaf,noprefix&type=sprint,stage"); - $('#executionBox').load(link, function(){$('#executionBox').find('select').attr('data-placeholder', holders.execution).attr('onchange', "loadObjectModules('execution', this.value)").picker()}); + $('#executionBox').load(link, function() + { + var $extension = $('#executionBox').find('select'); + $extension.attr('data-placeholder', holders.execution).attr('onchange', "loadObjectModules('execution', this.value)").picker(); + if($extension.hasClass('disabled')) $('#executionBox').find('.picker').addClass('disabled'); + }); loadObjectModules('project', projectID); } @@ -421,9 +426,10 @@ function updateCrumbs() if(widthSum >= crumbMaxWidth) { $(crumbItem).addClass('in-auto-box'); + var $autoCrumbItems = $('#crumbs > .in-auto-box'); + $lastChild.before('
...
'); + $('#autoBox').prepend($autoCrumbItems); + return; } } - var $autoCrumbItems = $('#crumbs > .in-auto-box'); - $lastChild.before('
...
'); - $('#autoBox').prepend($autoCrumbItems); } diff --git a/module/doc/js/create.js b/module/doc/js/create.js index 9fecfc5fec..68a32ef56a 100644 --- a/module/doc/js/create.js +++ b/module/doc/js/create.js @@ -6,6 +6,7 @@ $(function() setTimeout(function(){$('.CodeMirror').height($(document).height() - 112);}, 100); $('iframe.ke-edit-iframe').contents().find('.article-content').css('padding', '20px 20px 0 20px'); + if(objectType == 'project') loadExecutions($('#project').val()); setSavePath(); /* Change for show create error. */ diff --git a/module/doc/js/view.js b/module/doc/js/view.js index acbd606d6d..a2babcc1fb 100644 --- a/module/doc/js/view.js +++ b/module/doc/js/view.js @@ -141,21 +141,24 @@ $(function() $('.outline').height($('.article-content').height()); - $('body').on('click', '.outline-toggle i.icon-angle-right', function() + $('body').on('click', '.outline-toggle i.icon-menu-arrow-left', function() { $('.outline').css({'min-width' : '180px', 'border-left' : '2px solid #efefef'}); - $(this).removeClass('icon-angle-right').addClass('icon-angle-left').css('left', '-9px'); + $(this).removeClass('icon-menu-arrow-left').addClass('icon-menu-arrow-right').css('left', '-9px'); $('.outline-content').show(); - if($('#sidebar>.cell').is(':visible')) $('#sidebar .icon.icon-angle-right').trigger("click"); - }).on('click', '.outline-toggle i.icon-angle-left', function() + if($('#sidebar>.cell').is(':visible')) $('#sidebar .icon.icon-menu-arrow-right').trigger("click"); + }).on('click', '.outline-toggle i.icon-menu-arrow-right', function() { - $(this).removeClass('icon-angle-left').addClass('icon-angle-right'); + $(this).removeClass('icon-menu-arrow-right').addClass('icon-menu-arrow-left'); $('.outline').css({'min-width' : '180px', 'border-left' : 'none'}); $('.outline-content').hide(); }).on('click', '#outline li', function(e) { $('#outline li.active').removeClass('active'); $(e.target).closest('li').addClass('active'); + }).on('click', '.comment-edit-form .btn-hide-form', function() + { + $('.comment-edit-form #submit').attr('disabled', false); }); $('#outline li.has-list').addClass('open in'); @@ -190,15 +193,14 @@ $(function() }); }) - $('#sidebar .icon.icon-angle-right').click(function() + $('#sidebar .icon.icon-menu-arrow-left').click(function() { if($('#sidebar>.cell').is(':hidden') && $('.outline-content').is(':visible')) { - $('.outline .outline-toggle i.icon-angle-left').trigger("click"); + $('.outline .outline-toggle i.icon-menu-arrow-right').trigger("click"); } }) - $('.outline .outline-toggle i.icon-angle-right').trigger("click"); $('#history').append(''); $('#hisTrigger').on('click', function() { @@ -226,4 +228,9 @@ $(function() $('#hisTrigger').removeClass('text-primary'); }) $('#history').find('.btn.pull-right').removeClass('pull-right'); + if($('.files-list').length) + { + $('#content .detail-content.article-content').css('height', 'calc(100vh - 300px)'); + } + $('.outline .outline-toggle i.icon-menu-arrow-left').trigger("click"); }) diff --git a/module/doc/model.php b/module/doc/model.php index 740b82a278..dcaaee2a2d 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -852,7 +852,7 @@ class docModel extends model $now = helper::now(); $doc = fixer::input('post') ->callFunc('title', 'trim') - ->setDefault('content', '') + ->setDefault('content,template,templateType,chapterType', '') ->add('addedBy', $this->app->user->account) ->add('addedDate', $now) ->add('editedBy', $this->app->user->account) @@ -891,6 +891,7 @@ class docModel extends model $docContent->title = $doc->title; $docContent->content = $doc->contentType == 'html' ? $doc->content : $doc->contentMarkdown; $docContent->type = $doc->contentType; + $docContent->digest = ''; $docContent->version = 1; unset($doc->contentMarkdown, $doc->contentType, $doc->url); diff --git a/module/doc/view/content.html.php b/module/doc/view/content.html.php index 44b3a49911..4c2735ae26 100644 --- a/module/doc/view/content.html.php +++ b/module/doc/view/content.html.php @@ -158,7 +158,7 @@
-
+
diff --git a/module/gitea/css/create.css b/module/gitea/css/create.css new file mode 100644 index 0000000000..807e1a132b --- /dev/null +++ b/module/gitea/css/create.css @@ -0,0 +1,2 @@ +.main-content>.center-block {max-width: 800px;} +#giteaForm table {width: 600px;} diff --git a/module/gitea/view/create.html.php b/module/gitea/view/create.html.php index a5a176aa6c..e42c7b0f33 100644 --- a/module/gitea/view/create.html.php +++ b/module/gitea/view/create.html.php @@ -22,7 +22,6 @@ gitea->name;?> - gitea->url;?> diff --git a/module/gitlab/control.php b/module/gitlab/control.php index 33cfacfc41..a4fb4087c0 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -132,7 +132,7 @@ class gitlab extends control * @access public * @return void */ - public function bindUser($gitlabID) + public function bindUser($gitlabID, $type = 'all') { $userPairs = $this->loadModel('user')->getPairs('noclosed|noletter'); @@ -140,7 +140,7 @@ class gitlab extends control $user = $this->gitlab->apiGetCurrentUser($gitlab->url, $gitlab->token); if(!isset($user->is_admin) or !$user->is_admin) return print(js::alert($this->lang->gitlab->tokenLimit) . js::locate($this->createLink('gitlab', 'edit', array('gitlabID' => $gitlabID)))); - $zentaoUsers = $this->dao->select('account,email,realname')->from(TABLE_USER)->fetchAll('account'); + $zentaoUsers = $this->dao->select('account,email,realname')->from(TABLE_USER)->where('deleted')->eq('0')->fetchAll('account'); if($_POST) { @@ -188,11 +188,32 @@ class gitlab extends control return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->server->http_referer)); } + $gitlabUsers = $this->gitlab->apiGetUsers($gitlabID); + $bindedUsers = $this->gitlab->getUserAccountIdPairs($gitlabID); + $matchedResult = $this->gitlab->getMatchedUsers($gitlabID, $gitlabUsers, $zentaoUsers); + $matchedResult = array_column(json_decode(json_encode($matchedResult), true), null, "email"); + + $gitlabUsers = array_filter($gitlabUsers, function($item) use($bindedUsers, $userPairs, $type) + { + if($type == 'all') return true; + + if(in_array($item->id, $bindedUsers)) + { + $zentaoAccount = isset($item->zentaoAccount) ? zget($userPairs, $item->zentaoAccount, '') : ''; + return $type == 'binded' ? !empty($zentaoAccount) : empty($zentaoAccount); + } + return $type == 'binded' ? false : true; + }); + $this->view->title = $this->lang->gitlab->bindUser; + $this->view->zentaoUsers = $zentaoUsers; $this->view->userPairs = $userPairs; - $this->view->gitlabUsers = $this->gitlab->apiGetUsers($gitlabID); - $this->view->bindedUsers = $this->gitlab->getUserAccountIdPairs($gitlabID); - $this->view->matchedResult = $this->gitlab->getMatchedUsers($gitlabID, $this->view->gitlabUsers, $zentaoUsers); + $this->view->type = $type; + $this->view->gitlabID = $gitlabID; + $this->view->gitlabUsers = $gitlabUsers; + $this->view->bindedUsers = $bindedUsers; + $this->view->matchedResult = $matchedResult; + $this->display(); } diff --git a/module/gitlab/css/common.css b/module/gitlab/css/common.css index ad50c2a1d2..d31a13a052 100644 --- a/module/gitlab/css/common.css +++ b/module/gitlab/css/common.css @@ -1,2 +1,9 @@ #publicTip {padding-left: 10px;} .table-form>tbody>tr>th {width: 110px;} +.gitlab-bind .btn-info{background-color: unset;color:unset;padding: 6px 6px;} +.gitlab-bind .btn-info.active{color: #2e7fff;background-color: rgba(239,239,239,.8); +border-color: rgba(0,0,0,0);} +.gitlab-bind-all{padding: 1px 6px;margin-left: 5px;border-radius: 10px;background: white;} +.img-circle {border-radius: 50%;} +.gitlab-account-desc{color: #9EA3B0;font-size: 12px;} +.gitlab-user-select .chosen-container{max-width: 200px;} \ No newline at end of file diff --git a/module/gitlab/css/create.css b/module/gitlab/css/create.css new file mode 100644 index 0000000000..09df31008b --- /dev/null +++ b/module/gitlab/css/create.css @@ -0,0 +1,2 @@ +.main-content>.center-block {max-width: 800px;} +#gitlabForm table {width: 600px;} diff --git a/module/gitlab/js/binduser.js b/module/gitlab/js/binduser.js new file mode 100644 index 0000000000..a4b6cc07c2 --- /dev/null +++ b/module/gitlab/js/binduser.js @@ -0,0 +1,11 @@ +$(document).ready(function() +{ + $('.gitlab-user-bind').change(function() + { + var user = zentaoUsers[$(this).val()]; + if(user !== undefined) + { + $(this).parent().parent().find('.email').text(user.email) + } + }); +}); \ No newline at end of file diff --git a/module/gitlab/lang/de.php b/module/gitlab/lang/de.php index cf37e4bbec..bd77e7239d 100644 --- a/module/gitlab/lang/de.php +++ b/module/gitlab/lang/de.php @@ -5,7 +5,7 @@ $lang->gitlab->search = 'Search'; $lang->gitlab->create = 'Create GitLab'; $lang->gitlab->edit = 'Edit GitLab'; $lang->gitlab->view = 'View GitLab'; -$lang->gitlab->bindUser = 'Bind User'; +$lang->gitlab->bindUser = 'Permission Setting'; $lang->gitlab->webhook = 'Webhook'; $lang->gitlab->bindProduct = "Import {$lang->productCommon}"; $lang->gitlab->importIssue = 'Import Issue'; @@ -13,9 +13,12 @@ $lang->gitlab->delete = 'Delete GitLab'; $lang->gitlab->confirmDelete = 'Do you want to delete this GitLab server?'; $lang->gitlab->gitlabAvatar = 'Avatar'; $lang->gitlab->gitlabAccount = 'GitLab Account'; -$lang->gitlab->gitlabEmail = 'Email'; +$lang->gitlab->gitlabEmail = 'GitLab User\'s Email'; +$lang->gitlab->zentaoEmail = 'Zentao User\'s Email'; $lang->gitlab->zentaoAccount = 'Zentao Account'; +$lang->gitlab->accountDesc = '(Automatically match users with the same email)'; $lang->gitlab->bindingStatus = 'Binding Status'; +$lang->gitlab->all = 'All'; $lang->gitlab->notBind = 'Not bind'; $lang->gitlab->binded = 'Binded'; $lang->gitlab->bindedError = 'The bound user has been deleted or modified. Please bind again.'; diff --git a/module/gitlab/lang/en.php b/module/gitlab/lang/en.php index cf37e4bbec..bd77e7239d 100644 --- a/module/gitlab/lang/en.php +++ b/module/gitlab/lang/en.php @@ -5,7 +5,7 @@ $lang->gitlab->search = 'Search'; $lang->gitlab->create = 'Create GitLab'; $lang->gitlab->edit = 'Edit GitLab'; $lang->gitlab->view = 'View GitLab'; -$lang->gitlab->bindUser = 'Bind User'; +$lang->gitlab->bindUser = 'Permission Setting'; $lang->gitlab->webhook = 'Webhook'; $lang->gitlab->bindProduct = "Import {$lang->productCommon}"; $lang->gitlab->importIssue = 'Import Issue'; @@ -13,9 +13,12 @@ $lang->gitlab->delete = 'Delete GitLab'; $lang->gitlab->confirmDelete = 'Do you want to delete this GitLab server?'; $lang->gitlab->gitlabAvatar = 'Avatar'; $lang->gitlab->gitlabAccount = 'GitLab Account'; -$lang->gitlab->gitlabEmail = 'Email'; +$lang->gitlab->gitlabEmail = 'GitLab User\'s Email'; +$lang->gitlab->zentaoEmail = 'Zentao User\'s Email'; $lang->gitlab->zentaoAccount = 'Zentao Account'; +$lang->gitlab->accountDesc = '(Automatically match users with the same email)'; $lang->gitlab->bindingStatus = 'Binding Status'; +$lang->gitlab->all = 'All'; $lang->gitlab->notBind = 'Not bind'; $lang->gitlab->binded = 'Binded'; $lang->gitlab->bindedError = 'The bound user has been deleted or modified. Please bind again.'; diff --git a/module/gitlab/lang/fr.php b/module/gitlab/lang/fr.php index cf37e4bbec..03a82ee249 100644 --- a/module/gitlab/lang/fr.php +++ b/module/gitlab/lang/fr.php @@ -5,7 +5,7 @@ $lang->gitlab->search = 'Search'; $lang->gitlab->create = 'Create GitLab'; $lang->gitlab->edit = 'Edit GitLab'; $lang->gitlab->view = 'View GitLab'; -$lang->gitlab->bindUser = 'Bind User'; +$lang->gitlab->bindUser = 'Permission Setting'; $lang->gitlab->webhook = 'Webhook'; $lang->gitlab->bindProduct = "Import {$lang->productCommon}"; $lang->gitlab->importIssue = 'Import Issue'; @@ -13,9 +13,12 @@ $lang->gitlab->delete = 'Delete GitLab'; $lang->gitlab->confirmDelete = 'Do you want to delete this GitLab server?'; $lang->gitlab->gitlabAvatar = 'Avatar'; $lang->gitlab->gitlabAccount = 'GitLab Account'; -$lang->gitlab->gitlabEmail = 'Email'; +$lang->gitlab->gitlabEmail = 'GitLab User\'s Email'; +$lang->gitlab->zentaoEmail = 'Zentao User\'s Email'; $lang->gitlab->zentaoAccount = 'Zentao Account'; +$lang->gitlab->accountDesc = '(System will automatically match users with the same email address)'; $lang->gitlab->bindingStatus = 'Binding Status'; +$lang->gitlab->all = 'All'; $lang->gitlab->notBind = 'Not bind'; $lang->gitlab->binded = 'Binded'; $lang->gitlab->bindedError = 'The bound user has been deleted or modified. Please bind again.'; diff --git a/module/gitlab/lang/vi.php b/module/gitlab/lang/vi.php index f3b3b2d451..f858af5575 100644 --- a/module/gitlab/lang/vi.php +++ b/module/gitlab/lang/vi.php @@ -13,9 +13,12 @@ $lang->gitlab->delete = 'Delete GitLab'; $lang->gitlab->confirmDelete = 'Do you want to delete this GitLab server?'; $lang->gitlab->gitlabAvatar = 'Avatar'; $lang->gitlab->gitlabAccount = 'GitLab Account'; -$lang->gitlab->gitlabEmail = 'Email'; +$lang->gitlab->gitlabEmail = 'GitLab User\'s Email'; +$lang->gitlab->zentaoEmail = 'Zentao User\'s Email'; $lang->gitlab->zentaoAccount = 'Zentao Account'; +$lang->gitlab->accountDesc = '(System will automatically match users with the same email address)'; $lang->gitlab->bindingStatus = 'Binding Status'; +$lang->gitlab->all = 'All'; $lang->gitlab->notBind = 'Not bind'; $lang->gitlab->binded = 'Binded'; $lang->gitlab->bindedError = 'The bound user has been deleted or modified. Please bind again.'; diff --git a/module/gitlab/lang/zh-cn.php b/module/gitlab/lang/zh-cn.php index 8483edf40c..0fba26cd7a 100644 --- a/module/gitlab/lang/zh-cn.php +++ b/module/gitlab/lang/zh-cn.php @@ -5,7 +5,7 @@ $lang->gitlab->search = '搜索'; $lang->gitlab->create = '添加GitLab'; $lang->gitlab->edit = '编辑GitLab'; $lang->gitlab->view = '查看GitLab'; -$lang->gitlab->bindUser = '绑定用户'; +$lang->gitlab->bindUser = '权限设置'; $lang->gitlab->webhook = 'Webhook'; $lang->gitlab->bindProduct = "关联{$lang->productCommon}"; $lang->gitlab->importIssue = '关联issue'; @@ -13,9 +13,12 @@ $lang->gitlab->delete = '删除GitLab'; $lang->gitlab->confirmDelete = '确认删除该GitLab吗?'; $lang->gitlab->gitlabAvatar = '头像'; $lang->gitlab->gitlabAccount = 'GitLab用户'; -$lang->gitlab->gitlabEmail = '邮箱'; +$lang->gitlab->gitlabEmail = 'GitLab用户邮箱'; +$lang->gitlab->zentaoEmail = '禅道用户邮箱'; $lang->gitlab->zentaoAccount = '禅道用户'; +$lang->gitlab->accountDesc = '(系统会将相同邮箱地址的用户自动匹配)'; $lang->gitlab->bindingStatus = '绑定状态'; +$lang->gitlab->all = '全部'; $lang->gitlab->notBind = '未绑定'; $lang->gitlab->binded = '已绑定'; $lang->gitlab->bindedError = '绑定的用户已删除或者已修改,请重新绑定'; diff --git a/module/gitlab/lang/zh-tw.php b/module/gitlab/lang/zh-tw.php index 3ceb69d896..81e5f2714f 100644 --- a/module/gitlab/lang/zh-tw.php +++ b/module/gitlab/lang/zh-tw.php @@ -13,7 +13,9 @@ $lang->gitlab->delete = '刪除GitLab'; $lang->gitlab->confirmDelete = '確認刪除該GitLab嗎?'; $lang->gitlab->gitlabAccount = 'GitLab用戶'; $lang->gitlab->zentaoAccount = '禪道用戶'; +$lang->gitlab->accountDesc = '(系統會將相同郵箱地址的用戶自動匹配)'; $lang->gitlab->bindingStatus = '綁定狀態'; +$lang->gitlab->all = '全部'; $lang->gitlab->binded = '已綁定'; $lang->gitlab->bindedError = '綁定的用戶已刪除或者已修改,請重新綁定'; $lang->gitlab->serverFail = '連接GitLab伺服器異常,請檢查GitLab伺服器。'; diff --git a/module/gitlab/model.php b/module/gitlab/model.php index 8413708a3c..f83126aaaf 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -1034,6 +1034,28 @@ class gitlabModel extends model return $this->projects[$gitlabID][$projectID]; } + /** + * Multi get projects by repos. + * + * @param object $repos + * @access public + * @return void + */ + public function apiMultiGetProjects($repos) + { + $requests = array(); + foreach($repos as $id => $repo) + { + $requests[$id]['url'] = sprintf($this->getApiRoot($repo->serviceHost, false), "/projects/{$repo->serviceProject}"); + } + $this->app->loadClass('requests', true); + $results = requests::request_multiple($requests); + foreach($results as $id => $result) + { + if(!empty($result->body) and substr($result->body, 0, 1) == '{') $this->projects[$repos[$id]->serviceHost][$repos[$id]->serviceProject] = json_decode($result->body); + } + } + /** * Get single user by API. * diff --git a/module/gitlab/view/binduser.html.php b/module/gitlab/view/binduser.html.php index d06281144c..8c89ec2f27 100644 --- a/module/gitlab/view/binduser.html.php +++ b/module/gitlab/view/binduser.html.php @@ -11,19 +11,45 @@ */ ?> +createLink('gitlab', 'browse', ""); ?> +
-
-

gitlab->bindUser;?>

+
+ ' . $lang->goback, $browseLink, 'self', "data-app='{$app->tab}'", 'btn btn-secondary'); + + $allLink = $this->createLink('gitlab', 'binduser', "gitlabID={$gitlabID}&type=all"); + $bindedLink = $this->createLink('gitlab', 'binduser', "gitlabID={$gitlabID}&type=binded"); + $notBindLink = $this->createLink('gitlab', 'binduser', "gitlabID={$gitlabID}&type=notBind"); + if($type == 'all') + { + echo html::linkButton('' . $lang->gitlab->all . "" . count($gitlabUsers) . "", $allLink, 'self', "data-app='{$app->tab}'", 'btn btn-info active'); + echo html::linkButton('' . $lang->gitlab->notBind, $notBindLink, 'self', "data-app='{$app->tab}'", 'btn btn-info'); + echo html::linkButton('' . $lang->gitlab->binded, $bindedLink, 'self', "data-app='{$app->tab}'", 'btn btn-info'); + } + else if($type == 'binded') + { + echo html::linkButton('' . $lang->gitlab->all, $allLink, 'self', "data-app='{$app->tab}'", 'btn btn-info'); + echo html::linkButton('' . $lang->gitlab->notBind, $notBindLink, 'self', "data-app='{$app->tab}'", 'btn btn-info'); + echo html::linkButton('' . $lang->gitlab->binded . "" . count($gitlabUsers) . "", $bindedLink, 'self', "data-app='{$app->tab}'", 'btn btn-info active'); + } + else + { + echo html::linkButton('' . $lang->gitlab->all, $allLink, 'self', "data-app='{$app->tab}'", 'btn btn-info'); + echo html::linkButton('' . $lang->gitlab->notBind . "" . count($gitlabUsers) . "", $notBindLink, 'self', "data-app='{$app->tab}'", 'btn btn-info active'); + echo html::linkButton('' . $lang->gitlab->binded, $bindedLink, 'self', "data-app='{$app->tab}'", 'btn btn-info'); + } + ?>
- +
- - + + @@ -32,29 +58,27 @@ zentaoAccount)) continue;?> id]", $gitlabUser->realname);?> - - - - + + + zentaoAccount)) continue;?> id]", $gitlabUser->realname);?> - - + + diff --git a/module/gitlab/view/browse.html.php b/module/gitlab/view/browse.html.php index 37dde0aabe..cb47b665e9 100644 --- a/module/gitlab/view/browse.html.php +++ b/module/gitlab/view/browse.html.php @@ -56,7 +56,7 @@ diff --git a/module/gitlab/view/create.html.php b/module/gitlab/view/create.html.php index 9df06b923e..4c34df003a 100644 --- a/module/gitlab/view/create.html.php +++ b/module/gitlab/view/create.html.php @@ -23,7 +23,6 @@ - diff --git a/module/gogs/css/create.css b/module/gogs/css/create.css new file mode 100644 index 0000000000..eca6cd5850 --- /dev/null +++ b/module/gogs/css/create.css @@ -0,0 +1,2 @@ +.main-content>.center-block {max-width: 800px;} +#gogsForm table {width: 600px;} diff --git a/module/gogs/view/create.html.php b/module/gogs/view/create.html.php index 62c109f8fd..eab94d08c6 100644 --- a/module/gogs/view/create.html.php +++ b/module/gogs/view/create.html.php @@ -22,7 +22,6 @@ - diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 8fb24759c1..eafbb77d0f 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1305,26 +1305,28 @@ $lang->resource->repo->linkStory = 'linkStory'; $lang->resource->repo->linkBug = 'linkBug'; $lang->resource->repo->linkTask = 'linkTask'; $lang->resource->repo->unlink = 'unlink'; +$lang->resource->repo->import = 'importAction'; -$lang->repo->methodOrder[5] = 'create'; -$lang->repo->methodOrder[10] = 'edit'; -$lang->repo->methodOrder[15] = 'delete'; -$lang->repo->methodOrder[20] = 'showSyncCommit'; -$lang->repo->methodOrder[25] = 'maintain'; -$lang->repo->methodOrder[30] = 'browse'; -$lang->repo->methodOrder[35] = 'view'; -$lang->repo->methodOrder[40] = 'diff'; -$lang->repo->methodOrder[45] = 'log'; -$lang->repo->methodOrder[50] = 'revision'; -$lang->repo->methodOrder[55] = 'blame'; -$lang->repo->methodOrder[60] = 'download'; -$lang->repo->methodOrder[65] = 'setRules'; -$lang->repo->methodOrder[70] = 'apiGetRepoByUrl'; -$lang->repo->methodOrder[75] = 'downloadCode'; -$lang->repo->methodOrder[80] = 'linkStory'; -$lang->repo->methodOrder[85] = 'linkBug'; -$lang->repo->methodOrder[90] = 'linkTask'; -$lang->repo->methodOrder[95] = 'unlink'; +$lang->repo->methodOrder[5] = 'create'; +$lang->repo->methodOrder[10] = 'edit'; +$lang->repo->methodOrder[15] = 'delete'; +$lang->repo->methodOrder[20] = 'showSyncCommit'; +$lang->repo->methodOrder[25] = 'maintain'; +$lang->repo->methodOrder[30] = 'browse'; +$lang->repo->methodOrder[35] = 'view'; +$lang->repo->methodOrder[40] = 'diff'; +$lang->repo->methodOrder[45] = 'log'; +$lang->repo->methodOrder[50] = 'revision'; +$lang->repo->methodOrder[55] = 'blame'; +$lang->repo->methodOrder[60] = 'download'; +$lang->repo->methodOrder[65] = 'setRules'; +$lang->repo->methodOrder[70] = 'apiGetRepoByUrl'; +$lang->repo->methodOrder[75] = 'downloadCode'; +$lang->repo->methodOrder[80] = 'linkStory'; +$lang->repo->methodOrder[85] = 'linkBug'; +$lang->repo->methodOrder[90] = 'linkTask'; +$lang->repo->methodOrder[95] = 'unlink'; +$lang->repo->methodOrder[100] = 'import'; $lang->resource->ci = new stdclass(); $lang->resource->ci->commitResult = 'commitResult'; diff --git a/module/jenkins/css/create.css b/module/jenkins/css/create.css new file mode 100644 index 0000000000..84a9608681 --- /dev/null +++ b/module/jenkins/css/create.css @@ -0,0 +1,2 @@ +.main-content>.center-block {max-width: 800px;} +#jenkinsForm table {width: 600px;} diff --git a/module/jenkins/view/create.html.php b/module/jenkins/view/create.html.php index 75e91d1574..ed065495dd 100644 --- a/module/jenkins/view/create.html.php +++ b/module/jenkins/view/create.html.php @@ -22,12 +22,10 @@ - - @@ -35,13 +33,11 @@ - - + - - + - diff --git a/module/testcase/control.php b/module/testcase/control.php index 2849bf2452..90a2ad2a05 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -2400,8 +2400,11 @@ class testcase extends control if(dao::isError()) return print(js::error(dao::getError())); - $nodeID = $_POST['node']; - $node = $this->zanode->getNodeByID($_POST['node']); + // if(!empty($_POST['syncToZentao'])) + // $this->zanode->syncCasesToZentao($_POST['scriptPath']); + + // $nodeID = $_POST['node']; + // $node = $this->zanode->getNodeByID($_POST['node']); $locatelink = $this->createLink('testcase', 'browse', "productID={$_POST['product']}"); $locatelink = str_replace(array('?onlybody=yes', '&onlybody=yes'), '', $locatelink); diff --git a/module/testcase/css/automation.css b/module/testcase/css/automation.css new file mode 100644 index 0000000000..dc2b387672 --- /dev/null +++ b/module/testcase/css/automation.css @@ -0,0 +1 @@ +table a.refresh {border-color: white;} diff --git a/module/testcase/js/automation.js b/module/testcase/js/automation.js new file mode 100644 index 0000000000..29a66f56fc --- /dev/null +++ b/module/testcase/js/automation.js @@ -0,0 +1,8 @@ +function loadNodes() +{ + var nodeLink = createLink('zanode', 'ajaxGetNodes'); + $('#nodeIdBox').load(nodeLink, function() + { + $('#nodeIdBox').find('#node').picker(); + }); +} diff --git a/module/testcase/view/automation.html.php b/module/testcase/view/automation.html.php index 20a2d96b99..3eab92a982 100644 --- a/module/testcase/view/automation.html.php +++ b/module/testcase/view/automation.html.php @@ -33,26 +33,31 @@ - - + + - + + - + diff --git a/module/testtask/model.php b/module/testtask/model.php index 45252a2272..ea2c56a520 100755 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -1903,11 +1903,13 @@ class testtaskModel extends model $caseID = $case->id; $oldCase = $this->dao->select('*')->from(TABLE_CASE)->where('id')->eq($caseID)->fetch(); - $this->dao->update(TABLE_CASE)->data($case)->where('id')->eq($caseID)->exec(); - + $case->version = $oldCase->version; + $case->openedDate = $oldCase->openedDate; + $changes = common::createChanges($oldCase, $case); if($changes) { + $this->dao->update(TABLE_CASE)->data($case)->where('id')->eq($caseID)->exec(); $actionID = $this->action->create('case', $caseID, 'Edited'); $this->action->logHistory($actionID, $changes); } @@ -2344,7 +2346,7 @@ class testtaskModel extends model $caseStep = new stdclass(); $caseStep->type = 'step'; - $caseStep->desc = ''; + $caseStep->desc = $step->name; $caseStep->expect = $step->checkPoints[0]->expect; $case->steps[] = $caseStep; diff --git a/module/zahost/control.php b/module/zahost/control.php index 0e25e3911e..1af478abed 100644 --- a/module/zahost/control.php +++ b/module/zahost/control.php @@ -44,7 +44,7 @@ class zahost extends control $showFeature = false; $accounts = !empty($this->config->global->skipAutomation) ? $this->config->global->skipAutomation : ''; - if(strpos(",$accounts,", $this->app->user->account) === false) + if(strpos(",$accounts,", $this->app->user->account) === false) { $showFeature = true; $accounts .= ',' . $this->app->user->account; @@ -109,6 +109,7 @@ class zahost extends control } $viewLink = $this->createLink('zahost', 'view', "hostID=$hostID"); + if(isonlybody()) return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => 'parent.loadHosts()')); return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $viewLink)); } @@ -368,4 +369,16 @@ class zahost extends control return $this->send(array('result' => 'success', 'message' => '', 'data' => $serviceStatus)); } + + /** + * Ajax:get hosts. + * + * @access public + * @return void + */ + public function ajaxGetHosts() + { + $hostList = $this->zahost->getPairs(); + return print(html::select("parent", $hostList, '', "class='form-control chosen'")); + } } diff --git a/module/zahost/model.php b/module/zahost/model.php index 3aa0029f42..e147b70e06 100644 --- a/module/zahost/model.php +++ b/module/zahost/model.php @@ -193,7 +193,8 @@ class zahostModel extends model */ public function getImageList($hostID, $browseType = 'all', $param = 0, $orderBy = 'id', $pager = null) { - $imageList = json_decode(commonModel::http($this->config->zahost->imageListUrl, array(), array())); + $imageList = json_decode(commonModel::http($this->config->zahost->imageListUrl, array(), array())); + if(empty($imageList)) return array(); $downloadedImageList = $this->dao->select('*')->from(TABLE_IMAGE) ->where('host')->eq($hostID) diff --git a/module/zanode/config.php b/module/zanode/config.php index c8a81099d6..447e580967 100644 --- a/module/zanode/config.php +++ b/module/zanode/config.php @@ -3,7 +3,7 @@ $config->zanode->create = new stdClass(); $config->zanode->edit = new stdClass(); $config->zanode->createimage = new stdClass(); $config->zanode->create->requiredFields = 'name,host,image,cpu,memory,disk,osName'; -$config->zanode->create->physicsRequiredFields = 'name,extranet,cpu,memory,osName'; +$config->zanode->create->physicsRequiredFields = 'name,extranet,cpu,memory,osNamePhysics'; $config->zanode->edit->requiredFields = ''; $config->zanode->createimage->requiredFields = 'name'; @@ -12,7 +12,8 @@ $config->zanode->defaultAccount = 'z'; $config->zanode->defaultWinAccount = 'admin'; $config->zanode->defaultPwd = 'CQdliYQn6tKkoFhP'; -$config->zanode->initBash = 'curl -sSL https://pkg.qucheng.com/zenagent/zagent.sh | bash /dev/stdin -szvm -z%s'; +$config->zanode->initBash = 'curl -sSL https://pkg.qucheng.com/zenagent/zagent.sh | bash /dev/stdin -s zvm -k %s -z %s'; +$config->zanode->initPosh = 'Invoke-WebRequest -UseBasicParsing -Uri "https://pkg.qucheng.com/zenagent/zagent-vm.ps1" -OutFile "./install-zanget-vm.ps1"; &"./install-zanget-vm.ps1" -s %s -z %s'; $config->zanode->os = new stdClass(); @@ -51,3 +52,33 @@ $config->zanode->editor->create = array('id' => 'desc', 'tools' => 'simpleT $config->zanode->editor->edit = array('id' => 'desc', 'tools' => 'simpleTools'); $config->zanode->editor->createimage = array('id' => 'desc', 'tools' => 'simpleTools'); $config->zanode->editor->view = array('id' => 'comment,lastComment', 'tools' => 'simpleTools'); + +$config->zanode->osType = array('linux' => 'Linux', 'windows' => 'Microsoft Windows'); + +$config->zanode->linuxList[''] = ''; +$config->zanode->linuxList['centOS65'] = 'CentOS 6.5'; +$config->zanode->linuxList['centOS66'] = 'CentOS 6.6'; +$config->zanode->linuxList['centOS67'] = 'CentOS 6.7'; +$config->zanode->linuxList['centOS70'] = 'CentOS 7.0'; +$config->zanode->linuxList['centOS71'] = 'CentOS 7.1'; +$config->zanode->linuxList['centOS79'] = 'CentOS 7.9'; + +$config->zanode->linuxList['ubuntu1404'] = 'Ubuntu 14.04'; +$config->zanode->linuxList['ubuntu1604'] = 'Ubuntu 16.04'; +$config->zanode->linuxList['ubuntu1804'] = 'Ubuntu 18.04'; +$config->zanode->linuxList['ubuntu2004'] = 'Ubuntu 20.04'; + +$config->zanode->linuxList['debianBullseye'] = 'Debian Bullseye'; +$config->zanode->linuxList['debianBuster'] = 'Debian Buster'; + +$config->zanode->windowsList[''] = ''; +$config->zanode->windowsList['win10'] = 'Windows 10'; +$config->zanode->windowsList['winserver08x64'] = 'Windows Server2008 x64'; +$config->zanode->windowsList['winserver12'] = 'Windows Server2012'; +$config->zanode->windowsList['winserver16'] = 'Windows Server2016'; + +$config->zanode->versionToOs[''] = ''; +$config->zanode->versionToOs['win10'] = 'windows'; +$config->zanode->versionToOs['winserver08x64'] = 'windows'; +$config->zanode->versionToOs['winserver12'] = 'windows'; +$config->zanode->versionToOs['winserver16'] = 'windows'; \ No newline at end of file diff --git a/module/zanode/control.php b/module/zanode/control.php index 7360defed1..b403c4e337 100644 --- a/module/zanode/control.php +++ b/module/zanode/control.php @@ -161,17 +161,16 @@ class zanode extends control $node = $this->zanode->getNodeByID($id); $vnc = $this->zanode->getVncUrl($node); - /* Add action log. */ - // if(!empty($vnc->token)) $this->loadModel('action')->create('zanode', $id, 'getVNC'); - - $this->view->url = $node->ip . ":" . $node->hzap; - $this->view->host = !empty($vnc->hostIP) ? $vnc->hostIP:''; - $this->view->token = !empty($vnc->token) ? $vnc->token:''; - $this->view->title = $this->lang->zanode->view; - $this->view->zanode = $node; + $this->view->url = $node->ip . ":" . $node->hzap; + $this->view->host = !empty($vnc->hostIP) ? $vnc->hostIP:''; + $this->view->token = !empty($vnc->token) ? $vnc->token:''; + $this->view->title = $this->lang->zanode->view; + $this->view->zanode = $node; $this->view->snapshotList = $this->zanode->getSnapshotList($id); - $this->view->actions = $this->loadModel('action')->getList('zanode', $id); - $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->initBash = sprintf(zget($this->config->zanode->versionToOs, $node->osName, '') != '' ? $this->config->zanode->initPosh : $this->config->zanode->initBash, $node->secret, getWebRoot(true)); + $this->view->actions = $this->loadModel('action')->getList('zanode', $id); + $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->display(); } @@ -564,8 +563,9 @@ class zanode extends control if ($node->status != 'running') { $serviceStatus['ZenAgent'] = "unknown"; - $serviceStatus['ZTF'] = "unknown"; + $serviceStatus['ZTF'] = "unknown"; } + $node->status = $node->status == 'online' ? 'ready' : $node->status; $serviceStatus['node'] = $node->status; return $this->send(array('result' => 'success', 'message' => '', 'data' => $serviceStatus)); @@ -626,4 +626,16 @@ class zanode extends control return $this->send(array('result' => 'success', 'message' => 'success')); } } + + /** + * Ajax:get nodes. + * + * @access public + * @return void + */ + public function ajaxGetNodes() + { + $nodeList = $this->zanode->getPairs(); + return print(html::select("node", $nodeList, '', "class='form-control picker-select'")); + } } diff --git a/module/zanode/css/browse.css b/module/zanode/css/browse.css index 648be7123d..64b697e35c 100644 --- a/module/zanode/css/browse.css +++ b/module/zanode/css/browse.css @@ -1,9 +1,12 @@ .c-id {width: 70px;} .c-memory{width: 100px;} -.c-status {width: 70px;} +.c-status {width: 90px;} .c-cpu, .c-host {width: 100px;} .c-ip{width: 150px;} .c-os, .c-type {width: 120px;} .desktop, .createImage{margin-right: 4px;} #helpTab .icon-help {line-height: unset;} #bysearchTab {margin-right: 0px;} + +.c-actions a img{position: relative; left: -80px; filter: drop-shadow(#18a6fd 80px 0); width: 18px;} +.c-actions a.disabled img {filter: drop-shadow(#313c52 80px 0);} diff --git a/module/zanode/css/browsesnapshot.css b/module/zanode/css/browsesnapshot.css index d5033bef8f..583507c6a8 100644 --- a/module/zanode/css/browsesnapshot.css +++ b/module/zanode/css/browsesnapshot.css @@ -1,4 +1,5 @@ #main{min-width: 0!important;padding:0!important;} +#main .container{padding:0!important;} body{background-color: #fff!important;} .c-createdBy {width: 100px;} diff --git a/module/zanode/css/common.css b/module/zanode/css/common.css index 1ef909a85b..8190cc895c 100644 --- a/module/zanode/css/common.css +++ b/module/zanode/css/common.css @@ -1 +1,3 @@ .icon-help{line-height: 34px;} +#osNamePhysicsContainer{display: flex;} +#osNamePhysicsContainer select{margin-right: 5px;} \ No newline at end of file diff --git a/module/zanode/css/view.css b/module/zanode/css/view.css index 66481a016a..14980da02f 100644 --- a/module/zanode/css/view.css +++ b/module/zanode/css/view.css @@ -7,14 +7,16 @@ .zanode-mt-8{margin-top: 8px;} .zanode-status-text{margin-left: 10px;font:small-caption;color:#838a9d;} .zanode-status-text i{color:#18a6fd} -.status-notice{margin-top: 8px;margin-left: 18px;line-height: 28px;} +.status-notice{margin-top: 16px;line-height: 28px;} .status-notice a{color: #2463c7;} .service-status a{color: #2463c7;} -.service-status{margin-top: 10px;} +.service-status{margin-top: 5px;} .vnc-detail{height: 60vh;min-height: 550px;} .vnc-mask{width: 100%;height:100%;background-color: rgba(0,0,0,0);position: absolute;z-index: 1;} .checkStatus{color: #313c52;} .node-not-wrap{white-space: nowrap;} .btn-info {background-color: unset;} .btn.disabled i {color: #fff;} -#serviceContent{min-height: 120px;} +.btn-toolbar a img{margin-bottom: 2px;} +.zanode-init{padding:15px;background: #f4f5f7;margin:10px 0;} +.btn-snap-create{height: 30px;} diff --git a/module/zanode/js/create.js b/module/zanode/js/create.js index bd96c2ca22..efad795dbe 100644 --- a/module/zanode/js/create.js +++ b/module/zanode/js/create.js @@ -1,12 +1,18 @@ -function zahostType() +/** + * Change zanode type. + * + * @access public + * @return void + */ +function zanodeType() { - if($('#type').val() == 'physics') + if($('#hostType').val() == 'physics') { $('#parent').closest('tr').hide(); $('#image').closest('tr').hide(); $('#extranet').closest('tr').removeClass('hidden'); $('#osName').addClass('hidden'); - $('#osNamePhysics').removeClass('hidden'); + $('#osNamePhysicsContainer').removeClass('hidden'); } else { @@ -14,6 +20,48 @@ function zahostType() $('#image').closest('tr').show(); $('#extranet').closest('tr').addClass('hidden'); $('#osName').removeClass('hidden'); - $('#osNamePhysics').addClass('hidden'); + $('#osNamePhysicsContainer').addClass('hidden'); } } + +/** + * Load hosts. + * + * @access public + * @return void + */ +function loadHosts() +{ + var hostLink = createLink('zahost', 'ajaxGetHosts'); + $('#hostIdBox').load(hostLink, function() + { + $('#hostIdBox').find('#parent').chosen(); + }); +} + +$(function() +{ + $('#osNamePhysicsPre').on('change', function() + { + console.log($(this).val()) + if($(this).val() == 'linux') + { + $('#osNamePhysics').empty(); + for(var i in linuxList) + { + console.log(linuxList[i]) + $('#osNamePhysics').append('') + } + } + else + { + $('#osNamePhysics').empty(); + for(var i in windowsList) + { + console.log(windowsList[i]) + $('#osNamePhysics').append('') + } + } + $('#osNamePhysics').trigger('chosen:updated'); + }) +}) \ No newline at end of file diff --git a/module/zanode/js/view.js b/module/zanode/js/view.js index d46022f99f..59059bd739 100644 --- a/module/zanode/js/view.js +++ b/module/zanode/js/view.js @@ -36,7 +36,14 @@ function checkServiceStatus(){ { if(resultData.data[key] == 'unknown') { - $('.ztf-status').text(zanodeLang.init.unknown) + if(hostType == 'physics') + { + $('.ztf-status').text(zanodeLang.init.not_install) + } + else + { + $('.ztf-status').text(zanodeLang.init.unknown) + } } else { @@ -47,7 +54,7 @@ function checkServiceStatus(){ } else if(key == "node") { - if(nodeStatus != resultData.data[key] && resultData.data[key]) + if(resultData.data[key] && zanodeLang.statusList[nodeStatus] != zanodeLang.statusList[resultData.data[key]]) { window.location.reload(); } @@ -88,14 +95,14 @@ function checkServiceStatus(){ if(!isSuccess) { - // $('.init-fail').show(); + $('.init-fail').show(); $('.init-success').hide(); } else { clearInterval(checkInterval) $('.init-success').show(); - // $('.init-fail').hide(); + $('.init-fail').hide(); } setTimeout(function() { $('#serviceContent').removeClass('loading'); @@ -161,6 +168,28 @@ $('.btn-pwd-copy').live('click', function() }, 2000) }) +$('.btn-init-copy').live('click', function() +{ + var copyText = $('#initBash'); + copyText.show(); + copyText .select(); + document.execCommand("Copy"); + copyText.hide(); + $('.btn-init-copy').tooltip({ + trigger: 'click', + placement: 'top', + title: zanodeLang.copied, + tipClass: 'tooltip-success' + }); + + $(this).tooltip('show'); + var that = this; + setTimeout(function() + { + $(that).tooltip('hide') + }, 2000) +}) + $('.btn-pwd-show').live('click', function() { var pwd = $('#pwd-copy').text(); @@ -188,6 +217,9 @@ $('#jumpManual').click(function() $(function(){ $('#checkServiceStatus').trigger("click") + if(hostType == 'physics'){ + return; + } checkInterval = setInterval(() => { intervalTimes++; if(intervalTimes > 300) diff --git a/module/zanode/lang/de.php b/module/zanode/lang/de.php index a3f4e4e192..6ccea2777f 100644 --- a/module/zanode/lang/de.php +++ b/module/zanode/lang/de.php @@ -22,6 +22,7 @@ $lang->zanode->getVNC = 'Remote management'; $lang->zanode->all = 'All'; $lang->zanode->byQuery = 'Search'; $lang->zanode->osName = 'System'; +$lang->zanode->osNamePhysics = 'System'; $lang->zanode->image = 'VM Image'; $lang->zanode->imageName = 'Image Name'; $lang->zanode->name = 'Name'; @@ -29,7 +30,8 @@ $lang->zanode->start = 'Start After Created'; $lang->zanode->hostName = 'Host Name'; $lang->zanode->host = $lang->zanode->hostName; $lang->zanode->extranet = 'IP/Domain'; -$lang->zanode->sshAddress = 'SSH Command'; +$lang->zanode->sshCommand = 'SSH Command'; +$lang->zanode->sshAddress = 'SSH Address'; $lang->zanode->osArch = 'Arch'; $lang->zanode->cpuCores = 'CPU'; $lang->zanode->defaultUser = 'Default Account Name'; @@ -53,6 +55,7 @@ $lang->zanode->confirmRestore = "The ZenAgent Node will be restored to this sna $lang->zanode->actionSuccess = 'Success'; $lang->zanode->deleted = "Deleted"; $lang->zanode->scriptPath = "Script path"; +$lang->zanode->syncToZentao = "Sync cases in the directory to Zentao"; $lang->zanode->shell = "Shell"; $lang->zanode->automation = "Automation"; $lang->zanode->install = "Install"; @@ -63,6 +66,9 @@ $lang->zanode->manual = 'Manual'; $lang->zanode->initializing = 'Initializing'; $lang->zanode->showPwd = 'Show Password'; $lang->zanode->hidePwd = 'Hide Password'; +$lang->zanode->baseInfo = 'Basic information'; +$lang->zanode->cpuUnit = 'CORE'; +$lang->zanode->IP = 'Extranet Address'; $lang->zanode->typeList['node'] = 'Virtual machine'; $lang->zanode->typeList['physics'] = 'Physical machine'; @@ -72,6 +78,7 @@ $lang->automation->scriptPath = $lang->zanode->scriptPath; $lang->automation->node = $lang->zanode->common; $lang->zanode->notFoundAgent = 'No Agent service is found'; +$lang->zanode->busy = 'This Node is %s, please wait for the operation to complete.'; $lang->zanode->createVmFail = 'Failed to create a ZenAgent Node'; $lang->zanode->noVncPort = 'Failed to get vnc port'; $lang->zanode->nameValid = "The name can only be letters, numbers, '-', '_', '.', and cannot start with a symbol"; @@ -134,6 +141,8 @@ $lang->zanode->statusList['destroy_fail'] = 'Destroy Fail'; $lang->zanode->statusList['wait'] = 'Initializing'; $lang->zanode->statusList['online'] = 'Online'; $lang->zanode->statusList['restoring'] = 'Restoring'; +$lang->zanode->statusList['creating_snap'] = 'Creating Snapshot'; +$lang->zanode->statusList['creating_img'] = 'Creating Image'; $lang->zanode->initNotice = "Succeeded. Please initialize the execution node or return to the list."; $lang->zanode->initButton = "Initialize"; @@ -148,9 +157,9 @@ $lang->zanode->init->ready = "Ready"; $lang->zanode->init->next = "Next"; $lang->zanode->init->button = "Go To Settings"; -$lang->zanode->init->initSuccessNoticeTitle = "The service is ready, and it takes two steps to execute the automated test on the execution node:
1. Configure the automated test running environment according to the %s
2. Go to %s"; -$lang->zanode->init->initFailNoticeTitle = "Initialization failed, check the init script execution log and try the following two solutions:"; -$lang->zanode->init->initFailNoticeDesc = "1. Re-execute the script
2. Review the initialization FAQ"; +$lang->zanode->init->initSuccessNoticeTitle = "The service is ready, and it takes two steps to execute the automated test on the execution node:
1. Configure the automated test running environment according to the %s
2. Go to %s"; +$lang->zanode->init->initFailNotice = "Fail,Execute the installation service command on the node or See Help."; +$lang->zanode->init->initFailNoticeOnPhysics = "The service has not been installed yet, please check the service status after executing the following command on the execution node。See Help"; $lang->zanode->init->serviceStatus = array( "ZenAgent" => 'not_install', diff --git a/module/zanode/lang/en.php b/module/zanode/lang/en.php index 6ea6e5acbd..a4d1e9b20e 100644 --- a/module/zanode/lang/en.php +++ b/module/zanode/lang/en.php @@ -22,6 +22,7 @@ $lang->zanode->getVNC = 'Remote management'; $lang->zanode->all = 'All'; $lang->zanode->byQuery = 'Search'; $lang->zanode->osName = 'System'; +$lang->zanode->osNamePhysics = 'System'; $lang->zanode->image = 'VM Image'; $lang->zanode->imageName = 'Image Name'; $lang->zanode->name = 'Name'; @@ -29,7 +30,8 @@ $lang->zanode->start = 'Start After Created'; $lang->zanode->hostName = 'Host Name'; $lang->zanode->host = $lang->zanode->hostName; $lang->zanode->extranet = 'IP/Domain'; -$lang->zanode->sshAddress = 'SSH Command'; +$lang->zanode->sshCommand = 'SSH Command'; +$lang->zanode->sshAddress = 'SSH Address'; $lang->zanode->osArch = 'Arch'; $lang->zanode->cpuCores = 'CPU'; $lang->zanode->defaultUser = 'Default Account Name'; @@ -53,6 +55,7 @@ $lang->zanode->confirmRestore = "The ZenAgent Node will be restored to this sna $lang->zanode->actionSuccess = 'Success'; $lang->zanode->deleted = "Deleted"; $lang->zanode->scriptPath = "Script path"; +$lang->zanode->syncToZentao = "Sync cases in the directory to Zentao"; $lang->zanode->shell = "Shell"; $lang->zanode->automation = "Automation"; $lang->zanode->install = "Install"; @@ -63,6 +66,9 @@ $lang->zanode->manual = 'Manual'; $lang->zanode->initializing = 'Initializing'; $lang->zanode->showPwd = 'Show Password'; $lang->zanode->hidePwd = 'Hide Password'; +$lang->zanode->baseInfo = 'Basic information'; +$lang->zanode->cpuUnit = 'CORE'; +$lang->zanode->IP = 'Extranet Address'; $lang->zanode->typeList['node'] = 'Virtual machine'; $lang->zanode->typeList['physics'] = 'Physical machine'; @@ -72,6 +78,7 @@ $lang->automation->scriptPath = $lang->zanode->scriptPath; $lang->automation->node = $lang->zanode->common; $lang->zanode->notFoundAgent = 'No Agent service is found'; +$lang->zanode->busy = 'This Node is %s, please wait for the operation to complete.'; $lang->zanode->createVmFail = 'Failed to create a ZenAgent Node'; $lang->zanode->noVncPort = 'Failed to get vnc port'; $lang->zanode->nameValid = "The name can only be letters, numbers, '-', '_', '.', and cannot start with a symbol"; @@ -134,6 +141,8 @@ $lang->zanode->statusList['destroy_fail'] = 'Destroy Fail'; $lang->zanode->statusList['wait'] = 'Initializing'; $lang->zanode->statusList['online'] = 'Online'; $lang->zanode->statusList['restoring'] = 'Restoring'; +$lang->zanode->statusList['creating_snap'] = 'Creating Snapshot'; +$lang->zanode->statusList['creating_img'] = 'Creating Image'; $lang->zanode->initNotice = "Succeeded. Please initialize the execution node or return to the list."; $lang->zanode->initButton = "Initialize"; @@ -148,9 +157,9 @@ $lang->zanode->init->ready = "Ready"; $lang->zanode->init->next = "Next"; $lang->zanode->init->button = "Go To Settings"; -$lang->zanode->init->initSuccessNoticeTitle = "The service is ready, and it takes two steps to execute the automated test on the execution node:
1. Configure the automated test running environment according to the %s
2. Go to %s"; -$lang->zanode->init->initFailNoticeTitle = "Initialization failed, check the init script execution log and try the following two solutions:"; -$lang->zanode->init->initFailNoticeDesc = "1. Re-execute the script
2. Review the initialization FAQ"; +$lang->zanode->init->initSuccessNoticeTitle = "The service is ready, and it takes two steps to execute the automated test on the execution node:
1. Configure the automated test running environment according to the %s
2. Go to %s"; +$lang->zanode->init->initFailNotice = "Fail,Execute the installation service command on the node or See Help."; +$lang->zanode->init->initFailNoticeOnPhysics = "The service has not been installed yet, please check the service status after executing the following command on the execution node。See Help"; $lang->zanode->init->serviceStatus = array( "ZenAgent" => 'not_install', diff --git a/module/zanode/lang/fr.php b/module/zanode/lang/fr.php index a3f4e4e192..6ccea2777f 100644 --- a/module/zanode/lang/fr.php +++ b/module/zanode/lang/fr.php @@ -22,6 +22,7 @@ $lang->zanode->getVNC = 'Remote management'; $lang->zanode->all = 'All'; $lang->zanode->byQuery = 'Search'; $lang->zanode->osName = 'System'; +$lang->zanode->osNamePhysics = 'System'; $lang->zanode->image = 'VM Image'; $lang->zanode->imageName = 'Image Name'; $lang->zanode->name = 'Name'; @@ -29,7 +30,8 @@ $lang->zanode->start = 'Start After Created'; $lang->zanode->hostName = 'Host Name'; $lang->zanode->host = $lang->zanode->hostName; $lang->zanode->extranet = 'IP/Domain'; -$lang->zanode->sshAddress = 'SSH Command'; +$lang->zanode->sshCommand = 'SSH Command'; +$lang->zanode->sshAddress = 'SSH Address'; $lang->zanode->osArch = 'Arch'; $lang->zanode->cpuCores = 'CPU'; $lang->zanode->defaultUser = 'Default Account Name'; @@ -53,6 +55,7 @@ $lang->zanode->confirmRestore = "The ZenAgent Node will be restored to this sna $lang->zanode->actionSuccess = 'Success'; $lang->zanode->deleted = "Deleted"; $lang->zanode->scriptPath = "Script path"; +$lang->zanode->syncToZentao = "Sync cases in the directory to Zentao"; $lang->zanode->shell = "Shell"; $lang->zanode->automation = "Automation"; $lang->zanode->install = "Install"; @@ -63,6 +66,9 @@ $lang->zanode->manual = 'Manual'; $lang->zanode->initializing = 'Initializing'; $lang->zanode->showPwd = 'Show Password'; $lang->zanode->hidePwd = 'Hide Password'; +$lang->zanode->baseInfo = 'Basic information'; +$lang->zanode->cpuUnit = 'CORE'; +$lang->zanode->IP = 'Extranet Address'; $lang->zanode->typeList['node'] = 'Virtual machine'; $lang->zanode->typeList['physics'] = 'Physical machine'; @@ -72,6 +78,7 @@ $lang->automation->scriptPath = $lang->zanode->scriptPath; $lang->automation->node = $lang->zanode->common; $lang->zanode->notFoundAgent = 'No Agent service is found'; +$lang->zanode->busy = 'This Node is %s, please wait for the operation to complete.'; $lang->zanode->createVmFail = 'Failed to create a ZenAgent Node'; $lang->zanode->noVncPort = 'Failed to get vnc port'; $lang->zanode->nameValid = "The name can only be letters, numbers, '-', '_', '.', and cannot start with a symbol"; @@ -134,6 +141,8 @@ $lang->zanode->statusList['destroy_fail'] = 'Destroy Fail'; $lang->zanode->statusList['wait'] = 'Initializing'; $lang->zanode->statusList['online'] = 'Online'; $lang->zanode->statusList['restoring'] = 'Restoring'; +$lang->zanode->statusList['creating_snap'] = 'Creating Snapshot'; +$lang->zanode->statusList['creating_img'] = 'Creating Image'; $lang->zanode->initNotice = "Succeeded. Please initialize the execution node or return to the list."; $lang->zanode->initButton = "Initialize"; @@ -148,9 +157,9 @@ $lang->zanode->init->ready = "Ready"; $lang->zanode->init->next = "Next"; $lang->zanode->init->button = "Go To Settings"; -$lang->zanode->init->initSuccessNoticeTitle = "The service is ready, and it takes two steps to execute the automated test on the execution node:
1. Configure the automated test running environment according to the %s
2. Go to %s"; -$lang->zanode->init->initFailNoticeTitle = "Initialization failed, check the init script execution log and try the following two solutions:"; -$lang->zanode->init->initFailNoticeDesc = "1. Re-execute the script
2. Review the initialization FAQ"; +$lang->zanode->init->initSuccessNoticeTitle = "The service is ready, and it takes two steps to execute the automated test on the execution node:
1. Configure the automated test running environment according to the %s
2. Go to %s"; +$lang->zanode->init->initFailNotice = "Fail,Execute the installation service command on the node or See Help."; +$lang->zanode->init->initFailNoticeOnPhysics = "The service has not been installed yet, please check the service status after executing the following command on the execution node。See Help"; $lang->zanode->init->serviceStatus = array( "ZenAgent" => 'not_install', diff --git a/module/zanode/lang/zh-cn.php b/module/zanode/lang/zh-cn.php index 8e0215ced4..5a89b72e9a 100644 --- a/module/zanode/lang/zh-cn.php +++ b/module/zanode/lang/zh-cn.php @@ -22,6 +22,7 @@ $lang->zanode->getVNC = '远程'; $lang->zanode->all = '全部'; $lang->zanode->byQuery = '搜索'; $lang->zanode->osName = '操作系统'; +$lang->zanode->osNamePhysics = '操作系统'; $lang->zanode->image = '镜像'; $lang->zanode->imageName = '镜像名称'; $lang->zanode->name = '名称'; @@ -29,7 +30,8 @@ $lang->zanode->start = '创建后自动开启'; $lang->zanode->hostName = '所属宿主机'; $lang->zanode->host = $lang->zanode->hostName; $lang->zanode->extranet = 'IP/域名'; -$lang->zanode->sshAddress = 'SSH命令'; +$lang->zanode->sshCommand = 'SSH命令'; +$lang->zanode->sshAddress = 'SSH地址'; $lang->zanode->osArch = '架构'; $lang->zanode->cpuCores = 'CPU'; $lang->zanode->defaultUser = '默认用户'; @@ -53,6 +55,7 @@ $lang->zanode->confirmRestore = "执行节点将会还原至此快照状态, $lang->zanode->actionSuccess = '操作成功'; $lang->zanode->deleted = "已删除"; $lang->zanode->scriptPath = "脚本目录"; +$lang->zanode->syncToZentao = "同步脚本信息到禅道"; $lang->zanode->shell = "shell命令"; $lang->zanode->automation = "自动化设置"; $lang->zanode->install = "安装"; @@ -63,6 +66,9 @@ $lang->zanode->manual = '手册'; $lang->zanode->initializing = '初始化中'; $lang->zanode->showPwd = '显示密码'; $lang->zanode->hidePwd = '隐藏密码'; +$lang->zanode->baseInfo = '基础信息'; +$lang->zanode->cpuUnit = '核'; +$lang->zanode->IP = 'IP/域名'; $lang->zanode->typeList['node'] = '虚拟机'; $lang->zanode->typeList['physics'] = '物理机'; @@ -72,6 +78,7 @@ $lang->automation->scriptPath = $lang->zanode->scriptPath; $lang->automation->node = $lang->zanode->common; $lang->zanode->notFoundAgent = '没有发现Agent服务'; +$lang->zanode->busy = '节点正在%s, 请等待操作完成'; $lang->zanode->createVmFail = '创建执行节点失败'; $lang->zanode->noVncPort = '无法获取执行节点端口'; $lang->zanode->nameValid = "名称只能是字母、数字,'-','_','.',且不能以符号开头"; @@ -121,19 +128,21 @@ $lang->zanode->apiError['notRunning'] = '请检查执行节点状态'; $lang->zanode->publicList[0] = '不共享'; $lang->zanode->publicList[1] = '共享'; -$lang->zanode->statusList['created'] = '已创建'; -$lang->zanode->statusList['launch'] = '运行中'; -$lang->zanode->statusList['ready'] = '运行中'; -$lang->zanode->statusList['running'] = '运行中'; -$lang->zanode->statusList['suspend'] = '休眠'; -$lang->zanode->statusList['offline'] = '下线'; -$lang->zanode->statusList['destroy'] = '已销毁'; -$lang->zanode->statusList['shutoff'] = '已关机'; -$lang->zanode->statusList['shutodown'] = '已关机'; -$lang->zanode->statusList['destroy_fail'] = '销毁失败'; -$lang->zanode->statusList['wait'] = '初始化中'; -$lang->zanode->statusList['online'] = '已上架'; -$lang->zanode->statusList['restoring'] = '还原中'; +$lang->zanode->statusList['created'] = '已创建'; +$lang->zanode->statusList['launch'] = '运行中'; +$lang->zanode->statusList['ready'] = '运行中'; +$lang->zanode->statusList['running'] = '运行中'; +$lang->zanode->statusList['suspend'] = '休眠'; +$lang->zanode->statusList['offline'] = '下线'; +$lang->zanode->statusList['destroy'] = '已销毁'; +$lang->zanode->statusList['shutoff'] = '已关机'; +$lang->zanode->statusList['shutodown'] = '已关机'; +$lang->zanode->statusList['destroy_fail'] = '销毁失败'; +$lang->zanode->statusList['wait'] = '初始化中'; +$lang->zanode->statusList['online'] = '运行中'; +$lang->zanode->statusList['restoring'] = '还原中'; +$lang->zanode->statusList['creating_snap'] = '创建快照中'; +$lang->zanode->statusList['creating_img'] = '导出镜像中'; $lang->zanode->initNotice = "保存成功,请初始化执行节点或返回列表。"; $lang->zanode->initButton = "去初始化"; @@ -148,9 +157,9 @@ $lang->zanode->init->ready = "已就绪"; $lang->zanode->init->next = "下一步"; $lang->zanode->init->button = "去设置"; -$lang->zanode->init->initSuccessNoticeTitle = "服务已就绪,还需两步即可在执行节点上执行自动化测试:
1、根据%s配置自动化测试运行环境。
2、进行%s"; -$lang->zanode->init->initFailNoticeTitle = "初始化失败,请查看初始化脚本执行日志并尝试以下两种解决方案:"; -$lang->zanode->init->initFailNoticeDesc = "1、 重新执行脚本
2、 查看初始化常见问题"; +$lang->zanode->init->initSuccessNoticeTitle = "服务已就绪,还需两步即可在执行节点上执行自动化测试:
1、根据%s配置自动化测试运行环境。
2、进行%s"; +$lang->zanode->init->initFailNotice = "服务未就绪,在执行节点上执行安装服务命令或查看帮助."; +$lang->zanode->init->initFailNoticeOnPhysics = "服务还没有安装,请在执行节点执行以下命令后检测服务状态。查看帮助"; $lang->zanode->init->serviceStatus = array( "ZenAgent" => 'not_install', diff --git a/module/zanode/model.php b/module/zanode/model.php index 313eb4d24b..592c7b1ea8 100644 --- a/module/zanode/model.php +++ b/module/zanode/model.php @@ -12,16 +12,19 @@ class zanodemodel extends model { - const STATUS_CREATED = 'created'; - const STATUS_LAUNCH = 'launch'; - const STATUS_FAIL_CREATE = 'vm_fail_create'; - const STATUS_RUNNING = 'running'; - const STATUS_SHUTOFF = 'shutoff'; - const STATUS_BUSY = 'busy'; - const STATUS_READY = 'ready'; - const STATUS_UNKNOWN = 'unknown'; - const STATUS_DESTROY = 'destroy'; - const STATUS_DESTROY_FAIL = 'vim_destroy_fail'; + const STATUS_CREATED = 'created'; + const STATUS_LAUNCH = 'launch'; + const STATUS_FAIL_CREATE = 'vm_fail_create'; + const STATUS_RUNNING = 'running'; + const STATUS_SHUTOFF = 'shutoff'; + const STATUS_BUSY = 'busy'; + const STATUS_READY = 'ready'; + const STATUS_UNKNOWN = 'unknown'; + const STATUS_DESTROY = 'destroy'; + const STATUS_RESTORING = 'restoring'; + const STATUS_CREATING_SNAP = 'creating_snap'; + const STATUS_CREATING_IMG = 'creating_img'; + const STATUS_DESTROY_FAIL = 'vim_destroy_fail'; const KVM_CREATE_PATH = '/api/v1/kvm/create'; const KVM_TOKEN_PATH = '/api/v1/virtual/getVncToken'; @@ -54,17 +57,29 @@ class zanodemodel extends model public function create() { $data = fixer::input('post') - ->setIF($this->post->type == 'physics', 'parent', 0) - ->setIF($this->post->type == 'physics', 'osName', $this->post->osNamePhysics) - ->remove('osNamePhysics') + ->setIF($this->post->hostType == 'physics', 'parent', 0) + ->setIF($this->post->hostType == 'physics', 'osName', $this->post->osNamePhysics) ->get(); + $data->type = "node"; + + if($data->hostType == 'physics') + { + $data->secret = md5($data->name . time()); + $data->status = "offline"; + } + else + { + $data->hostType = ''; + } + /* Batch check fields. */ $this->dao->update(TABLE_ZAHOST)->data($data) - ->batchCheck($data->type == 'node' ? $this->config->zanode->create->requiredFields : $this->config->zanode->create->physicsRequiredFields, 'notempty'); + ->batchCheck($data->hostType != 'physics' ? $this->config->zanode->create->requiredFields : $this->config->zanode->create->physicsRequiredFields, 'notempty'); if(dao::isError()) return false; + unset($data->osNamePhysics); if(!preg_match("/^(?!_)(?!-)(?!\.)[a-zA-Z0-9\_\.\-]+$/", $data->name)) { dao::$errors[] = $this->lang->zanode->nameValid; @@ -72,10 +87,10 @@ class zanodemodel extends model } /* If name already exists return error. */ - $node = $this->dao->select('*')->from(TABLE_ZAHOST)->where('name')->eq($data->name)->andWhere('type')->in('node,physics')->fetch(); + $node = $this->dao->select('*')->from(TABLE_ZAHOST)->where('name')->eq($data->name)->andWhere('type')->eq('node')->fetch(); if($node) return dao::$errors[] = $this->lang->zanode->nameUnique; - if($data->type == 'physics') + if($data->hostType == 'physics') { $ping = $this->loadModel('zahost')->checkAddress($data->extranet); if(!$ping) @@ -181,7 +196,12 @@ class zanodemodel extends model $result = json_decode(commonModel::http($agnetUrl . static::KVM_EXPORT_PATH, json_encode($param,JSON_NUMERIC_CHECK), null, array("Authorization:$node->tokenSN"))); - if(!empty($result) and $result->code == 'success') return $newID; + + if(!empty($result) and $result->code == 'success') + { + $this->dao->update(TABLE_HOST)->set('status')->eq(static::STATUS_CREATING_IMG)->where('id')->eq($node->id)->exec(); + return $newID; + } $this->dao->delete()->from(TABLE_IMAGE)->where('id')->eq($newID)->exec(); return false; @@ -239,11 +259,14 @@ class zanodemodel extends model if(!empty($result) and $result->code == 'success') { $this->loadModel('action')->create('zanode', $zanodeID, 'createdSnapshot', '', $data->name); + $this->dao->update(TABLE_HOST)->set('status')->eq(static::STATUS_CREATING_SNAP)->where('id')->eq($node->id)->exec(); + return $newID; } $this->dao->delete()->from(TABLE_IMAGE)->where('id')->eq($newID)->exec(); dao::$errors[] = (!empty($result) and !empty($result->msg)) ? $result->msg : $this->app->lang->fail; + return false; } @@ -286,11 +309,14 @@ class zanodemodel extends model if(!empty($result) and $result->code == 'success') { + $this->dao->update(TABLE_HOST)->set('status')->eq(static::STATUS_CREATING_SNAP)->where('id')->eq($node->id)->exec(); + return $newID; } $this->dao->delete()->from(TABLE_IMAGE)->where('id')->eq($newID)->exec(); dao::$errors[] = (!empty($result) and !empty($result->msg)) ? $result->msg : $this->app->lang->fail; + return false; } @@ -415,6 +441,11 @@ class zanodemodel extends model { $node = $this->getNodeByID($id); + if(in_array($node->status, array('restoring', 'creating_img', 'creating_snap'))) + { + return sprintf($this->lang->zanode->busy, $this->lang->zanode->statusList[$node->status]); + } + /* Prepare create params. */ $agnetUrl = 'http://' . $node->ip . ':' . $node->hzap; $path = '/api/v1/kvm/' . $node->name . '/' . $type; @@ -450,7 +481,7 @@ class zanodemodel extends model { $node = $this->getNodeByID($id); - if($node) + if($node && $node->hostType != 'physics') { $req = array( 'name' => $node->name ); $agnetUrl = 'http://' . $node->ip . ':' . $node->hzap; @@ -570,11 +601,11 @@ class zanodemodel extends model $query = str_replace('`hostID`', 't2.`id`', $query); } - $list = $this->dao->select("t1.*, t2.name as hostName, if(t1.type='node', t2.extranet, t1.extranet) extranet,if(t1.type='node', t3.osName, t1.osName) osName")->from(TABLE_ZAHOST)->alias('t1') + $list = $this->dao->select("t1.*, t2.name as hostName, if(t1.hostType='', t2.extranet, t1.extranet) extranet,if(t1.hostType='', t3.osName, t1.osName) osName")->from(TABLE_ZAHOST)->alias('t1') ->leftJoin(TABLE_ZAHOST)->alias('t2')->on('t1.parent = t2.id') ->leftJoin(TABLE_IMAGE)->alias('t3')->on('t3.id = t1.image') ->where('t1.deleted')->eq(0) - ->andWhere("((t1.type = 'node' and t2.type = 'zahost') or t1.type = 'physics')") + ->andWhere("t1.type = 'node'") ->beginIF($query)->andWhere($query)->fi() ->orderBy($orderBy) ->page($pager) @@ -587,7 +618,9 @@ class zanodemodel extends model foreach($list as $l) { - $host = zget($hosts, $l->parent); + $host = $l->hostType == '' ? zget($hosts, $l->parent) : clone $l; + $host->status = in_array($host->status, array('running', 'ready')) ? "online" : $host->status; + if($l->status == 'running' || $l->status == 'ready') { if(empty($host)) @@ -598,13 +631,13 @@ class zanodemodel extends model if($host->status != 'online' || time() - strtotime($host->heartbeat) > 60) { - $l->status = self::STATUS_SHUTOFF; + $l->status = $l->hostType == '' ? 'wait' : 'offline'; continue; } if(time() - strtotime($l->heartbeat) > 60) { - $l->status = 'wait'; + $l->status = $l->hostType == '' ? 'wait' : 'offline'; } } } @@ -622,7 +655,7 @@ class zanodemodel extends model { return $this->dao->select('*')->from(TABLE_ZAHOST) ->where('deleted')->eq(0) - ->andWhere("type")->eq('node') + ->andWhere("type")->in('node,physics') ->orderBy($orderBy) ->fetchAll('id'); } @@ -638,7 +671,7 @@ class zanodemodel extends model { return $this->dao->select('*')->from(TABLE_ZAHOST) ->where('deleted')->eq(0) - ->andWhere("type")->eq('node') + ->andWhere("type")->in('node,physics') ->orderBy($orderBy) ->fetchPairs('id', 'name'); } @@ -654,6 +687,8 @@ class zanodemodel extends model */ public function getListByHost($hostID, $orderBy = 'id_desc') { + if(!$hostID) return array(); + $list = $this->dao->select('id, name, vnc, cpuCores, memory, diskSize, osName, status, heartbeat')->from(TABLE_ZAHOST) ->where('deleted')->eq(0) ->andWhere("parent")->eq($hostID) @@ -786,15 +821,17 @@ class zanodemodel extends model */ public function getNodeByID($id) { - $node = $this->dao->select("t1.*, t2.name as hostName, t2.extranet as ip,t2.zap as hzap,if(t1.type='node', t3.osName, t1.osName) osName, t2.tokenSN as tokenSN, t2.secret as secret")->from(TABLE_ZAHOST) + $node = $this->dao->select("t1.*, t2.name as hostName, if(t1.hostType='', t2.extranet, t1.extranet) ip,t2.zap as hzap,if(t1.hostType='', t3.osName, t1.osName) osName, if(t1.hostType='', t2.tokenSN, t1.tokenSN) tokenSN, if(t1.hostType='', t2.secret, t1.secret) secret")->from(TABLE_ZAHOST) ->alias('t1') ->leftJoin(TABLE_ZAHOST)->alias('t2')->on('t1.parent = t2.id') ->leftJoin(TABLE_IMAGE)->alias('t3')->on('t3.id = t1.image') ->where('t1.id')->eq($id) ->fetch(); - $host = $this->loadModel("zahost")->getByID($node->type == 'node' ? $node->parent : $node->id); - if($node->status == 'running' || $node->status == 'ready') + $host = $node->hostType == '' ? $this->loadModel("zahost")->getByID($node->parent) : clone $node; + $host->status = in_array($host->status, array('running', 'ready')) ? "online" : $host->status; + + if($node->status == 'running' || $node->status == 'ready' || $node->status == 'online') { if(empty($host) || $host->status != 'online') { @@ -802,7 +839,7 @@ class zanodemodel extends model } elseif(time() - strtotime($node->heartbeat) > 60) { - $node->status = 'wait'; + $node->status = $node->hostType == '' ? 'wait' : 'offline'; } } @@ -820,8 +857,11 @@ class zanodemodel extends model $node = $this->dao->select('*')->from(TABLE_ZAHOST) ->where('mac')->eq($mac) ->fetch(); + if(empty($node)) return $node; + + $host = $node->hostType == '' ? $this->loadModel("zahost")->getByID($node->parent) : $node; + $host->status = in_array($host->status, array('running', 'ready')) ? "online" : $host->status; - $host = $this->loadModel("zahost")->getByID($node->parent); if($node->status == 'running' || $node->status == 'ready') { if(empty($host) || $host->status != 'online') @@ -1048,6 +1088,7 @@ class zanodemodel extends model { $now = helper::now(); $data = fixer::input('post') + ->remove('syncToZentao') ->setDefault('createdBy', $this->app->user->account) ->setDefault('createdDate', $now) ->setDefault('node', 0) @@ -1098,4 +1139,14 @@ class zanodemodel extends model return dao::$errors = $this->lang->zanode->runTimeout; } } + + /** + * Sync cases in dir to zentao. + * + * @access public + * @return void + */ + public function syncCasesToZentao($path) + { + } } diff --git a/module/zanode/view/browse.html.php b/module/zanode/view/browse.html.php index e586757bfa..fdae12124b 100644 --- a/module/zanode/view/browse.html.php +++ b/module/zanode/view/browse.html.php @@ -53,7 +53,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -80,26 +80,26 @@
gitlab->gitlabAvatar;?> gitlab->gitlabAccount;?> gitlab->gitlabEmail;?>gitlab->zentaoAccount;?>gitlab->zentaoEmail;?>gitlab->zentaoAccount;?> gitlab->bindingStatus;?>
avatar, "height=40");?> - realname;?> -
- account;?> +
+ avatar, "height=20 width=20 class='img-circle'");?> + realname . '@' . $gitlabUser->account;?> email;?>id]", $userPairs, '', "class='form-control select chosen'" );?>gitlab->notBind;?>id]", $userPairs, '', "class='form-control select chosen gitlab-user-bind'" );?>' . $lang->gitlab->notBind . '';?>
avatar, "height=40");?> - realname;?> -
- account;?> + avatar, "height=20 width=20 class='img-circle'");?> + realname . '@' . $gitlabUser->account;?>
email;?>id]", $userPairs, $gitlabUser->zentaoAccount, "class='form-control select chosen'" );?>id]", $userPairs, $gitlabUser->zentaoAccount, "class='form-control select chosen gitlab-user-bind'" );?> id, $bindedUsers)):?> zentaoAccount, '');?> @@ -64,7 +88,7 @@ ' . $lang->gitlab->bindedError . '';?> - gitlab->notBind;?> + ' . $lang->gitlab->notBind . '';?>
gitlab->name;?> gitlab->placeholder->name}'");?>
gitlab->url;?>
gogs->name;?>
gogs->url;?>
jenkins->name; ?>
jenkins->url; ?>
jenkins->account;?>
jenkins->token;?>jenkins->tokenFirst;?>jenkins->tokenFirst}'");?>
jenkins->password;?>jenkins->tips;?>jenkins->tips}'");?>
diff --git a/module/kanban/model.php b/module/kanban/model.php index fd8051f012..4f43e89ebd 100755 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -483,7 +483,8 @@ class kanbanModel extends model ->add('assignedDate', $now) ->add('color', '#fff') ->trim('name,estimate') - ->setDefault('estimate', 0) + ->setDefault('estimate,fromID', 0) + ->setDefault('fromType', '') ->stripTags($this->config->kanban->editor->createcard['id'], $this->config->allowedTags) ->join('assignedTo', ',') ->setIF(is_numeric($this->post->estimate), 'estimate', (float)$this->post->estimate) @@ -504,6 +505,9 @@ class kanbanModel extends model $card = $this->loadModel('file')->processImgURL($card, $this->config->kanban->editor->createcard['id'], $this->post->uid); + if(!$card->begin) unset($card->begin); + if(!$card->end) unset($card->end); + $this->dao->insert(TABLE_KANBANCARD)->data($card)->autoCheck() ->checkIF($card->estimate != '', 'estimate', 'float') ->batchCheck($this->config->kanban->createcard->requiredFields, 'notempty') diff --git a/module/product/model.php b/module/product/model.php index 538000b247..f2546bd56f 100755 --- a/module/product/model.php +++ b/module/product/model.php @@ -170,16 +170,13 @@ class productModel extends model { if(defined('TUTORIAL')) return $productID; - $product = $this->getById($productID); - if($productID == 0 and $this->cookie->preProductID and isset($products[$this->cookie->preProductID])) $productID = $this->cookie->preProductID; if($productID == 0 and $this->session->product == '') $productID = key($products); - if(!empty($product) and $product->shadow) $productID = key($products); $this->session->set('product', (int)$productID, $this->app->tab); if(!isset($products[$this->session->product])) { - if(!empty($product) and $product->id != $productID) $product = $this->getById($productID); + $product = $this->getById($productID); if(empty($product) or $product->deleted == 1) $productID = key($products); $this->session->set('product', (int)$productID, $this->app->tab); @@ -1772,14 +1769,14 @@ class productModel extends model $bugs = $this->dao->select('count(*) AS count')->from(TABLE_BUG)->where('product')->eq($productID)->andWhere('deleted')->eq(0)->fetch(); $docs = $this->dao->select('count(*) AS count')->from(TABLE_DOC)->where('product')->eq($productID)->andWhere('deleted')->eq(0)->fetch(); $releases = $this->dao->select('count(*) AS count')->from(TABLE_RELEASE)->where('deleted')->eq(0)->andWhere('product')->eq($productID)->fetch(); - $projects = $this->dao->select('count("t1.*") AS count')->from(TABLE_PROJECTPRODUCT)->alias('t1') + $projects = $this->dao->select('count(*) AS count')->from(TABLE_PROJECTPRODUCT)->alias('t1') ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id') ->where('t2.deleted')->eq(0) ->andWhere('t1.product')->eq($productID) ->andWhere('t2.type')->eq('project') ->fetch(); - $executions = $this->dao->select('count("t1.*") AS count')->from(TABLE_PROJECTPRODUCT)->alias('t1') + $executions = $this->dao->select('count(*) AS count')->from(TABLE_PROJECTPRODUCT)->alias('t1') ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id') ->where('t2.deleted')->eq(0) ->andWhere('t1.product')->eq($productID) diff --git a/module/project/control.php b/module/project/control.php index 7ec9d24580..bf15f03908 100755 --- a/module/project/control.php +++ b/module/project/control.php @@ -2348,16 +2348,19 @@ class project extends control * @param int $projectID * @param int $executionID * @param string $mode - * @param string $type + * @param string $type all|sprint|stage|kanban * @access public * @return void */ public function ajaxGetExecutions($projectID, $executionID = 0, $mode = '', $type = 'all') { + $project = $this->project->getById($projectID); $executions = array('' => '') + $this->loadModel('execution')->getPairs($projectID, $type, $mode); if($this->app->getViewType() == 'json') return print(json_encode($executionList)); - return print(html::select('execution', $executions, $executionID, "class='form-control'")); + + $disabled = $project->multiple ? '' : 'disabled'; + return print(html::select('execution', $executions, $executionID, "class='form-control $disabled' $disabled")); } /** diff --git a/module/project/model.php b/module/project/model.php index 565734be8d..575f710e1a 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -1957,7 +1957,7 @@ class projectModel extends model { $beginTimeStamp = strtotime($project->begin); $tasks = $this->dao->select('id,estStarted,deadline,status')->from(TABLE_TASK) - ->where('deadline')->ne('0000-00-00') + ->where('deadline')->notZeroDate() ->andWhere('status')->in('wait,doing') ->andWhere('project')->eq($projectID) ->fetchAll(); diff --git a/module/repo/control.php b/module/repo/control.php index c6f894d54f..54c3601dac 100644 --- a/module/repo/control.php +++ b/module/repo/control.php @@ -139,7 +139,7 @@ class repo extends control $this->app->loadLang('action'); - if($this->app->tab == 'project') + if($this->app->tab == 'project' or $this->app->tab == 'execution') { $products = $this->loadModel('product')->getProductPairsByProject($objectID); } @@ -154,7 +154,7 @@ class repo extends control $this->view->users = $this->loadModel('user')->getPairs('noletter|noempty|nodeleted|noclosed'); $this->view->products = $products; $this->view->projects = $this->loadModel('product')->getProjectPairsByProductIDList(array_keys($products)); - $this->view->relatedProjects = $this->app->tab == 'project' ? array($objectID) : array(); + $this->view->relatedProjects = ($this->app->tab == 'project' or $this->app->tab == 'execution') ? array($objectID) : array(); $this->view->serviceHosts = $this->loadModel('gitlab')->getPairs(); $this->view->objectID = $objectID; @@ -1382,6 +1382,50 @@ class repo extends control return $this->send(array('result' => 'success', 'revision' => $revision)); } + /** + * Import repos. + * + * @param int $server + * @access public + * @return void + */ + public function import($server = 0) + { + if($_POST) + { + $this->repo->batchCreate(); + + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->repo->createLink('maintain'))); + } + + $gitlabList = $this->loadModel('gitlab')->getList(); + $gitlab = empty($server) ? array_shift($gitlabList) : $this->gitlab->getById($server); + + $repoList = array(); + if(!empty($gitlab)) + { + $repoList = $this->gitlab->apiGetProjects($gitlab->id); + $existRepoList = $this->dao->select('serviceProject,name')->from(TABLE_REPO) + ->where('SCM')->eq(ucfirst($gitlab->type)) + ->andWhere('serviceHost')->eq($gitlab->id) + ->fetchPairs(); + foreach($repoList as $key => $repo) + { + if(isset($existRepoList[$repo->id])) unset($repoList[$key]); + } + } + + $products = $this->loadModel('product')->getPairs('', 0, '', 'all'); + + $this->view->gitlabPairs = $this->gitlab->getPairs(); + $this->view->products = $products; + $this->view->projects = $this->product->getProjectPairsByProductIDList(array_keys($products)); + $this->view->gitlab = $gitlab; + $this->view->repoList = array_values($repoList); + $this->display(); + } + /** * Ajax sync comment. * @@ -1705,12 +1749,19 @@ class repo extends control ->setDefault('projects', array()) ->get(); + $productIds = $postData->products; + if(empty($productIds)) + { + $products = $this->loadModel('product')->getPairs('', 0, '', 'all'); + $productIds = array_keys($products); + } /* Get all projects that can be accessed. */ - $accessProjects = $this->loadModel('product')->getProjectPairsByProductIDList($postData->products); + $accessProjects = $this->loadModel('product')->getProjectPairsByProductIDList($productIds); $selectedProjects = array_intersect(array_keys($accessProjects), $postData->projects); - return print (html::select('projects[]', $accessProjects, $selectedProjects, "class='form-control chosen' multiple")); + $name = isset($postData->number) ? "projects[{$postData->number}][]" : 'projects[]'; + return print (html::select($name, $accessProjects, $selectedProjects, "class='form-control chosen' multiple")); } /** diff --git a/module/repo/css/browse.css b/module/repo/css/browse.css index 9a157205eb..6cdbbf2e4d 100644 --- a/module/repo/css/browse.css +++ b/module/repo/css/browse.css @@ -13,6 +13,7 @@ #dropMenuRepo > div.table-row > div > div > ul > li > div {padding-left: 20px;} #dropMenuRepo > div.table-row > div > div > ul > li > ul {padding-left: 10px;} #repoList .hide-in-search .hidden {display: block !important; visibility: inherit !important;} +#mainMenu .btn-limit {max-width: unset !important;} #branchList {line-height: 25px;} #branchList .hide-in-search, #branchList .tree ul {padding-left: 20px;} diff --git a/module/repo/css/import.css b/module/repo/css/import.css new file mode 100644 index 0000000000..3b68af13d0 --- /dev/null +++ b/module/repo/css/import.css @@ -0,0 +1,8 @@ +#repoList td.form-actions {padding: 7px;} +#repoList td.form-actions a {line-height: 18px;} + +.main-table .table {cursor: default;} +.main-table thead>tr {border-bottom: none; height: 45px;} +.main-table tbody>tr {border-bottom: none; height: 42px;} +.icon-close {cursor: pointer;} +a.btn-active-text {line-height: 19px;} diff --git a/module/repo/js/import.js b/module/repo/js/import.js new file mode 100644 index 0000000000..cb3fa9e895 --- /dev/null +++ b/module/repo/js/import.js @@ -0,0 +1,53 @@ +/** + * Delete the project. + * + * @param object $icon + * @access public + * @return void + */ +function delItem(icon) +{ + $(icon).closest('tr').remove(); + checkItem(); +} + +/** + * Check the project. + * + * @access public + * @return void + */ +function checkItem() +{ + if(!$("#repoList tbody tr").length) $("#submit").prop('disabled', true); +} + +$(function() +{ + checkItem(); + + $(document).on('change', '[id^=product]', function() + { + var i = $(this).attr('id').replace(/[^0-9]/ig, ''); + var projects = $('#projects' + i).val(); + var products = $(this).val(); + $.post(createLink('repo', 'ajaxProjectsOfProducts'), {products, projects, 'number':i}, function(response) + { + $('#projectContainer' + i).html('').append(response); + $('#projects' + i).chosen().trigger("chosen:updated"); + }); + }); + +}); + +/** + * Change server. + * + * @access public + * @return void + */ +function selectServer() +{ + var server = $('#servers').val(); + window.location.href = createLink('repo', 'import', 'server=' + server); +} diff --git a/module/repo/lang/de.php b/module/repo/lang/de.php index 73f4cc4a63..90d9276f33 100644 --- a/module/repo/lang/de.php +++ b/module/repo/lang/de.php @@ -46,6 +46,11 @@ $lang->repo->httpClone = 'Clone with HTTP'; $lang->repo->cloneUrl = 'Clone URL'; $lang->repo->linkTask = 'Link Task'; $lang->repo->unlinkedTasks = 'Unlinked Tasks'; +$lang->repo->importAction = 'Import Repo'; +$lang->repo->import = 'Import'; +$lang->repo->importName = 'Name after import'; +$lang->repo->importServer = 'Please select a server'; +$lang->repo->gitlabList = 'Gitlab Repo'; $lang->repo->submit = 'Submit'; $lang->repo->cancel = 'Cancel'; diff --git a/module/repo/lang/en.php b/module/repo/lang/en.php index 2c2c3b9d26..7d3a299d1b 100644 --- a/module/repo/lang/en.php +++ b/module/repo/lang/en.php @@ -46,6 +46,11 @@ $lang->repo->httpClone = 'Clone with HTTP'; $lang->repo->cloneUrl = 'Clone URL'; $lang->repo->linkTask = 'Link Task'; $lang->repo->unlinkedTasks = 'Unlinked Tasks'; +$lang->repo->importAction = 'Import Repo'; +$lang->repo->import = 'Import'; +$lang->repo->importName = 'Name after import'; +$lang->repo->importServer = 'Please select a server'; +$lang->repo->gitlabList = 'Gitlab Repo'; $lang->repo->submit = 'Submit'; $lang->repo->cancel = 'Cancel'; diff --git a/module/repo/lang/fr.php b/module/repo/lang/fr.php index 3fe607091f..4a1f2a0c11 100644 --- a/module/repo/lang/fr.php +++ b/module/repo/lang/fr.php @@ -46,6 +46,11 @@ $lang->repo->httpClone = 'Clone with HTTP'; $lang->repo->cloneUrl = 'Clone URL'; $lang->repo->linkTask = 'Link Task'; $lang->repo->unlinkedTasks = 'Unlinked Tasks'; +$lang->repo->importAction = 'Import Repo'; +$lang->repo->import = 'Import'; +$lang->repo->importName = 'Name after import'; +$lang->repo->importServer = 'Please select a server'; +$lang->repo->gitlabList = 'Gitlab Repo'; $lang->repo->submit = 'Soumettre'; $lang->repo->cancel = 'Annuler'; diff --git a/module/repo/lang/zh-cn.php b/module/repo/lang/zh-cn.php index 42654aa451..3f5db6da02 100644 --- a/module/repo/lang/zh-cn.php +++ b/module/repo/lang/zh-cn.php @@ -32,7 +32,7 @@ $lang->repo->blameTmpl = '第 %line 行代码相关信息 $lang->repo->notRelated = '暂时没有关联禅道对象'; $lang->repo->browseAction = '浏览代码库'; -$lang->repo->createAction = '创建代码库'; +$lang->repo->createAction = '添加代码库'; $lang->repo->editAction = '编辑代码库'; $lang->repo->diffAction = '版本对比'; $lang->repo->downloadAction = '下载代码库文件'; @@ -46,6 +46,11 @@ $lang->repo->httpClone = '使用HTTP克隆'; $lang->repo->cloneUrl = '克隆地址'; $lang->repo->linkTask = '关联任务'; $lang->repo->unlinkedTasks = '未关联任务'; +$lang->repo->importAction = '导入代码库'; +$lang->repo->import = '导入'; +$lang->repo->importName = '导入后的名称'; +$lang->repo->importServer = '请选择服务器'; +$lang->repo->gitlabList = 'Gitlab代码库'; $lang->repo->submit = '提交'; $lang->repo->cancel = '取消'; diff --git a/module/repo/model.php b/module/repo/model.php index abfacaf628..2f9c73a193 100644 --- a/module/repo/model.php +++ b/module/repo/model.php @@ -120,6 +120,16 @@ class repoModel extends model ->page($pager) ->fetchAll('id'); + if($getCodePath) + { + $gitlabRepos = array(); + foreach($repos as $repo) + { + if($repo->SCM == 'Gitlab') $gitlabRepos[$repo->id] = $repo; + } + $this->loadModel('gitlab')->apiMultiGetProjects($gitlabRepos); + } + /* Get products. */ $productIdList = $this->loadModel('product')->getProductIDByProject($projectID, false); foreach($repos as $i => $repo) @@ -244,6 +254,67 @@ class repoModel extends model return $repoID; } + /** + * Batch create repos. + * + * @access public + * @return bool + */ + public function batchCreate() + { + $repos = fixer::input('post')->get(); + + $dataAry = array(); + foreach($repos as $key => $val) + { + if(strpos($key, 'serviceProject') === 0) + { + $i = substr($key, 14); + if(empty($repos->{'product' . $i})) dao::$errors['product' . $i][] = sprintf($this->lang->error->notempty, $this->lang->repo->product); + if(empty($repos->{'name' . $i})) dao::$errors['name' . $i][] = sprintf($this->lang->error->notempty, $this->lang->repo->name); + + if(!empty($repos->{'product' . $i}) and !empty($repos->{'name' . $i})) $dataAry[] = array('serviceProject' => $repos->{'serviceProject' . $i}, 'product' => implode(',', $repos->{'product' . $i}), 'name' => $repos->{'name' . $i}, 'projects' => empty($repos->projects[$i]) ? '' : implode(',', $repos->projects[$i])); + } + } + if(dao::isError()) return false; + + foreach($dataAry as $data) + { + $repo = new stdclass(); + $repo->serviceHost = $repos->serviceHost; + $repo->serviceProject = $data['serviceProject']; + $repo->product = $data['product']; + $repo->name = $data['name']; + $repo->projects = $data['projects']; + $repo->SCM = 'Gitlab'; + $repo->encoding = 'utf-8'; + $repo->encrypt = 'base64'; + + $this->dao->insert(TABLE_REPO)->data($repo) + ->batchCheck($this->config->repo->create->requiredFields, 'notempty') + ->check('serviceHost,serviceProject', 'notempty') + ->check('name', 'unique', "`SCM` = '{$repo->SCM}'") + ->check('serviceProject', 'unique', "`SCM` = '{$repo->SCM}' and `serviceHost` = '{$repo->serviceHost}'") + ->autoCheck() + ->exec(); + + if(dao::isError()) return false; + + $repoID = $this->dao->lastInsertID(); + + if($repo->SCM == 'Gitlab') + { + /* Add webhook. */ + $repo = $this->getRepoByID($repoID); + $this->loadModel('gitlab')->addPushWebhook($repo); + } + + $actionID = $this->loadModel('action')->create('repo', $repoID, 'created'); + } + + return true; + } + /** * Update a repo. * diff --git a/module/repo/view/import.html.php b/module/repo/view/import.html.php new file mode 100644 index 0000000000..cc1fe06a60 --- /dev/null +++ b/module/repo/view/import.html.php @@ -0,0 +1,65 @@ + + * @package repo + * @version $Id$ + * @link http://www.zentao.net + */ +?> + + +
+ + id);?> + + + + + + + + + + + + $repo): ?> + + + + + + + + + + + + + + +
repo->gitlabList;?>repo->importName;?>repo->product;?>repo->projects;?>
+ id);?> + name_with_namespace;?> + + name, "class='form-control'");?> +
+ repo->import); ?> + + app->tab == 'devops') echo html::a(inlink('maintain', ""), $lang->goback, '', 'class="btn btn-wide"');?> + +
+ +
+ diff --git a/module/repo/view/maintain.html.php b/module/repo/view/maintain.html.php index 0351fe1171..c22c59515e 100644 --- a/module/repo/view/maintain.html.php +++ b/module/repo/view/maintain.html.php @@ -16,7 +16,8 @@ createLink('repo', 'maintain'), "{$lang->repo->maintain}", '', "class='btn btn-link btn-active-text'");?>
- " . $this->lang->repo->create, '', "class='btn btn-primary'");?> + " . $this->lang->repo->importAction, '', "class='btn btn-link'");?> + " . $this->lang->repo->createAction, '', "class='btn btn-primary'");?>
diff --git a/module/sonarqube/css/create.css b/module/sonarqube/css/create.css index 22cf991723..bf9498be54 100644 --- a/module/sonarqube/css/create.css +++ b/module/sonarqube/css/create.css @@ -1,2 +1,4 @@ .table-form .c-name {width: 130px;} .table-form .c-input {width: 650px;} +.main-content>.center-block {max-width: 900px;} +#sonarqubeForm table {width: 700px;} diff --git a/module/sonarqube/view/create.html.php b/module/sonarqube/view/create.html.php index 2aa74e49d2..35988a653b 100644 --- a/module/sonarqube/view/create.html.php +++ b/module/sonarqube/view/create.html.php @@ -22,7 +22,6 @@
sonarqube->name;?> sonarqube->placeholder->name}'");?>
sonarqube->url;?>
zanode->common;?>node) ? $automation->node : '', "class='form-control picker-select'");?>node) ? $automation->node : '', "class='form-control picker-select'");?> + createLink('zanode', 'create'), $lang->zanode->create, '', "class='text-primary' target='_blank'");?> + ", '', "class='btn btn-icon refresh' data-toggle='tooltip' title='{$lang->refresh}' onclick='loadNodes()'");?> +
zanode->scriptPath;?> scriptPath) ? $automation->scriptPath : '', "class='form-control'");?>scriptPath) ? $automation->scriptPath : '', "class='form-control' placeholder='{$lang->zanode->scriptTips}'");?> -
zanode->shell;?> shell) ? $automation->shell : '', "rows='6' class='form-control'");?>shell) ? $automation->shell : '', "rows='6' class='form-control' placeholder='{$lang->zanode->shellTips}'");?> -
idAB); ?> zanode->name); ?>zahost->type); ?> zanode->extranet); ?> zanode->cpuCores); ?> zanode->memory); ?>
id; ?> inlink('view', "id=$node->id"), $node->name, '', ""); ?>hostType == 'physics' ? $this->lang->zanode->typeList['physics'] : $this->lang->zanode->typeList['node']; ?> extranet; ?> zanode->os->cpuCores, $node->cpuCores); ?> memory . $this->lang->zahost->unitList['GB']; ?> zanode->suspend}' target='hiddenwin'"; - $suspendAttr .= $node->type == 'physics' || $node->status != 'running' ? ' class="btn disabled"' : "class='btn' target='hiddenwin' onclick='if(confirm(\"{$lang->zanode->confirmSuspend}\")==false) return false;'"; + $suspendAttr .= $node->hostType == 'physics' || $node->status != 'running' ? ' class="btn disabled"' : "class='btn' target='hiddenwin' onclick='if(confirm(\"{$lang->zanode->confirmSuspend}\")==false) return false;'"; $resumeAttr = "title='{$lang->zanode->resume}' target='hiddenwin'"; - $resumeAttr .= $node->type == 'physics' || $node->status == 'running' || $node->status == 'wait' ? ' class="btn disabled"' : "class='btn' target='hiddenwin' onclick='if(confirm(\"{$lang->zanode->confirmResume}\")==false) return false;'"; + $resumeAttr .= $node->hostType == 'physics' || $node->status == 'running' || $node->status == 'wait' ? ' class="btn disabled"' : "class='btn' target='hiddenwin' onclick='if(confirm(\"{$lang->zanode->confirmResume}\")==false) return false;'"; $rebootAttr = "title='{$lang->zanode->reboot}' target='hiddenwin'"; - $rebootAttr .= $node->type == 'physics' || $node->status == 'shutoff' || $node->status == 'wait' ? ' class="btn disabled"' : "class='btn' target='hiddenwin' onclick='if(confirm(\"{$lang->zanode->confirmReboot}\")==false) return false;'"; + $rebootAttr .= $node->hostType == 'physics' || in_array($node->status, array('wait', 'creating_img', 'creating_snap', 'restoring', 'shutoff')) ? ' class="btn disabled"' : "class='btn' target='hiddenwin' onclick='if(confirm(\"{$lang->zanode->confirmReboot}\")==false) return false;'"; $closeAttr = "title='{$lang->zanode->shutdown}'"; - $closeAttr .= $node->type == 'physics' || $node->status == 'wait' ? ' class="btn disabled"' : ' class="btn iframe"'; + $closeAttr .= $node->hostType == 'physics' || in_array($node->status, array('wait', 'creating_img', 'creating_snap', 'restoring')) ? ' class="btn disabled"' : ' class="btn iframe"'; $startAttr = "title='{$lang->zanode->boot}'"; - $startAttr .= $node->type == 'physics' || $node->status == 'wait' ? ' class="btn disabled"' : ' class="btn iframe"'; + $startAttr .= $node->hostType == 'physics' || in_array($node->status, array('wait', 'creating_img', 'creating_snap', 'restoring')) ? ' class="btn disabled"' : ' class="btn iframe"'; $snapshotAttr = "title='{$lang->zanode->createSnapshot}'"; - $snapshotAttr .= $node->type == 'physics' || $node->status != 'running' ? ' class="btn disabled"' : ' class="btn iframe"'; + $snapshotAttr .= $node->hostType == 'physics' || $node->status != 'running' ? ' class="btn disabled"' : ' class="btn iframe"'; - $imageAttr = $node->status != 'running' ? ' class="btn btn-action iframe createImage disabled"' : ' class="btn btn-action iframe createImage"'; + $imageAttr = $node->hostType == 'physics' || $node->status != 'running' && $node->status != 'creating_img' ? ' class="btn btn-action iframe createImage disabled"' : ' class="btn btn-action iframe createImage"'; - common::printLink('zanode', 'getVNC', "id={$node->id}", " ", (in_array($node->status ,array('running', 'launch', 'wait')) ? '_blank' : ''), "title='{$lang->zanode->getVNC}' class='btn desktop " . (in_array($node->status ,array('running', 'launch', 'wait')) ? '':'disabled') . "'", ''); + common::printLink('zanode', 'getVNC', "id={$node->id}", " ", (in_array($node->status ,array('running', 'launch', 'wait')) ? '_blank' : ''), "title='{$lang->zanode->getVNC}' class='btn desktop " . ($node->hostType == '' && in_array($node->status ,array('running', 'launch', 'wait')) ? '':'disabled') . "'", ''); if($node->status == "suspend") { common::printLink('zanode', 'resume', "zanodeID={$node->id}", " ", '', $resumeAttr); @@ -119,7 +119,7 @@ } common::printLink('zanode', 'reboot', "zanodeID={$node->id}", " ", '', $rebootAttr); - common::printLink('zanode', 'createSnapshot', "zanodeID={$node->id}", " ", '', $snapshotAttr, true, true); + common::printLink('zanode', 'createSnapshot', "zanodeID={$node->id}", " ", '', $snapshotAttr, true, true); if(common::hasPriv('zanode', 'createImage') or common::hasPriv('zanode', 'destroy')) { diff --git a/module/zanode/view/create.html.php b/module/zanode/view/create.html.php index 19f1a570df..67829d80d7 100644 --- a/module/zanode/view/create.html.php +++ b/module/zanode/view/create.html.php @@ -13,6 +13,8 @@ getModuleRoot() . 'common/view/kindeditor.html.php';?> +zanode->linuxList);?> +zanode->windowsList);?>
@@ -22,15 +24,15 @@
- + - + - - + + @@ -71,8 +73,10 @@ diff --git a/module/zanode/view/edit.html.php b/module/zanode/view/edit.html.php index e733b205a0..603cc39b6a 100644 --- a/module/zanode/view/edit.html.php +++ b/module/zanode/view/edit.html.php @@ -21,7 +21,7 @@
zahost->type;?>zanode->typeList, 'virtual', "class='form-control chosen' onchange='zahostType()'")?>zanode->typeList, 'virtual', "class='form-control chosen' onchange='zanodeType()'")?>
zanode->hostName;?>createLink('zahost', 'create', array(), '', true), $lang->zahost->create, '', "class='text-primary iframe'");?>
zanode->name;?>
zanode->osName;?> - - + +
- type == 'node'):?> + hostType != 'physics'):?> @@ -29,17 +29,17 @@ - + - type == 'node'):?> + hostType != 'physics'):?> - + @@ -69,7 +69,7 @@ - + diff --git a/module/zanode/view/view.html.php b/module/zanode/view/view.html.php index 9a9c9ad15c..57e56571cb 100644 --- a/module/zanode/view/view.html.php +++ b/module/zanode/view/view.html.php @@ -21,11 +21,13 @@ id) ?> zanode); ?> status); ?> +hostType); ?> -session->zanodeList ? $this->session->zanodeList : $this->createLink('zanode', 'browse', ""); ?> +session->zanodeList ? $this->session->zanodeList : $this->createLink('zanode', 'browse', "");?> id}&orderBy=%s"; $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccount : $config->zanode->defaultAccount; +$ssh = $zanode->hostType == 'physics' ? ('ssh ' . $zanode->extranet) : ($zanode->ssh ? 'ssh ' . $account . '@' . $zanode->ip . ' -p ' . $zanode->ssh : ''); ?>
zanode->hostName;?> name, "class='form-control' readonly='readonly'");?>
zanode->name;?>name, "class='form-control' placeholder=\"{$lang->zanode->nameValid}\" readonly='readonly'");?>name, "class='form-control' placeholder=\"{$lang->zanode->nameValid}\" " . ($zanode->hostType != 'physics' ? "readonly='readonly'" : ''));?>
zanode->image;?> name, "class='form-control' readonly='readonly'");?>
zahost->IP;?>zanode->IP;?> extranet, "class='form-control' readonly='readonly'");?>
zanode->osName;?>osName, "class='form-control' readonly='readonly'")?>hostType != 'physics' ? $zanode->osName : zget($config->zanode->linuxList, $zanode->osName, zget($config->zanode->windowsList, $zanode->osName)), "class='form-control' readonly='readonly'")?>
zanode->desc ?>