国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

564 lines
22KB

  1. <?php
  2. /**
  3. * 模块管理
  4. *
  5. * @version $id:module_main.php 14:17 2010年7月20日 tianya $
  6. * @package DedeBIZ.Administrator
  7. * @copyright Copyright (c) 2022 DedeBIZ.COM
  8. * @license https://www.dedebiz.com/license
  9. * @link https://www.dedebiz.com
  10. */
  11. require_once(dirname(__FILE__)."/config.php");
  12. if (DEDEBIZ_SAFE_MODE) {
  13. die(DedeAlert("系统已启用安全模式,无法使用当前功能",ALERT_DANGER));
  14. }
  15. CheckPurview('sys_module');
  16. require_once(DEDEINC."/dedemodule.class.php");
  17. require_once(DEDEINC."/libraries/oxwindow.class.php");
  18. if (empty($action)) $action = '';
  19. $mdir = DEDEDATA.'/module';
  20. $mdurl = "";
  21. function TestWriteAble($d)
  22. {
  23. $tfile = '_dedet.txt';
  24. $d = preg_replace("#\/$#", '', $d);
  25. $fp = @fopen($d.'/'.$tfile, 'w');
  26. if (!$fp) return FALSE;
  27. else {
  28. fclose($fp);
  29. $rs = @unlink($d.'/'.$tfile);
  30. if ($rs) return TRUE;
  31. else return FALSE;
  32. }
  33. }
  34. function ReWriteConfigAuto()
  35. {
  36. global $dsql;
  37. $configfile = DEDEDATA.'/config.cache.inc.php';
  38. if (!is_writeable($configfile)) {
  39. echo "配置文件<span class='text-primary'>{$configfile}</span>不支持写入,无法修改系统配置参数";
  40. exit();
  41. }
  42. $fp = fopen($configfile, 'w');
  43. flock($fp, 3);
  44. fwrite($fp, "<"."?php\r\n");
  45. $dsql->SetQuery("SELECT `varname`,`type`,`value`,`groupid` FROM `#@__sysconfig` ORDER BY aid ASC ");
  46. $dsql->Execute();
  47. while ($row = $dsql->GetArray()) {
  48. if (empty($row['value']) && $row['type'] == 'number') $row['value'] = 0;
  49. if ($row['type'] == 'number') fwrite($fp, "\${$row['varname']} = ".$row['value'].";\r\n");
  50. else fwrite($fp, "\${$row['varname']} = '".str_replace("'", '', $row['value'])."';\r\n");
  51. }
  52. fwrite($fp, "?".">");
  53. fclose($fp);
  54. }
  55. /*--------------
  56. function ShowAll();
  57. --------------*/
  58. if ($action == '') {
  59. $types = array('soft' => '模块', 'templets' => '模板', 'plus' => '小插件', 'patch' => '补丁');
  60. $dm = new DedeModule($mdir);
  61. if (empty($moduletype)) $moduletype = '';
  62. $modules_remote = $dm->GetModuleUrlList($moduletype, $mdurl);
  63. $modules = array();
  64. $modules = $dm->GetModuleList($moduletype);
  65. is_array($modules) || $modules = array();
  66. if (is_array($modules_remote) && count($modules_remote) > 0) {
  67. $modules = array_merge($modules, $modules_remote);
  68. }
  69. require_once(dirname(__FILE__)."/templets/module_main.htm");
  70. $dm->Clear();
  71. exit();
  72. }
  73. /*--------------
  74. function ViewDevelopoer();
  75. --------------*/
  76. else if ($action == 'view_developoer') {
  77. //检验开发者信息
  78. $dm = new DedeModule($mdir);
  79. $info = $dm->GetModuleInfo($hash);
  80. if ($info == null) {
  81. ShowMsg("获取模块信息错误,模块文件可能被篡改", -1);
  82. exit;
  83. }
  84. $dev_id = $info['dev_id'];
  85. $devURL = DEDECDNURL."/developers/$dev_id.json";
  86. $dhd = new DedeHttpDown();
  87. $dhd->OpenUrl($devURL);
  88. $devContent = $dhd->GetHtml();
  89. $devInfo = (array)json_decode($devContent);
  90. $offUrl = "";
  91. if ($devInfo['dev_type'] == 1) {
  92. $offUrl = "<p>官方网址:<code>{$devInfo['offurl']}</code><small>(复制在浏览器中打开)</small></p>";
  93. }
  94. $authAt = date("Y-m-d", $devInfo['auth_at']);
  95. if (!isset($info['dev_id'])) {
  96. $devInfo['dev_name'] = $info['team']."<span class='btn btn-danger btn-sm'>未认证</span>";
  97. $authAt = "未知";
  98. }
  99. ShowMsg("<p>开发者名称:{$devInfo['dev_name']}</p><p>开发者id:{$devInfo['dev_id']}</p><span>认证于:{$authAt}</span>", "-1");
  100. exit;
  101. }
  102. /*--------------
  103. function Setup();
  104. --------------*/
  105. else if ($action == 'setup') {
  106. $dm = new DedeModule($mdir);
  107. $infos = $dm->GetModuleInfo($hash);
  108. if ($infos == null) {
  109. ShowMsg("获取模块信息错误,模块文件可能被篡改", -1);
  110. exit;
  111. }
  112. $alertMsg = ($infos['lang'] == $cfg_soft_lang ? '' : '<br>该模块的语言编码与您系统的编码不一致,请向开发者确认它的兼容性');
  113. $filelists = (array)$dm->GetFileLists($hash);
  114. $filelist = '';
  115. $prvdirs = array();
  116. $incdir = array();
  117. foreach ($filelists as $v) {
  118. if (empty($v['name'])) continue;
  119. if ($v['type'] == 'dir') {
  120. $v['type'] = '目录';
  121. $incdir[] = $v['name'];
  122. } else {
  123. $v['type'] = '文件';
  124. }
  125. $filelist .= "{$v['type']}|{$v['name']}\r\n";
  126. }
  127. //检测需要的目录权限
  128. foreach ($filelists as $v) {
  129. $prvdir = preg_replace("#\/([^\/]*)$#", '/', $v['name']);
  130. if (!preg_match("#^\.#", $prvdir)) $prvdir = './';
  131. $n = TRUE;
  132. foreach ($incdir as $k => $v) {
  133. if (preg_match("#^".$v."#i", $prvdir)) {
  134. $n = FALSE;
  135. break;
  136. }
  137. }
  138. if (!isset($prvdirs[$prvdir]) && $n && is_dir($prvdir)) {
  139. $prvdirs[$prvdir][0] = 1;
  140. $prvdirs[$prvdir][1] = TestWriteAble($prvdir);
  141. }
  142. }
  143. $prvdir = "<table cellpadding='1' cellspacing='1'>\r\n";
  144. $prvdir .= "<tr bgcolor='#e9ecef'><th width='270'>目录</td><th align='center'>可写</td></tr>\r\n";
  145. foreach ($prvdirs as $k => $v) {
  146. if ($v) $cw = "<span class='text-success'><i class='fa fa-check'></i></span>";
  147. else $cw = "<span class='text-danger'>×</span>";
  148. $prvdir .= "<tr><td>$k</td>";
  149. $prvdir .= "<td align='center'>$cw</td></tr>\r\n";
  150. }
  151. $prvdir .= "</table>";
  152. $win = new OxWindow();
  153. $win->Init("module_main.php", "js/blank.js", "post");
  154. $wecome_info = "模块管理";
  155. $devURL = DEDECDNURL."/developers/{$infos['dev_id']}.json";
  156. $dhd = new DedeHttpDown();
  157. $dhd->OpenUrl($devURL);
  158. $devContent = $dhd->GetHtml();
  159. $devInfo = (array)json_decode($devContent);
  160. $s = "未认证";
  161. if (($devInfo['dev_id'] == $infos['dev_id']) && !empty($devInfo['dev_id'])) {
  162. $s = "已认证";
  163. }
  164. $win->AddTitle("<a href='module_main.php'>模块管理</a> &gt; 安装{$infos['name']}");
  165. $win->AddHidden("hash", $hash);
  166. $win->AddHidden("action", 'setupstart');
  167. $msg = "<table width='98%' cellspacing='0' cellpadding='0' class='table'>
  168. <tr>
  169. <td width='260' class='admin-td'>模块名称:</td>
  170. <td class='admin-td'>{$infos['name']}</td>
  171. </tr>
  172. <tr>
  173. <td class='admin-td'>语言:</td>
  174. <td class='admin-td'>{$infos['lang']} {$alertMsg}</td>
  175. </tr>
  176. <tr>
  177. <td class='admin-td'>文件大小:</td>
  178. <td class='admin-td'>{$infos['filesize']}</td>
  179. </tr>
  180. <tr>
  181. <td class='admin-td'>开发者id:</td>
  182. <td class='admin-td'>{$infos['dev_id']} <a href='{$cfg_biz_dedebizUrl}/developer?dev_id={$infos['dev_id']}' target='_blank' class='btn btn-success btn-sm'>{$s}</a></td>
  183. </tr>
  184. <tr>
  185. <td class='admin-td'>发布时间:</td>
  186. <td class='admin-td'>{$infos['time']}</td>
  187. </tr>
  188. <tr>
  189. <td class='admin-td'>使用协议:</td>
  190. <td class='admin-td'><a href='module_main.php?action=showreadme&hash={$hash}' target='_blank' class='btn btn-success btn-sm'>浏览</a></td>
  191. </tr>
  192. <tr>
  193. <td class='admin-td' colspan='2'>
  194. <div class='alert alert-danger mb-0'>注意事项:安装时请确保文件列表中涉及的目录前可写入权限,此外“后台管理目录”、“templets”目录也必须暂时设置可写入权限</div>
  195. </td>
  196. </tr>
  197. <tr>
  198. <td>目录权限检测:<br> ../ 为根目录 <br> ./ 表示当前目录</td>
  199. <td>$prvdir</td>
  200. </tr>
  201. <tr>
  202. <td>模块包含的所有文件列表:</td>
  203. <td></td>
  204. </tr>
  205. <tr>
  206. <td colspan='2'><textarea name='filelists' id='filelists' class='admin-textarea-xl'>{$filelist}</textarea></td>
  207. </tr>
  208. <tr>
  209. <td>对于已存在文件处理方法:</td>
  210. <td>
  211. <label><input type='radio' name='isreplace' value='1' checked='checked'> 覆盖</label>
  212. <label><input type='radio' name='isreplace' value='3'> 覆盖,保留副本</label>
  213. <label><input type='radio' name='isreplace' value='0'> 保留旧文件</label>
  214. </td>
  215. </tr>
  216. </table>";
  217. $win->AddMsgItem("$msg");
  218. $winform = $win->GetWindow("ok", "");
  219. $win->Display();
  220. $dm->Clear();
  221. exit();
  222. }
  223. /*---------------
  224. function SetupRun()
  225. --------------*/
  226. else if ($action == 'setupstart') {
  227. if (!is_writeable($mdir)) {
  228. ShowMsg("目录<span class='text-primary'>{$mdir}</span>不支持写入,这导致程序安装没法正常创建", "-1");
  229. exit();
  230. }
  231. $dm = new DedeModule($mdir);
  232. $minfos = (array)$dm->GetModuleInfo($hash);
  233. extract($minfos, EXTR_SKIP);
  234. $menustring = addslashes($dm->GetSystemFile($hash, 'menustring'));
  235. $indexurl = str_replace('**', '=', $indexurl);
  236. $query = "INSERT INTO `#@__sys_module` (`hashcode`,`modname`,`indexname`,`indexurl`,`ismember`,`menustring` ) VALUES ('$hash','$name','$indexname','$indexurl','$ismember','$menustring' ) ";
  237. $rs = $dsql->ExecuteNoneQuery("DELETE FROM `#@__sys_module` WHERE hashcode LIKE '$hash' ");
  238. $rs = $dsql->ExecuteNoneQuery($query);
  239. if (!$rs) {
  240. ShowMsg('保存数据库信息失败,无法完成安装'.$dsql->GetError(), 'javascript:;');
  241. exit();
  242. }
  243. $dm->WriteFiles($hash, $isreplace);
  244. $filename = '';
  245. if (!isset($autosetup) || $autosetup == 0) $filename = $dm->WriteSystemFile($hash, 'setup');
  246. if (!isset($autodel) || $autodel == 0) $dm->WriteSystemFile($hash, 'uninstall');
  247. $dm->WriteSystemFile($hash, 'readme');
  248. $dm->Clear();
  249. //用模块的程序安装安装
  250. if (!isset($autosetup) || $autosetup == 0) {
  251. include(DEDEDATA.'/module/'.$filename);
  252. exit();
  253. }
  254. //系统自动安装
  255. else {
  256. $mysql_version = $dsql->GetVersion(TRUE);
  257. //默认使用MySQL 4.1 以下版本的SQL语句,对大于4.1版本采用替换处理 TYPE=MyISAM ==> ENGINE=MyISAM DEFAULT CHARSET=#~lang~#
  258. $setupsql = $dm->GetSystemFile($hash, 'setupsql40');
  259. $setupsql = preg_replace("#ENGINE=MyISAM#i", 'TYPE=MyISAM', $setupsql);
  260. $sql41tmp = 'ENGINE=MyISAM DEFAULT CHARSET='.$cfg_db_language;
  261. if ($mysql_version >= 4.1) {
  262. $setupsql = preg_replace("#TYPE=MyISAM#i", $sql41tmp, $setupsql);
  263. }
  264. //_ROOTURL_
  265. if ($cfg_cmspath == '/') $cfg_cmspath = '';
  266. $rooturl = $cfg_basehost.$cfg_cmspath;
  267. $setupsql = preg_replace("#_ROOTURL_#i", $rooturl, $setupsql);
  268. $setupsql = preg_replace("#[\r\n]{1,}#", "\n", $setupsql);
  269. $sqls = @split(";[ \t]{0,}\n", $setupsql);
  270. foreach ($sqls as $sql) {
  271. if (trim($sql) != '') $dsql->ExecuteNoneQuery($sql);
  272. }
  273. ReWriteConfigAuto();
  274. $rflwft = "<script>\r\n";
  275. $rflwft .= "if (window.navigator.userAgent.indexOf('MSIE')>=1) top.document.frames.menu.location = 'index_menu.php';\r\n";
  276. $rflwft .= "else top.document.getElementById('menufra').src = 'index_menu.php';\r\n";
  277. $rflwft .= "</script>";
  278. echo $rflwft;
  279. UpDateCatCache();
  280. ShowMsg('模块安装完成', 'module_main.php');
  281. exit();
  282. }
  283. }
  284. /*--------------
  285. function DelModule();
  286. --------------*/
  287. else if ($action == 'del') {
  288. $dm = new DedeModule($mdir);
  289. $infos = $dm->GetModuleInfo($hash);
  290. $alertMsg = ($infos['lang'] == $cfg_soft_lang ? '' : '<br>该模块的语言编码与您系统的编码不一致,请向开发者确认它的兼容性');
  291. $dev_id = empty($infos['dev_id'])? "<a href='{$cfg_biz_dedebizUrl}/developer' target='_blank' class='btn btn-danger btn-sm'>未认证</a>" : "{$infos['dev_id']} <a href='{$cfg_biz_dedebizUrl}/developer?dev_id={$infos['dev_id']}' target='_blank' class='btn btn-success btn-sm'>已认证</a>";
  292. $win = new OxWindow();
  293. $win->Init("module_main.php", "js/blank.js", "post");
  294. $wecome_info = "模块管理";
  295. $win->AddTitle("<a href='module_main.php'>模块管理</a> &gt; 删除{$infos['name']}");
  296. $win->AddHidden('hash', $hash);
  297. $win->AddHidden('action', 'delok');
  298. $msg = "<table width='98%' cellspacing='0' cellpadding='0' class='table'>
  299. <tr>
  300. <td width='260' class='admin-td'>模块名称:</td>
  301. <td class='admin-td'>{$infos['name']}</td>
  302. </tr>
  303. <tr>
  304. <td class='admin-td'>语言:</td>
  305. <td class='admin-td'>{$infos['lang']} {$alertMsg}</td>
  306. </tr>
  307. <tr>
  308. <td class='admin-td'>文件大小:</td>
  309. <td class='admin-td'>{$infos['filesize']}</td>
  310. </tr>
  311. <tr>
  312. <td class='admin-td'>开发者id:</td>
  313. <td class='admin-td'>{$dev_id}</td>
  314. </tr>
  315. <tr>
  316. <td class='admin-td'>发布时间:</td>
  317. <td class='admin-td'>{$infos['time']}</td>
  318. </tr>
  319. <tr>
  320. <td class='admin-td'>使用协议:</td>
  321. <td class='admin-td'><a href='module_main.php?action=showreadme&hash={$hash}' target='_blank' class='btn btn-success btn-sm'>浏览</a></td>
  322. </tr>
  323. <tr>
  324. <td colspan='2'>删除模块仅删除这个模块的安装包文件,如果您已经安装,请执行<a href='module_main.php?hash={$hash}&action=uninstall'>卸载程序</a>来删除</td>
  325. </tr>
  326. </table>";
  327. $win->AddMsgItem("$msg");
  328. $winform = $win->GetWindow("ok", "");
  329. $win->Display();
  330. $dm->Clear();
  331. exit();
  332. } else if ($action == 'delok') {
  333. $dm = new DedeModule($mdir);
  334. $modfile = $mdir."/".$dm->GetHashFile($hash);
  335. unlink($modfile) or die("删除文件<span class='text-primary'>{$modfile}</span>失败");
  336. ShowMsg("成功删除一个模块文件", "module_main.php");
  337. exit();
  338. }
  339. /*--------------
  340. function UnInstall();
  341. --------------*/
  342. else if ($action == 'uninstall') {
  343. $dm = new DedeModule($mdir);
  344. $infos = $dm->GetModuleInfo($hash);
  345. if ($infos['url'] == '') $infos['url'] = ' ';
  346. $alertMsg = ($infos['lang'] == $cfg_soft_lang ? '' : '<br>该模块的语言编码与您系统的编码不一致,请向开发者确认它的兼容性');
  347. $filelists = (array)$dm->GetFileLists($hash);
  348. $filelist = '';
  349. foreach ($filelists as $v) {
  350. if (empty($v['name'])) continue;
  351. if ($v['type'] == 'dir') $v['type'] = '目录';
  352. else $v['type'] = '文件';
  353. $filelist .= "{$v['type']}|{$v['name']}\r\n";
  354. }
  355. $dev_id = empty($infos['dev_id'])? "<a href='{$cfg_biz_dedebizUrl}/developer' target='_blank' class='btn btn-danger btn-sm'>未认证</a>" : "{$infos['dev_id']} <a href='{$cfg_biz_dedebizUrl}/developer?dev_id={$infos['dev_id']}' target='_blank' class='btn btn-success btn-sm'>已认证</a>";
  356. $win = new OxWindow();
  357. $win->Init("module_main.php", "js/blank.js", "post");
  358. $wecome_info = "模块管理";
  359. $win->AddTitle("<a href='module_main.php'>模块管理</a> &gt; 卸载{$infos['name']}");
  360. $win->AddHidden("hash", $hash);
  361. $win->AddHidden("action", 'uninstallok');
  362. $msg = "<table width='98%' cellspacing='0' cellpadding='0' class='table'>
  363. <tr>
  364. <td width='260' class='admin-td'>模块名称:</td>
  365. <td class='admin-td'>{$infos['name']}</td>
  366. </tr>
  367. <tr>
  368. <td class='admin-td'>语言:</td>
  369. <td class='admin-td'>{$infos['lang']} {$alertMsg}</td>
  370. </tr>
  371. <tr>
  372. <td class='admin-td'>文件大小:</td>
  373. <td class='admin-td'>{$infos['filesize']}</td>
  374. </tr>
  375. <tr>
  376. <td class='admin-td'>开发者id:</td>
  377. <td class='admin-td'>{$dev_id}</td>
  378. </tr>
  379. <tr>
  380. <td class='admin-td'>发布时间:</td>
  381. <td class='admin-td'>{$infos['time']}</td>
  382. </tr>
  383. <tr>
  384. <td class='admin-td'>使用协议:</td>
  385. <td class='admin-td'><a href='module_main.php?action=showreadme&hash={$hash}' target='_blank' class='btn btn-success btn-sm'>浏览</a></td>
  386. </tr>
  387. <tr>
  388. <td>模块包含的文件(文件路径相对于当前目录)</td>
  389. <td></td>
  390. </tr>
  391. <tr>
  392. <td colspan='2'><textarea name='filelists' id='filelists' class='admin-textarea-xl'>{$filelist}</textarea></td>
  393. </tr>
  394. <tr>
  395. <td>对于模块的文件处理方法:</td>
  396. <td>
  397. <label><input type='radio' name='isreplace' value='0' checked='checked'> 手工删除文件,仅运行卸载程序</label>
  398. <label><input type='radio' name='isreplace' value='2'> 删除模块的所有文件</label>
  399. </td>
  400. </tr>
  401. </table>";
  402. $win->AddMsgItem("$msg");
  403. $winform = $win->GetWindow("ok", "");
  404. $win->Display();
  405. $dm->Clear();
  406. exit();
  407. }
  408. /*--------------
  409. function UnInstallRun();
  410. --------------*/
  411. else if ($action == 'uninstallok') {
  412. $dsql->ExecuteNoneQuery("DELETE FROM `#@__sys_module` WHERE hashcode LIKE '$hash' ");
  413. $dm = new DedeModule($mdir);
  414. $minfos = (array)$dm->GetModuleInfo($hash);
  415. extract($minfos, EXTR_SKIP);
  416. if (!isset($moduletype) || $moduletype != 'patch') {
  417. $dm->DeleteFiles($hash, $isreplace);
  418. }
  419. @$dm->DelSystemFile($hash, 'readme');
  420. @$dm->DelSystemFile($hash, 'setup');
  421. $dm->Clear();
  422. if (!isset($autodel) || $autodel == 0) {
  423. include(DEDEDATA."/module/{$hash}-uninstall.php");
  424. @unlink(DEDEDATA."/module/{$hash}-uninstall.php");
  425. exit();
  426. } else {
  427. @$dm->DelSystemFile($hash, 'uninstall');
  428. $delsql = $dm->GetSystemFile($hash, 'delsql');
  429. if (trim($delsql) != '') {
  430. $sqls = explode(';', $delsql);
  431. foreach ($sqls as $sql) {
  432. if (trim($sql) != '') $dsql->ExecuteNoneQuery($sql);
  433. }
  434. }
  435. ReWriteConfigAuto();
  436. $rflwft = "<script>\r\n";
  437. $rflwft .= "if (window.navigator.userAgent.indexOf('MSIE')>=1) top.document.frames.menu.location = 'index_menu.php';\r\n";
  438. $rflwft .= "else top.document.getElementById('menufra').src = 'index_menu.php';\r\n";
  439. $rflwft .= "</script>";
  440. echo $rflwft;
  441. ShowMsg('模块卸载完成', 'module_main.php');
  442. exit();
  443. }
  444. }
  445. /*--------------
  446. function ShowReadme();
  447. --------------*/
  448. else if ($action == 'showreadme') {
  449. $dm = new DedeModule($mdir);
  450. $msg = $dm->GetSystemFile($hash, 'readme');
  451. $msg = preg_replace("/(.*)<body/isU", "", $msg);
  452. $msg = preg_replace("/<\/body>(.*)/isU", "", $msg);
  453. $dm->Clear();
  454. $win = new OxWindow();
  455. $win->Init("module_main.php", "js/blank.js", "post");
  456. $wecome_info = "模块管理";
  457. $win->AddTitle("<a href='module_main.php'>模块管理</a> &gt; 使用说明");
  458. $win->AddMsgItem("$msg");
  459. $winform = $win->GetWindow("hand");
  460. $win->Display();
  461. exit();
  462. }
  463. /*--------------
  464. function ViewOne();
  465. --------------*/
  466. else if ($action == 'view') {
  467. $dm = new DedeModule($mdir);
  468. $infos = $dm->GetModuleInfo($hash);
  469. if ($infos['url'] == '') $infos['url'] = ' ';
  470. $alertMsg = ($infos['lang'] == $cfg_soft_lang ? '' : '<br>该模块的语言编码与您系统的编码不一致,请向开发者确认它的兼容性');
  471. $filelists = (array)$dm->GetFileLists($hash);
  472. $filelist = '';
  473. $setupinfo = '';
  474. $devURL = DEDECDNURL."/developers/{$infos['dev_id']}.json";
  475. $dhd = new DedeHttpDown();
  476. $dhd->OpenUrl($devURL);
  477. $devContent = $dhd->GetHtml();
  478. $devInfo = (array)json_decode($devContent);
  479. $s = "未认证";
  480. if (($devInfo['dev_id'] == $infos['dev_id']) && !empty($devInfo['dev_id'])) {
  481. $s = "已认证";
  482. }
  483. foreach ($filelists as $v) {
  484. if (empty($v['name'])) continue;
  485. if ($v['type'] == 'dir') $v['type'] = '目录';
  486. else $v['type'] = '文件';
  487. $filelist .= "{$v['type']}|{$v['name']}\r\n";
  488. }
  489. if (file_exists(DEDEDATA."/module/{$hash}-readme.php")) {
  490. $setupinfo = "已安装 <a href='module_main.php?action=uninstall&hash={$hash}'>卸载</a>";
  491. } else {
  492. $setupinfo = "未安装 <a href='module_main.php?action=setup&hash={$hash}'>安装</a>";
  493. }
  494. $dev_id = empty($infos['dev_id'])? "<a href='module_main.php?action=setup&hash={$hash}' class='btn btn-warning btn-sm'>安装</a><a href='{$cfg_biz_dedebizUrl}/developer' target='_blank' class='btn btn-success btn-sm'>{$s}</a>" : "{$infos['dev_id']} <a href='module_main.php?action=setup&hash={$hash}' class='btn btn-warning btn-sm'>安装</a><a href='{$cfg_biz_dedebizUrl}/developer?dev_id={$infos['dev_id']}' target='_blank' class='btn btn-success btn-sm'>{$s}</a>";
  495. $win = new OxWindow();
  496. $win->Init("", "js/blank.js", "");
  497. $wecome_info = "模块管理";
  498. $win->AddTitle("<a href='module_main.php'>模块管理</a> &gt; {$infos['name']}");
  499. $msg = "<table width='98%' cellspacing='0' cellpadding='0'>
  500. <tr>
  501. <td width='260' class='admin-td'>模块名称:</td>
  502. <td class='admin-td'>{$infos['name']}</td>
  503. </tr>
  504. <tr>
  505. <td class='admin-td'>语言:</td>
  506. <td class='admin-td'>{$infos['lang']} {$alertMsg}</td>
  507. </tr>
  508. <tr>
  509. <td class='admin-td'>文件大小:</td>
  510. <td class='admin-td'>{$infos['filesize']}</td>
  511. </tr>
  512. <tr>
  513. <td class='admin-td'>开发者id:</td>
  514. <td class='admin-td'>{$dev_id}</td>
  515. </tr>
  516. <tr>
  517. <td class='admin-td'>发布时间:</td>
  518. <td class='admin-td'>{$infos['time']}</td>
  519. </tr>
  520. <tr>
  521. <td class='admin-td'>使用协议:</td>
  522. <td class='admin-td'><a href='module_main.php?action=showreadme&hash={$hash}' target='_blank' class='btn btn-success btn-sm'>浏览</a></td>
  523. </tr>
  524. <tr>
  525. <td>模块包含的文件(文件路径相对于当前目录)</td>
  526. <td></td>
  527. </tr>
  528. <tr>
  529. <td colspan='2'><textarea name='filelists' id='filelists' class='admin-textarea-xl'>{$filelist}</textarea></td>
  530. </tr>
  531. </table>";
  532. $win->AddMsgItem("$msg");
  533. $winform = $win->GetWindow('hand', '');
  534. $win->Display();
  535. $dm->Clear();
  536. exit();
  537. }
  538. /*--------------
  539. function Edit();
  540. --------------*/
  541. else if ($action == 'edit') {
  542. $dm = new DedeModule($mdir);
  543. $minfos = (array)$dm->GetModuleInfo($hash);
  544. extract($minfos, EXTR_SKIP);
  545. if (!isset($lang)) $lang = 'gb2312';
  546. if (!isset($moduletype)) $moduletype = 'soft';
  547. $menustring = $dm->GetSystemFile($hash, 'menustring');
  548. $setupsql40 = dede_htmlspecialchars($dm->GetSystemFile($hash, 'setupsql40'));
  549. $readmetxt = $dm->GetSystemFile($hash, 'readme');
  550. $delsql = $dm->GetSystemFile($hash, 'delsql');
  551. $filelist = $dm->GetSystemFile($hash, 'oldfilelist', false);
  552. $indexurl = str_replace('**', '=', $indexurl);
  553. $dm->Clear();
  554. require_once(dirname(__FILE__).'/templets/module_edit.htm');
  555. exit();
  556. }
  557. /*--------------
  558. function Download();
  559. --------------*/
  560. else if ($action == 'download') {
  561. ShowMsg("暂不支持模块下载功能", "javascript:;");
  562. }
  563. ?>