diff --git a/config/zentaopms.php b/config/zentaopms.php index 77f092763d..d322da99af 100644 --- a/config/zentaopms.php +++ b/config/zentaopms.php @@ -428,6 +428,7 @@ $config->maxPriValue = '256'; $config->importWhiteList = array('user', 'task', 'story', 'bug', 'testcase', 'feedback', 'ticket'); $config->featureGroup = new stdclass(); +$config->featureGroup->my = array('score'); $config->featureGroup->product = array('roadmap', 'track', 'UR'); $config->featureGroup->scrum = array(); $config->featureGroup->waterfall = array(); diff --git a/framework/helper.class.php b/framework/helper.class.php index 38b42bf5b6..b368adf933 100644 --- a/framework/helper.class.php +++ b/framework/helper.class.php @@ -305,6 +305,43 @@ class helper extends baseHelper { throw EndResponseException::create($content); } + + /** + * Get date interval. + * + * @param string|int $begin + * @param string|int $end + * @param string $format %Y-%m-%d %H:%i:%s + * @static + * @access public + * @return object|string + */ + public static function getDateInterval($begin, $end = '', $format = '') + { + if(empty($end)) $end = time(); + if(is_int($begin)) $begin = date('Y-m-d H:i:s', $begin); + if(is_int($end)) $end = date('Y-m-d H:i:s', $end); + + $begin = date_create($begin); + $end = date_create($end); + $interval = date_diff($begin, $end); + + if($format) + { + $dateInterval = $interval->format($format); + } + else + { + $dateInterval = new stdClass(); + $dateInterval->year = $interval->format('%Y'); + $dateInterval->month = $interval->format('%m'); + $dateInterval->day = $interval->format('%d'); + $dateInterval->hour = $interval->format('%H'); + $dateInterval->minute = $interval->format('%i'); + $dateInterval->secound = $interval->format('%s'); + } + return $dateInterval; + } } /** diff --git a/module/admin/config.php b/module/admin/config.php index 2cb602a112..4af17ccfdd 100755 --- a/module/admin/config.php +++ b/module/admin/config.php @@ -7,11 +7,11 @@ $config->admin->log->saveDays = 30; if(!isset($config->safe)) $config->safe = new stdclass(); if(!isset($config->safe->weak)) $config->safe->weak = '123456,password,12345,12345678,qwerty,123456789,1234,1234567,abc123,111111,123123'; -$config->admin->menuGroup['system'] = array('custom|mode', 'backup', 'cron', 'action|trash', 'admin|xuanxuan', 'setting|xuanxuan', 'admin|license', 'admin|checkweak', 'admin|resetpwdsetting', 'admin|safe', 'custom|timezone', 'search|buildindex', 'admin|tableengine', 'ldap', 'custom|libreoffice'); +$config->admin->menuGroup['system'] = array('custom|mode', 'backup', 'cron', 'action|trash', 'admin|xuanxuan', 'setting|xuanxuan', 'admin|license', 'admin|checkweak', 'admin|resetpwdsetting', 'admin|safe', 'custom|timezone', 'search|buildindex', 'admin|tableengine', 'ldap', 'custom|libreoffice', 'conference', 'client'); $config->admin->menuGroup['user'] = array('dept', 'company', 'user', 'group'); $config->admin->menuGroup['switch'] = array('admin|setmodule'); $config->admin->menuGroup['model'] = array('auditcl', 'stage', 'design', 'cmcl', 'reviewcl', 'custom|required', 'custom|set', 'custom|flow', 'custom|code', 'custom|estimate', 'subject', 'process'); -$config->admin->menuGroup['feature'] = array('custom|set', 'custom|product', 'custom|execution', 'custom|required', 'custom|kanban', 'approvalflow', 'measurement', 'meetingroom', 'custom|browsestoryconcept', 'custom|kanban'); +$config->admin->menuGroup['feature'] = array('custom|set', 'custom|product', 'custom|execution', 'custom|required', 'custom|kanban', 'approvalflow', 'measurement', 'meetingroom', 'custom|browsestoryconcept', 'custom|kanban', 'sqlbuilder'); $config->admin->menuGroup['template'] = array('custom|set', 'baseline'); $config->admin->menuGroup['message'] = array('mail', 'webhook', 'sms', 'message'); $config->admin->menuGroup['dev'] = array('dev', 'entry'); @@ -61,12 +61,18 @@ $config->admin->plugins[194]->name = '应用巡检报告'; $config->admin->plugins[194]->desc = '每日生成公司级禅道应用巡检报告,促进项目管理持续改进。'; $config->admin->plugins[194]->viewLink = 'https://www.zentao.net/extension-viewExt-194.html'; -$config->admin->apiRoot = 'https://www.zentao.net/'; -$config->admin->classURL = 'https://www.zentao.net/publicclass.html'; -$config->admin->extensionURL = 'https://www.zentao.net/extension-browse.html'; -$config->admin->patchURL = 'https://www.zentao.net/extension-browse-byModule-1218.html'; -$config->admin->downloadURL = 'https://www.zentao.net/download.html'; -$config->admin->liteMenuList = array('system', 'user', 'feature', 'message', 'extension', 'dev'); +$config->admin->apiRoot = 'https://www.zentao.net'; +$config->admin->cdnRoot = 'https://cdn.easycorp.cn/web'; +$config->admin->classURL = 'https://www.zentao.net/publicclass.html'; +$config->admin->dynamicURL = 'https://www.zentao.net/download.html'; +$config->admin->extensionURL = 'https://www.zentao.net/extension-browse.html'; +$config->admin->patchURL = 'https://www.zentao.net/extension-browse-byModule-1218.html'; +$config->admin->apiSite = 'https://api.zentao.net/'; +$config->admin->extAPIURL = $config->admin->apiSite . 'extension-apiGetExtensions-'; +$config->admin->patchAPIURL = $config->admin->apiSite . 'extension-apiGetExtensions-bymodule-MTIxOA==-0-100-1.json'; +$config->admin->downloadAPIURL = $config->admin->apiSite . 'download.json'; +$config->admin->videoAPIURL = $config->admin->apiSite . 'publicclass.json'; +$config->admin->liteMenuList = array('system', 'user', 'feature', 'message', 'extension', 'dev'); $config->admin->helpURL['system'] = 'https://www.zentao.net/book/zentaopms/538.html'; $config->admin->helpURL['user'] = 'https://www.zentao.net/book/zentaopms/538.html'; diff --git a/module/admin/control.php b/module/admin/control.php index c49cd97b5e..f1e2141069 100755 --- a/module/admin/control.php +++ b/module/admin/control.php @@ -37,12 +37,15 @@ class admin extends control $hasInternet = $this->admin->checkInternet(); $clientLang = $this->app->getClientLang(); $langNotCN = common::checkNotCN(); + $dateUsed = $this->admin->genDateUsed(); $this->view->title = $this->lang->admin->common; $this->view->position[] = $this->lang->admin->index; $this->view->plugins = $this->admin->getExtensionsByAPI('plugin', $langNotCN ? 5 : 6, $hasInternet); - $this->view->patches = $this->admin->getExtensionsByAPI('patch', 3, $hasInternet); + $this->view->patches = $this->admin->getExtensionsByAPI('patch', 5, $hasInternet); + $this->view->dateUsed = $dateUsed; $this->view->hasInternet = $hasInternet; + $this->view->dynamics = ($hasInternet and !$langNotCN) ? $this->admin->getDynamicsByAPI(3) : array(); $this->view->publicClass = ($hasInternet and !$langNotCN) ? $this->admin->getPublicClassByAPI(3) : array(); $this->view->langNotCN = $langNotCN; $this->display(); @@ -257,17 +260,20 @@ class admin extends control { foreach($this->post->module as $module => $options) { + if($module == 'myScore') continue; $checked = reset($options); if(!$checked) $closedFeatures .= "$module,"; } } $closedFeatures = rtrim($closedFeatures, ','); $this->loadModel('setting')->setItem('system.common.closedFeatures', $closedFeatures); + $this->loadModel('setting')->setItem('system.common.global.scoreStatus', $this->post->module['myScore'][0]); $this->loadModel('custom')->processMeasrecordCron(); $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'top')); } $this->view->title = $this->lang->admin->setModuleIndex; $this->view->closedFeatures = $this->loadModel('setting')->getItem('owner=system&module=common§ion=&key=closedFeatures'); + $this->view->useScore = $this->loadModel('setting')->getItem('system.common.global.scoreStatus'); $this->view->disabledFeatures = $this->setting->getItem('owner=system&module=common§ion=&key=disabledFeatures'); $this->display(); } diff --git a/module/admin/css/index.css b/module/admin/css/index.css index 815c5a3265..2806765475 100755 --- a/module/admin/css/index.css +++ b/module/admin/css/index.css @@ -30,16 +30,18 @@ .admin > .main {flex: 1 1 70%;} .admin > .side {flex: 1 1 30%; margin-left: 16px; padding-right: 16px;} .panel-title {padding: 10px 0px;} -.panel {padding: 0 0 0 16px;} +.panel {padding-left: 16px;} .settings.panel, .plug.panel {margin-bottom: 16px;} +.main > .panel {padding-right: 8px;} .settings-list {display: flex; flex-wrap: wrap; padding: 0 4px 16px 4px;} -.settings-list > .setting-box.btn {flex: 1 1 18%; padding: 8px; border: 1px solid rgba(227, 228, 233, 0.6); margin-right: 10px; margin-top: 16px; display: flex; flex-direction: column; justify-content: space-between; cursor: pointer; white-space: unset; text-align: unset;} -.settings-list > .setting-box.btn:hover {background: unset;} -.settings-list > .setting-box.btn[disabled] {cursor: not-allowed; pointer-events: unset;} -.settings-list > .setting-box.btn[disabled] > a {pointer-events: none;} -.settings-list > .setting-box > h4 > img {padding-right: 8px; padding-bottom: 3px; width: 32px; height: 27px;} -.settings-list > .setting-box > .setting-desc {padding-bottom: 16px; color: #5E626D;} +.settings-list > .setting-box {border: unset; flex: 0 1 20%; padding: 8px;} +.settings-list > .setting-box > button.btn {padding: 16px 10px; height: 100%; width: 100%; display: flex; flex-direction: column; justify-content: space-between; cursor: pointer; white-space: unset; text-align: unset; border: 1px solid rgba(227, 228, 233, 0.6)} +.settings-list > .setting-box > .btn:hover {background: unset;} +.settings-list > .setting-box > .btn[disabled] {cursor: not-allowed; pointer-events: unset;} +.settings-list > .setting-box > .btn[disabled] > a {pointer-events: none;} +.settings-list > .setting-box > .btn > h4 > img {padding-right: 8px; padding-bottom: 3px; width: 32px; height: 27px;} +.settings-list > .setting-box > .btn > .setting-desc {padding-bottom: 16px; color: #5E626D;} .settings-list.lite-setting > .setting-box {flex: 1 1 30%;} .plugin-list {display: flex; flex-wrap: wrap; padding: 12px 4px 4px 4px;} @@ -59,10 +61,9 @@ .official-content > .content {color: #838A9D; font-size: 12px; line-height: 22px; padding-top: 6px;} .official-content > .title {color: #313C52; font-size: 13px; line-height: 14px;} -.classList {aspect-ratio: 4/1;} -.classList > .classItem {flex: 1 1 30%; margin: 5px; border: 1px solid rgba(227, 228, 233, 0.6); border-radius: 4px; padding-bottom: 16px; align-items: center;} +.classList > .classItem {flex: 1 1 30%; margin: 5px 5px 16px 5px; border: 1px solid rgba(227, 228, 233, 0.6); border-radius: 4px; padding-bottom: 5px; align-items: center;} .classItem > .imgBack {flex: 1 1 50%;} -.classItem > .imgBack > .classImg {background-repeat: no-repeat; background-size: contain; aspect-ratio: 16 / 9; background-position: center; margin: 0px; border-top-left-radius: 4px; border-top-right-radius: 4px;} +.classItem > .imgBack > .classImg {background-repeat: no-repeat; background-size: contain; aspect-ratio: 16 / 9; background-position: center; margin: 0; border-top-left-radius: 4px; border-top-right-radius: 4px;} .classItem > .classContent {flex: 1 1 50%; padding: 5px; font-size: 14px; color: #0B0F18; text-align: center; overflow: hidden; height: 24px; margin-bottom: 6px; font-weight: 700;} .more {float: right; padding-right: 12px; font-weight: normal;} .panel.publicClass {padding: 0 10px;} @@ -78,6 +79,7 @@ .main.without-internet > .bottom > .official.panel > .main-panel {flex-direction: row-reverse;} /* css in side */ +#mainContent > .side.panel {height: 100%;} .time-block {background: #EDEEF2; padding:2px 4px; border-radius: 4px; color: #0B0F18; font-size: 15px; margin: 0 4px;} .dynamic-block {height: 74px; padding: 12px 16px; display: flex; justify-content: space-between; position: relative; line-height: 20px; border-top: 1px solid #E3E4E9;} .dynamic-content {height: 50px; line-height: 25px; overflow: hidden;} diff --git a/module/admin/lang/de.php b/module/admin/lang/de.php index 67e77b6ae4..7d4d570f4a 100755 --- a/module/admin/lang/de.php +++ b/module/admin/lang/de.php @@ -25,6 +25,13 @@ $lang->admin->resetPWDSetting = 'Reset password Setting'; $lang->admin->tableEngine = 'Table Engine'; $lang->admin->setModuleIndex = 'Set Module'; +$lang->admin->mon = 'month'; +$lang->admin->day = 'day'; +$lang->admin->updateDynamics = 'updateDynamics'; +$lang->admin->updatePatch = 'updatePatch'; +$lang->admin->upgradeRecommend = 'upgradeRecommend'; +$lang->admin->zentaoUsed = ''; + $lang->admin->api = 'API'; $lang->admin->log = 'Log'; $lang->admin->setting = 'Einstellungen'; @@ -170,10 +177,4 @@ $lang->admin->menuSetting['dev']['desc'] = 'Support for secondary developm $lang->admin->menuSetting['convert']['name'] = 'Data Import'; $lang->admin->menuSetting['convert']['desc'] = 'Data import from third-party systems.'; -$lang->admin->mon = 'month'; -$lang->admin->day = 'day'; -$lang->admin->updateDynamics = 'updateDynamics'; -$lang->admin->updatePatch = 'updatePatch'; -$lang->admin->upgradeRecommend = 'upgradeRecommend'; - include dirname(__FILE__) . '/menu.php'; diff --git a/module/admin/lang/en.php b/module/admin/lang/en.php index 2314b2dd83..51a566be61 100755 --- a/module/admin/lang/en.php +++ b/module/admin/lang/en.php @@ -25,6 +25,13 @@ $lang->admin->resetPWDSetting = 'Reset password Setting'; $lang->admin->tableEngine = 'Table Engine'; $lang->admin->setModuleIndex = 'Set Module'; +$lang->admin->mon = 'month'; +$lang->admin->day = 'day'; +$lang->admin->updateDynamics = 'updateDynamics'; +$lang->admin->updatePatch = 'updatePatch'; +$lang->admin->upgradeRecommend = 'upgradeRecommend'; +$lang->admin->zentaoUsed = ''; + $lang->admin->api = 'API'; $lang->admin->log = 'Log'; $lang->admin->setting = 'Setting'; @@ -170,10 +177,4 @@ $lang->admin->menuSetting['dev']['desc'] = 'Support for secondary developm $lang->admin->menuSetting['convert']['name'] = 'Data Import'; $lang->admin->menuSetting['convert']['desc'] = 'Data import from third-party systems.'; -$lang->admin->mon = 'month'; -$lang->admin->day = 'day'; -$lang->admin->updateDynamics = 'updateDynamics'; -$lang->admin->updatePatch = 'updatePatch'; -$lang->admin->upgradeRecommend = 'upgradeRecommend'; - include dirname(__FILE__) . '/menu.php'; diff --git a/module/admin/lang/fr.php b/module/admin/lang/fr.php index 2bda8e62e3..2760ba8873 100755 --- a/module/admin/lang/fr.php +++ b/module/admin/lang/fr.php @@ -25,6 +25,13 @@ $lang->admin->resetPWDSetting = 'Reset password Setting'; $lang->admin->tableEngine = 'Table Engine'; $lang->admin->setModuleIndex = 'Set Module'; +$lang->admin->mon = 'month'; +$lang->admin->day = 'day'; +$lang->admin->updateDynamics = 'updateDynamics'; +$lang->admin->updatePatch = 'updatePatch'; +$lang->admin->upgradeRecommend = 'upgradeRecommend'; +$lang->admin->zentaoUsed = ''; + $lang->admin->api = 'API'; $lang->admin->log = 'Log'; $lang->admin->setting = 'Paramétrage'; @@ -170,10 +177,4 @@ $lang->admin->menuSetting['dev']['desc'] = 'Support for secondary developm $lang->admin->menuSetting['convert']['name'] = 'Data Import'; $lang->admin->menuSetting['convert']['desc'] = 'Data import from third-party systems.'; -$lang->admin->mon = 'month'; -$lang->admin->day = 'day'; -$lang->admin->updateDynamics = 'updateDynamics'; -$lang->admin->updatePatch = 'updatePatch'; -$lang->admin->upgradeRecommend = 'upgradeRecommend'; - include dirname(__FILE__) . '/menu.php'; diff --git a/module/admin/lang/zh-cn.php b/module/admin/lang/zh-cn.php index 64939cc0db..c7e9bab21f 100755 --- a/module/admin/lang/zh-cn.php +++ b/module/admin/lang/zh-cn.php @@ -25,6 +25,13 @@ $lang->admin->resetPWDSetting = '重置密码设置'; $lang->admin->tableEngine = '表引擎'; $lang->admin->setModuleIndex = '系统功能配置'; +$lang->admin->mon = '月'; +$lang->admin->day = '天'; +$lang->admin->updateDynamics = '更新动态'; +$lang->admin->updatePatch = '补丁更新'; +$lang->admin->upgradeRecommend = '推荐升级'; +$lang->admin->zentaoUsed = '您已使用禅道'; + $lang->admin->api = '接口'; $lang->admin->log = '日志'; $lang->admin->setting = '设置'; @@ -78,12 +85,14 @@ $lang->admin->setModule->optional = '可选功能'; $lang->admin->setModule->opened = '已开启'; $lang->admin->setModule->closed = '已关闭'; +$lang->admin->setModule->my = '地盘'; $lang->admin->setModule->product = '产品'; $lang->admin->setModule->scrum = '敏捷项目'; $lang->admin->setModule->waterfall = '瀑布项目'; $lang->admin->setModule->assetlib = '资产库'; $lang->admin->setModule->other = '通用功能'; +$lang->admin->setModule->score = '积分'; $lang->admin->setModule->repo = '代码'; $lang->admin->setModule->issue = '问题'; $lang->admin->setModule->risk = '风险'; @@ -171,9 +180,24 @@ $lang->admin->menuSetting['convert']['name'] = '数据导入'; $lang->admin->menuSetting['convert']['desc'] = '第三方系统的数据导入。'; $lang->admin->mon = '月'; -$lang->admin->day = '天'; +$lang->admin->day = '日'; $lang->admin->updateDynamics = '更新动态'; $lang->admin->updatePatch = '补丁更新'; $lang->admin->upgradeRecommend = '推荐升级'; +$lang->admin->zentaoUsed = '您已使用禅道'; + +$lang->admin->openTag = '禅道'; +$lang->admin->bizTag = '禅道企业版'; +$lang->admin->maxTag = '禅道旗舰版'; + +$lang->admin->bizInfoURL = 'https://www.zentao.net/page/enterprise.html'; +$lang->admin->maxInfoURL = 'https://www.zentao.net/page/max.html'; +$lang->admin->productDetail = '查看详情'; +$lang->admin->productFeature['biz'][] = '工时管理、甘特图、导入导出'; +$lang->admin->productFeature['biz'][] = '40+内置统计报表、自定义报表功能'; +$lang->admin->productFeature['biz'][] = '强大的自定义工作流、反馈管理功能'; +$lang->admin->productFeature['max'][] = '瀑布模型功能更全面'; +$lang->admin->productFeature['max'][] = '完整CMMI流程'; +$lang->admin->productFeature['max'][] = '资产库管理'; include dirname(__FILE__) . '/menu.php'; diff --git a/module/admin/model.php b/module/admin/model.php index 0da4df405a..45acba68c4 100755 --- a/module/admin/model.php +++ b/module/admin/model.php @@ -492,11 +492,15 @@ class adminModel extends model { if($hasInternet) { - $searchType = $type == 'plugin' ? 'byUpdatedTime' : 'byModule'; + $searchType = $type == 'plugin' ? 'byUpdatedTime,offcial' : 'byModule'; $param = $type == 'plugin' ? '' : 'MTIxOA=='; $extensions = $this->loadModel('extension')->getExtensionsByAPI($searchType, $param, 0, $limit); $plugins = isset($extensions->extensions) ? (array)$extensions->extensions : array(); - foreach($plugins as $plugin) $plugin->viewLink = str_replace(array('info', 'client'), '', $plugin->viewLink); + foreach($plugins as $id => $plugin) + { + $plugin->viewLink = str_replace(array('info', 'client'), '', $plugin->viewLink); + if($type == 'patch' and !isset($plugin->compatibleRelease)) unset($plugins[$id]); + } } else { @@ -533,7 +537,7 @@ class adminModel extends model $version = $this->loadModel('upgrade')->getOpenVersion(str_replace('.', '_', $this->config->version)); $version = str_replace('_', '.', $version); - $url .= (strpos($url, '?') === false ? '?' : '&') . 'lang=' . str_replace('-', '_', $this->app->getClientLang()) . '&managerVersion=' . self::EXT_MANAGER_VERSION . '&zentaoVersion=' . $version; + $url .= (strpos($url, '?') === false ? '?' : '&') . 'lang=' . str_replace('-', '_', $this->app->getClientLang()) . '&managerVersion=' . self::EXT_MANAGER_VERSION . '&zentaoVersion=' . $version . '&edition=' . $this->config->edition; $result = json_decode(preg_replace('/[[:cntrl:]]/mu', '', common::http($url))); if(!isset($result->status)) return false; @@ -550,7 +554,7 @@ class adminModel extends model */ public function getPublicClassByAPI($limit = 2) { - $apiURL = $this->config->admin->apiRoot . "publicclass.json"; + $apiURL = $this->config->admin->videoAPIURL; $data = $this->fetchAPI($apiURL); $courses = $data->videos; @@ -558,17 +562,50 @@ class adminModel extends model $publicClass = array(); foreach($courses as $course) { - if($index > $limit) return $publicClass; + if($index > $limit) break; $publicClass[$index] = new stdClass(); $publicClass[$index]->name = $course->title; - $publicClass[$index]->image = $this->config->admin->apiRoot . $course->image->list[0]->largeURL; - $publicClass[$index]->viewLink = $this->config->admin->apiRoot . 'publicclass/' . ($course->alias ? "{$course->alias}-" : '') . "{$course->id}.html"; + $publicClass[$index]->image = $this->config->admin->cdnRoot . $course->image->list[0]->middleURL; + $publicClass[$index]->viewLink = $this->config->admin->apiRoot . '/publicclass/' . ($course->alias ? "{$course->alias}-" : '') . "{$course->id}.html"; $index ++; } return $publicClass; } + /** + * Get dynamics by API. + * + * @param int $limit + * @access public + * @return array + */ + public function getDynamicsByAPI($limit = 2) + { + $apiURL = $this->config->admin->downloadAPIURL; + $data = $this->fetchAPI($apiURL); + $articles = $data->articles; + + $index = 1; + $downloads = array(); + foreach($articles as $article) + { + if($index > $limit) break; + + $tagKey = $this->config->edition . 'Tag'; + if(!isset($this->lang->admin->$tagKey)) break; + if(!preg_match("/{$this->lang->admin->$tagKey}\d/", $article->title)) continue; + + $downloads[$index] = new stdClass(); + $downloads[$index]->id = $article->id; + $downloads[$index]->title = $article->title; + $downloads[$index]->addedDate = $article->addedDate; + $downloads[$index]->link = $this->config->admin->apiRoot . "/download/{$article->alias}-{$article->id}.html"; + $index ++; + } + return $downloads; + } + /** * Check internet. * @@ -578,7 +615,7 @@ class adminModel extends model public function checkInternet() { $curl = curl_init(); - curl_setopt($curl, CURLOPT_URL, 'https://api.zentao.net/extension-apiGetExtensions.json'); + curl_setopt($curl, CURLOPT_URL, $this->config->admin->apiSite); curl_setopt($curl, CURLOPT_TIMEOUT_MS, 1000); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, 1000); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); @@ -589,4 +626,22 @@ class adminModel extends model return (bool)$connected; } + + /** + * Get date used object. + * + * @access public + * @return object + */ + public function genDateUsed() + { + $firstUseDate = $this->dao->select('date')->from(TABLE_ACTION) + ->where('date')->gt('0000-00-00') + ->andWhere('actor')->eq($this->app->user->account) + ->orderBy('date_asc') + ->limit('1') + ->fetch('date'); + + return helper::getDateInterval($firstUseDate); + } } diff --git a/module/admin/view/index.html.php b/module/admin/view/index.html.php index 79060aee20..aa1f338b2e 100755 --- a/module/admin/view/index.html.php +++ b/module/admin/view/index.html.php @@ -19,11 +19,13 @@
admin->menuList as $menuKey => $menu):?> vision == 'lite' and !in_array($menuKey, $config->admin->liteMenuList)) continue;?> - +
+ +
@@ -90,68 +92,72 @@
admin->zentaoInfo?>
-
您已使用禅道5year?>9admin->mon?>19admin->day?>
+
+ admin->zentaoUsed;?> + year):?> + year;?>year;?> + + month):?> + month;?>admin->mon;?> + + day;?>admin->day;?> +
admin->updateDynamics?>
- admin->downloadURL, "{$lang->more} ", '_blank', 'class="more text-muted flex align-center"');?> + admin->dynamicURL, "{$lang->more} ", '_blank', 'class="more text-muted flex align-center"');?>
+
-
禅道18.0发布,新增自动化测试方案、使用帮助及全新IDE风格
-
2022-03-12
-
-
-
禅道18.0发布,新增自动化测试方案、使用帮助及全新IDE风格
-
2022-03-12
-
-
-
禅道18.0发布,新增自动化测试方案、使用帮助及全新IDE风格
-
2022-03-12
+
link, $dynamic->title, '_blank');?>
+
addedDate, 0, 10);?>
+
admin->updatePatch?>
admin->patchURL, "{$lang->more} ", '_blank', 'class="more text-muted flex align-center"');?>
- view->patches as $patch):?> +
-
-
name?>
+
+
name?>
-
- desc?> -
+
desc?>
+ edition != 'max'):?>
admin->upgradeRecommend?>
- admin->downloadURL, "{$lang->more} ", '_blank', 'class="more text-muted flex align-center"');?> + admin->apiRoot, "{$lang->more} ", '_blank', 'class="more text-muted flex align-center"');?>
+ edition != 'biz'):?>
- -
禅道企业版
-
查看详情
+
+
admin->bizTag?>
+
admin->productDetail?>
-
工时管理、甘特图、导入导出
-
40+内置统计报表、自定义报表功能
-
强大的自定义工作流、反馈管理功能
+ admin->productFeature['biz'] as $feature):?> +
+
+
- -
禅道旗舰版
-
查看详情
+
+
admin->maxTag?>
+
admin->productDetail?>
-
工时管理、甘特图、导入导出
-
40+内置统计报表、自定义报表功能
-
强大的自定义工作流、反馈管理功能
-
工时管理、甘特图、导入导出
+ admin->productFeature['max'] as $feature):?> +
+
+
diff --git a/module/admin/view/setmodule.html.php b/module/admin/view/setmodule.html.php index 1cffccae29..040f56400c 100755 --- a/module/admin/view/setmodule.html.php +++ b/module/admin/view/setmodule.html.php @@ -47,7 +47,16 @@ - +
$lang->admin->setModule->{$feature}), $value, "data-code='{$code}'", 'inline');?> diff --git a/module/extension/model.php b/module/extension/model.php index fa10ae4fa2..9175c0ec5f 100644 --- a/module/extension/model.php +++ b/module/extension/model.php @@ -60,7 +60,7 @@ class extensionModel extends model $version = $this->loadModel('upgrade')->getOpenVersion(str_replace('.', '_', $this->config->version)); $version = str_replace('_', '.', $version); - $url .= (strpos($url, '?') === false ? '?' : '&') . 'lang=' . str_replace('-', '_', $this->app->getClientLang()) . '&managerVersion=' . self::EXT_MANAGER_VERSION . '&zentaoVersion=' . $version; + $url .= (strpos($url, '?') === false ? '?' : '&') . 'lang=' . str_replace('-', '_', $this->app->getClientLang()) . '&managerVersion=' . self::EXT_MANAGER_VERSION . '&zentaoVersion=' . $version . '&edition=' . $this->config->edition; $result = json_decode(common::http($url)); if(!isset($result->status)) return false; diff --git a/xuanxuan/extension/xuan/admin/ext/lang/de/xuanxuan.php b/xuanxuan/extension/xuan/admin/ext/lang/de/xuanxuan.php index 332adc1cc0..1a35918f24 100644 --- a/xuanxuan/extension/xuan/admin/ext/lang/de/xuanxuan.php +++ b/xuanxuan/extension/xuan/admin/ext/lang/de/xuanxuan.php @@ -27,4 +27,13 @@ if($config->vision != 'lite') { $lang->admin->menuList->system['subMenu']['xuanxuan'] = array('link' => 'Desktop|admin|xuanxuan|', 'subModule' => 'client,setting'); $lang->admin->menuList->system['menuOrder']['20'] = 'xuanxuan'; + + $lang->admin->menuList->system['tabMenu']['xuanxuan']['index'] = array('link' => 'Home|admin|xuanxuan|'); + $lang->admin->menuList->system['tabMenu']['xuanxuan']['setting'] = array('link' => 'Parameter|setting|xuanxuan|'); + if($config->edition != 'open') + { + $lang->admin->menuList->system['tabMenu']['xuanxuan']['conference'] = array('link' => 'Conference|conference|admin|'); + $lang->navGroup->conference = 'admin'; + } + $lang->admin->menuList->system['tabMenu']['xuanxuan']['update'] = array('link' => 'Update|client|browse|', 'subModule' => 'client'); } diff --git a/xuanxuan/extension/xuan/admin/ext/lang/en/xuanxuan.php b/xuanxuan/extension/xuan/admin/ext/lang/en/xuanxuan.php index 332adc1cc0..1a35918f24 100644 --- a/xuanxuan/extension/xuan/admin/ext/lang/en/xuanxuan.php +++ b/xuanxuan/extension/xuan/admin/ext/lang/en/xuanxuan.php @@ -27,4 +27,13 @@ if($config->vision != 'lite') { $lang->admin->menuList->system['subMenu']['xuanxuan'] = array('link' => 'Desktop|admin|xuanxuan|', 'subModule' => 'client,setting'); $lang->admin->menuList->system['menuOrder']['20'] = 'xuanxuan'; + + $lang->admin->menuList->system['tabMenu']['xuanxuan']['index'] = array('link' => 'Home|admin|xuanxuan|'); + $lang->admin->menuList->system['tabMenu']['xuanxuan']['setting'] = array('link' => 'Parameter|setting|xuanxuan|'); + if($config->edition != 'open') + { + $lang->admin->menuList->system['tabMenu']['xuanxuan']['conference'] = array('link' => 'Conference|conference|admin|'); + $lang->navGroup->conference = 'admin'; + } + $lang->admin->menuList->system['tabMenu']['xuanxuan']['update'] = array('link' => 'Update|client|browse|', 'subModule' => 'client'); } diff --git a/xuanxuan/extension/xuan/admin/ext/lang/fr/xuanxuan.php b/xuanxuan/extension/xuan/admin/ext/lang/fr/xuanxuan.php index 332adc1cc0..1a35918f24 100644 --- a/xuanxuan/extension/xuan/admin/ext/lang/fr/xuanxuan.php +++ b/xuanxuan/extension/xuan/admin/ext/lang/fr/xuanxuan.php @@ -27,4 +27,13 @@ if($config->vision != 'lite') { $lang->admin->menuList->system['subMenu']['xuanxuan'] = array('link' => 'Desktop|admin|xuanxuan|', 'subModule' => 'client,setting'); $lang->admin->menuList->system['menuOrder']['20'] = 'xuanxuan'; + + $lang->admin->menuList->system['tabMenu']['xuanxuan']['index'] = array('link' => 'Home|admin|xuanxuan|'); + $lang->admin->menuList->system['tabMenu']['xuanxuan']['setting'] = array('link' => 'Parameter|setting|xuanxuan|'); + if($config->edition != 'open') + { + $lang->admin->menuList->system['tabMenu']['xuanxuan']['conference'] = array('link' => 'Conference|conference|admin|'); + $lang->navGroup->conference = 'admin'; + } + $lang->admin->menuList->system['tabMenu']['xuanxuan']['update'] = array('link' => 'Update|client|browse|', 'subModule' => 'client'); } diff --git a/xuanxuan/extension/xuan/admin/ext/lang/zh-cn/xuanxuan.php b/xuanxuan/extension/xuan/admin/ext/lang/zh-cn/xuanxuan.php index ab4ae61356..e17b1a5dcc 100644 --- a/xuanxuan/extension/xuan/admin/ext/lang/zh-cn/xuanxuan.php +++ b/xuanxuan/extension/xuan/admin/ext/lang/zh-cn/xuanxuan.php @@ -25,6 +25,15 @@ $lang->admin->sizeType['G'] = 1024 * 1024 * 1024; global $config; if($config->vision != 'lite') { - $lang->admin->menuList->system['subMenu']['xuanxuan'] = array('link' => '聊天|admin|xuanxuan|', 'subModule' => 'client,setting'); + $lang->admin->menuList->system['subMenu']['xuanxuan'] = array('link' => '聊天|admin|xuanxuan|', 'subModule' => 'client,setting,conference'); $lang->admin->menuList->system['menuOrder']['20'] = 'xuanxuan'; + + $lang->admin->menuList->system['tabMenu']['xuanxuan']['index'] = array('link' => '首页|admin|xuanxuan|'); + $lang->admin->menuList->system['tabMenu']['xuanxuan']['setting'] = array('link' => '参数|setting|xuanxuan|'); + if($config->edition != 'open') + { + $lang->admin->menuList->system['tabMenu']['xuanxuan']['conference'] = array('link' => '音视频|conference|admin|'); + $lang->navGroup->conference = 'admin'; + } + $lang->admin->menuList->system['tabMenu']['xuanxuan']['update'] = array('link' => '更新|client|browse|', 'subModule' => 'client'); } diff --git a/xuanxuan/extension/xuan/common/ext/lang/de/xuanxuan.php b/xuanxuan/extension/xuan/common/ext/lang/de/xuanxuan.php index f83f28956d..96b9269483 100644 --- a/xuanxuan/extension/xuan/common/ext/lang/de/xuanxuan.php +++ b/xuanxuan/extension/xuan/common/ext/lang/de/xuanxuan.php @@ -1,22 +1,5 @@ xuanxuan = new stdclass(); -//$lang->admin->menu->xuanxuan['subMenu'] = new stdclass(); -//$lang->admin->menu->xuanxuan['subMenu']->index = array('link' => 'Home|admin|xuanxuan'); -//$lang->admin->menu->xuanxuan['subMenu']->setting = array('link' => 'Parameter|setting|xuanxuan'); -//$lang->admin->menu->xuanxuan['subMenu']->update = array('link' => 'Update|client|browse', 'subModule' => 'client'); -// -//$lang->admin->menu->xuanxuan['menuOrder'][0] = 'index'; -//$lang->admin->menu->xuanxuan['menuOrder'][5] = 'setting'; -//$lang->admin->menu->xuanxuan['menuOrder'][10] = 'update'; - -global $config; -//if($config->edition != 'open') -//{ -// $lang->admin->menu->xuanxuan['subModule'] = 'client,setting,conference'; -// $lang->admin->menu->xuanxuan['subMenu']->conference = array('link' => 'Conference|conference|admin'); -// $lang->admin->menu->xuanxuan['menuOrder'][7] = 'conference'; -// $lang->navGroup->conference = 'admin'; -//} $lang->navGroup->im = 'admin'; $lang->navGroup->setting = 'admin'; diff --git a/xuanxuan/extension/xuan/common/ext/lang/en/xuanxuan.php b/xuanxuan/extension/xuan/common/ext/lang/en/xuanxuan.php index f83f28956d..96b9269483 100644 --- a/xuanxuan/extension/xuan/common/ext/lang/en/xuanxuan.php +++ b/xuanxuan/extension/xuan/common/ext/lang/en/xuanxuan.php @@ -1,22 +1,5 @@ xuanxuan = new stdclass(); -//$lang->admin->menu->xuanxuan['subMenu'] = new stdclass(); -//$lang->admin->menu->xuanxuan['subMenu']->index = array('link' => 'Home|admin|xuanxuan'); -//$lang->admin->menu->xuanxuan['subMenu']->setting = array('link' => 'Parameter|setting|xuanxuan'); -//$lang->admin->menu->xuanxuan['subMenu']->update = array('link' => 'Update|client|browse', 'subModule' => 'client'); -// -//$lang->admin->menu->xuanxuan['menuOrder'][0] = 'index'; -//$lang->admin->menu->xuanxuan['menuOrder'][5] = 'setting'; -//$lang->admin->menu->xuanxuan['menuOrder'][10] = 'update'; - -global $config; -//if($config->edition != 'open') -//{ -// $lang->admin->menu->xuanxuan['subModule'] = 'client,setting,conference'; -// $lang->admin->menu->xuanxuan['subMenu']->conference = array('link' => 'Conference|conference|admin'); -// $lang->admin->menu->xuanxuan['menuOrder'][7] = 'conference'; -// $lang->navGroup->conference = 'admin'; -//} $lang->navGroup->im = 'admin'; $lang->navGroup->setting = 'admin'; diff --git a/xuanxuan/extension/xuan/common/ext/lang/fr/xuanxuan.php b/xuanxuan/extension/xuan/common/ext/lang/fr/xuanxuan.php index f83f28956d..96b9269483 100644 --- a/xuanxuan/extension/xuan/common/ext/lang/fr/xuanxuan.php +++ b/xuanxuan/extension/xuan/common/ext/lang/fr/xuanxuan.php @@ -1,22 +1,5 @@ xuanxuan = new stdclass(); -//$lang->admin->menu->xuanxuan['subMenu'] = new stdclass(); -//$lang->admin->menu->xuanxuan['subMenu']->index = array('link' => 'Home|admin|xuanxuan'); -//$lang->admin->menu->xuanxuan['subMenu']->setting = array('link' => 'Parameter|setting|xuanxuan'); -//$lang->admin->menu->xuanxuan['subMenu']->update = array('link' => 'Update|client|browse', 'subModule' => 'client'); -// -//$lang->admin->menu->xuanxuan['menuOrder'][0] = 'index'; -//$lang->admin->menu->xuanxuan['menuOrder'][5] = 'setting'; -//$lang->admin->menu->xuanxuan['menuOrder'][10] = 'update'; - -global $config; -//if($config->edition != 'open') -//{ -// $lang->admin->menu->xuanxuan['subModule'] = 'client,setting,conference'; -// $lang->admin->menu->xuanxuan['subMenu']->conference = array('link' => 'Conference|conference|admin'); -// $lang->admin->menu->xuanxuan['menuOrder'][7] = 'conference'; -// $lang->navGroup->conference = 'admin'; -//} $lang->navGroup->im = 'admin'; $lang->navGroup->setting = 'admin'; diff --git a/xuanxuan/extension/xuan/common/ext/lang/zh-cn/xuanxuan.php b/xuanxuan/extension/xuan/common/ext/lang/zh-cn/xuanxuan.php index 432af47cbf..c9646d571d 100644 --- a/xuanxuan/extension/xuan/common/ext/lang/zh-cn/xuanxuan.php +++ b/xuanxuan/extension/xuan/common/ext/lang/zh-cn/xuanxuan.php @@ -1,22 +1,5 @@ xuanxuan = new stdclass(); -//$lang->admin->menu->xuanxuan['subMenu'] = new stdclass(); -//$lang->admin->menu->xuanxuan['subMenu']->index = array('link' => '首页|admin|xuanxuan'); -//$lang->admin->menu->xuanxuan['subMenu']->setting = array('link' => '参数|setting|xuanxuan'); -//$lang->admin->menu->xuanxuan['subMenu']->update = array('link' => '更新|client|browse', 'subModule' => 'client'); -// -//$lang->admin->menu->xuanxuan['menuOrder'][0] = 'index'; -//$lang->admin->menu->xuanxuan['menuOrder'][5] = 'setting'; -//$lang->admin->menu->xuanxuan['menuOrder'][10] = 'update'; - -global $config; -//if($config->edition != 'open') -//{ -// $lang->admin->menu->xuanxuan['subModule'] = 'client,setting,conference'; -// $lang->admin->menu->xuanxuan['subMenu']->conference = array('link' => '音视频|conference|admin'); -// $lang->admin->menu->xuanxuan['menuOrder'][7] = 'conference'; -// $lang->navGroup->conference = 'admin'; -//} $lang->navGroup->im = 'admin'; $lang->navGroup->setting = 'admin'; diff --git a/xuanxuan/extension/xuan/conference/ext/view/admin.html.php b/xuanxuan/extension/xuan/conference/ext/view/admin.html.php new file mode 100644 index 0000000000..3d06c44ca1 --- /dev/null +++ b/xuanxuan/extension/xuan/conference/ext/view/admin.html.php @@ -0,0 +1,217 @@ + + * @package conference + * @version $Id$ + * @link https://xuanim.com + */ +?> +getModuleRoot() . 'common/view/header.html.php';?> +
+ +
+
+
'> +
+
+ conference->server?> +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
conference->enabled;?> + +
+ +
+ +
+ > + +
+ +
conference->backend->type;?> + +
+ conference->backend->types, $backendType);?> + conference->backend->types, $backendType, 'disabled'); endif; ?> +
conference->backendTypeTip;?>
conference->serverAddr;?> + +
+ + conference->notset : $serverAddr; endif; ?> +
conference->serverAddrTip;?>
conference->https;?> + +
+ +
+ +
+ > + +
+ +
conference->apiPort;?> + +
+ min="1" max="65535" class="form-control"> + conference->notset : $apiPort; endif; ?> +
conference->apiPortTip : '';?>
conference->mgmtPort;?> + +
+ min="1" max="65535" class="form-control"> + conference->notset : $mgmtPort; endif; ?> +
conference->mgmtPortTip : '';?>
conference->rtcPort;?> + +
+ min="1" max="65535" class="form-control"> + conference->notset : $rtcPort; endif; ?> +
conference->rtcPortTip : '';?>
conference->serviceId;?> + +
+ + conference->notset : $serviceId; endif; ?> +
conference->serviceIdTip : '';?>
conference->serviceKey;?> + +
+ + conference->notset : $serviceKey; endif; ?> +
conference->serviceKeyTip : '';?>
+ + ' . $lang->edit;?> +
+
+
+
+
createLink("conference", 'admin', 'type=video');?>> +
+
+ conference->video?> +
+
+ + + + + + + + + + + + + + + +
conference->resolutionWidth;?> + min="320" max="1280" class="form-control"> + conference->resolutionWidthTip;?>
conference->resolutionHeight;?> + min="240" max="720" class="form-control"> + conference->resolutionHeightTip;?>
+ +
+
+
+
+
+ + +getModuleRoot() . 'common/view/footer.html.php';?>