install.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. <?php
  2. function params($key, $default_value = '')
  3. {
  4. return $_POST[$key] ?? $default_value;
  5. }
  6. $run = true;
  7. if (file_exists('./installed.lock')) {//如果没有安装的就提示安装
  8. header('Location: /');
  9. $run = false;
  10. return false;//阻止后续执行
  11. }
  12. if (!$run) {
  13. exit();
  14. }
  15. // 获取当前PHP版本
  16. $phpVersion = phpversion();
  17. // 检查是否大于7.4
  18. $php_version = false;
  19. if (version_compare($phpVersion, '7.4', '>')) {
  20. $php_version = true;
  21. }
  22. $fileinfo_ext = false;
  23. if (extension_loaded('fileinfo')) {
  24. $fileinfo_ext = true;
  25. }
  26. $zip_ext = false;
  27. if (extension_loaded('zip')) {
  28. $zip_ext = true;
  29. }
  30. $mysqli_ext = false;
  31. if (extension_loaded('mysqli')) {
  32. $mysqli_ext = true;
  33. }
  34. $curl_ext = false;
  35. if (extension_loaded('curl')) {
  36. $curl_ext = true;
  37. }
  38. // 连接数据库
  39. $servername = 'localhost';
  40. $db_username = params('db_username', false);
  41. $db_password = params('db_password', false);
  42. $db_host = params('db_host', '');
  43. $db_port = params('db_port', 3306);
  44. $table_name = params('table_name', '');
  45. $admin_email = params('admin_email', '');
  46. $admin_password = params('admin_password', '');
  47. $database_type = params('database_type', 1);//1=全新安装,2=使用已存在数据库不安装数据库
  48. $error = false;
  49. $conn = null;
  50. $status = false;
  51. function isDatabaseVersionValid($conn): bool
  52. {
  53. global $error;
  54. $serverInfo = mysqli_get_server_info($conn);
  55. if (strpos($serverInfo, 'MariaDB') !== false) {
  56. return true;
  57. // preg_match('/^(\d+\.\d+\.\d+)/', $serverInfo, $matches);
  58. // $mariaDbVersion = $matches[1];
  59. // if (version_compare(trim($mariaDbVersion), '10.0.0', '>=')) {//验证MariaDB数据库版本是否大于10.2.3
  60. // return true;
  61. // }else{
  62. // $error = '<div style="text-align: center">数据库相关错误,详细信息如下</div>' . "<div style='margin-top:15px;text-align: center'>MariaDB版本低于10.0.0,请升级MariaDB版本至10.0.0及以上!</div>";
  63. // return false;
  64. // }
  65. }
  66. if (version_compare($serverInfo, '5.7', '>=')) {//验证数据库版本是否大于5.7
  67. return true;
  68. }
  69. $error = '<div style="text-align: center">数据库相关错误,详细信息如下</div>' . "<div style='margin-top:15px;text-align: center'>Mysql数据库版本低于5.7,请升级Mysql数据库至5.7及以上!</div>";
  70. return false;
  71. }
  72. if ($db_username && $php_version && $fileinfo_ext && $curl_ext && $zip_ext) {
  73. $conn = new mysqli($db_host, $db_username, $db_password, null, $db_port);
  74. if ($conn->connect_error) {
  75. $error = '<div style="text-align: center">数据库相关错误,详细信息如下</div>' . "<div style='margin-top:15px;text-align: center'>{$conn->connect_error}</div>";
  76. } else if (!isDatabaseVersionValid($conn)) {
  77. } else {
  78. if ($database_type == 1) {//全新安装
  79. $sql = "DROP DATABASE $table_name";//删除原来的
  80. $conn->query($sql);
  81. $sql = "CREATE DATABASE $table_name";//创建新的
  82. if ($conn->query($sql) !== TRUE) {
  83. $error = '数据表创建失败';
  84. }
  85. $conn = new mysqli($db_host, $db_username, $db_password, $table_name, $db_port);
  86. //数据库的格式内容数据
  87. $sql_file_content = file_get_contents('../install.sql');
  88. // 解析SQL文件内容并执行
  89. $sql_statements = explode(';', trim($sql_file_content));
  90. foreach ($sql_statements as $sql_statement) {
  91. if (!empty($sql_statement)) {
  92. try {
  93. $conn->query($sql_statement);
  94. }catch (Exception $exception){
  95. }
  96. }
  97. }
  98. //默认的一些基础数据
  99. $sql_file_content = file_get_contents('../defaultData.sql');
  100. // 解析SQL文件内容并执行
  101. $sql_statements = explode(';', trim($sql_file_content));
  102. foreach ($sql_statements as $sql_statement) {
  103. if (!empty($sql_statement)) {
  104. try {
  105. $conn->query($sql_statement);
  106. }catch (Exception $exception){
  107. }
  108. }
  109. }
  110. $admin_password = md5($admin_password);
  111. //添加默认管理员
  112. $AdminSql = ("
  113. INSERT INTO user (mail, password, create_time, login_ip, register_ip, manager, login_fail_count, login_time)
  114. VALUES ('$admin_email', '$admin_password', null, null, null, 1, DEFAULT, null);
  115. ");
  116. $conn->query($AdminSql);
  117. $conn->close();
  118. file_put_contents('./installed.lock', 'installed');
  119. $status = true;
  120. }
  121. }
  122. }
  123. if ($status) {
  124. $env = <<<EOF
  125. APP_DEBUG = false
  126. [APP]
  127. [DATABASE]
  128. TYPE = mysql
  129. HOSTNAME = {$db_host}
  130. DATABASE = {$table_name}
  131. USERNAME = {$db_username}
  132. PASSWORD = {$db_password}
  133. HOSTPORT = {$db_port}
  134. CHARSET = utf8mb4
  135. DEBUG = false
  136. [CACHE]
  137. DRIVER = file
  138. EOF;
  139. file_put_contents('../.env', $env);
  140. }
  141. ?>
  142. <?php if ($status === false) { ?>
  143. <!DOCTYPE html>
  144. <html lang="zh">
  145. <head>
  146. <title>mTab新标签页安装页面</title>
  147. <meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no'>
  148. <style>
  149. body {
  150. font-family: Arial, sans-serif;
  151. background: url("static/background.jpeg") no-repeat center/cover;
  152. }
  153. *::-webkit-scrollbar {
  154. display: none;
  155. }
  156. * {
  157. scrollbar-width: none;
  158. -ms-overflow-style: none;
  159. }
  160. form {
  161. max-width: 900px;
  162. margin: 0 auto 100px;
  163. background-color: #fff;
  164. padding: 20px 20px 30px 20px;
  165. border-radius: 12px;
  166. box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  167. }
  168. label {
  169. display: block;
  170. margin-bottom: 10px;
  171. font-weight: bold;
  172. margin-top: 15px;
  173. }
  174. input[type='text'], input[type='password'], input[type='number'] {
  175. text-indent: 15px;
  176. width: calc(100% - 8px);
  177. height: 45px;
  178. line-height: 30px;
  179. border: 2px solid transparent;
  180. border-radius: 10px;
  181. outline: none;
  182. background-color: #f3f3f3;
  183. color: #0d0c22;
  184. transition: .5s ease;
  185. font-size: 16px;
  186. }
  187. input[type='submit'] {
  188. width: 100%;
  189. background-color: rgb(255, 171, 84);
  190. color: #fff;
  191. border-radius: 0.9em;
  192. border: none;
  193. padding: 0.8em 1.2em 0.8em 1em;
  194. transition: all ease-in-out 0.2s;
  195. font-size: 16px;
  196. }
  197. .input:focus, input:hover {
  198. outline: none;
  199. border-color: rgba(255, 171, 84, 0.85);
  200. background-color: #fff;
  201. box-shadow: 0 0 0 5px rgba(253, 224, 99, 0.3);
  202. }
  203. input[type='submit']:hover {
  204. background-color: rgb(255, 171, 84);
  205. }
  206. #error-popup {
  207. position: fixed;
  208. left: 0;
  209. right: 0;
  210. top: 0;
  211. bottom: 0;
  212. margin: auto;
  213. width: 500px;
  214. height: fit-content;
  215. padding: 10px 20px 20px;
  216. background-color: rgb(255, 101, 2);
  217. color: #fff;
  218. border-radius: 12px;
  219. justify-content: center;
  220. z-index: 9999;
  221. }
  222. </style>
  223. <link rel='icon' href='/static/mtab.png'>
  224. </head>
  225. <body>
  226. <?php if ($error) { ?>
  227. <div id='error-popup'>
  228. <div style='text-align: center'><h2>错误提示</h2></div>
  229. <p style='text-align: center;font-size: 18px'><?php echo $error ?></p>
  230. </div>
  231. <script>
  232. setTimeout(function () {
  233. document.querySelector("#error-popup").style.display = "none";
  234. }, 5000);
  235. </script>
  236. }
  237. <?php } ?>
  238. <h1 style="text-align: center;color: #fff">mTab书签安装程序</h1>
  239. <form method='post' action='install.php'>
  240. <div style="font-size: 25px;font-weight: bold;margin-bottom: 15px;">
  241. 请优先授权程序可执行权限(755及以上的权限),并检查并安装以下php扩展
  242. </div>
  243. <div style="margin-bottom: 20px;display: flex;flex-wrap: wrap;gap:15px 40px;">
  244. <b>
  245. php版本>7.4
  246. <?php if ($php_version) { ?>
  247. <span style='color: limegreen'>✔</span>
  248. <?php } else { ?>
  249. <span style='color: red'>✘</span>
  250. <?php } ?>
  251. </b>
  252. <b>
  253. fileinfo扩展
  254. <?php if ($fileinfo_ext) { ?>
  255. <span style='color: limegreen'>✔</span>
  256. <?php } else { ?>
  257. <span style='color: red'>✘</span>
  258. <?php } ?>
  259. </b>
  260. <b>
  261. zip扩展
  262. <?php if ($zip_ext) { ?>
  263. <span style='color: limegreen'>✔</span>
  264. <?php } else { ?>
  265. <span style='color: red'>✘</span>
  266. <?php } ?>
  267. </b>
  268. <b>
  269. curl扩展
  270. <?php if ($curl_ext) { ?>
  271. <span style='color: limegreen'>✔</span>
  272. <?php } else { ?>
  273. <span style='color: red'>✘</span>
  274. <?php } ?>
  275. </b>
  276. <b>
  277. mysqli扩展
  278. <?php if ($mysqli_ext) { ?>
  279. <span style='color: limegreen'>✔</span>
  280. <?php } else { ?>
  281. <span style='color: red'>✘</span>
  282. <?php } ?>
  283. </b>
  284. </div>
  285. <div style='margin-bottom: 30px;font-weight: bolder;font-size: 19px;color: #19a673;'>
  286. mTab书签相关文档:<a target="_blank" style="color:inherit" href="https://www.mtab.cc/document.html">https://www.mtab.cc/document.html</a>
  287. </div>
  288. <label for='db_host'>mysql数据库地址: <span style='font-size: 13px;color: #1d5cdc'>Mysql数据库版本必须大于等于5.7及以上,内存大于6G推荐Mysql8,小于推荐Mysql5.7</span></label>
  289. <input value="<?php echo $db_host; ?>"
  290. placeholder="本地一般是127.0.0.1,docker部署请勿填写127.0.0.1,请使用内网ip或docker容器网关ip或者能到达数据库服务的ip"
  291. type='text' name='db_host' id='db_host'
  292. required><br>
  293. <label for='db_port'>mysql数据库端口号:</label>
  294. <input type='number' value="<?php echo $db_port; ?>" placeholder='默认 3306' name='db_port' id='db_port'
  295. required><br>
  296. <label for='db_username'>mysql数据库用户名:<span style="font-size: 13px;color: #1d5cdc">前提是当前用户名有数据库的控制权限,并且允许访问来源权限是当前服务的IP,或者是 %(代表任何来源)</span></label>
  297. <input type='text' placeholder="请输入数据库用户名" value="<?php echo $db_username; ?>" name='db_username'
  298. id='db_username' required><br>
  299. <label for='db_password'>mysql数据库密码:</label>
  300. <input type='text' name='db_password' value="<?php echo $db_password; ?>" placeholder="请输入数据库密码"
  301. id='db_password' required><br>
  302. <label for='table_name'>mysql数据库名称:</label>
  303. <input type='text' value="<?php echo $table_name; ?>" placeholder="请输入创建的数据库名称" name='table_name'
  304. id='table_name' required><br>
  305. <label for='redis_port'>管理员邮箱账号:</label>
  306. <input type='text' value="<?php echo $admin_email; ?>" placeholder='请输入邮箱,用于默认的管理员账号登录使用'
  307. name='admin_email'
  308. id='redis_port'
  309. required><br>
  310. <label for='redis_port'>管理员密码:</label>
  311. <input type='text' value="<?php echo $admin_password; ?>" placeholder='请设置管理员账号密码'
  312. name='admin_password'
  313. id='redis_port'
  314. required><br>
  315. <label for='redis_port'>数据库安装其他选项</label>
  316. <label for='install_other'></label>
  317. <label>
  318. <input checked type='radio' name='database_type' value='1' required>
  319. 全新安装(如果数据库存在则删除原来的数据库,重新安装)
  320. </label>
  321. <label>
  322. <input type='radio' name='database_type' value='2' required>
  323. 使用已存在数据库(不会覆盖数据库,仅安装代码,注意的是数据库的数据表要和最新版本的程序的库一致,否则使用旧版本的数据库表<b
  324. style="color: red">却</b>安装最新版的代码,否则导致有些服务异常)
  325. </label>
  326. <input type='submit' value='安装' style="margin-top: 30px">
  327. <div style='margin-top: 30px;font-size: 14px;line-height: 24px;display: flex;flex-direction: column;align-items: center;text-align: center'>
  328. <b style="font-size: 18px">温馨提示</b>如果您在安装阶段出现问题或对安装方式(特别是Nas部署用户)不知如何操作,可联系我们为您提供解决方法或辅助您安装,本服务不收费
  329. <a target='_blank'
  330. style='text-decoration: none;color: #ffffff;padding: 5px 15px;background: #1e9fff;border-radius: 30px;margin-top: 10px;'
  331. href='https://mtab.cc'>点我跳转至官网,点击右下角客服即可联系</a>
  332. </div>
  333. </form>
  334. </body>
  335. </html>
  336. <?php } else { ?>
  337. <!DOCTYPE html>
  338. <html lang="zh">
  339. <head>
  340. <meta charset="UTF-8">
  341. <title>网站安装完毕</title>
  342. <style>
  343. body {
  344. font-family: Arial, sans-serif;
  345. background-color: #fff;
  346. text-align: center;
  347. margin: 0;
  348. padding: 0;
  349. }
  350. .container {
  351. background-color: #fff;
  352. padding: 20px;
  353. border-radius: 10px;
  354. box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
  355. margin: 50px auto;
  356. max-width: 800px;
  357. }
  358. h1 {
  359. color: #333;
  360. }
  361. p {
  362. color: #666;
  363. font-size: 18px;
  364. }
  365. .btn-container {
  366. margin-top: 20px;
  367. }
  368. .btn {
  369. display: inline-block;
  370. padding: 10px 20px;
  371. margin-right: 10px;
  372. background-color: rgb(255, 171, 84);
  373. color: #fff;
  374. text-decoration: none;
  375. border-radius: 5px;
  376. transition: background-color 0.3s;
  377. }
  378. .btn:hover {
  379. background-color: rgb(255, 147, 38);
  380. }
  381. </style>
  382. <link rel='icon' href='favicon.png'>
  383. </head>
  384. <body>
  385. <div class='container'>
  386. <h1 style="align-content: center">mTab书签安装完毕</h1>
  387. <div style="display: flex;justify-content: center">
  388. <svg style="width: 100px" t='1694607796889' class='icon' viewBox='0 0 1024 1024' version='1.1'
  389. xmlns='http://www.w3.org/2000/svg'
  390. p-id='40460' width='128' height='128'>
  391. <path d='M512 0C230.4 0 0 230.4 0 512c0 281.6 230.4 512 512 512 281.6 0 512-230.4 512-512C1024 230.4 793.6 0 512 0zM512 960c-249.6 0-448-204.8-448-448 0-249.6 204.8-448 448-448 249.6 0 448 198.4 448 448C960 761.6 761.6 960 512 960zM691.2 339.2 454.4 576 332.8 454.4c-19.2-19.2-51.2-19.2-76.8 0C243.2 480 243.2 512 262.4 531.2l153.6 153.6c19.2 19.2 51.2 19.2 70.4 0l51.2-51.2 224-224c19.2-19.2 25.6-51.2 0-70.4C742.4 320 710.4 320 691.2 339.2z'
  392. fill='#54E283' p-id='40461'></path>
  393. </svg>
  394. </div>
  395. <p>欢迎使用mTab书签,<br>点击下方按钮跳转到首页。</p>
  396. <div class='btn-container'>
  397. <a class='btn' href='/'>进入首页</a>
  398. </div>
  399. <p>后台进入方式,需要用管理员账户登录客户端<br/></p>
  400. <p><b>鼠标在桌面右击打开菜单->点击设置->个人中心->登录管理员的账号</b><br/>
  401. <b>
  402. ->再次进入个人中心即可看到->管理后台->进入即可</b></p>
  403. <p>这是一个多用户的书签导航程序,用户之间数据是隔离的不受干扰</p>
  404. <p>可以使用鼠标右键在桌面点击呼出菜单。</p>
  405. <p>很多功能就在鼠标右键菜单内。别怪我没告诉你哟hahaha~</p>
  406. <div style='margin-bottom: 30px;font-weight: bolder;font-size: 19px;color: #19a673;'>
  407. mTab书签相关文档:<a target='_blank' style='color:inherit' href='https://www.mtab.cc/document.html'>https://www.mtab.cc/document.html</a>
  408. </div>
  409. </div>
  410. </body>
  411. </html>
  412. <?php } ?>