diff --git a/application/admin/command/Min.php b/application/admin/command/Min.php new file mode 100644 index 00000000..c950d5bf --- /dev/null +++ b/application/admin/command/Min.php @@ -0,0 +1,151 @@ + 'public/assets/css/', + 'cssBaseName' => '{module}', + 'jsBaseUrl' => 'public/assets/js/', + 'jsBaseName' => 'require-{module}', + ]; + + protected function configure() + { + $this + ->setName('min') + ->addOption('module', 'm', Option::VALUE_REQUIRED, 'module name(frontend or backend),use \'all\' when build all modules', null) + ->addOption('resource', 'r', Option::VALUE_REQUIRED, 'resource name(js or css),use \'all\' when build all resources', null) + ->setDescription('Compress js and css file'); + } + + protected function execute(Input $input, Output $output) + { + $module = $input->getOption('module') ? : ''; + $resource = $input->getOption('resource') ? : ''; + + if (!$module || !in_array($module, ['frontend', 'backend', 'all'])) + { + throw new Exception('Please input correct module name'); + } + if (!$resource || !in_array($resource, ['js', 'css', 'all'])) + { + throw new Exception('Please input correct resource name'); + } + + $moduleArr = $module == 'all' ? ['frontend', 'backend'] : [$module]; + $resourceArr = $resource == 'all' ? ['js', 'css'] : [$resource]; + + $minPath = __DIR__ . DS . 'Min' . DS; + $publicPath = ROOT_PATH . 'public' . DS; + $tempFile = $minPath . 'temp.js'; + + try + { + $nodeExec = exec("which node"); + if (!$nodeExec) + { + throw new Exception("node environment not found!please install node first!"); + } + } + catch (Exception $e) + { + throw new Exception($e->getMessage()); + } + + foreach ($moduleArr as $mod) + { + foreach ($resourceArr as $res) + { + $data = [ + 'publicPath' => $publicPath, + 'jsBaseName' => str_replace('{module}', $mod, $this->options['jsBaseName']), + 'jsBaseUrl' => $this->options['jsBaseUrl'], + 'cssBaseName' => str_replace('{module}', $mod, $this->options['cssBaseName']), + 'cssBaseUrl' => $this->options['cssBaseUrl'], + 'jsBasePath' => ROOT_PATH . $this->options['jsBaseUrl'], + 'cssBasePath' => ROOT_PATH . $this->options['cssBaseUrl'], + 'ds' => DS, + ]; + + //源文件 + $from = $data["{$res}BasePath"] . $data["{$res}BaseName"] . '.' . $res; + if (!is_file($from)) + { + $output->error("{$res} source file not found!file:{$from}"); + continue; + } + if ($res == "js") + { + $content = file_get_contents($from); + preg_match("/require\.config\(\{[\n]+(.*?)\n\}\);/is", $content, $matches); + if (!isset($matches[1])) + { + $output->error("js config not found!"); + continue; + } + $config = preg_replace("/(urlArgs|baseUrl):(.*)\n/", '', $matches[1]); + $data['config'] = $config; + } + // 生成压缩文件 + $this->writeToFile($res, $data, $tempFile); + + $output->info("Compress " . $data["{$res}BaseName"] . ".{$res}"); + + // 执行压缩 + echo exec("{$nodeExec} {$minPath}r.js -o {$tempFile} >> {$minPath}node.log"); + } + } + + @unlink($tempFile); + + $output->info("Build Successed!"); + } + + /** + * 写入到文件 + * @param string $name + * @param array $data + * @param string $pathname + * @return mixed + */ + protected function writeToFile($name, $data, $pathname) + { + $search = $replace = []; + foreach ($data as $k => $v) + { + $search[] = "{%{$k}%}"; + $replace[] = $v; + } + $stub = file_get_contents($this->getStub($name)); + $content = str_replace($search, $replace, $stub); + + if (!is_dir(dirname($pathname))) + { + mkdir(strtolower(dirname($pathname)), 0755, true); + } + return file_put_contents($pathname, $content); + } + + /** + * 获取基础模板 + * @param string $name + * @return string + */ + protected function getStub($name) + { + return __DIR__ . '/Min/stubs/' . $name . '.stub'; + } + +} diff --git a/public/assets/build/r.js b/application/admin/command/Min/r.js similarity index 100% rename from public/assets/build/r.js rename to application/admin/command/Min/r.js diff --git a/application/admin/command/Min/stubs/css.stub b/application/admin/command/Min/stubs/css.stub new file mode 100644 index 00000000..e2cafa3b --- /dev/null +++ b/application/admin/command/Min/stubs/css.stub @@ -0,0 +1,5 @@ +({ + cssIn: "{%cssBasePath%}{%cssBaseName%}.css", + out: "{%cssBasePath%}{%cssBaseName%}.min.css", + optimizeCss: "default" +}) \ No newline at end of file diff --git a/application/admin/command/Min/stubs/js.stub b/application/admin/command/Min/stubs/js.stub new file mode 100644 index 00000000..7f573102 --- /dev/null +++ b/application/admin/command/Min/stubs/js.stub @@ -0,0 +1,10 @@ +({ + {%config%} + , + optimizeCss: "standard", + optimize: "none", + removeCombined: false, + baseUrl: "{%jsBasePath%}", //JS文件所在的基础目录 + name: "{%jsBaseName%}", //来源文件,不包含后缀 + out: "{%jsBasePath%}{%jsBaseName%}.min.js" //目标文件 +}); \ No newline at end of file diff --git a/application/admin/controller/Dashboard.php b/application/admin/controller/Dashboard.php index 914482d4..7017b757 100644 --- a/application/admin/controller/Dashboard.php +++ b/application/admin/controller/Dashboard.php @@ -27,7 +27,7 @@ class Dashboard extends Backend $paylist[$day] = mt_rand(1, mt_rand(1, $createlist[$day])); } $this->view->assign([ - 'totaluser' => 3500, + 'totaluser' => 35200, 'totalviews' => 219390, 'totalorder' => 32143, 'totalorderamount' => 174800, diff --git a/application/admin/view/common/meta.html b/application/admin/view/common/meta.html index fa46ef86..be31fb45 100644 --- a/application/admin/view/common/meta.html +++ b/application/admin/view/common/meta.html @@ -4,7 +4,7 @@ - + - +