国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
5 månader sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
2 år sedan
1 år sedan
6 månader sedan
2 år sedan
6 månader sedan
2 år sedan
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. <?php
  2. /**
  3. * 后台api接口
  4. *
  5. * @version $id:api.php 8:26 2022年11月20日 tianya $
  6. * @package DedeBIZ.Administrator
  7. * @copyright Copyright (c) 2022 DedeBIZ.COM
  8. * @license GNU GPL v2 (https://www.dedebiz.com/license)
  9. * @link https://www.dedebiz.com
  10. */
  11. define('AJAXLOGIN', TRUE);
  12. define('IS_DEDEAPI', TRUE);
  13. define('DEDEADMIN', str_replace("\\", '/', dirname(__FILE__)));
  14. require_once(DEDEADMIN.'/../system/common.inc.php');
  15. require_once(DEDEINC.'/userlogin.class.php');
  16. @set_time_limit(0);
  17. AjaxHead();
  18. helper('cache');
  19. $action = isset($action) && in_array($action, array('is_need_check_code', 'has_new_version', 'get_changed_files', 'update_backup', 'get_update_versions', 'update', 'upload_image', 'get_ai_server', 'get_setbody_url')) ? $action : '';
  20. $curDir = dirname(GetCurUrl());//当前目录
  21. /**
  22. * 登录鉴权
  23. *
  24. * @return void
  25. */
  26. function checkLogin()
  27. {
  28. $cuserLogin = new userLogin();
  29. if ($cuserLogin->getUserID() <= 0 || $cuserLogin->getUserType() != 10) {
  30. echo json_encode(array(
  31. "code" => -1,
  32. "msg" => "此操作需要登录超级管理员权限",
  33. "data" => null,
  34. ));
  35. exit;
  36. }
  37. }
  38. if ($action === 'is_need_check_code') {
  39. $cuserLogin = new userLogin();
  40. $isNeed = $cuserLogin->isNeedCheckCode($userid);
  41. echo json_encode(array(
  42. "code" => 0,
  43. "msg" => "",
  44. "data" => array(
  45. "isNeed" => $isNeed,
  46. ),
  47. ));
  48. exit;
  49. } else if ($action === 'has_new_version') {
  50. //判断版本SQL之间差异
  51. $unQueryVer = array();
  52. if (!TableHasField("#@__tagindex", "keywords")) {
  53. $unQueryVer[] = "6.0.2";
  54. }
  55. if (!TableHasField("#@__feedback", "replycount")) {
  56. $unQueryVer[] = "6.0.3";
  57. }
  58. if (!TableHasField("#@__arctype", "litimg")) {
  59. $unQueryVer[] = "6.1.0";
  60. }
  61. if (!$dsql->IsTable("#@__statistics")) {
  62. $unQueryVer[] = "6.1.7";
  63. }
  64. if (TableHasField("#@__tagindex", "tag_pinyin")) {
  65. $unQueryVer[] = "6.1.8";
  66. }
  67. if (!TableHasField("#@__admin", "pwd_new")) {
  68. $unQueryVer[] = "6.1.9";
  69. }
  70. if (!TableHasField("#@__arctype", "cnoverview")) {
  71. $unQueryVer[] = "6.1.10";
  72. }
  73. if (!TableHasField("#@__admin", "loginerr") || !TableHasField("#@__member", "loginerr")) {
  74. $unQueryVer[] = "6.2.0";
  75. }
  76. $row = $dsql->GetOne("SELECT COUNT(*) as dd FROM `#@__sysconfig` WHERE varname = 'cfg_bizcore_api'");
  77. if (isset($row['dd']) && $row['dd'] == 0) {
  78. $unQueryVer[] = "6.2.3";
  79. }
  80. if (!$dsql->IsTable("#@__sys_payment")) {
  81. $unQueryVer[] = "6.2.5";
  82. }
  83. if (!TableHasField("#@__arctype", "apienabled")) {
  84. $unQueryVer[] = "6.2.7";
  85. }
  86. if (!$dsql->IsTable("#@__ai")) {
  87. $unQueryVer[] = "6.5.0";
  88. }
  89. if ($dsql->IsTable("#@__ai_prompt")) {
  90. $row = $dsql->GetOne("SELECT COUNT(*) as dd FROM `#@__ai_prompt` WHERE pname = 'body_edit'");
  91. if (isset($row['dd']) && $row['dd'] == 0) {
  92. $unQueryVer[] = "6.5.2";
  93. }
  94. }
  95. if (count($unQueryVer) > 0) {
  96. $upsqls = GetUpdateSQL();
  97. foreach ($unQueryVer as $vv) {
  98. $ss = $upsqls[$vv];
  99. foreach ($ss as $s) {
  100. if (trim($s) != '') {
  101. $dsql->safeCheck = false;
  102. $dsql->ExecuteNoneQuery(trim($s));
  103. $dsql->safeCheck = true;
  104. }
  105. }
  106. }
  107. }
  108. require_once(DEDEINC.'/libraries/dedehttpdown.class.php');
  109. checkLogin();
  110. //发现有新版本
  111. $phpv = phpversion();
  112. $sp_os = PHP_OS;
  113. $mysql_ver = $dsql->GetVersion();
  114. $nurl = $_SERVER['HTTP_HOST'];
  115. if (preg_match("#[a-z\-]{1,}\.[a-z]{2,}#i", $nurl)) {
  116. $nurl = urlencode($nurl);
  117. } else {
  118. $nurl = "test";
  119. }
  120. $add_query = '';
  121. $query = "SELECT COUNT(*) AS dd FROM `#@__member` ";
  122. $row1 = $dsql->GetOne($query);
  123. if ($row1) $add_query .= "&mcount={$row1['dd']}";
  124. $query = "SELECT COUNT(*) AS dd FROM `#@__arctiny` ";
  125. $row2 = $dsql->GetOne($query);
  126. if ($row2) $add_query .= "&acount={$row2['dd']}";
  127. $offUrl = DEDEBIZURL."/version?version={$cfg_version_detail}&formurl={$nurl}&phpver={$phpv}&os={$sp_os}&mysqlver={$mysql_ver}{$add_query}&json=1";
  128. if (strpos($_SERVER['SERVER_SOFTWARE'], 'Development Server') !== false && version_compare(phpversion(), '7.2', '<')) {
  129. echo json_encode(array(
  130. "code"=>-1,
  131. "msg"=>'获取版本信息失败',
  132. ));
  133. exit;
  134. }
  135. $dhd = new DedeHttpDown();
  136. $dhd->OpenUrl($offUrl);
  137. $data = $dhd->GetHtml();
  138. if (empty($data)) {
  139. echo json_encode(array(
  140. "code" => -1,
  141. "msg" => '获取版本信息失败',
  142. ));
  143. } else {
  144. echo $data;
  145. }
  146. } else if ($action === 'get_changed_files') {
  147. require_once(DEDEINC.'/libraries/dedehttpdown.class.php');
  148. checkLogin();
  149. //获取本地更改过的文件
  150. $hashUrl = DEDEBIZCDN.'/release/'.$cfg_version_detail.'.json';
  151. $dhd = new DedeHttpDown();
  152. $dhd->OpenUrl($hashUrl);
  153. $data = $dhd->GetJSON();
  154. if (empty($data)) {
  155. echo json_encode(array(
  156. "code" => -1,
  157. "msg" => '获取版本信息失败',
  158. ));
  159. exit();
  160. }
  161. $changedFiles = array();
  162. foreach ($data as $file) {
  163. $realFile = DEDEROOT.str_replace("\\", '/', $file->filename);
  164. if (file_exists($realFile) && md5_file($realFile) !== $file->hash) {
  165. $changedFiles[] = $file;
  166. continue;
  167. }
  168. }
  169. echo json_encode(array(
  170. "code" => 0,
  171. "msg" => "",
  172. "data" => array(
  173. "files" => $changedFiles,
  174. ),
  175. ));
  176. exit;
  177. } else if ($action === 'update_backup') {
  178. require_once(DEDEINC.'/libraries/dedehttpdown.class.php');
  179. checkLogin();
  180. //获取本地更改过的文件
  181. $hashUrl = DEDEBIZCDN.'/release/'.$cfg_version_detail.'.json';
  182. $dhd = new DedeHttpDown();
  183. $dhd->OpenUrl($hashUrl);
  184. $data = $dhd->GetJSON();
  185. if (empty($data)) {
  186. echo json_encode(array(
  187. "code" => -1,
  188. "msg" => '获取版本信息失败',
  189. ));
  190. exit;
  191. }
  192. $changedFiles = array();
  193. $enkey = substr(md5(substr($cfg_cookie_encode, 0, 5)), 0, 10);
  194. $backupPath = DEDEDATA."/backupfile_{$enkey}";
  195. RmRecurse($backupPath);
  196. mkdir($backupPath);
  197. foreach ($data as $file) {
  198. $realFile = DEDEROOT.str_replace("\\", '/', $file->filename);
  199. //备份文件
  200. if (file_exists($realFile) && md5_file($realFile) !== $file->hash) {
  201. $dstFile = $backupPath.'/'.str_replace("\\", '/', $file->filename);
  202. @mkdir(dirname($dstFile), 0777, true);
  203. copy($realFile, $dstFile);
  204. }
  205. }
  206. echo json_encode(array(
  207. "code" => 0,
  208. "msg" => "",
  209. "data" => array(
  210. "backupdir" => "data/backupfile_{$enkey}",
  211. ),
  212. ));
  213. exit;
  214. } else if ($action === 'get_update_versions') {
  215. require_once(DEDEINC.'/libraries/dedehttpdown.class.php');
  216. checkLogin();
  217. //获取本地更改过的文件
  218. $offUrl = DEDEBIZURL."/versions?version={$cfg_version_detail}";
  219. $dhd = new DedeHttpDown();
  220. $dhd->OpenUrl($offUrl);
  221. $data = $dhd->GetHtml();
  222. if (empty($data)) {
  223. echo json_encode(array(
  224. "code" => -1,
  225. "msg" => '获取版本信息失败',
  226. ));
  227. exit;
  228. }
  229. $arr = json_decode($data);
  230. SetCache('update', 'vers', $arr->result->Versions);
  231. echo $data;
  232. exit;
  233. } else if ($action === 'update') {
  234. require_once(DEDEINC.'/libraries/dedehttpdown.class.php');
  235. $row = GetCache('update', 'vers');
  236. if (count($row) === 0) {
  237. echo json_encode(array(
  238. "code" => -1,
  239. "msg" => "请获取版本更新记录",
  240. "data" => null,
  241. ));
  242. exit;
  243. }
  244. $enkey = substr(md5(substr($cfg_cookie_encode, 0, 5)), 0, 10);
  245. $backupPath = DEDEDATA."/updatefile_{$enkey}";
  246. @mkdir($backupPath);
  247. foreach ($row as $k => $ver) {
  248. if ($ver->isdownload !== true) {
  249. $filesUrl = DEDEBIZCDN.'/update/'.$ver->ver.'/files.txt';
  250. $dhd = new DedeHttpDown();
  251. $dhd->OpenUrl($filesUrl);
  252. $fileList = $dhd->GetJSON();
  253. $dhd->Close();
  254. $backupVerPath = $backupPath.'/'.$ver->ver;
  255. if (!is_dir($backupVerPath)) {
  256. @mkdir($backupVerPath);
  257. }
  258. $i = 0;
  259. foreach ($fileList as $f) {
  260. $realFile = $backupVerPath.$f->filename;
  261. //忽略src之外的目录
  262. if (!preg_match("/^\//", $f->filename)) {
  263. continue;
  264. }
  265. if (file_exists($realFile)) {
  266. continue;
  267. }
  268. $fileUrl = DEDEBIZCDN.'/update/'.$ver->ver.'/src'.$f->filename;
  269. $dhd = new DedeHttpDown();
  270. $dhd->OpenUrl($fileUrl);
  271. $fData = $dhd->GetHtml();
  272. $dhd->Close();
  273. $f->filename = preg_replace('/^\/admin/', $curDir, $f->filename);
  274. @mkdir(dirname($realFile), 0777, true);
  275. file_put_contents($realFile, $fData);
  276. $i++;
  277. if ($i === 10) {
  278. echo json_encode(array(
  279. "code" => 0,
  280. "msg" => "正在下载{$ver->ver}版本的{$f->filename}文件",
  281. "data" => array(
  282. "finish" => false,
  283. ),
  284. ));
  285. exit;
  286. }
  287. }
  288. $sqlUrl = DEDEBIZCDN.'/update/'.$ver->ver.'/update.sql';
  289. $dhd = new DedeHttpDown();
  290. $dhd->OpenUrl($sqlUrl);
  291. $fData = $dhd->GetHtml();
  292. $dhd->Close();
  293. $realFile = $backupVerPath.'/update.sql';
  294. file_put_contents($realFile, $fData);
  295. $realFile = $backupVerPath.'/files.txt';
  296. file_put_contents($realFile, json_encode($fileList));
  297. $row[$k]->isdownload = true;
  298. SetCache('update', 'vers', $row);
  299. echo json_encode(array(
  300. "code" => 0,
  301. "msg" => "正在下载{$ver->ver}版本更新文件",
  302. "data" => array(
  303. "finish" => false,
  304. ),
  305. ));
  306. exit;
  307. }
  308. }
  309. foreach ($row as $k => $ver) {
  310. if ($ver->ispatched !== true) {
  311. $backupVerPath = $backupPath.'/'.$ver->ver;
  312. //执行更新SQL文件
  313. $sql = file_get_contents($backupVerPath.'/update.sql');
  314. if (!empty($sql)) {
  315. $sql = preg_replace('#ENGINE=MyISAM#i', 'TYPE=MyISAM', $sql);
  316. $sql41tmp = 'ENGINE=MyISAM DEFAULT CHARSET='.$cfg_db_language;
  317. $sql = preg_replace('#TYPE=MyISAM#i', $sql41tmp, $sql);
  318. $sqls = explode(";\r\n", $sql);
  319. foreach ($sqls as $sql) {
  320. if (trim($sql) != '') {
  321. $dsql->safeCheck = false;
  322. $dsql->ExecuteNoneQuery(trim($sql));
  323. $dsql->safeCheck = true;
  324. }
  325. }
  326. }
  327. //复制文件
  328. $fileList = json_decode(file_get_contents($backupVerPath.'/files.txt'));
  329. foreach ($fileList as $f) {
  330. //忽略src之外的目录
  331. if (!preg_match("/^\//", $f->filename)) {
  332. continue;
  333. }
  334. $f->filename = preg_replace('/^\/admin/', $curDir, $f->filename);
  335. $srcFile = $backupVerPath.$f->filename;
  336. $dstFile = str_replace(array("\\", "//"), '/', DEDEROOT.$f->filename);
  337. @mkdir(dirname($dstFile), 0777, true);
  338. $rs = @copy($srcFile, $dstFile);
  339. if ($rs) {
  340. unlink($srcFile);
  341. }
  342. }
  343. $row[$k]->ispatched = true;
  344. SetCache('update', 'vers', $row);
  345. RmRecurse($backupVerPath);
  346. echo json_encode(array(
  347. "code" => 0,
  348. "msg" => "正在更新{$ver->ver}版本补丁文件",
  349. "data" => array(
  350. "finish" => false,
  351. ),
  352. ));
  353. exit;
  354. }
  355. }
  356. echo json_encode(array(
  357. "code" => 0,
  358. "msg" => "",
  359. "data" => array(
  360. "finish" => true,
  361. ),
  362. ));
  363. exit;
  364. } else if($action === 'upload_image') {
  365. $cuserLogin = new userLogin();
  366. if ($cuserLogin->getUserID() <= 0) {
  367. echo json_encode(array(
  368. "code" => -1,
  369. "msg" => "登录系统后才能上传图片",
  370. "data" => null,
  371. ));
  372. exit;
  373. }
  374. $imgfile_name = $_FILES["file"]['name'];
  375. $activepath = $cfg_image_dir;
  376. $allowedTypes = array("image/pjpeg", "image/jpeg", "image/gif", "image/png", "image/xpng", "image/wbmp", "image/webp");
  377. $uploadedFile = $_FILES['file']['tmp_name'];
  378. if (!function_exists('mime_content_type')) {
  379. echo json_encode(array(
  380. "code" => -1,
  381. "uploaded" => 0,
  382. "error" => array(
  383. "message" => "系统不支持fileinfo组件,建议php.ini中开启",
  384. ),
  385. ));
  386. exit;
  387. }
  388. if (empty($uploadedFile)) {
  389. echo json_encode(array(
  390. "code" => -1,
  391. "msg" => "文件为空",
  392. "data" => null,
  393. ));
  394. exit;
  395. }
  396. $fileType = mime_content_type($uploadedFile);
  397. $imgSize = getimagesize($uploadedFile);
  398. if (!in_array($fileType, $allowedTypes) || !$imgSize) {
  399. echo json_encode(array(
  400. "code" => -1,
  401. "uploaded" => 0,
  402. "error" => array(
  403. "message" => "仅支持图片格式文件",
  404. ),
  405. ));
  406. exit;
  407. }
  408. $nowtme = time();
  409. $mdir = MyDate($cfg_addon_savetype, $nowtme);
  410. if (!is_dir($cfg_basedir.$activepath."/$mdir")) {
  411. MkdirAll($cfg_basedir.$activepath."/$mdir", $cfg_dir_purview);
  412. }
  413. $cuserLogin = new userLogin();
  414. $iseditor = isset($iseditor)? intval($iseditor) : 0;
  415. $filename_name = $cuserLogin->getUserID().'-'.dd2char(MyDate("ymdHis", $nowtme).mt_rand(100, 999));
  416. $filename = $mdir.'/'.$filename_name;
  417. $fs = explode('.', $imgfile_name);
  418. $filename = $filename.'.'.$fs[count($fs) - 1];
  419. $filename_name = $filename_name.'.'.$fs[count($fs) - 1];
  420. $fullfilename = $cfg_basedir.$activepath."/".$filename;
  421. if (preg_match('#\.(php|pl|cgi|asp|aspx|jsp|php5|php4|php3|shtm|shtml|htm)$#i', trim($fullfilename))) {
  422. echo json_encode(array(
  423. "code" => -1,
  424. "uploaded" => 0,
  425. "error" => array(
  426. "message" => "文件扩展名已被系统禁止",
  427. ),
  428. ));
  429. exit;
  430. }
  431. move_uploaded_file($_FILES["file"]["tmp_name"], $fullfilename) or die(json_encode(array(
  432. "code" => -1,
  433. "uploaded" => 0,
  434. "error" => array(
  435. "message" => "上传失败",
  436. ),
  437. )));
  438. $info = '';
  439. $sizes[0] = 0;
  440. $sizes[1] = 0;
  441. $sizes = getimagesize($fullfilename, $info);
  442. $imgwidthValue = $sizes[0];
  443. $imgheightValue = $sizes[1];
  444. $imgsize = filesize($fullfilename);
  445. $inquery = "INSERT INTO `#@__uploads` (arcid,title,url,mediatype,width,height,playtime,filesize,uptime,mid) VALUES ('0','$filename','".$activepath."/".$filename."','1','$imgwidthValue','$imgheightValue','0','{$imgsize}','{$nowtme}','".$cuserLogin->getUserID()."'); ";
  446. $dsql->ExecuteNoneQuery($inquery);
  447. $fid = $dsql->GetLastID();
  448. AddMyAddon($fid, $activepath.'/'.$filename);
  449. echo json_encode(array(
  450. "code" => 0,
  451. "msg" => "上传成功",
  452. "data" => $activepath."/".$filename,
  453. ));
  454. } else if($action === 'get_ai_server') {
  455. $params = $_GET;
  456. unset($params['action']);
  457. checkLogin();
  458. $params['timestamp'] = time(); // 加入时间戳
  459. $cuserLogin = new userLogin();
  460. $params['adminid'] = $cuserLogin->getUserID(); // 加入时间戳
  461. $params['ip'] = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1'; // 获取客户端IP
  462. ksort($params); // 按字典序排序
  463. $queryString = http_build_query($params); // 生成查询字符串
  464. $params['sign'] = md5($queryString . $cfg_ai_apikey); // 计算MD5签名
  465. $url = $cfg_ai_server . '/ai?' . http_build_query($params);
  466. echo json_encode(array(
  467. "code" => 0,
  468. "data" => $url,
  469. ));
  470. } else if($action === 'get_setbody_url') {
  471. $params = $_GET;
  472. unset($params['action']);
  473. checkLogin();
  474. $params['timestamp'] = time(); // 加入时间戳
  475. $cuserLogin = new userLogin();
  476. $params['adminid'] = $cuserLogin->getUserID(); // 加入时间戳
  477. $params['ip'] = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1'; // 获取客户端IP
  478. ksort($params); // 按字典序排序
  479. $queryString = http_build_query($params); // 生成查询字符串
  480. $params['sign'] = md5($queryString . $cfg_ai_apikey); // 计算MD5签名
  481. $url = $cfg_ai_server . '/api/setbody?' . http_build_query($params);
  482. echo json_encode(array(
  483. "code" => 0,
  484. "data" => $url,
  485. ));
  486. }
  487. ?>