作者 Karson

新增命令行插件升级和打包

修复后台保持登录不起作用的BUG
优化安装程序的文字提示
1 /nbproject/ 1 /nbproject/
2 /thinkphp/ 2 /thinkphp/
3 /vendor/ 3 /vendor/
4 -/runtime/ 4 +/runtime/*
5 /addons/* 5 /addons/*
6 -/application/admin/command/Install/*.lock  
7 /public/assets/libs/ 6 /public/assets/libs/
8 /public/assets/addons/* 7 /public/assets/addons/*
9 -/public/uploads/ 8 +/public/uploads/*
10 .idea 9 .idea
11 composer.lock 10 composer.lock
12 *.log 11 *.log
@@ -19,8 +19,9 @@ class Addon extends Command @@ -19,8 +19,9 @@ class Addon extends Command
19 $this 19 $this
20 ->setName('addon') 20 ->setName('addon')
21 ->addOption('name', 'a', Option::VALUE_REQUIRED, 'addon name', null) 21 ->addOption('name', 'a', Option::VALUE_REQUIRED, 'addon name', null)
22 - ->addOption('action', 'c', Option::VALUE_REQUIRED, 'action(create/enable/disable/install/uninstall/refresh)', 'create') 22 + ->addOption('action', 'c', Option::VALUE_REQUIRED, 'action(create/enable/disable/install/uninstall/refresh/upgrade/package)', 'create')
23 ->addOption('force', 'f', Option::VALUE_OPTIONAL, 'force override', null) 23 ->addOption('force', 'f', Option::VALUE_OPTIONAL, 'force override', null)
  24 + ->addOption('release', 'r', Option::VALUE_OPTIONAL, 'addon release version', null)
24 ->setDescription('Addon manager'); 25 ->setDescription('Addon manager');
25 } 26 }
26 27
@@ -30,6 +31,8 @@ class Addon extends Command @@ -30,6 +31,8 @@ class Addon extends Command
30 $action = $input->getOption('action') ?: ''; 31 $action = $input->getOption('action') ?: '';
31 //强制覆盖 32 //强制覆盖
32 $force = $input->getOption('force'); 33 $force = $input->getOption('force');
  34 + //版本
  35 + $release = $input->getOption('release') ?: '';
33 36
34 include dirname(__DIR__) . DS . 'common.php'; 37 include dirname(__DIR__) . DS . 'common.php';
35 38
@@ -37,15 +40,15 @@ class Addon extends Command @@ -37,15 +40,15 @@ class Addon extends Command
37 { 40 {
38 throw new Exception('Addon name could not be empty'); 41 throw new Exception('Addon name could not be empty');
39 } 42 }
40 - if (!$action || !in_array($action, ['create', 'disable', 'enable', 'install', 'uninstall', 'refresh'])) 43 + if (!$action || !in_array($action, ['create', 'disable', 'enable', 'install', 'uninstall', 'refresh', 'upgrade', 'package']))
41 { 44 {
42 throw new Exception('Please input correct action name'); 45 throw new Exception('Please input correct action name');
43 } 46 }
44 - 47 +
45 // 查询一次SQL,判断连接是否正常 48 // 查询一次SQL,判断连接是否正常
46 Db::execute("SELECT 1"); 49 Db::execute("SELECT 1");
47 -  
48 - $addonDir = ADDON_PATH . $name; 50 +
  51 + $addonDir = ADDON_PATH . $name . DS;
49 switch ($action) 52 switch ($action)
50 { 53 {
51 case 'create': 54 case 'create':
@@ -65,9 +68,9 @@ class Addon extends Command @@ -65,9 +68,9 @@ class Addon extends Command
65 'addon' => $name, 68 'addon' => $name,
66 'addonClassName' => ucfirst($name) 69 'addonClassName' => ucfirst($name)
67 ]; 70 ];
68 - $this->writeToFile("addon", $data, $addonDir . DS . ucfirst($name) . '.php');  
69 - $this->writeToFile("config", $data, $addonDir . DS . 'config.php');  
70 - $this->writeToFile("info", $data, $addonDir . DS . 'info.ini'); 71 + $this->writeToFile("addon", $data, $addonDir . ucfirst($name) . '.php');
  72 + $this->writeToFile("config", $data, $addonDir . 'config.php');
  73 + $this->writeToFile("info", $data, $addonDir . 'info.ini');
71 $output->info("Create Successed!"); 74 $output->info("Create Successed!");
72 break; 75 break;
73 case 'disable': 76 case 'disable':
@@ -117,7 +120,7 @@ class Addon extends Command @@ -117,7 +120,7 @@ class Addon extends Command
117 } 120 }
118 try 121 try
119 { 122 {
120 - Service::install($name, 0); 123 + Service::install($name, 0, ['version' => $release]);
121 } 124 }
122 catch (AddonException $e) 125 catch (AddonException $e)
123 { 126 {
@@ -137,7 +140,7 @@ class Addon extends Command @@ -137,7 +140,7 @@ class Addon extends Command
137 { 140 {
138 throw new Exception("Operation is aborted!"); 141 throw new Exception("Operation is aborted!");
139 } 142 }
140 - Service::install($name, 1); 143 + Service::install($name, 1, ['version' => $release]);
141 } 144 }
142 catch (Exception $e) 145 catch (Exception $e)
143 { 146 {
@@ -187,6 +190,67 @@ class Addon extends Command @@ -187,6 +190,67 @@ class Addon extends Command
187 Service::refresh(); 190 Service::refresh();
188 $output->info("Refresh Successed!"); 191 $output->info("Refresh Successed!");
189 break; 192 break;
  193 + case 'upgrade':
  194 + Service::upgrade($name, ['version' => $release]);
  195 + $output->info("Upgrade Successed!");
  196 + break;
  197 + case 'package':
  198 + $infoFile = $addonDir . 'info.ini';
  199 + if (!is_file($infoFile))
  200 + {
  201 + throw new Exception(__('Addon info file was not found'));
  202 + }
  203 +
  204 + $info = get_addon_info($name);
  205 + if (!$info)
  206 + {
  207 + throw new Exception(__('Addon info file data incorrect'));
  208 + }
  209 + $infoname = isset($info['name']) ? $info['name'] : '';
  210 + if (!$infoname || !preg_match("/^[a-z]+$/i", $infoname) || $infoname != $name)
  211 + {
  212 + throw new Exception(__('Addon info name incorrect'));
  213 + }
  214 +
  215 + $infoversion = isset($info['version']) ? $info['version'] : '';
  216 + if (!$infoversion || !preg_match("/^\d+\.\d+\.\d+$/i", $infoversion))
  217 + {
  218 + throw new Exception(__('Addon info version incorrect'));
  219 + }
  220 +
  221 + $addonTmpDir = RUNTIME_PATH . 'addons' . DS;
  222 + if (!is_dir($addonTmpDir))
  223 + {
  224 + @mkdir($addonTmpDir, 0755, true);
  225 + }
  226 + $addonFile = $addonTmpDir . $infoname . '-' . $infoversion . '.zip';
  227 + if (!class_exists('ZipArchive'))
  228 + {
  229 + throw new Exception(__('ZinArchive not install'));
  230 + }
  231 + $zip = new \ZipArchive;
  232 + $zip->open($addonFile, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
  233 +
  234 + $files = new \RecursiveIteratorIterator(
  235 + new \RecursiveDirectoryIterator($addonDir), \RecursiveIteratorIterator::LEAVES_ONLY
  236 + );
  237 +
  238 + foreach ($files as $name => $file)
  239 + {
  240 + if (!$file->isDir())
  241 + {
  242 + $filePath = $file->getRealPath();
  243 + $relativePath = substr($filePath, strlen($addonDir));
  244 + if (!in_array($file->getFilename(), ['.git', '.DS_Store', 'Thumbs.db']))
  245 + {
  246 + $zip->addFile($filePath, $relativePath);
  247 + }
  248 + }
  249 + }
  250 + $zip->close();
  251 + $output->info("Package Successed!");
  252 + break;
  253 +
190 default : 254 default :
191 break; 255 break;
192 } 256 }
@@ -126,7 +126,7 @@ class Auth extends \fast\Auth @@ -126,7 +126,7 @@ class Auth extends \fast\Auth
126 $expiretime = time() + $keeptime; 126 $expiretime = time() + $keeptime;
127 $key = md5(md5($this->id) . md5($keeptime) . md5($expiretime) . $this->token); 127 $key = md5(md5($this->id) . md5($keeptime) . md5($expiretime) . $this->token);
128 $data = [$this->id, $keeptime, $expiretime, $key]; 128 $data = [$this->id, $keeptime, $expiretime, $key];
129 - Cookie::set('keeplogin', implode('|', $data)); 129 + Cookie::set('keeplogin', implode('|', $data), 86400 * 30);
130 return true; 130 return true;
131 } 131 }
132 return false; 132 return false;
@@ -77,7 +77,7 @@ else if (!extension_loaded("PDO")) @@ -77,7 +77,7 @@ else if (!extension_loaded("PDO"))
77 } 77 }
78 else if (!is_really_writable($dbConfigFile)) 78 else if (!is_really_writable($dbConfigFile))
79 { 79 {
80 - $errInfo = "当前权限不足,无法写入配置文件application/database.php"; 80 + $errInfo = '当前权限不足,无法写入配置文件application/database.php<br><a href="http://forum.fastadmin.net/?q=%E6%9D%83%E9%99%90%E4%B8%8D%E8%B6%B3" target="_blank">点击查看解决办法</a>';
81 } 81 }
82 else 82 else
83 { 83 {
@@ -86,7 +86,7 @@ else @@ -86,7 +86,7 @@ else
86 { 86 {
87 if (!is_dir(ROOT_PATH . $v)) 87 if (!is_dir(ROOT_PATH . $v))
88 { 88 {
89 - $errInfo = '当前代码不完整,请加入QQ群(<a href="' . $link['qqun'] . '" target="_blank">636393962</a>),在群共享免费下载FastAdmin完整包后再尝试安装'; 89 + $errInfo = '当前代码仅包含核心代码,请前往官网下载完整包或资源包覆盖后再尝试安装,<a href="http://www.fastadmin.net/download.html?ref=install" target="_blank">立即前往下载</a>';
90 break; 90 break;
91 } 91 }
92 } 92 }
@@ -95,7 +95,7 @@ else @@ -95,7 +95,7 @@ else
95 if (!$errInfo && isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') 95 if (!$errInfo && isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST')
96 { 96 {
97 $err = ''; 97 $err = '';
98 - $mysqlHostname = isset($_POST['mysqlHost']) ? $_POST['mysqlHost'] : 'localhost'; 98 + $mysqlHostname = isset($_POST['mysqlHost']) ? $_POST['mysqlHost'] : '127.0.0.1';
99 $mysqlHostport = 3306; 99 $mysqlHostport = 3306;
100 $hostArr = explode(':', $mysqlHostname); 100 $hostArr = explode(':', $mysqlHostname);
101 if (count($hostArr) > 1) 101 if (count($hostArr) > 1)
@@ -330,7 +330,7 @@ if (!$errInfo && isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] @@ -330,7 +330,7 @@ if (!$errInfo && isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD']
330 <h2>安装 <?php echo $sitename; ?></h2> 330 <h2>安装 <?php echo $sitename; ?></h2>
331 <div> 331 <div>
332 332
333 - <p>若你在安装中遇到麻烦可点击 <a href="<?php echo $link['doc']; ?>" target="_blank">安装文档</a> <a href="<?php echo $link['forum']; ?>" target="_blank">交流论坛</a> <a href="<?php echo $link['qqun']; ?>">QQ交流群</a></p> 333 + <p>若你在安装中遇到麻烦可点击 <a href="<?php echo $link['doc']; ?>" target="_blank">安装文档</a> <a href="<?php echo $link['forum']; ?>" target="_blank">交流社区</a> <a href="<?php echo $link['qqun']; ?>">QQ交流群</a></p>
334 <!--<p><?php echo $sitename; ?>还支持在命令行php think install一键安装</p>--> 334 <!--<p><?php echo $sitename; ?>还支持在命令行php think install一键安装</p>-->
335 335
336 <form method="post"> 336 <form method="post">
@@ -345,7 +345,7 @@ if (!$errInfo && isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] @@ -345,7 +345,7 @@ if (!$errInfo && isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD']
345 <div class="form-group"> 345 <div class="form-group">
346 <div class="form-field"> 346 <div class="form-field">
347 <label>MySQL 数据库地址</label> 347 <label>MySQL 数据库地址</label>
348 - <input type="text" name="mysqlHost" value="localhost" required=""> 348 + <input type="text" name="mysqlHost" value="127.0.0.1" required="">
349 </div> 349 </div>
350 350
351 <div class="form-field"> 351 <div class="form-field">