install.php 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047
  1. <?php
  2. /**
  3. * [WeEngine System] Copyright (c) 2014 WE7.CC
  4. * WeEngine is NOT a free software, it under the license terms, visited http://www.we7.cc/ for more details.
  5. */
  6. error_reporting(E_ALL ^ E_NOTICE);
  7. @set_time_limit(0);
  8. ob_start();
  9. define('IA_ROOT', str_replace("\\",'/', dirname(__FILE__)));
  10. define('APP_URL', 'http://v2.addons.we7.cc/web/');
  11. define('APP_STORE_URL', 'http://v2.addons.we7.cc/web');
  12. define('APP_STORE_API', 'http://v2.addons.we7.cc/api.php');
  13. if($_GET['res']) {
  14. $res = $_GET['res'];
  15. $reses = tpl_resources();
  16. if(array_key_exists($res, $reses)) {
  17. if($res == 'css') {
  18. header('content-type:text/css');
  19. } else {
  20. header('content-type:image/png');
  21. }
  22. echo base64_decode($reses[$res]);
  23. exit();
  24. }
  25. }
  26. $actions = array('license', 'env', 'db', 'finish');
  27. $action = $_COOKIE['action'];
  28. $action = in_array($action, $actions) ? $action : 'license';
  29. $ispost = strtolower($_SERVER['REQUEST_METHOD']) == 'post';
  30. if(file_exists(IA_ROOT . '/data/install.lock') && $action != 'finish') {
  31. header('location: ./index.php');
  32. exit;
  33. }
  34. header('content-type: text/html; charset=utf-8');
  35. if($action == 'license') {
  36. if($ispost) {
  37. setcookie('action', 'env');
  38. header('location: ?refresh');
  39. exit;
  40. }
  41. tpl_install_license();
  42. }
  43. if($action == 'env') {
  44. if($ispost) {
  45. setcookie('action', $_POST['do'] == 'continue' ? 'db' : 'license');
  46. header('location: ?refresh');
  47. exit;
  48. }
  49. $ret = array();
  50. $ret['server']['os']['value'] = php_uname();
  51. if(PHP_SHLIB_SUFFIX == 'dll') {
  52. $ret['server']['os']['remark'] = '建议使用 Linux 系统以提升程序性能';
  53. $ret['server']['os']['class'] = 'warning';
  54. }
  55. $ret['server']['sapi']['value'] = $_SERVER['SERVER_SOFTWARE'];
  56. if(PHP_SAPI == 'isapi') {
  57. $ret['server']['sapi']['remark'] = '建议使用 Apache 或 Nginx 以提升程序性能';
  58. $ret['server']['sapi']['class'] = 'warning';
  59. }
  60. $ret['server']['php']['value'] = PHP_VERSION;
  61. $ret['server']['dir']['value'] = IA_ROOT;
  62. if(function_exists('disk_free_space')) {
  63. $ret['server']['disk']['value'] = floor(disk_free_space(IA_ROOT) / (1024*1024)).'M';
  64. } else {
  65. $ret['server']['disk']['value'] = 'unknow';
  66. }
  67. $ret['server']['upload']['value'] = @ini_get('file_uploads') ? ini_get('upload_max_filesize') : 'unknow';
  68. $ret['php']['version']['value'] = PHP_VERSION;
  69. $ret['php']['version']['class'] = 'success';
  70. if(version_compare(PHP_VERSION, '5.3.0') == -1) {
  71. $ret['php']['version']['class'] = 'danger';
  72. $ret['php']['version']['failed'] = true;
  73. $ret['php']['version']['remark'] = 'PHP版本必须为 5.3.0 以上. <a href="http://bbs.we7.cc/forum.php?mod=redirect&goto=findpost&ptid=3564&pid=58062">详情</a>';
  74. }
  75. $ret['php']['pdo']['ok'] = extension_loaded('pdo') && extension_loaded('pdo_mysql');
  76. if($ret['php']['pdo']['ok']) {
  77. $ret['php']['pdo']['value'] = '<span class="glyphicon glyphicon-ok text-success"></span>';
  78. $ret['php']['pdo']['class'] = 'success';
  79. } else {
  80. $ret['php']['pdo']['failed'] = true;
  81. $ret['php']['pdo']['value'] = '<span class="glyphicon glyphicon-remove text-warning"></span>';
  82. $ret['php']['pdo']['class'] = 'warning';
  83. $ret['php']['pdo']['remark'] = '您的PHP环境不支持PDO, 请开启此扩展. <a target="_blank" href="http://bbs.we7.cc/forum.php?mod=redirect&goto=findpost&ptid=3564&pid=58074">详情</a>';
  84. }
  85. $ret['php']['fopen']['ok'] = @ini_get('allow_url_fopen') && function_exists('fsockopen');
  86. if($ret['php']['fopen']['ok']) {
  87. $ret['php']['fopen']['value'] = '<span class="glyphicon glyphicon-ok text-success"></span>';
  88. } else {
  89. $ret['php']['fopen']['value'] = '<span class="glyphicon glyphicon-remove text-danger"></span>';
  90. }
  91. $ret['php']['curl']['ok'] = extension_loaded('curl') && function_exists('curl_init');
  92. if($ret['php']['curl']['ok']) {
  93. $ret['php']['curl']['value'] = '<span class="glyphicon glyphicon-ok text-success"></span>';
  94. $ret['php']['curl']['class'] = 'success';
  95. } else {
  96. $ret['php']['curl']['value'] = '<span class="glyphicon glyphicon-remove text-danger"></span>';
  97. $ret['php']['curl']['class'] = 'danger';
  98. $ret['php']['curl']['remark'] = '您的PHP环境不支持cURL, 也不支持 allow_url_fopen, 系统无法正常运行. <a target="_blank" href="http://bbs.we7.cc/forum.php?mod=redirect&goto=findpost&ptid=3564&pid=58086">详情</a>';
  99. $ret['php']['curl']['failed'] = true;
  100. }
  101. $ret['php']['ssl']['ok'] = extension_loaded('openssl');
  102. if($ret['php']['ssl']['ok']) {
  103. $ret['php']['ssl']['value'] = '<span class="glyphicon glyphicon-ok text-success"></span>';
  104. $ret['php']['ssl']['class'] = 'success';
  105. } else {
  106. $ret['php']['ssl']['value'] = '<span class="glyphicon glyphicon-remove text-danger"></span>';
  107. $ret['php']['ssl']['class'] = 'danger';
  108. $ret['php']['ssl']['failed'] = true;
  109. $ret['php']['ssl']['remark'] = '没有启用OpenSSL, 将无法访问公众平台的接口, 系统无法正常运行. <a target="_blank" href="http://bbs.we7.cc/forum.php?mod=redirect&goto=findpost&ptid=3564&pid=58109">详情</a>';
  110. }
  111. $ret['php']['gd']['ok'] = extension_loaded('gd');
  112. if($ret['php']['gd']['ok']) {
  113. $ret['php']['gd']['value'] = '<span class="glyphicon glyphicon-ok text-success"></span>';
  114. $ret['php']['gd']['class'] = 'success';
  115. } else {
  116. $ret['php']['gd']['value'] = '<span class="glyphicon glyphicon-remove text-danger"></span>';
  117. $ret['php']['gd']['class'] = 'danger';
  118. $ret['php']['gd']['failed'] = true;
  119. $ret['php']['gd']['remark'] = '没有启用GD, 将无法正常上传和压缩图片, 系统无法正常运行. <a target="_blank" href="http://bbs.we7.cc/forum.php?mod=redirect&goto=findpost&ptid=3564&pid=58110">详情</a>';
  120. }
  121. $ret['php']['dom']['ok'] = class_exists('DOMDocument');
  122. if($ret['php']['dom']['ok']) {
  123. $ret['php']['dom']['value'] = '<span class="glyphicon glyphicon-ok text-success"></span>';
  124. $ret['php']['dom']['class'] = 'success';
  125. } else {
  126. $ret['php']['dom']['value'] = '<span class="glyphicon glyphicon-remove text-danger"></span>';
  127. $ret['php']['dom']['class'] = 'danger';
  128. $ret['php']['dom']['failed'] = true;
  129. $ret['php']['dom']['remark'] = '没有启用DOMDocument, 将无法正常安装使用模块, 系统无法正常运行. <a target="_blank" href="http://bbs.we7.cc/forum.php?mod=redirect&goto=findpost&ptid=3564&pid=58111">详情</a>';
  130. }
  131. $ret['php']['session']['ok'] = ini_get('session.auto_start');
  132. if($ret['php']['session']['ok'] == 0 || strtolower($ret['php']['session']['ok']) == 'off') {
  133. $ret['php']['session']['value'] = '<span class="glyphicon glyphicon-ok text-success"></span>';
  134. $ret['php']['session']['class'] = 'success';
  135. } else {
  136. $ret['php']['session']['value'] = '<span class="glyphicon glyphicon-remove text-danger"></span>';
  137. $ret['php']['session']['class'] = 'danger';
  138. $ret['php']['session']['failed'] = true;
  139. $ret['php']['session']['remark'] = '系统session.auto_start开启, 将无法正常注册会员, 系统无法正常运行. <a target="_blank" href="http://bbs.we7.cc/forum.php?mod=redirect&goto=findpost&ptid=3564&pid=58111">详情</a>';
  140. }
  141. $ret['php']['asp_tags']['ok'] = ini_get('asp_tags');
  142. if(empty($ret['php']['asp_tags']['ok']) || strtolower($ret['php']['asp_tags']['ok']) == 'off') {
  143. $ret['php']['asp_tags']['value'] = '<span class="glyphicon glyphicon-ok text-success"></span>';
  144. $ret['php']['asp_tags']['class'] = 'success';
  145. } else {
  146. $ret['php']['asp_tags']['value'] = '<span class="glyphicon glyphicon-remove text-danger"></span>';
  147. $ret['php']['asp_tags']['class'] = 'danger';
  148. $ret['php']['asp_tags']['failed'] = true;
  149. $ret['php']['asp_tags']['remark'] = '请禁用可以使用ASP 风格的标志,配置php.ini中asp_tags = Off';
  150. }
  151. $ret['write']['root']['ok'] = local_writeable(IA_ROOT . '/');
  152. if($ret['write']['root']['ok']) {
  153. $ret['write']['root']['value'] = '<span class="glyphicon glyphicon-ok text-success"></span>';
  154. $ret['write']['root']['class'] = 'success';
  155. } else {
  156. $ret['write']['root']['value'] = '<span class="glyphicon glyphicon-remove text-danger"></span>';
  157. $ret['write']['root']['class'] = 'danger';
  158. $ret['write']['root']['failed'] = true;
  159. $ret['write']['root']['remark'] = '本地目录无法写入, 将无法使用自动更新功能, 系统无法正常运行. <a href="http://bbs.we7.cc/">详情</a>';
  160. }
  161. $ret['write']['data']['ok'] = local_writeable(IA_ROOT . '/data');
  162. if($ret['write']['data']['ok']) {
  163. $ret['write']['data']['value'] = '<span class="glyphicon glyphicon-ok text-success"></span>';
  164. $ret['write']['data']['class'] = 'success';
  165. } else {
  166. $ret['write']['data']['value'] = '<span class="glyphicon glyphicon-remove text-danger"></span>';
  167. $ret['write']['data']['class'] = 'danger';
  168. $ret['write']['data']['failed'] = true;
  169. $ret['write']['data']['remark'] = 'data目录无法写入, 将无法写入配置文件, 系统无法正常安装. ';
  170. }
  171. $ret['continue'] = true;
  172. foreach($ret['php'] as $opt) {
  173. if($opt['failed']) {
  174. $ret['continue'] = false;
  175. break;
  176. }
  177. }
  178. if($ret['write']['failed']) {
  179. $ret['continue'] = false;
  180. }
  181. tpl_install_env($ret);
  182. }
  183. if($action == 'db') {
  184. if($ispost) {
  185. if($_POST['do'] != 'continue') {
  186. setcookie('action', 'env');
  187. header('location: ?refresh');
  188. exit();
  189. }
  190. $family = $_POST['family'] == 'x' ? 'x' : 'v';
  191. $db = $_POST['db'];
  192. $user = $_POST['user'];
  193. try {
  194. $pieces = explode(':', $db['server']);
  195. $db['server'] = $pieces[0];
  196. $db['port'] = !empty($pieces[1]) ? $pieces[1] : '3306';
  197. $link = new PDO("mysql:host={$db['server']};port={$db['port']}", $db['username'], $db['password']); // dns可以没有dbname
  198. $link->exec("SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary");
  199. $link->exec("SET sql_mode=''");
  200. if ($link->errorCode() != '00000') {
  201. $errorInfo = $link->errorInfo();
  202. $error = $errorInfo[2];
  203. } else {
  204. $statement = $link->query("SHOW DATABASES LIKE '{$db['name']}';");
  205. $fetch = $statement->fetch();
  206. if (empty($fetch)){
  207. if (substr($link->getAttribute(PDO::ATTR_SERVER_VERSION), 0, 3) > '4.1') {
  208. $link->query("CREATE DATABASE IF NOT EXISTS `{$db['name']}` DEFAULT CHARACTER SET utf8");
  209. } else {
  210. $link->query("CREATE DATABASE IF NOT EXISTS `{$db['name']}`");
  211. }
  212. }
  213. $statement = $link->query("SHOW DATABASES LIKE '{$db['name']}';");
  214. $fetch = $statement->fetch();
  215. if (empty($fetch)) {
  216. $error .= "数据库不存在且创建数据库失败. <br />";
  217. }
  218. if ($link->errorCode() != '00000') {
  219. $errorInfo = $link->errorInfo();
  220. $error .= $errorInfo[2];
  221. }
  222. }
  223. } catch (PDOException $e) {
  224. $error = $e->getMessage();
  225. if (strpos($error, 'Access denied for user') !== false) {
  226. $error = '您的数据库访问用户名或是密码错误. <br />';
  227. } else {
  228. $error = iconv('gbk', 'utf8', $error);
  229. }
  230. }
  231. if(empty($error)) {
  232. $link->exec("USE {$db['name']}");
  233. $statement = $link->query("SHOW TABLES LIKE '{$db['prefix']}%';");
  234. if ($statement->fetch()) {
  235. $error = '您的数据库不为空,请重新建立数据库或是清空该数据库或更改表前缀!';
  236. }
  237. }
  238. if(empty($error)) {
  239. $config = local_config();
  240. $cookiepre = local_salt(4) . '_';
  241. $authkey = local_salt(8);
  242. $config = str_replace(array(
  243. '{db-server}', '{db-username}', '{db-password}', '{db-port}', '{db-name}', '{db-tablepre}', '{cookiepre}', '{authkey}', '{attachdir}'
  244. ), array(
  245. $db['server'], $db['username'], $db['password'], $db['port'], $db['name'], $db['prefix'], $cookiepre, $authkey, 'attachment'
  246. ), $config);
  247. $verfile = IA_ROOT . '/framework/version.inc.php';
  248. $dbfile = IA_ROOT . '/data/db.php';
  249. if($_POST['type'] == 'remote') {
  250. $link = NULL;
  251. $ins = remote_install();
  252. if(empty($ins)) {
  253. die('<script type="text/javascript">alert("连接不到服务器, 请稍后重试!");history.back();</script>');
  254. }
  255. if($ins == 'error') {
  256. die('<script type="text/javascript">alert("版本错误,请确认是否为微擎最新版安装文件!");history.back();</script>');
  257. }
  258. $link = new PDO("mysql:dbname={$db['name']};host={$db['server']};port={$db['port']}", $db['username'], $db['password']);
  259. $link->exec("SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary");
  260. $link->exec("SET sql_mode=''");
  261. $tmpfile = IA_ROOT . '/we7source.tmp';
  262. file_put_contents($tmpfile, $ins);
  263. $zip = new ZipArchive;
  264. $res = $zip->open($tmpfile);
  265. if ($res === TRUE) {
  266. $zip->extractTo(IA_ROOT);
  267. $zip->close();
  268. } else {
  269. die('<script type="text/javascript">alert("安装失败,请确认当前目录是否有写入权限!");history.back();</script>');
  270. }
  271. unlink($tmpfile);
  272. }
  273. if(file_exists(IA_ROOT . '/index.php') && is_dir(IA_ROOT . '/web') && file_exists($verfile) && file_exists($dbfile)) {
  274. $dat = require $dbfile;
  275. if(empty($dat) || !is_array($dat)) {
  276. die('<script type="text/javascript">alert("安装包不正确, 数据安装脚本缺失.");history.back();</script>');
  277. }
  278. foreach($dat['schemas'] as $schema) {
  279. $sql = local_create_sql($schema);
  280. local_run($sql);
  281. }
  282. //start
  283. $_URLTYPE = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
  284. $tmp1 = local_salt(6);
  285. $tmp2 = $_URLTYPE . $_SERVER['HTTP_HOST'];
  286. $site_tmp = array ( 'key' => $tmp1, 'token' => md5($tmp1), 'url' => $tmp2, 'version' => '2.0.0', 'family' => 'x', 'type' => 'register',);
  287. $site_tmp = serialize($site_tmp);
  288. $dat['datas'][] = <<<EOF
  289. insert into `ims_core_settings`(`key`,`value`) values
  290. ('site','{$site_tmp}');
  291. EOF;
  292. //end
  293. foreach($dat['datas'] as $data) {
  294. local_run($data);
  295. }
  296. } else {
  297. die('<script type="text/javascript">alert("你正在使用本地安装, 但未下载完整安装包, 请从微擎官网下载完整安装包后重试.");history.back();</script>');
  298. }
  299. $salt = local_salt(8);
  300. $password = sha1("{$user['password']}-{$salt}-{$authkey}");
  301. $link->exec("INSERT INTO {$db['prefix']}users (username, password, salt, joindate, groupid) VALUES('{$user['username']}', '{$password}', '{$salt}', '" . time() . "', 1)");
  302. local_mkdirs(IA_ROOT . '/data');
  303. file_put_contents(IA_ROOT . '/data/config.php', $config);
  304. touch(IA_ROOT . '/data/install.lock');
  305. setcookie('action', 'finish');
  306. header('location: ?refresh');
  307. exit();
  308. }
  309. }
  310. tpl_install_db($error);
  311. }
  312. if($action == 'finish') {
  313. setcookie('action', '', -10);
  314. $dbfile = IA_ROOT . '/data/db.php';
  315. @unlink($dbfile);
  316. define('IN_SYS', true);
  317. require IA_ROOT . '/framework/bootstrap.inc.php';
  318. require IA_ROOT . '/web/common/bootstrap.sys.inc.php';
  319. $_W['uid'] = $_W['isfounder'] = 1;
  320. load()->web('common');
  321. load()->web('template');
  322. load()->model('setting');
  323. load()->model('cache');
  324. cache_build_frame_menu();
  325. cache_build_setting();
  326. cache_build_users_struct();
  327. cache_build_module_subscribe_type();
  328. tpl_install_finish();
  329. }
  330. function local_writeable($dir) {
  331. $writeable = 0;
  332. if(!is_dir($dir)) {
  333. @mkdir($dir, 0777);
  334. }
  335. if(is_dir($dir)) {
  336. if($fp = fopen("$dir/test.txt", 'w')) {
  337. fclose($fp);
  338. unlink("$dir/test.txt");
  339. $writeable = 1;
  340. } else {
  341. $writeable = 0;
  342. }
  343. }
  344. return $writeable;
  345. }
  346. function local_salt($length = 8) {
  347. $result = '';
  348. while(strlen($result) < $length) {
  349. $result .= sha1(uniqid('', true));
  350. }
  351. return substr($result, 0, $length);
  352. }
  353. function local_config() {
  354. $cfg = <<<EOF
  355. <?php
  356. defined('IN_IA') or exit('Access Denied');
  357. \$config = array();
  358. \$config['db']['master']['host'] = '{db-server}';
  359. \$config['db']['master']['username'] = '{db-username}';
  360. \$config['db']['master']['password'] = '{db-password}';
  361. \$config['db']['master']['port'] = '{db-port}';
  362. \$config['db']['master']['database'] = '{db-name}';
  363. \$config['db']['master']['charset'] = 'utf8';
  364. \$config['db']['master']['pconnect'] = 0;
  365. \$config['db']['master']['tablepre'] = '{db-tablepre}';
  366. \$config['db']['slave_status'] = false;
  367. \$config['db']['slave']['1']['host'] = '';
  368. \$config['db']['slave']['1']['username'] = '';
  369. \$config['db']['slave']['1']['password'] = '';
  370. \$config['db']['slave']['1']['port'] = '3307';
  371. \$config['db']['slave']['1']['database'] = '';
  372. \$config['db']['slave']['1']['charset'] = 'utf8';
  373. \$config['db']['slave']['1']['pconnect'] = 0;
  374. \$config['db']['slave']['1']['tablepre'] = 'ims_';
  375. \$config['db']['slave']['1']['weight'] = 0;
  376. \$config['db']['common']['slave_except_table'] = array('core_sessions');
  377. // -------------------------- CONFIG COOKIE --------------------------- //
  378. \$config['cookie']['pre'] = '{cookiepre}';
  379. \$config['cookie']['domain'] = '';
  380. \$config['cookie']['path'] = '/';
  381. // -------------------------- CONFIG SETTING --------------------------- //
  382. \$config['setting']['charset'] = 'utf-8';
  383. \$config['setting']['cache'] = 'mysql';
  384. \$config['setting']['timezone'] = 'Asia/Shanghai';
  385. \$config['setting']['memory_limit'] = '256M';
  386. \$config['setting']['filemode'] = 0644;
  387. \$config['setting']['authkey'] = '{authkey}';
  388. \$config['setting']['founder'] = '1';
  389. \$config['setting']['development'] = 0;
  390. \$config['setting']['referrer'] = 0;
  391. \$config['setting']['https'] = 0;
  392. // -------------------------- CONFIG UPLOAD --------------------------- //
  393. \$config['upload']['image']['extentions'] = array('gif', 'jpg', 'pem', 'jpeg', 'png');
  394. \$config['upload']['image']['limit'] = 5000;
  395. \$config['upload']['attachdir'] = '{attachdir}';
  396. \$config['upload']['audio']['extentions'] = array('mp3');
  397. \$config['upload']['audio']['limit'] = 5000;
  398. // -------------------------- CONFIG MEMCACHE --------------------------- //
  399. \$config['setting']['memcache']['server'] = '';
  400. \$config['setting']['memcache']['port'] = 11211;
  401. \$config['setting']['memcache']['pconnect'] = 1;
  402. \$config['setting']['memcache']['timeout'] = 30;
  403. \$config['setting']['memcache']['session'] = 1;
  404. // -------------------------- CONFIG PROXY --------------------------- //
  405. \$config['setting']['proxy']['host'] = '';
  406. \$config['setting']['proxy']['auth'] = '';
  407. // -------------------------- CONFIG REDIS --------------------------- //
  408. \$config['setting']['redis']['server'] = '';
  409. \$config['setting']['redis']['port'] = 6379;
  410. \$config['setting']['redis']['pconnect'] = 0;
  411. \$config['setting']['redis']['requirepass'] = '';
  412. \$config['setting']['redis']['timeout'] = 1;
  413. EOF;
  414. return trim($cfg);
  415. }
  416. function local_mkdirs($path) {
  417. if(!is_dir($path)) {
  418. local_mkdirs(dirname($path));
  419. mkdir($path);
  420. }
  421. return is_dir($path);
  422. }
  423. function local_run($sql) {
  424. global $link, $db;
  425. if(!isset($sql) || empty($sql)) return;
  426. $sql = str_replace("\r", "\n", str_replace(' ims_', ' '.$db['prefix'], $sql));
  427. $sql = str_replace("\r", "\n", str_replace(' `ims_', ' `'.$db['prefix'], $sql));
  428. $ret = array();
  429. $num = 0;
  430. foreach(explode(";\n", trim($sql)) as $query) {
  431. $ret[$num] = '';
  432. $queries = explode("\n", trim($query));
  433. foreach($queries as $query) {
  434. $ret[$num] .= (isset($query[0]) && $query[0] == '#') || (isset($query[1]) && isset($query[1]) && $query[0].$query[1] == '--') ? '' : $query;
  435. }
  436. $num++;
  437. }
  438. unset($sql);
  439. foreach($ret as $query) {
  440. $query = trim($query);
  441. if($query) {
  442. $link->exec($query);
  443. if($link->errorCode() != '00000') {
  444. $errorInfo = $link->errorInfo();
  445. echo $errorInfo[0] . ": " . $errorInfo[2] . "<br />";
  446. exit($query);
  447. }
  448. }
  449. }
  450. }
  451. function local_create_sql($schema) {
  452. $pieces = explode('_', $schema['charset']);
  453. $charset = $pieces[0];
  454. $engine = $schema['engine'];
  455. $sql = "CREATE TABLE IF NOT EXISTS `{$schema['tablename']}` (\n";
  456. foreach ($schema['fields'] as $value) {
  457. if(!empty($value['length'])) {
  458. $length = "({$value['length']})";
  459. } else {
  460. $length = '';
  461. }
  462. $signed = empty($value['signed']) ? ' unsigned' : '';
  463. if(empty($value['null'])) {
  464. $null = ' NOT NULL';
  465. } else {
  466. $null = '';
  467. }
  468. if(isset($value['default'])) {
  469. $default = " DEFAULT '" . $value['default'] . "'";
  470. } else {
  471. $default = '';
  472. }
  473. if($value['increment']) {
  474. $increment = ' AUTO_INCREMENT';
  475. } else {
  476. $increment = '';
  477. }
  478. $sql .= "`{$value['name']}` {$value['type']}{$length}{$signed}{$null}{$default}{$increment},\n";
  479. }
  480. foreach ($schema['indexes'] as $value) {
  481. $fields = implode('`,`', $value['fields']);
  482. if($value['type'] == 'index') {
  483. $sql .= "KEY `{$value['name']}` (`{$fields}`),\n";
  484. }
  485. if($value['type'] == 'unique') {
  486. $sql .= "UNIQUE KEY `{$value['name']}` (`{$fields}`),\n";
  487. }
  488. if($value['type'] == 'primary') {
  489. $sql .= "PRIMARY KEY (`{$fields}`),\n";
  490. }
  491. }
  492. $sql = rtrim($sql);
  493. $sql = rtrim($sql, ',');
  494. $sql .= "\n) ENGINE=$engine DEFAULT CHARSET=$charset;\n\n";
  495. return $sql;
  496. }
  497. function remote_install() {
  498. global $family;
  499. $token = '';
  500. $pars = array();
  501. $pars['host'] = $_SERVER['HTTP_HOST'];
  502. $pars['version'] = '1.0';
  503. $pars['type'] = 'install';
  504. $pars['method'] = 'application.install';
  505. $url = $_SERVER['HTTP_HOST'].'/api.php';
  506. $urlset = parse_url($url);
  507. $cloudip = gethostbyname($urlset['host']);
  508. $headers[] = "Host: {$urlset['host']}";
  509. $ch = curl_init();
  510. curl_setopt($ch, CURLOPT_URL, $urlset['scheme'] . '://' . $cloudip . $urlset['path']);
  511. curl_setopt($ch, CURLOPT_POST, 1);
  512. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($pars, '', '&'));
  513. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  514. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  515. $content = curl_exec($ch);
  516. curl_close($ch);
  517. if (empty($content)) {
  518. return showerror(-1, '获取安装信息失败,可能是由于网络不稳定,请重试。');
  519. }
  520. return $content;
  521. }
  522. function tpl_frame() {
  523. global $action, $actions;
  524. $action = $_COOKIE['action'];
  525. $step = array_search($action, $actions);
  526. $steps = array();
  527. for($i = 0; $i <= $step; $i++) {
  528. if($i == $step) {
  529. $steps[$i] = ' list-group-item-info';
  530. } else {
  531. $steps[$i] = ' list-group-item-success';
  532. }
  533. }
  534. $progress = $step * 25 + 25;
  535. $content = ob_get_contents();
  536. ob_clean();
  537. $tpl = <<<EOF
  538. <!DOCTYPE html>
  539. <html lang="zh-cn">
  540. <head>
  541. <meta charset="utf-8">
  542. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  543. <meta name="viewport" content="width=device-width, initial-scale=1">
  544. <title>安装系统 - 微擎 - 公众平台自助开源引擎</title>
  545. <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.2.0/css/bootstrap.min.css">
  546. <style>
  547. html,body{font-size:13px;font-family:"Microsoft YaHei UI", "微软雅黑", "宋体";}
  548. .pager li.previous a{margin-right:10px;}
  549. .header a{color:#FFF;}
  550. .header a:hover{color:#428bca;}
  551. .footer{padding:10px;}
  552. .footer a,.footer{color:#eee;font-size:14px;line-height:25px;}
  553. </style>
  554. <!--[if lt IE 9]>
  555. <script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
  556. <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
  557. <![endif]-->
  558. </head>
  559. <body style="background-color:#28b0e4;">
  560. <div class="container">
  561. <div class="header" style="margin:15px auto;">
  562. <ul class="nav nav-pills pull-right" role="tablist">
  563. <li role="presentation" class="active"><a href="javascript:;">安装微擎系统</a></li>
  564. <li role="presentation"><a href="http://www.we7.cc">微擎官网</a></li>
  565. <li role="presentation"><a href="http://bbs.we7.cc">访问论坛</a></li>
  566. </ul>
  567. <img src="?res=logo" />
  568. </div>
  569. <div class="row well" style="margin:auto 0;">
  570. <div class="col-xs-3">
  571. <div class="progress" title="安装进度">
  572. <div class="progress-bar progress-bar-info progress-bar-striped active" role="progressbar" aria-valuenow="{$progress}" aria-valuemin="0" aria-valuemax="100" style="width: {$progress}%;">
  573. {$progress}%
  574. </div>
  575. </div>
  576. <div class="panel panel-default">
  577. <div class="panel-heading">
  578. 安装步骤
  579. </div>
  580. <ul class="list-group">
  581. <a href="javascript:;" class="list-group-item{$steps[0]}"><span class="glyphicon glyphicon-copyright-mark"></span> &nbsp; 许可协议</a>
  582. <a href="javascript:;" class="list-group-item{$steps[1]}"><span class="glyphicon glyphicon-eye-open"></span> &nbsp; 环境监测</a>
  583. <a href="javascript:;" class="list-group-item{$steps[2]}"><span class="glyphicon glyphicon-cog"></span> &nbsp; 参数配置</a>
  584. <a href="javascript:;" class="list-group-item{$steps[3]}"><span class="glyphicon glyphicon-ok"></span> &nbsp; 成功</a>
  585. </ul>
  586. </div>
  587. </div>
  588. <div class="col-xs-9">
  589. {$content}
  590. </div>
  591. </div>
  592. <div class="footer" style="margin:15px auto;">
  593. <div class="text-center">
  594. <a href="http://www.we7.cc">关于微擎</a> &nbsp; &nbsp; <a href="http://bbs.we7.cc">微擎帮助</a> &nbsp; &nbsp; <a href="http://www.we7.cc">购买授权</a>
  595. </div>
  596. <div class="text-center">
  597. Powered by <a href="http://www.we7.cc"><b>微擎</b></a> &copy; 2018 <a href="http://www.we7.cc">www.we7.cc</a>
  598. </div>
  599. </div>
  600. </div>
  601. <script src="//cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
  602. <script src="//cdn.bootcss.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
  603. </body>
  604. </html>
  605. EOF;
  606. echo trim($tpl);
  607. }
  608. function tpl_install_license() {
  609. echo <<<EOF
  610. <div class="panel panel-default">
  611. <div class="panel-heading">阅读许可协议</div>
  612. <div class="panel-body" style="overflow-y:scroll;max-height:400px;line-height:20px;">
  613. <h3>版权所有 (c)2019,微擎团队保留所有权利。 </h3>
  614. <p>
  615. 感谢您选择微擎 - 微信公众平台自助开源引擎(以下简称WE7,WE7基于 PHP + MySQL的技术开发,全部源码开放。 <br />
  616. 为了使你正确并合法的使用本软件,请你在使用前务必阅读清楚下面的协议条款:
  617. </p>
  618. <p>
  619. <strong>一、本授权协议适用且仅适用于微擎系统(We7, MicroEngine. 以下简称微擎)任何版本,微擎官方对本授权协议的最终解释权。</strong>
  620. </p>
  621. <p>
  622. <strong>二、协议许可的权利 </strong>
  623. <ol>
  624. <li>您可以在完全遵守本最终用户授权协议的基础上,将本软件应用于非商业用途,而不必支付软件版权授权费用。</li>
  625. <li>您可以在协议规定的约束和限制范围内修改微擎源代码或界面风格以适应您的网站要求。</li>
  626. <li>您拥有使用本软件构建的网站全部内容所有权,并独立承担与这些内容的相关法律义务。</li>
  627. <li>获得商业授权之后,您可以将本软件应用于商业用途,同时依据所购买的授权类型中确定的技术支持内容,自购买时刻起,在技术支持期限内拥有通过指定的方式获得指定范围内的技术支持服务。商业授权用户享有反映和提出意见的权力,相关意见将被作为首要考虑,但没有一定被采纳的承诺或保证。</li>
  628. </ol>
  629. </p>
  630. <p>
  631. <strong>三、协议规定的约束和限制 </strong>
  632. <ol>
  633. <li>未获商业授权之前,不得将本软件用于商业用途(包括但不限于企业网站、经营性网站、以营利为目的或实现盈利的网站)。</li>
  634. <li>未经官方许可,不得对本软件或与之关联的商业授权进行出租、出售、抵押或发放子许可证。</li>
  635. <li>未经官方许可,禁止在微擎的整体或任何部分基础上以发展任何派生版本、修改版本或第三方版本用于重新分发。</li>
  636. <li>如果您未能遵守本协议的条款,您的授权将被终止,所被许可的权利将被收回,并承担相应法律责任。</li>
  637. </ol>
  638. </p>
  639. <p>
  640. <strong>四、有限担保和免责声明 </strong>
  641. <ol>
  642. <li>本软件及所附带的文件是作为不提供任何明确的或隐含的赔偿或担保的形式提供的。</li>
  643. <li>用户出于自愿而使用本软件,您必须了解使用本软件的风险,在尚未购买产品技术服务之前,我们不承诺对免费用户提供任何形式的技术支持、使用担保,也不承担任何因使用本软件而产生问题的相关责任。</li>
  644. <li>电子文本形式的授权协议如同双方书面签署的协议一样,具有完全的和等同的法律效力。您一旦开始确认本协议并安装 WE7,即被视为完全理解并接受本协议的各项条款,在享有上述条款授予的权力的同时,受到相关的约束和限制。协议许可范围以外的行为,将直接违反本授权协议并构成侵权,我们有权随时终止授权,责令停止损害,并保留追究相关责任的权力。</li>
  645. <li>如果本软件带有其它软件的整合API示范例子包,这些文件版权不属于本软件官方,并且这些文件是没经过授权发布的,请参考相关软件的使用许可合法的使用。</li>
  646. </ol>
  647. </p>
  648. </div>
  649. </div>
  650. <form class="form-inline" role="form" method="post">
  651. <ul class="pager">
  652. <li class="pull-left" style="display:block;padding:5px 10px 5px 0;">
  653. <div class="checkbox">
  654. <label>
  655. <input type="checkbox"> 我已经阅读并同意此协议
  656. </label>
  657. </div>
  658. </li>
  659. <li class="previous"><a href="javascript:;" onclick="if(jQuery(':checkbox:checked').length == 1){jQuery('form')[0].submit();}else{alert('您必须同意软件许可协议才能安装!')};">继续 <span class="glyphicon glyphicon-chevron-right"></span></a></li>
  660. </ul>
  661. </form>
  662. EOF;
  663. tpl_frame();
  664. }
  665. function tpl_install_env($ret = array()) {
  666. if(empty($ret['continue'])) {
  667. $continue = '<li class="previous disabled"><a href="javascript:;">请先解决环境问题后继续</a></li>';
  668. } else {
  669. $continue = '<li class="previous"><a href="javascript:;" onclick="$(\'#do\').val(\'continue\');$(\'form\')[0].submit();">继续 <span class="glyphicon glyphicon-chevron-right"></span></a></li>';
  670. }
  671. echo <<<EOF
  672. <div class="panel panel-default">
  673. <div class="panel-heading">服务器信息</div>
  674. <table class="table table-striped">
  675. <tr>
  676. <th style="width:150px;">参数</th>
  677. <th>值</th>
  678. <th></th>
  679. </tr>
  680. <tr class="{$ret['server']['os']['class']}">
  681. <td>服务器操作系统</td>
  682. <td>{$ret['server']['os']['value']}</td>
  683. <td>{$ret['server']['os']['remark']}</td>
  684. </tr>
  685. <tr class="{$ret['server']['sapi']['class']}">
  686. <td>Web服务器环境</td>
  687. <td>{$ret['server']['sapi']['value']}</td>
  688. <td>{$ret['server']['sapi']['remark']}</td>
  689. </tr>
  690. <tr class="{$ret['server']['php']['class']}">
  691. <td>PHP版本</td>
  692. <td>{$ret['server']['php']['value']}</td>
  693. <td>{$ret['server']['php']['remark']}</td>
  694. </tr>
  695. <tr class="{$ret['server']['dir']['class']}">
  696. <td>程序安装目录</td>
  697. <td>{$ret['server']['dir']['value']}</td>
  698. <td>{$ret['server']['dir']['remark']}</td>
  699. </tr>
  700. <tr class="{$ret['server']['disk']['class']}">
  701. <td>磁盘空间</td>
  702. <td>{$ret['server']['disk']['value']}</td>
  703. <td>{$ret['server']['disk']['remark']}</td>
  704. </tr>
  705. <tr class="{$ret['server']['upload']['class']}">
  706. <td>上传限制</td>
  707. <td>{$ret['server']['upload']['value']}</td>
  708. <td>{$ret['server']['upload']['remark']}</td>
  709. </tr>
  710. </table>
  711. </div>
  712. <div class="alert alert-info">PHP环境要求必须满足下列所有条件,否则系统或系统部份功能将无法使用。</div>
  713. <div class="panel panel-default">
  714. <div class="panel-heading">PHP环境要求</div>
  715. <table class="table table-striped">
  716. <tr>
  717. <th style="width:150px;">选项</th>
  718. <th style="width:180px;">要求</th>
  719. <th style="width:50px;">状态</th>
  720. <th>说明及帮助</th>
  721. </tr>
  722. <tr class="{$ret['php']['version']['class']}">
  723. <td>PHP版本</td>
  724. <td>5.3或者5.3以上</td>
  725. <td>{$ret['php']['version']['value']}</td>
  726. <td>{$ret['php']['version']['remark']}</td>
  727. </tr>
  728. <tr class="{$ret['php']['curl']['class']}">
  729. <td>cURL</td>
  730. <td>支持</td>
  731. <td>{$ret['php']['curl']['value']}</td>
  732. <td>{$ret['php']['curl']['remark']}</td>
  733. </tr>
  734. <tr class="{$ret['php']['pdo']['class']}">
  735. <td>PDO</td>
  736. <td>支持</td>
  737. <td>{$ret['php']['pdo']['value']}</td>
  738. <td>{$ret['php']['pdo']['remark']}</td>
  739. </tr>
  740. <tr class="{$ret['php']['ssl']['class']}">
  741. <td>openSSL</td>
  742. <td>支持</td>
  743. <td>{$ret['php']['ssl']['value']}</td>
  744. <td>{$ret['php']['ssl']['remark']}</td>
  745. </tr>
  746. <tr class="{$ret['php']['gd']['class']}">
  747. <td>GD2</td>
  748. <td>支持</td>
  749. <td>{$ret['php']['gd']['value']}</td>
  750. <td>{$ret['php']['gd']['remark']}</td>
  751. </tr>
  752. <tr class="{$ret['php']['dom']['class']}">
  753. <td>DOM</td>
  754. <td>支持</td>
  755. <td>{$ret['php']['dom']['value']}</td>
  756. <td>{$ret['php']['dom']['remark']}</td>
  757. </tr>
  758. <tr class="{$ret['php']['session']['class']}">
  759. <td>session.auto_start</td>
  760. <td>关闭</td>
  761. <td>{$ret['php']['session']['value']}</td>
  762. <td>{$ret['php']['session']['remark']}</td>
  763. </tr>
  764. <tr class="{$ret['php']['asp_tags']['class']}">
  765. <td>asp_tags</td>
  766. <td>关闭</td>
  767. <td>{$ret['php']['asp_tags']['value']}</td>
  768. <td>{$ret['php']['asp_tags']['remark']}</td>
  769. </tr>
  770. </table>
  771. </div>
  772. <div class="alert alert-info">系统要求微擎整个安装目录必须可写, 才能使用微擎所有功能。</div>
  773. <div class="panel panel-default">
  774. <div class="panel-heading">目录权限监测</div>
  775. <table class="table table-striped">
  776. <tr>
  777. <th style="width:150px;">目录</th>
  778. <th style="width:180px;">要求</th>
  779. <th style="width:50px;">状态</th>
  780. <th>说明及帮助</th>
  781. </tr>
  782. <tr class="{$ret['write']['root']['class']}">
  783. <td>/</td>
  784. <td>整目录可写</td>
  785. <td>{$ret['write']['root']['value']}</td>
  786. <td>{$ret['write']['root']['remark']}</td>
  787. </tr>
  788. <tr class="{$ret['write']['data']['class']}">
  789. <td>/</td>
  790. <td>data目录可写</td>
  791. <td>{$ret['write']['data']['value']}</td>
  792. <td>{$ret['write']['data']['remark']}</td>
  793. </tr>
  794. </table>
  795. </div>
  796. <form class="form-inline" role="form" method="post">
  797. <input type="hidden" name="do" id="do" />
  798. <ul class="pager">
  799. <li class="previous"><a href="javascript:;" onclick="$('#do').val('back');$('form')[0].submit();"><span class="glyphicon glyphicon-chevron-left"></span> 返回</a></li>
  800. {$continue}
  801. </ul>
  802. </form>
  803. EOF;
  804. tpl_frame();
  805. }
  806. function tpl_install_db($error = '') {
  807. if(!empty($error)) {
  808. $message = '<div class="alert alert-danger">发生错误: ' . $error . '</div>';
  809. }
  810. $insTypes = array();
  811. if(file_exists(IA_ROOT . '/index.php') && is_dir(IA_ROOT . '/app') && is_dir(IA_ROOT . '/web')) {
  812. $insTypes['local'] = ' checked="checked"';
  813. } else {
  814. $insTypes['remote'] = ' checked="checked"';
  815. }
  816. if (!empty($_POST['type'])) {
  817. $insTypes = array();
  818. $insTypes[$_POST['type']] = ' checked="checked"';
  819. }
  820. $disabled = empty($insTypes['local']) ? ' disabled="disabled"' : '';
  821. echo <<<EOF
  822. {$message}
  823. <form class="form-horizontal" method="post" role="form">
  824. <div class="panel panel-default">
  825. <div class="panel-heading">数据库选项</div>
  826. <div class="panel-body">
  827. <div class="form-group">
  828. <label class="col-sm-2 control-label">数据库主机</label>
  829. <div class="col-sm-4">
  830. <input class="form-control" type="text" name="db[server]" value="127.0.0.1">
  831. </div>
  832. </div>
  833. <div class="form-group">
  834. <label class="col-sm-2 control-label">数据库用户</label>
  835. <div class="col-sm-4">
  836. <input class="form-control" type="text" name="db[username]" value="root">
  837. </div>
  838. </div>
  839. <div class="form-group">
  840. <label class="col-sm-2 control-label">数据库密码</label>
  841. <div class="col-sm-4">
  842. <input class="form-control" type="text" name="db[password]">
  843. </div>
  844. </div>
  845. <div class="form-group">
  846. <label class="col-sm-2 control-label">表前缀</label>
  847. <div class="col-sm-4">
  848. <input class="form-control" type="text" name="db[prefix]" value="ims_" readonly="readonly" onclick="javascript:alert('禁止修改表前缀!')">
  849. </div>
  850. </div>
  851. <div class="form-group">
  852. <label class="col-sm-2 control-label">数据库名称</label>
  853. <div class="col-sm-4">
  854. <input class="form-control" type="text" name="db[name]" value="we7">
  855. </div>
  856. </div>
  857. </div>
  858. </div>
  859. <div class="panel panel-default">
  860. <div class="panel-heading">管理选项</div>
  861. <div class="panel-body">
  862. <div class="form-group">
  863. <label class="col-sm-2 control-label">管理员账号</label>
  864. <div class="col-sm-4">
  865. <input class="form-control" type="username" name="user[username]">
  866. </div>
  867. </div>
  868. <div class="form-group">
  869. <label class="col-sm-2 control-label">管理员密码</label>
  870. <div class="col-sm-4">
  871. <input class="form-control" type="password" name="user[password]">
  872. </div>
  873. </div>
  874. <div class="form-group">
  875. <label class="col-sm-2 control-label">确认密码</label>
  876. <div class="col-sm-4">
  877. <input class="form-control" type="password"">
  878. </div>
  879. </div>
  880. </div>
  881. </div>
  882. <input type="hidden" name="do" id="do" />
  883. <ul class="pager">
  884. <li class="previous"><a href="javascript:;" onclick="$('#do').val('back');$('form')[0].submit();"><span class="glyphicon glyphicon-chevron-left"></span> 返回</a></li>
  885. <li class="previous"><a href="javascript:;" onclick="if(check(this)){jQuery('#do').val('continue');if($('input[name=type]:checked').val() == 'remote'){alert('在线安装时,安装程序会下载精简版快速完成安装,完成后请务必注册云服务更新到完整版。')}$('form')[0].submit();}">继续 <span class="glyphicon glyphicon-chevron-right"></span></a></li>
  886. </ul>
  887. </form>
  888. <script>
  889. var lock = false;
  890. function check(obj) {
  891. if(lock) {
  892. return;
  893. }
  894. $('.form-control').parent().parent().removeClass('has-error');
  895. var error = false;
  896. $('.form-control').each(function(){
  897. if($(this).val() == '') {
  898. $(this).parent().parent().addClass('has-error');
  899. this.focus();
  900. error = true;
  901. }
  902. });
  903. if(error) {
  904. alert('请检查未填项');
  905. return false;
  906. }
  907. if($(':password').eq(0).val() != $(':password').eq(1).val()) {
  908. $(':password').parent().parent().addClass('has-error');
  909. alert('确认密码不正确.');
  910. return false;
  911. }
  912. lock = true;
  913. $(obj).parent().addClass('disabled');
  914. $(obj).html('正在执行安装');
  915. return true;
  916. }
  917. </script>
  918. EOF;
  919. tpl_frame();
  920. }
  921. function tpl_install_finish() {
  922. $modules = get_store_module();
  923. $themes = get_store_theme();
  924. echo <<<EOF
  925. <div class="page-header"><h3>安装完成</h3></div>
  926. <div class="alert alert-success">
  927. 恭喜您!已成功安装“微擎 - 公众平台自助开源引擎”系统,您现在可以: <a target="_blank" class="btn btn-success" href="./web/index.php">访问网站首页</a>
  928. </div>
  929. EOF;
  930. tpl_frame();
  931. }
  932. function tpl_resources() {
  933. static $res = array(
  934. 'logo' => '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',
  935. );
  936. return $res;
  937. }
  938. function showerror($errno, $message = '') {
  939. return array(
  940. 'errno' => $errno,
  941. 'error' => $message,
  942. );
  943. }
  944. function get_store_module() {
  945. load()->func('communication');
  946. $response = ihttp_request(APP_STORE_API, array('controller' => 'store', 'action' => 'api', 'do' => 'module'));
  947. $response = json_decode($response['content'], true);
  948. $modules = '';
  949. foreach ($response['message'] as $key => $module) {
  950. if ($key % 3 < 1) {
  951. $modules .= '</tr><tr>';
  952. }
  953. $module['detail_link'] = APP_STORE_URL . trim($module['detail_link'], '.');
  954. $modules .= '<td>';
  955. $modules .= '<div class="col-sm-4">';
  956. $modules .= '<a href="' . $module['detail_link'] . '" title="查看详情" target="_blank">';
  957. $modules .= '<img src="' . $module['logo']. '"' . ' width="50" height="50" ' . $module['title'] . '" /></a>';
  958. $modules .= '</div>';
  959. $modules .= '<div class="col-sm-8">';
  960. $modules .= '<p><a href="' . $module['detail_link'] .'" title="查看详情" target="_blank">' . $module['title'] . '</a></p>';
  961. $modules .= '<p>安装量:<span class="text-danger">' . $module['purchases'] . '</span></p>';
  962. $modules .= '</div>';
  963. $modules .= '</td>';
  964. }
  965. $modules = substr($modules, 5) . '</tr>';
  966. return $modules;
  967. }
  968. function get_store_theme() {
  969. load()->func('communication');
  970. $response = ihttp_request(APP_STORE_API, array('controller' => 'store', 'action' => 'api', 'do' => 'theme'));
  971. $response = json_decode($response['content'], true);
  972. $themes = '<tr><td colspan="' . count($response['message']) . '">';
  973. $themes .= '<div class="form-group">';
  974. foreach ($response['message'] as $key => $theme) {
  975. $theme['detail_link'] = APP_STORE_URL . trim($theme['detail_link'], '.');
  976. $themes .= '<div class="col-sm-2" style="padding-left: 7px;margin-right: 25px;">';
  977. $themes .= '<a href="' . $theme['detail_link'] .'" title="查看详情" target="_blank" /><img src="' . $theme['logo']. '" /></a>';
  978. $themes .= '<p></p><p class="text-right">';
  979. $themes .= '<a href="' . $theme['detail_link']. '" title="查看详情" target="_blank">' . $theme['title'] . '</a></p>';
  980. $themes .= '</div>';
  981. }
  982. $themes .= '</div>';
  983. return $themes;
  984. }