Ver código fonte

初级版本上线

wushuiyong 9 anos atrás
pai
commit
3092071668
100 arquivos alterados com 45716 adições e 1 exclusões
  1. 1 0
      .gitignore
  2. 191 0
      LICENSE
  3. 62 1
      README.md
  4. 29 0
      assets/AppAsset.php
  5. 49 0
      components/Controller.php
  6. 40 0
      components/EventBootstrap.php
  7. 32 0
      components/GlobalHelper.php
  8. 21 0
      components/KafkaConsumer.php
  9. 89 0
      components/KafkaProducer.php
  10. 28 0
      components/LoggerDetail.php
  11. 59 0
      components/ZKafka.php
  12. 32 0
      composer.json
  13. 28 0
      config/console.php
  14. 20 0
      config/local.php
  15. 13 0
      config/params.php
  16. 90 0
      config/web.php
  17. 94 0
      console/RunController.php
  18. 474 0
      console/runtime/logs/app.log
  19. 29 0
      controllers/LoggerController.php
  20. 183 0
      controllers/SiteController.php
  21. 26 0
      controllers/SubscribeController.php
  22. 400 0
      controllers/WalleController.php
  23. 29 0
      deploy.yml/env/conf_tpl.yml
  24. 8 0
      deploy.yml/global.yml
  25. 16 0
      mail/confirmEmail.php
  26. 23 0
      mail/layouts/html.php
  27. 16 0
      mail/passwordResetToken.php
  28. 14 0
      messages/zh-CN/log.php
  29. 31 0
      messages/zh-CN/status.php
  30. 30 0
      migrations/m140328_144900_init.php
  31. 102 0
      models/Conf.php
  32. 51 0
      models/DynamicConf.php
  33. 51 0
      models/KafkaOffset.php
  34. 19 0
      models/Log.php
  35. 71 0
      models/LogDetail.php
  36. 111 0
      models/Record.php
  37. 77 0
      models/Task.php
  38. 266 0
      models/User.php
  39. 20 0
      models/behaviors/TimestampBehavior.php
  40. 76 0
      models/forms/LoginForm.php
  41. 56 0
      models/forms/PasswordResetRequestForm.php
  42. 64 0
      models/forms/ResetPasswordForm.php
  43. 19 0
      models/old.kafkaoffset.php
  44. 67 0
      models/queries/UserQuery.php
  45. 4 0
      runtime/.gitignore
  46. 9 0
      submit.sh
  47. 459 0
      views/layouts/main.php
  48. 114 0
      views/layouts/site.php
  49. 54 0
      views/logger/index.php
  50. 42 0
      views/logger/info.php
  51. 21 0
      views/site/emailConfirmationFailed.php
  52. 26 0
      views/site/error.php
  53. 1105 0
      views/site/index.html
  54. 60 0
      views/site/index.php
  55. 55 0
      views/site/login.php
  56. 43 0
      views/site/requestPasswordResetToken.php
  57. 28 0
      views/site/resetPassword.php
  58. 18 0
      views/site/signedUp.php
  59. 47 0
      views/site/signup.php
  60. 42 0
      views/subscribe/index.php
  61. 63 0
      views/walle/admin-list.php
  62. 38 0
      views/walle/config-edit.php
  63. 56 0
      views/walle/config.php
  64. 105 0
      views/walle/deploy.php
  65. 70 0
      views/walle/dev-list.php
  66. 34 0
      views/walle/index.php
  67. 58 0
      views/walle/list.php
  68. 14 0
      views/walle/select-project.php
  69. 39 0
      views/walle/submit.php
  70. 9 0
      web/.gitignore
  71. 46 0
      web/ace/.!11657!ace.html
  72. 2134 0
      web/ace/ace.html
  73. 801 0
      web/ace/blank.html
  74. 2064 0
      web/ace/buttons.html
  75. 1042 0
      web/ace/calendar.html
  76. 853 0
      web/ace/dropzone.html
  77. 1865 0
      web/ace/elements.html
  78. 856 0
      web/ace/error-404.html
  79. 848 0
      web/ace/error-500.html
  80. 1240 0
      web/ace/faq.html
  81. 2255 0
      web/ace/form-elements.html
  82. 1473 0
      web/ace/form-wizard.html
  83. 1053 0
      web/ace/gallery.html
  84. 970 0
      web/ace/grid.html
  85. 2072 0
      web/ace/inbox.html
  86. 2135 0
      web/ace/index.html
  87. 990 0
      web/ace/invoice.html
  88. 1146 0
      web/ace/jqgrid.html
  89. 1399 0
      web/ace/jquery-ui.html
  90. 298 0
      web/ace/login.html
  91. 984 0
      web/ace/nestable-list.html
  92. 1251 0
      web/ace/pricing.html
  93. 3188 0
      web/ace/profile.html
  94. 3013 0
      web/ace/tables.html
  95. 1392 0
      web/ace/timeline.html
  96. 885 0
      web/ace/treeview.html
  97. 1091 0
      web/ace/typography.html
  98. 1476 0
      web/ace/widgets.html
  99. 1076 0
      web/ace/wysiwyg.html
  100. 0 0
      web/assets/714e5a5a/bg.png

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+/vendor

+ 191 - 0
LICENSE

@@ -0,0 +1,191 @@
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct or
+indirect, to cause the direction or management of such entity, whether by
+contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included
+in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that
+is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative Works
+shall not include works that remain separable from, or merely link (or bind by
+name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative Works
+thereof, that is intentionally submitted to Licensor for inclusion in the Work
+by the copyright owner or by an individual or Legal Entity authorized to submit
+on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for
+the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+3. Grant of Patent License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable (except as stated in this section) patent license to make, have
+made, use, offer to sell, sell, import, and otherwise transfer the Work, where
+such license applies only to those patent claims licensable by such Contributor
+that are necessarily infringed by their Contribution(s) alone or by combination
+of their Contribution(s) with the Work to which such Contribution(s) was
+submitted. If You institute patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Work or a
+Contribution incorporated within the Work constitutes direct or contributory
+patent infringement, then any patent licenses granted to You under this License
+for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution.
+
+You may reproduce and distribute copies of the Work or Derivative Works thereof
+in any medium, with or without modifications, and in Source or Object form,
+provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and
+You must cause any modified files to carry prominent notices stating that You
+changed the files; and
+You must retain, in the Source form of any Derivative Works that You distribute,
+all copyright, patent, trademark, and attribution notices from the Source form
+of the Work, excluding those notices that do not pertain to any part of the
+Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any
+Derivative Works that You distribute must include a readable copy of the
+attribution notices contained within such NOTICE file, excluding those notices
+that do not pertain to any part of the Derivative Works, in at least one of the
+following places: within a NOTICE text file distributed as part of the
+Derivative Works; within the Source form or documentation, if provided along
+with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents of
+the NOTICE file are for informational purposes only and do not modify the
+License. You may add Your own attribution notices within Derivative Works that
+You distribute, alongside or as an addendum to the NOTICE text from the Work,
+provided that such additional attribution notices cannot be construed as
+modifying the License.
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies
+with the conditions stated in this License.
+
+5. Submission of Contributions.
+
+Unless You explicitly state otherwise, any Contribution intentionally submitted
+for inclusion in the Work by You to the Licensor shall be under the terms and
+conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of
+any separate license agreement you may have executed with Licensor regarding
+such Contributions.
+
+6. Trademarks.
+
+This License does not grant permission to use the trade names, trademarks,
+service marks, or product names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty.
+
+Unless required by applicable law or agreed to in writing, Licensor provides the
+Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+including, without limitation, any warranties or conditions of TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
+solely responsible for determining the appropriateness of using or
+redistributing the Work and assume any risks associated with Your exercise of
+permissions under this License.
+
+8. Limitation of Liability.
+
+In no event and under no legal theory, whether in tort (including negligence),
+contract, or otherwise, unless required by applicable law (such as deliberate
+and grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special, incidental,
+or consequential damages of any character arising as a result of this License or
+out of the use or inability to use the Work (including but not limited to
+damages for loss of goodwill, work stoppage, computer failure or malfunction, or
+any and all other commercial damages or losses), even if such Contributor has
+been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability.
+
+While redistributing the Work or Derivative Works thereof, You may choose to
+offer, and charge a fee for, acceptance of support, warranty, indemnity, or
+other liability obligations and/or rights consistent with this License. However,
+in accepting such obligations, You may act only on Your own behalf and on Your
+sole responsibility, not on behalf of any other Contributor, and only if You
+agree to indemnify, defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason of your
+accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "{}" replaced with your own
+identifying information. (Don't include the brackets!) The text should be
+enclosed in the appropriate comment syntax for the file format. We also
+recommend that a file or class name and description of purpose be included on
+the same "printed page" as the copyright notice for easier identification within
+third-party archives.
+
+   Copyright 2015 wushuiyong
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 62 - 1
README.md

@@ -1 +1,62 @@
-# walle-web 代码部署工具
+Walle 瓦力 web ui
+==========================
+
+功能
+---
+
+Walle景愿是做一个web系统工具,实现最基础的上线部署,以及日志分析。
+
+* 上线部署
+	* 用户分身份注册、登录
+	* 开发者发起上线任务申请
+	* 管理者审核上线任务
+	* 开发者一键部署上线
+	* 查看上线日志
+
+依赖
+---
+
+* git
+* web ui的运行环境php、nginx(apache)、mysql
+* composer,安装wall、yii2
+* ssh
+
+配置
+---
+
+WEBROOT/deploy.yml/env/production.yml
+```
+#production
+scm:
+  type: git
+  url: git@github.com:meolu/walle.git
+  branch: master
+deployment:
+  user: edison
+  from: /var/www/deploy/from
+  to: /var/www/deploy/to
+  excludes:
+  strategy: targz
+releases:
+  enabled: true
+  max: 10
+  symlink: current
+  directory: releases
+hosts:
+    - 127.0.0.1
+tasks:
+  pre-deploy:
+  on-deploy:
+  post-release:
+  post-deploy:
+```
+
+
+To Do List
+----------
+
+* 支持多项目部署
+* 日志查询
+* 日志图表展示
+* 日志订阅
+* 日志报警

+ 29 - 0
assets/AppAsset.php

@@ -0,0 +1,29 @@
+<?php
+/**
+ * @link http://www.yiiframework.com/
+ * @copyright Copyright (c) 2008 Yii Software LLC
+ * @license http://www.yiiframework.com/license/
+ */
+
+namespace app\assets;
+
+use yii\web\AssetBundle;
+
+/**
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @since 2.0
+ */
+class AppAsset extends AssetBundle
+{
+    public $basePath = '@webroot';
+    public $baseUrl = '@web';
+    public $css = [
+        'css/site.css',
+    ];
+    public $js = [
+    ];
+    public $depends = [
+        'yii\web\YiiAsset',
+        'yii\bootstrap\BootstrapAsset',
+    ];
+}

+ 49 - 0
components/Controller.php

@@ -0,0 +1,49 @@
+<?php
+/* *****************************************************************
+ * @Author: wushuiyong
+ * @Created Time : 一  7/20 15:52:01 2015
+ *
+ * @File Name: components/Controller.php
+ * @Description:
+ * *****************************************************************/
+
+namespace app\components;
+
+use yii;
+
+class Controller extends yii\web\Controller {
+
+    /**
+     * json渲染. PS:调用此方法之前若有输出将会出错
+     *
+     * @param mixed     $data
+     * @param int       $code 0成功 非0错误
+     * @param string    $msg  错误信息
+     * @param int       $option json_encode options
+     */
+    public static function renderJson($data, $code = 0, $msg = '', $option = 0) {
+        Yii::$app->response->format = yii\web\Response::FORMAT_JSON;
+        $ret = [
+            'code' => (int)$code,
+            'msg'  => $msg,
+            'data' => $data,
+        ];
+
+        Yii::$app->response->data = $ret;
+        Yii::$app->end();
+    }
+
+    /**
+     * 获取参数(post/get)的值, 优先级:post > get > default
+     *
+     * @param string $name 参数名字
+     * @param mixed  $default 默认值
+     * @return mixed
+     */
+    public static function getParam($name, $default = null) {
+        $post = Yii::$app->request->post($name);
+        $get  = Yii::$app->request->get($name);
+        return isset($_POST[$name]) ? $post : (isset($_GET[$name]) ? $get : $default);
+    }
+}
+

+ 40 - 0
components/EventBootstrap.php

@@ -0,0 +1,40 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: wushuiyong
+ * Date: 15/8/14
+ * Time: 下午5:41
+ */
+
+namespace app\components;
+
+use Yii;
+use yii\base\BootstrapInterface;
+use yii\web\NotFoundHttpException;
+use yii\helpers\Url;
+
+class EventBootstrap implements BootstrapInterface
+{
+    public function bootstrap($app) {
+        $this->event();
+    }
+
+
+    public function event() {
+        Yii::$app->on(\yii\base\Application::EVENT_BEFORE_ACTION, function ($event) {
+            $aid = $event->action->id;
+            $cid = $event->action->controller->id;
+            if (Yii::$app->user->id) return true;
+            if ($cid == 'site') {
+                return true;
+            }
+            if (!Yii::$app->request->getIsAjax()) {
+                Yii::$app->response->redirect('/site/login');
+                Yii::$app->end();
+            }
+            $event->isValid = false;
+            throw new \Exception('请先登录,再操作:)');
+        });
+    }
+
+}

+ 32 - 0
components/GlobalHelper.php

@@ -0,0 +1,32 @@
+<?php
+/* *****************************************************************
+ * @Author: wushuiyong
+ * @Created Time : 一  7/20 15:52:01 2015
+ *
+ * @File Name: components/Controller.php
+ * @Description:
+ * *****************************************************************/
+
+namespace app\components;
+
+use yii;
+
+class GlobalHelper {
+
+    /**
+     * 获取参数(post/get)的值, 优先级:post > get > default
+     *
+     * @param string $name 参数名字
+     * @param mixed  $default 默认值
+     * @return mixed
+     */
+    public static function sendMail($user, $default = null) {
+        $params = Yii::$app->params;
+        return Yii::$app->mail->compose()
+            ->setFrom([$params['support.email'] => $params['support.name']])
+            ->setTo($user->email)
+            ->setSubject('Complete registration with ' . Yii::$app->name)
+            ->send();
+    }
+}
+

+ 21 - 0
components/KafkaConsumer.php

@@ -0,0 +1,21 @@
+<?php
+/* *****************************************************************
+ * @Author: wushuiyong
+ * @Created Time : 六  7/18 23:08:29 2015
+ *
+ * @File Name: KafkaConsumer.php
+ * @Description:
+ * *****************************************************************/
+namespace app\components;
+
+use yii\console\Controller;
+use app\components\ZKafka;
+
+class KafkaConsumer {
+
+    public static function process($topic, $offset, $limit = 20) {
+        $message = ZKafka::consume($topic, $offset, $limit);
+        return $message;
+    }
+
+}

+ 89 - 0
components/KafkaProducer.php

@@ -0,0 +1,89 @@
+<?php
+/* *****************************************************************
+ * @Author: wushuiyong
+ * @Created Time : 六  7/18 22:47:22 2015
+ *
+ * @File Name: KafkaProducer.php
+ * @Description:
+ * *****************************************************************/
+namespace app\components;
+
+use app\components\ZKafka;
+
+class KafkaProducer {
+
+    const KAFKA_OFFSET = 'kafka_offset';
+
+    const LOG   = 'log';
+
+    // log topic
+    const TOPIC_ERROR   = 'error';
+
+    const TOPIC_WARNING = 'warning';
+
+    const TOPIC_NOTICE  = 'notice';
+
+    // log level
+    const LEVEL_ERROR   = 'error';
+
+    const LEVEL_WARNING = 'warning';
+
+    const LEVEL_NOTICE  = 'notice';
+
+    // kafka offset
+    const KAFKA_ERROR_OFFSET   = 'kafka_error_offset';
+
+    const KAFKA_WARNING_OFFSET = 'kafka_warning_offset';
+
+    const KAFKA_NOTICE_OFFSET  = 'kafka_notice_offset';
+
+    public static function error($name, $log) {
+        $trace = debug_backtrace(false);
+        foreach ($trace as &$line) {
+            unset($line['args']);
+        }
+        return static::write(static::TOPIC_ERROR, static::LEVEL_ERROR, $name, $log, $trace);
+    }
+
+    public static function warning($name, $log) {
+        $trace = debug_backtrace(false);
+        foreach ($trace as &$line) {
+            unset($line['args']);
+        }
+        return static::write(static::TOPIC_WARNING, static::LEVEL_WARNING, $name, $log, $trace);
+    }
+
+    public static function notice($name, $log) {
+        $trace = debug_backtrace(false);
+        foreach ($trace as &$line) {
+            unset($line['args']);
+        }
+        return static::write(static::TOPIC_NOTICE, static::LEVEL_NOTICE, $name, $log, $trace);
+    }
+
+    public static function write($topic, $level, $name, $log, $trace) {
+        $trace = static::formatTrace($trace);
+        $message = json_encode([
+            'name'    => $name,
+            'log'     => $log,
+            'level'   => $level,
+            'trace'   => json_encode($trace),
+            'request' => $_SERVER,
+            'time'    => date("Y-m-d H:i:s", time()),
+        ], JSON_UNESCAPED_UNICODE);
+        d($topic);d($message);
+        return ZKafka::produce($topic, $message);
+    }
+
+    public static function formatTrace($trace) {
+        $format = [];
+        foreach ($trace as $line) {
+            $format[] = sprintf("%s %s",
+                empty($line['file']) ? '' : $line['file'] . ':' .$line['line'],
+                empty($line['class']) ? '' : stripslashes($line['class']) . $line['type'] . $line['function']);
+
+        }
+        return $format;
+    }
+
+}

+ 28 - 0
components/LoggerDetail.php

@@ -0,0 +1,28 @@
+<?php
+/* *****************************************************************
+ * @Author: wushuiyong
+ * @Created Time : 一  7/27 21:38:38 2015
+ *
+ * @File Name: LoggerDetail.php
+ * @Description:
+ * *****************************************************************/
+namespace app\components;
+
+class LoggerDetail {
+
+    public static function formatChildDetail($detail, $name = null) {
+        $name = $name ? $name . '.' . $detail['name'] : $detail['name'];
+        $list[$name] = [
+            'name'    => $detail['name'],
+            'error'   => $detail['error'],
+            'warning' => $detail['warning'],
+            'notice'  => $detail['notice'],
+        ];
+        if (!empty($detail['child'])) {
+            foreach ($detail['child'] as $child) {
+                $list = array_merge($list, static::formatChildDetail($child, $name));
+            }
+        }
+        return $list;
+    }
+}

+ 59 - 0
components/ZKafka.php

@@ -0,0 +1,59 @@
+<?php
+/* *****************************************************************
+ * @Author: wushuiyong
+ * @Created Time : 六  7/18 23:02:36 2015
+ *
+ * @File Name: ZKafka.php
+ * @Description:
+ * *****************************************************************/
+namespace app\components;
+
+use app\models\KafkaOffset;
+
+class ZKafka {
+    
+    const KAFKA_OFFSET = 'kafka_offset';
+
+    // kafka的偏移量
+    const KAFKA_ERROR_OFFSET   = 'kafka_error_offset';
+
+    const KAFKA_WARNING_OFFSET = 'kafka_warning_offset';
+
+    const KAFKA_NOTICE_OFFSET  = 'kafka_notice_offset';
+
+    private static $_kafka;
+
+    public static function produce($topic, $message) {
+        return static::getInstance()->produce($topic, $message);
+    }
+
+    public static function consume($topic, $begin, $limit) {
+        return static::getInstance()->consume($topic, $begin, $limit);
+    }
+
+    public static function getInstance() {
+        if (is_object(static::$_kafka)) {
+            return static::$_kafka;
+        }
+        return static::$_kafka = new \Kafka("localhost:9092");
+    }
+
+    public static function setOffset($topic, $offset) {
+        $kafkaOffset = KafkaOffset::findOne(['name' => $topic]);
+        if ($kafkaOffset) {
+            $kafkaOffset->offset = $offset;
+            return $kafkaOffset->save();
+        } else {
+            $kafkaOffset = new KafkaOffset();
+            $kafkaOffset->name = $topic;
+            $kafkaOffset->offset = $offset;
+            return $kafkaOffset->save();
+        }
+
+    }
+
+    public static function getOffset($topic) {
+        $kafkaOffset = KafkaOffset::findOne(['name' => $topic]);
+        return $kafkaOffset ? $kafkaOffset->offset : 0;
+    }
+}

+ 32 - 0
composer.json

@@ -0,0 +1,32 @@
+{
+    "name": "meolu/walle-web",
+    "description": "walle web ui",
+    "keywords": ["walle", "php deploy", "deploy web", "deploy ui"],
+    "homepage": "http://www.huamanshu.com/",
+    "type": "project",
+    "license": "BSD-3-Clause",
+    "minimum-stability": "dev",
+    "require": {
+        "php": ">=5.4.0",
+        "yiisoft/yii2": ">=2.0.4",
+        "wushuiyong/walle": "*",
+        "yiisoft/yii2-bootstrap": "*",
+        "yiisoft/yii2-swiftmailer": "*",
+        "yiisoft/yii2-mongodb": "*"
+    },
+    "require-dev": {
+        "yiisoft/yii2-codeception": "*",
+        "yiisoft/yii2-debug": "*",
+        "yiisoft/yii2-gii": "*",
+        "yiisoft/yii2-faker": "*"
+    },
+    "config": {
+        "process-timeout": 1800
+    },
+    "extra": {
+        "asset-installer-paths": {
+            "npm-asset-library": "vendor/npm",
+            "bower-asset-library": "vendor/bower"
+        }
+    }
+}

+ 28 - 0
config/console.php

@@ -0,0 +1,28 @@
+<?php
+// Merged web + local configuration is available in $web
+return [
+    'id' => 'console',
+    'basePath' => dirname(__DIR__),
+    'bootstrap' => ['log'],
+    'controllerNamespace' => 'app\console',
+    'extensions' => $web['extensions'],
+    'components' => [
+        'db' => $web['components']['db'],
+        'mongodb' => [
+            'class' => 'yii\mongodb\Connection',
+            'dsn'   => 'mongodb://localhost:27017/local',
+        ],
+        'log' => [
+            'targets' => [
+                [
+                    'class' => 'yii\log\FileTarget',
+                    'levels' => ['error', 'warning'],
+                ],
+            ],
+        ],
+        'example' => [
+            'class' => 'console\controllers\ExampleController',
+        ],
+    ],
+    'params' => $web['params'],
+];

+ 20 - 0
config/local.php

@@ -0,0 +1,20 @@
+<?php
+// Uncomment to enable debug mode. Recommended for development.
+define('YII_DEBUG', true);
+
+// Uncomment to enable dev environment. Recommended for development
+define('YII_ENV', 'prod');
+function d($var) {
+    var_dump($var);
+}
+function dd($var) {
+    die(var_dump($var));
+}
+
+return [
+    'components' => [
+        'request' => [
+            'cookieValidationKey' => 'PdXWDAfV5-gPJJWRar5sEN71DN0JcDRV',
+        ],
+    ],
+];

+ 13 - 0
config/params.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Application parameters
+ */
+return [
+    'support.email' => 'admin@huamanshu.com',
+    'support.name' => 'admin',
+
+    'user.passwordResetTokenExpire' => 3600,
+    'user.emailConfirmationTokenExpire' => 43200, // 5 days
+
+    'config.dir' => '/deploy.yml/env',
+];

+ 90 - 0
config/web.php

@@ -0,0 +1,90 @@
+<?php
+$config = [
+    'id' => 'basic',
+    'basePath' => dirname(__DIR__),
+    'extensions' => require(__DIR__ . '/../vendor/yiisoft/extensions.php'),
+    'defaultRoute' => 'walle/index',
+    'components' => [
+        'db' => [
+            'class'     => 'yii\db\Connection',
+            'dsn'       => 'mysql:host=127.0.0.1;dbname=test',
+            'username'  => 'username',
+            'password'  => 'password',
+            'charset'   => 'utf8',
+        ],
+        'mongodb' => [
+            'class' => '\yii\mongodb\Connection',
+            'dsn' => 'mongodb://localhost:27017/local',
+        ],
+        'errorHandler' => [
+            'errorAction' => 'site/error',
+        ],
+        'mail' => [
+            'class' => 'yii\swiftmailer\Mailer',
+            'useFileTransport' => false,
+            'transport' => [
+                'class' => 'Swift_SmtpTransport',
+                'host' => 'ip or host',
+                'username' => 'admin@huamanshu.com',
+                'password' => 'password',
+                'port' => 25,
+                'encryption' => 'tls',
+            ],
+            'messageConfig' => [
+                'charset' => 'UTF-8',
+                'from' => ['admin@humanshu.com' => '花满树出品']
+            ],
+        ],
+        'log' => [
+            'traceLevel' => YII_DEBUG ? 3 : 0,
+            'targets' => [
+                [
+                    'class' => 'yii\log\FileTarget',
+                    'levels' => ['error', 'warning'],
+                ],
+            ],
+        ],
+        'user' => [
+            'identityClass' => 'app\models\User',
+            'enableAutoLogin' => true,
+        ],
+        'i18n' => [
+            'translations' => [
+                '*' => [
+                    'class' => 'yii\i18n\PhpMessageSource',
+                    'basePath' => '@app/messages',
+                ],
+            ],
+        ],
+        'urlManager' => [
+            'enablePrettyUrl' => true,
+            'showScriptName' => false,
+            'rules'=>[
+                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
+            ],
+        ],
+    ],
+    'language' => 'zh-CN',
+    'bootstrap' => [
+        'app\components\EventBootstrap',
+    ],
+    'params' => require(__DIR__.'/params.php'),
+];
+
+if (YII_ENV_DEV) {
+    $config['bootstrap'][] = 'debug';
+    $config['modules']['debug'] = [
+        'class' => 'yii\debug\Module',
+        'allowedIPs' => ['*'],
+    ];
+    $config['modules']['gii'] =  [
+        'class' => 'yii\gii\Module',
+        'generators' => [
+            'mongoDbModel' => [
+                'class' => 'yii\mongodb\gii\model\Generator'
+            ],
+        ],
+    ];
+}
+
+return $config;

+ 94 - 0
console/RunController.php

@@ -0,0 +1,94 @@
+<?php
+ 
+namespace app\console;
+ 
+use yii;
+use yii\console\Controller;
+use app\components\ZKafka;
+use app\components\KafkaConsumer;
+use app\components\KafkaProducer;
+ 
+/**
+ * Test controller
+ */
+class RunController extends Controller {
+
+    public function actionProduce() {
+//        $ret = KafkaProducer::error('social.touch', '找不到数据');
+        $ret = KafkaProducer::warning('social.touch', '只能切回去不能切回来');
+//        $ret = KafkaProducer::notice('social.touch', '记录下数据');
+        echo "\n==========================\n";
+        dd($ret);
+    }
+
+    public function actionConsume() {
+        return KafkaConsumer::process(KafkaProducer::TOPIC_ERROR, 10);
+    }
+
+    public function actionMongo() {
+        $offset = ZKafka::getOffset(ZKafka::KAFKA_ERROR_OFFSET);
+        $colError = Yii::$app->mongodb->getCollection(KafkaProducer::LOG);
+        while (true) {
+            echo 'offset:', $offset, PHP_EOL;
+            $logs = KafkaConsumer::process(KafkaProducer::TOPIC_ERROR, $offset, 10);
+            if (!$logs) {
+                echo 'empty. sleep for a while...', PHP_EOL;
+                sleep(5);
+                continue;
+            }
+            foreach ($logs as $log) {
+                $log = json_decode($log, true);
+                if (empty($log)) continue;
+                $ret = $colError->insert($log);
+                echo $ret ? 'done' : 'error', PHP_EOL;
+            }
+        }
+        
+    }
+
+
+
+    public function actionLog($level = KafkaProducer::LEVEL_ERROR) {
+        if (!in_array($level, [KafkaProducer::LEVEL_ERROR, KafkaProducer::LEVEL_WARNING, KafkaProducer::LEVEL_NOTICE])) {
+            throw new \Exception('暂无配置此错误级别:' . $level);
+        }
+        $limit = 10;
+        $offsetName = 'kafka_' . $level . '_offset';
+        $offset = ZKafka::getOffset($offsetName);
+        $colError = Yii::$app->mongodb->getCollection(KafkaProducer::LOG);
+        while (true) {
+            echo 'offset:', $offset, PHP_EOL;
+            $logs = KafkaConsumer::process($level, $offset, $limit);
+            if (!$logs) {
+                echo 'empty. sleep for a while...', PHP_EOL;
+                sleep(5);
+                continue;
+            }
+            foreach ($logs as $log) {
+                $log = json_decode($log, true);
+                if (empty($log)) continue;
+                $ret = $colError->insert($log);
+                echo $ret ? 'done' : 'error', PHP_EOL;
+                if ($ret) {
+                    ZKafka::setOffset($offsetName, ++$offset);
+                }
+            }
+        }
+
+    }
+
+
+    public function actionSetoffset() {
+        $offset = ZKafka::getOffset(ZKafka::KAFKA_ERROR_OFFSET);
+        d($offset);
+        $ret = ZKafka::setOffset(ZKafka::KAFKA_ERROR_OFFSET, --$offset);
+        d($ret);
+        $offset = ZKafka::getOffset(ZKafka::KAFKA_ERROR_OFFSET);
+        d($offset);
+    }
+
+    public function actionCost() {
+        $ret = Zkafka::produce('adOffline', 'planId|1|xxxdasflkd');
+        dd($ret);
+    }
+}

Diferenças do arquivo suprimidas por serem muito extensas
+ 474 - 0
console/runtime/logs/app.log


+ 29 - 0
controllers/LoggerController.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace app\controllers;
+use app\components\KafkaProducer;
+use app\models\Log;
+use app\components\Controller;
+
+class LoggerController extends Controller {
+
+    public $enableCsrfValidation = false;
+
+    public function actionSearch() {
+        $rows = [];
+        $kw = self::getParam('kw');
+        if ($kw) {
+            $query = new \yii\mongodb\Query();
+            $rows  = $query->select([])
+                ->from(KafkaProducer::LOG)
+                ->where(['LIKE', 'name', $kw])
+                ->all();
+        }
+        return $this->render('index', [
+            'rows' => $rows,
+        ]);
+    }
+
+
+
+}

+ 183 - 0
controllers/SiteController.php

@@ -0,0 +1,183 @@
+<?php
+
+namespace app\controllers;
+
+use Yii;
+use app\components\Controller;
+use yii\filters\AccessControl;
+use yii\filters\VerbFilter;
+use app\models\User;
+use app\models\forms\LoginForm;
+use app\models\forms\PasswordResetRequestForm;
+use app\models\forms\ResetPasswordForm;
+use yii\web\HttpException;
+use yii\base\Exception;
+use yii\base\UserException;
+use yii\base\InvalidParamException;
+use yii\web\BadRequestHttpException;
+
+class SiteController extends Controller
+{
+    public $layout = 'site';
+
+    /**
+     * Render the homepage
+     */
+    public function actionIndex()
+    {
+        return $this->render('index');
+    }
+
+    /**
+     * User login
+     */
+    public function actionLogin() {
+        if (!\Yii::$app->user->isGuest) {
+            return $this->goHome();
+        }
+
+        $model = new LoginForm();
+        if ($model->load(Yii::$app->request->post()) && $model->login()) {
+            return $this->goBack();
+        } else {
+            return $this->render('login', [
+                'model' => $model,
+            ]);
+        }
+    }
+
+    /**
+     * User logout
+     */
+    public function actionLogout()
+    {
+        Yii::$app->user->logout();
+
+        return $this->goHome();
+    }
+
+    /**
+     * User signup
+     */
+    public function actionSignup() {
+        $user = new User(['scenario' => 'signup']);
+        if ($user->load(Yii::$app->request->post())) {
+            if ($user->save()) {
+                $params = Yii::$app->params;
+                Yii::$app->mail->compose('confirmEmail', ['user' => $user])
+                    ->setFrom([$params['support.email'] => $params['support.name']])
+                    ->setTo($user->email)
+                    ->setSubject('Complete registration with ' . Yii::$app->name)
+                    ->send();
+                Yii::$app->session->setFlash('user-signed-up');
+                return $this->refresh();
+            }
+        }
+
+        if (Yii::$app->session->hasFlash('user-signed-up')) {
+            return $this->render('signedUp');
+        }
+
+        return $this->render('signup', [
+            'model' => $user,
+        ]);
+    }
+
+    /**
+     * Confirm email
+     */
+    public function actionConfirmEmail($token)
+    {
+        $user = User::find()->emailConfirmationToken($token)->one();
+        if ($user!==null && $user->removeEmailConfirmationToken(true)) {
+            Yii::$app->getUser()->login($user);
+            return $this->goHome();
+        }
+
+        return $this->render('emailConfirmationFailed');
+    }
+
+    /**
+     * Request password reset
+     */
+    public function actionRequestPasswordReset()
+    {
+        $model = new PasswordResetRequestForm();
+        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
+            if ($model->sendEmail()) {
+                Yii::$app->getSession()->setFlash('success', 'Check your email for further instructions.');
+
+                return $this->goHome();
+            } else {
+                Yii::$app->getSession()->setFlash('error', 'Sorry, we are unable to reset password for email provided.');
+            }
+        }
+
+        return $this->render('requestPasswordResetToken', [
+            'model' => $model,
+        ]);
+    }
+
+    /**
+     * Reset password
+     */
+    public function actionResetPassword($token)
+    {
+        try {
+            $model = new ResetPasswordForm($token);
+        } catch (InvalidParamException $e) {
+            throw new BadRequestHttpException($e->getMessage());
+        }
+
+        if ($model->load(Yii::$app->request->post()) && $model->validate() && $model->resetPassword()) {
+            Yii::$app->getSession()->setFlash('success', 'New password was saved.');
+
+            return $this->goHome();
+        }
+
+        return $this->render('resetPassword', [
+            'model' => $model,
+        ]);
+    }
+
+
+    public function actionSearch() {
+
+    }
+
+    public function actionError() {
+        if (($exception = Yii::$app->getErrorHandler()->exception) === null) {
+            return '';
+        }
+
+        if ($exception instanceof HttpException) {
+            $code = $exception->statusCode;
+        } else {
+            $code = $exception->getCode();
+        }
+        if ($exception instanceof Exception) {
+            $name = $exception->getName();
+        } else {
+            $name = $this->defaultName ?: Yii::t('yii', 'Error');
+        }
+        if ($code) {
+            $name .= " (#$code)";
+        }
+
+        if ($exception instanceof UserException) {
+            $message = $exception->getMessage();
+        } else {
+            $message = $this->defaultMessage ?: Yii::t('yii', 'An internal server error occurred.');
+        }
+
+        if (Yii::$app->getRequest()->getIsAjax()) {
+            static::renderJson([], $code, $message);
+        } else {
+            return $this->render('error', [
+                'name' => $name,
+                'message' => $message,
+                'exception' => $exception,
+            ]);
+        }
+    }
+}

+ 26 - 0
controllers/SubscribeController.php

@@ -0,0 +1,26 @@
+<?php
+/* *****************************************************************
+ * @Author: wushuiyong
+ * @Created Time : 一  7/27 22:23:54 2015
+ *
+ * @File Name: SubscribeController.php
+ * @Description:
+ * *****************************************************************/
+namespace app\controllers;
+
+use app\components\Controller;
+use app\components\LoggerDetail;
+use app\models\LogDetail;
+
+class SubscribeController extends Controller {
+
+    public function actionIndex() {
+        $logDetails = LogDetail::find()->asArray()->all();
+        foreach ($logDetails as $logDetail) {
+            $detail = LoggerDetail::formatChildDetail($logDetail);
+        }
+        return $this->render('index', [
+            'detail' => $detail,
+        ]);
+    }
+}

+ 400 - 0
controllers/WalleController.php

@@ -0,0 +1,400 @@
+<?php
+
+namespace app\controllers;
+use app\components\Controller;
+use app\models\DynamicConf;
+use walle\command\Git;
+use walle\command\Sync;
+use walle\command\Task as WalleTask;
+use walle\command\RemoteCmd;
+use walle\config\Config;
+use app\models\Task;
+use app\models\Record;
+use walle\command\Command;
+use app\models\Conf;
+use app\models\User;
+
+class WalleController extends Controller {
+
+    private $_config;
+
+    private $_task;
+
+    public $enableCsrfValidation = false;
+
+    public function actionIndex($kw = null) {
+        $user = User::findOne(\Yii::$app->user->id);
+        $list = Task::find()
+            ->select(['username' => 'user.username', 'task.title', 'task.status', 'task.id', 'task.commit_id'])
+            ->leftJoin('user', 'user.id=task.user_id');
+        if ($user->role != User::ROLE_ADMIN) {
+            $list->where(['user_id' => \Yii::$app->user->id]);
+        }
+
+        $kw = \Yii::$app->request->post('kw');
+        if ($kw) {
+            $list->andWhere(['or', "commit_id like '%" . $kw . "%'", "title like '%" . $kw . "%'"]);
+        }
+        $tasks = $list->orderBy('id desc')
+            ->asArray()->all();
+
+        $view = $user->role == User::ROLE_ADMIN ? 'admin-list' : 'dev-list';
+        return $this->render($view, [
+            'list' => $tasks,
+        ]);
+    }
+
+    /**
+     * 发起上线
+     * @throws \Exception
+     */
+    public function actionStartDeploy() {
+        $taskId = \Yii::$app->request->post('taskId');
+        if (!$taskId) {
+            static::renderJson([], -1, '任务号不能为空:)');
+        }
+        $this->_task = Task::findOne($taskId);
+        if (!$this->_task) {
+            throw new \Exception('任务号不存在:)');
+        }
+        if ($this->_task->user_id != \Yii::$app->user->id) {
+            throw new \Exception('不可以操作其它人的任务:)');
+        }
+        // 任务失败或者审核通过时可发起上线
+        if (!in_array($this->_task->status, [Task::STATUS_PASS, Task::STATUS_FAILED])) {
+            throw new \Exception('任务不能被重复执行:)');
+        }
+        // 配置
+        $this->_config = new Config(Conf::getConfigFile($this->_task->project_id));
+        try {
+            if ($this->_task->action == Task::ACTION_ONLINE) {
+                $this->_checkPermission();
+                $this->_gitUpdate();
+                $this->_preDeploy();
+                $this->_rsync();
+                $this->_postRelease();
+                $this->_link();
+            } else {
+                $this->_link($this->_task->ex_link_id);
+            }
+
+
+            $online = DynamicConf::findOne(DynamicConf::K_ONLINE_VERSION);
+            if (!$online) {
+                $online = new DynamicConf();
+                $online->name = DynamicConf::K_ONLINE_VERSION;
+            }
+            $exLinkId = $online->value;
+            $online->value = $this->_config->getReleases('release_id');
+            $online->save();
+
+            $this->_task->link_id = $this->_config->getReleases('release_id');
+            $this->_task->ex_link_id = $exLinkId;
+            $this->_task->status = Task::STATUS_DONE;
+            $this->_task->save();
+
+            $online = DynamicConf::findOne(DynamicConf::K_ONLINE_VERSION);
+            if (!$online) {
+                $online = new DynamicConf();
+                $online->name = DynamicConf::K_ONLINE_VERSION;
+            }
+            $online->value = $this->_config->getReleases('release_id');
+            $online->save();
+        } catch (\Exception $e) {
+            $this->_task->status = Task::STATUS_FAILED;
+            $this->_task->save();
+            throw $e;
+        }
+    }
+
+    /**
+     * 配置项目
+     * @param $projectId
+     * @return string
+     * @throws \Exception
+     */
+    public function actionConfigEdit($projectId = null) {
+        $conf = $projectId ? Conf::findOne($projectId) : new Conf();
+        $confName = $projectId && $conf ? $conf->conf : static::getParam('conf');
+        if (\Yii::$app->request->getIsPost()) {
+            $conf->attributes = [
+                'user_id' => \Yii::$app->user->id,
+                'created_at' => time(),
+                'name'   => static::getParam('name'),
+                'conf'   => $confName,
+                'level'  => static::getParam('level'),
+            ];
+            if ($conf->save()) {
+
+                Conf::saveConfContext($confName, static::getParam('context'));
+                $this->redirect('/walle/config');
+            }
+        }
+
+        if ($projectId && !$conf) throw new \Exception('找不到项目配置');
+        $conf->context = Conf::getConfContext($projectId ? $conf->conf : Conf::CONF_TPL);
+        return $this->render('config-edit', [
+            'conf' => $conf,
+        ]);
+    }
+
+    /**
+     * 配置项目列表
+     * @return string
+     */
+    public function actionConfig() {
+        $conf = Conf::find();
+
+        $kw = \Yii::$app->request->post('kw');
+        if ($kw) {
+            $conf->where(['like', "name", $kw]);
+        }
+        $conf = $conf->asArray()->all();
+        return $this->render('config', [
+            'list' => $conf,
+        ]);
+    }
+
+    /**
+     * 提交任务
+     * @param null $projectId
+     * @return string
+     */
+    public function actionSubmit($projectId = null) {
+        if (\Yii::$app->request->getIsPost()) {
+            $task = new Task();
+            $conf = Conf::findOne($projectId);
+            // 只有线上才需要审核
+            $status = in_array($conf->level, [Conf::LEVEL_PROD]) ? Task::STATUS_SUBMIT : Task::STATUS_PASS;
+            $task->attributes = [
+                'user_id' => \Yii::$app->user->id,
+                'project_id' => (int)static::getParam('projectId'),
+                'status' => $status,
+                'action' => Task::ACTION_ONLINE,
+                'created_at' => time(),
+                'title' => static::getParam('title'),
+                'commit_id' => static::getParam('commit'),
+            ];
+            if ($task->save()) {
+                $this->redirect('/walle/index');
+            }
+        }
+        if ($projectId) {
+            return $this->render('submit', [
+            ]);
+        }
+        $projects = Conf::find()->asArray()->all();
+        return $this->render('select-project', [
+            'projects' => $projects,
+        ]);
+    }
+
+    /**
+     * 获取commit历史
+     * @param $projectId
+     */
+    public function actionGetCommitHistory($projectId) {
+        $git = new Git();
+        $git->setConfig(Conf::getConfigFile($projectId));
+        $proj = Conf::findOne($projectId);
+        if ($proj->level == Conf::LEVEL_PROD) {
+            $list = $git->getTagList();
+        } else {
+            $list = $git->getCommitList();
+        }
+        $this->renderJson($list);
+    }
+
+    /**
+     * 任务审核
+     * @param $id
+     * @param $operation
+     */
+    public function actionTaskOperation($id, $operation) {
+        $task = Task::findOne($id);
+        if (!$task) {
+            static::renderJson([], -1, '任务号不存在');
+        }
+        $task->status = $operation == 'pass' ? Task::STATUS_PASS : Task::STATUS_REFUSE;
+        $task->save();
+        static::renderJson(['status' => \Yii::t('status', 'task_status_' . $task->status)]);
+    }
+
+    /**
+     * 上线管理
+     * @param $taskId
+     * @return string
+     * @throws \Exception
+     */
+    public function actionRollback() {
+        $taskId = $this->getParam('taskId');
+        $this->_task = Task::findOne($taskId);
+        if (!$this->_task) {
+            throw new \Exception('任务号不存在:)');
+        }
+        if ($this->_task->user_id != \Yii::$app->user->id) {
+            throw new \Exception('不可以操作其它人的任务:)');
+        }
+        $rollbackTask = new Task();
+        $conf = Conf::findOne($this->_task->project_id);
+        // 只有线上才需要审核
+        $status = in_array($conf->level, [Conf::LEVEL_PROD]) ? Task::STATUS_SUBMIT : Task::STATUS_PASS;
+        $rollbackTask->attributes = [
+            'user_id' => \Yii::$app->user->id,
+            'project_id' => $this->_task->project_id,
+            'status' => $status,
+            'action' => Task::ACTION_ROLLBACK,
+            'link_id' => $this->_task->ex_link_id,
+            'created_at' => time(),
+            'title' => $this->_task->title . ' - 回滚',
+            'commit_id' => $this->_task->commit_id,
+        ];
+        if ($rollbackTask->save()) {
+            $this->renderJson(['taskId' => $rollbackTask->id]);
+        } else {
+            $this->renderJson([], -1, '生成回滚任务失败');
+        }
+    }
+
+    /**
+     * 上线管理
+     * @param $taskId
+     * @return string
+     * @throws \Exception
+     */
+    public function actionDeploy($taskId) {
+        $this->_task = Task::findOne($taskId);
+        if (!$this->_task) {
+            throw new \Exception('任务号不存在:)');
+        }
+        if ($this->_task->user_id != \Yii::$app->user->id) {
+            throw new \Exception('不可以操作其它人的任务:)');
+        }
+
+        return $this->render('deploy', [
+            'task' => $this->_task,
+        ]);
+    }
+
+
+    /**
+     * 获取上线进度
+     * @param $taskId
+     */
+    public function actionGetProcess($taskId) {
+        $record = Record::find()
+            ->select(['action', 'status', 'memo'])
+            ->where(['task_id' => $taskId,])
+            ->orderBy('id desc')
+            ->asArray()->one();
+        $record['percent'] = isset(Record::$ACTION_PERCENT[$record['action']])
+            ? Record::$ACTION_PERCENT[$record['action']]
+            : 0;
+
+        static::renderJson($record);
+    }
+
+    /**
+     * 检查目录和权限
+     * @return bool
+     * @throws \Exception
+     */
+    private function _checkPermission() {
+        $sync = new Sync();
+        $sTime = Command::getMs();
+        $sync->setConfig($this->_config);
+        // 本地目录检查
+        $sync->initDirector();
+        // 远程目录检查
+        $ret = $sync->directorAndPermission();
+        // 记录执行日志
+        $log = $sync->getExeLog();
+        $duration = Command::getMs() - $sTime;
+        Record::saveRecord($sync, $this->_task->id, Record::ACTION_PERMSSION, $duration);
+        if (!$ret) throw new \Exception('检查目录和权限出错');
+        return true;
+    }
+
+    /**
+     * 更新代码文件
+     * @return bool
+     * @throws \Exception
+     */
+    private function _gitUpdate() {
+        // 更新代码文件
+        $git = new Git();
+        $sTime = Command::getMs();
+        $ret = $git->setConfig($this->_config)
+            ->rollback($this->_task->commit_id); // 更新到指定版本
+        // 记录执行日志
+        $duration = Command::getMs() - $sTime;
+        Record::saveRecord($git, $this->_task->id, Record::ACTION_CLONE, $duration);
+        if (!$ret) throw new \Exception('更新代码文件出错');
+        return true;
+    }
+
+    private function _preDeploy() {
+        $task = new WalleTask();
+        $sTime = Command::getMs();
+        $task->setConfig($this->_config);
+        $ret = $task->preDeploy();
+        $duration = Command::getMs() - $sTime;
+        Record::saveRecord($task, $this->_task->id, Record::ACTION_CLONE, $duration);
+        if (!$ret) throw new \Exception('前置操作失败');
+        return true;
+    }
+
+    /**
+     * 部署时触发操作
+     *
+     * @return bool
+     * @throws \Exception
+     */
+    private function _postRelease() {
+        $task = new WalleTask();
+        $sTime = Command::getMs();
+        $task->setConfig($this->_config);
+        $ret = $task->postRelease();
+        $duration = Command::getMs() - $sTime;
+        Record::saveRecord($task, $this->_task->id, Record::ACTION_CLONE, $duration);
+        if (!$ret) throw new \Exception('前置操作失败');
+        return true;
+    }
+
+    /**
+     * 同步文件到服务器
+     * @return bool
+     * @throws \Exception
+     */
+    private function _rsync() {
+        $sync = new Sync();
+        $sync->setConfig($this->_config);
+        // 同步文件
+        foreach ($this->_config->getHosts() as $remoteHost) {
+            $sTime = Command::getMs();
+            $ret = $sync->syncFiles($remoteHost);
+            // 记录执行日志
+//            $log = $ret ?: $remoteHost . PHP_EOL . $sync->getLog();
+            $duration = Command::getMs() - $sTime;
+            $x = Record::saveRecord($sync, $this->_task->id, Record::ACTION_SYNC, $duration);
+            if (!$ret) throw new \Exception('同步文件到服务器出错');
+        }
+        return true;
+    }
+
+    /**
+     * 软链接
+     */
+    private function _link($version = null) {
+        // 创建链接指向
+        $remote = new RemoteCmd();
+        $sTime = Command::getMs();
+        $ret = $remote->setConfig($this->_config)->link($version);
+        // 记录执行日志
+        $duration = Command::getMs() - $sTime;
+        $ret = Record::saveRecord($remote, $this->_task->id, Record::ACTION_LINK, $duration);
+        if (!$ret) throw new \Exception($version ? '回滚失败' : '创建链接指向出错');
+        return true;
+    }
+
+}

+ 29 - 0
deploy.yml/env/conf_tpl.yml

@@ -0,0 +1,29 @@
+#production
+scm:
+  type: git
+  url: git@github.com:meolu/walle-web.git
+  branch: master
+deployment:
+  user: wushuiyong 
+  from: /var/www/deploy/from
+  env: simulate
+  excludes:
+    - READ.ME
+  strategy: targz
+releases:
+  user: wushuiyong
+  enabled: true
+  max: 10
+  to: /var/www/deploy/to
+  symlink: walle 
+  directory: releases
+hosts:
+    - 127.0.0.1
+tasks:
+  pre-deploy:
+  on-deploy:
+  post-release:
+    - cp -rf {WORKSPACE}/deploy.yml {VERSION}/
+  post-deploy:
+
+                                                                                                                                    

+ 8 - 0
deploy.yml/global.yml

@@ -0,0 +1,8 @@
+# global settings
+name: app name
+email: wushuiyong@huamanshu.com
+notifications: true
+logging: true
+maxlogs: 30
+ssh_needs_tty: false
+

+ 16 - 0
mail/confirmEmail.php

@@ -0,0 +1,16 @@
+<?php
+use yii\helpers\Html;
+
+/**
+ * @var yii\web\View $this
+ * @var common\models\User $user
+ */
+
+$confirmationLink = Yii::$app->urlManager->createAbsoluteUrl(['site/confirm-email', 'token' => $user->email_confirmation_token]);
+?>
+
+Hello <?= Html::encode($user->username) ?>,
+
+Follow the link below to complete your registration:
+
+<?= Html::a(Html::encode($confirmationLink), $confirmationLink) ?>

+ 23 - 0
mail/layouts/html.php

@@ -0,0 +1,23 @@
+<?php
+use yii\helpers\Html;
+
+/**
+ * @var \yii\web\View $this
+ * @var \yii\mail\BaseMessage $content
+ */
+?>
+<?php $this->beginPage() ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=<?= Yii::$app->charset ?>" />
+    <title><?= Html::encode($this->title) ?></title>
+    <?php $this->head() ?>
+</head>
+<body>
+    <?php $this->beginBody() ?>
+    <?= $content ?>
+    <?php $this->endBody() ?>
+</body>
+</html>
+<?php $this->endPage() ?>

+ 16 - 0
mail/passwordResetToken.php

@@ -0,0 +1,16 @@
+<?php
+use yii\helpers\Html;
+
+/**
+ * @var yii\web\View $this
+ * @var common\models\User $user
+ */
+
+$resetLink = Yii::$app->urlManager->createAbsoluteUrl(['site/reset-password', 'token' => $user->password_reset_token]);
+?>
+
+Hello <?= Html::encode($user->username) ?>,
+
+Follow the link below to reset your password:
+
+<?= Html::a(Html::encode($resetLink), $resetLink) ?>

+ 14 - 0
messages/zh-CN/log.php

@@ -0,0 +1,14 @@
+<?php
+/* *****************************************************************
+ * @Author: wushuiyong
+ * @Created Time : 日  7/26 10:56:07 2015
+ *
+ * @File Name: log.php
+ * @Description:
+ * *****************************************************************/
+
+return [
+    'class-error' => 'label-danger',
+    'class-warning' => 'label-warning',
+    'class-notice' => 'label-primary',
+];

+ 31 - 0
messages/zh-CN/status.php

@@ -0,0 +1,31 @@
+<?php
+/* *****************************************************************
+ * @Author: wushuiyong
+ * @Created Time : 二  8/11 11:04:50 2015
+ *
+ * @File Name: messages/zh-CN/status.php
+ * @Description:
+ * *****************************************************************/
+return [
+    'user_role_1' => '管理员',
+    'user_role_2' => '开发者',
+
+    'task_status_0' => '新提交',
+    'task_status_1' => '审核通过',
+    'task_status_2' => '审核拒绝',
+    'task_status_3' => '上线完成',
+    'task_status_4' => '上线失败',
+    'task_status_0_color' => 'text-primary',
+    'task_status_1_color' => '',
+    'task_status_2_color' => 'text-yellow',
+    'task_status_3_color' => 'text-green',
+    'task_status_4_color' => 'text-red',
+
+    'conf_level_1' => 'test',
+    'conf_level_2' => 'simu',
+    'conf_level_3' => 'prod',
+    'conf_status_0' => '无效',
+    'conf_status_1' => '有效',
+    'conf_status_0_color' => 'text-red',
+    'conf_status_1_color' => 'text-green',
+];

+ 30 - 0
migrations/m140328_144900_init.php

@@ -0,0 +1,30 @@
+<?php
+
+use yii\db\Schema;
+
+class m140328_144900_init extends \yii\db\Migration
+{
+    public function up()
+    {
+        $this->createTable('user', [
+            'id' => Schema::TYPE_PK,
+            'username' => Schema::TYPE_STRING . ' NOT NULL',
+            'is_email_verified' => Schema::TYPE_BOOLEAN . ' NOT NULL DEFAULT 0',
+            'auth_key' => Schema::TYPE_STRING . '(32) NOT NULL',
+            'password_hash' => Schema::TYPE_STRING . ' NOT NULL',
+            'password_reset_token' => Schema::TYPE_STRING,
+            'email_confirmation_token' => Schema::TYPE_STRING,
+            'email' => Schema::TYPE_STRING . ' NOT NULL',
+            'role' => Schema::TYPE_SMALLINT . ' NOT NULL DEFAULT 10',
+
+            'status' => Schema::TYPE_SMALLINT . ' NOT NULL DEFAULT 10',
+            'created_at' => Schema::TYPE_DATETIME . ' NOT NULL',
+            'updated_at' => Schema::TYPE_DATETIME . ' NOT NULL',
+        ], 'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB');
+    }
+
+    public function down()
+    {
+        $this->dropTable('user');
+    }
+}

+ 102 - 0
models/Conf.php

@@ -0,0 +1,102 @@
+<?php
+
+namespace app\models;
+
+use Yii;
+
+/**
+ * This is the model class for table "conf".
+ *
+ * @property integer $id
+ * @property integer $user_id
+ * @property string $name
+ * @property string $conf
+ * @property integer $level
+ * @property integer $status
+ * @property integer $at
+ */
+class Conf extends \yii\db\ActiveRecord
+{
+    const CONF_TPL = 'conf_tpl';
+    // 有效状态
+    const STATUS_VALID = 1;
+
+    // 测试环境
+    const LEVEL_TEST  = 1;
+
+    // 模拟线上环境
+    const LEVEL_SIMU  = 2;
+
+    // 线上环境
+    const LEVEL_PROD  = 3;
+
+    public static $LEVEL = [
+        self::LEVEL_TEST => 'test',
+        self::LEVEL_SIMU => 'simu',
+        self::LEVEL_PROD => 'prod',
+    ];
+
+    public $context;
+
+    /**
+     * @inheritdoc
+     */
+    public static function tableName()
+    {
+        return 'conf';
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function rules()
+    {
+        return [
+            [['user_id', 'name', 'conf', 'level', 'created_at'], 'required'],
+            [['user_id', 'level', 'status', 'created_at', 'level'], 'integer'],
+            [['name', 'conf'], 'string', 'max' => 20],
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributeLabels()
+    {
+        return [
+            'id' => 'ID',
+            'user_id' => 'user_id',
+            'name' => 'Name',
+            'conf' => 'Conf',
+            'level' => 'Level',
+            'status' => 'Status',
+            'created_at' => 'created_at',
+        ];
+    }
+
+    public static function getConfigFile($id) {
+        $conf = static::findOne($id);
+        if (!$conf) {
+            throw new \Exception('找不到此任务号');
+        };
+        return static::getConf($conf->conf);
+    }
+
+    public static function getConf($name) {
+        return sprintf("%s/%s/%s.yml",
+            rtrim(\Yii::$app->basePath, '/'), trim(Yii::$app->params['config.dir'], '/'), $name);
+    }
+
+    public static function saveConfContext($name, $context) {
+        $file = static::getConf($name);
+        return file_put_contents($file, $context);
+    }
+
+    public static function getConfContext($name) {
+        $file = static::getConf($name);
+        if (file_exists($file)) {
+            return file_get_contents($file);
+        }
+        return '';
+    }
+}

+ 51 - 0
models/DynamicConf.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace app\models;
+
+use Yii;
+
+/**
+ * This is the model class for table "conf".
+ *
+ * @property integer $id
+ * @property integer $user_id
+ * @property string $name
+ * @property string $conf
+ * @property integer $level
+ * @property integer $status
+ * @property integer $at
+ */
+class DynamicConf extends \yii\db\ActiveRecord
+{
+    const K_ONLINE_VERSION = 'online_version';
+
+    /**
+     * @inheritdoc
+     */
+    public static function tableName()
+    {
+        return 'dynamic_conf';
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function rules()
+    {
+        return [
+            [['name', 'value'], 'required'],
+            [['name', 'value'], 'string', 'max' => 30],
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributeLabels()
+    {
+        return [
+            'name' => 'Name',
+            'value' => 'value',
+        ];
+    }
+}

+ 51 - 0
models/KafkaOffset.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace app\models;
+
+use Yii;
+
+/**
+ * This is the model class for collection "kafka_offset".
+ *
+ * @property \MongoId|string $_id
+ */
+class KafkaOffset extends \yii\mongodb\ActiveRecord {
+
+    /**
+     * @inheritdoc
+     */
+    public static function collectionName()
+    {
+        return ['local', 'kafka_offset'];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributes()
+    {
+        return [
+            '_id', 'name', 'offset',
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function rules()
+    {
+        return [
+            
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributeLabels()
+    {
+        return [
+            '_id' => 'ID',
+        ];
+    }
+}

+ 19 - 0
models/Log.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace app\models;
+
+use yii\mongodb\ActiveRecord;
+
+class Log extends ActiveRecord {
+
+    /**
+     * @inheritdoc
+     */
+    public static function collectionName() {
+        return 'log';
+    }
+
+    public function attributes() {
+        return ['_id', 'name', 'trace',];
+    }
+}

+ 71 - 0
models/LogDetail.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace app\models;
+
+use Yii;
+
+/**
+ * This is the model class for collection "log_detail".
+ *
+ * @property \MongoId|string $_id
+ */
+class LogDetail extends \yii\mongodb\ActiveRecord
+{
+    /**
+     * @inheritdoc
+     */
+    public static function collectionName()
+    {
+        return ['local', 'log_detail'];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributes()
+    {
+        return [
+            '_id', 'name',
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function rules()
+    {
+        return [
+            
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributeLabels()
+    {
+        return [
+            '_id' => 'ID',
+        ];
+    }
+
+    public static function formatChildDetail($detail, $name = null) {
+        $name = $name ? $name . '.' . $detail['name'] : $detail['name'];
+        $list[$name] = [
+            'name'    => $detail['name'],
+            'error'   => $detail['error'],
+            'warning' => $detail['warning'],
+            'notice'  => $detail['notice'],
+        ];
+        if (!empty($detail['child'])) {
+            foreach ($detail['child'] as $child) {
+                $list = array_merge($list, static::formatChildDetail($child, $name));
+            }
+        }
+        return $list;
+    }
+
+    public static function incrCount() {
+
+    }
+}

+ 111 - 0
models/Record.php

@@ -0,0 +1,111 @@
+<?php
+
+namespace app\models;
+
+use Yii;
+use walle\command\Command;
+
+/**
+ * This is the model class for table "record".
+ *
+ * @property integer $id
+ * @property integer $user_id
+ * @property integer $task_id
+ * @property integer $status
+ * @property integer $action
+ * @property integer $at
+ * @property integer $duration
+ * @property integer $memo
+ */
+class Record extends \yii\db\ActiveRecord
+{
+
+    /**
+     * 服务器权限检查
+     */
+    const ACTION_PERMSSION = 1;
+
+    /**
+     * 本地代码更新
+     */
+    const ACTION_CLONE = 2;
+
+    /**
+     * 同步代码到服务器
+     */
+    const ACTION_SYNC  = 3;
+
+    /**
+     * 软链接
+     */
+    const ACTION_LINK  = 4;
+
+    public static $ACTION_PERCENT = [
+        self::ACTION_PERMSSION => '25',
+        self::ACTION_CLONE => '50',
+        self::ACTION_SYNC => '75',
+        self::ACTION_LINK => '100',
+    ];
+
+    /**
+     * @inheritdoc
+     */
+    public static function tableName()
+    {
+        return 'record';
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function rules()
+    {
+        return [
+            [['user_id', 'task_id', 'status'], 'required'],
+            [['user_id', 'task_id', 'status', 'created_at', 'duration', 'action'], 'integer'],
+            [['memo', 'command'], 'string'],
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributeLabels()
+    {
+        return [
+            'id' => 'ID',
+            'user_id' => 'user_id',
+            'task_id' => 'task_id',
+            'status' => 'Status',
+            'created_at' => 'created_at',
+            'action' => 'action',
+            'duration' => 'duration',
+            'memo' => 'memo',
+        ];
+    }
+
+    /**
+     * 保存记录
+     *
+     * @param Command $commandObj
+     * @param $task_id
+     * @param $action
+     * @param $duration
+     * @return mixed
+     */
+    public static function saveRecord(Command $commandObj, $task_id, $action, $duration) {
+        $record = new static();
+        $record->attributes = [
+            'user_id' => \Yii::$app->user->id,
+            'task_id' => $task_id,
+            'status' => (int)$commandObj->getExeStatus(),
+            'action' => $action,
+            'created_at' => time(),
+            'command'=> var_export($commandObj->getExeCommand(), true),
+            'memo'   => var_export($commandObj->getExeLog(), true),
+            'duration' => $duration,
+        ];
+//        file_put_contents('/tmp/xx', var_export($record->attributes, true).PHP_EOL.PHP_EOL, 8);
+        return $record->save();
+    }
+}

+ 77 - 0
models/Task.php

@@ -0,0 +1,77 @@
+<?php
+
+namespace app\models;
+
+use Yii;
+
+/**
+ * This is the model class for table "task".
+ *
+ * @property integer $id
+ * @property string $userid
+ * @property integer $status
+ * @property integer $at
+ * @property string $title
+ * @property string $commitid
+ */
+class Task extends \yii\db\ActiveRecord
+{
+    const ACTION_ONLINE = 0;
+
+    const ACTION_ROLLBACK = 1;
+    /**
+     * 任务新提交
+     */
+    const STATUS_SUBMIT = 0;
+    /**
+     * 任务通过
+     */
+    const STATUS_PASS   = 1;
+    /**
+     * 任务拒绝
+     */
+    const STATUS_REFUSE = 2;
+    /**
+     * 任务上线完成
+     */
+    const STATUS_DONE   = 3;
+    /**
+     * 任务上线失败
+     */
+    const STATUS_FAILED = 4;
+    /**
+     * @inheritdoc
+     */
+    public static function tableName()
+    {
+        return 'task';
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function rules()
+    {
+        return [
+            [['user_id', 'status', 'created_at', 'title', 'commit_id', 'project_id'], 'required'],
+            [['user_id', 'status', 'created_at', 'project_id', 'action'], 'integer'],
+            [['title', 'commit_id', 'link_id', 'ex_link_id'], 'string', 'max' => 100],
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributeLabels()
+    {
+        return [
+            'id' => 'ID',
+            'user_id' => 'user_id',
+            'status' => 'Status',
+            'created_at' => 'created_at',
+            'title' => 'Title',
+            'commit_id' => 'commit_id',
+            'ex_link_id' => 'ex_link_id',
+        ];
+    }
+}

+ 266 - 0
models/User.php

@@ -0,0 +1,266 @@
+<?php
+namespace app\models;
+
+use Yii;
+use yii\base\NotSupportedException;
+use yii\db\ActiveRecord;
+use yii\web\IdentityInterface;
+use app\models\behaviors\TimestampBehavior;
+use app\models\queries\UserQuery;
+
+/**
+ * User model
+ *
+ * @property integer $id
+ * @property string $username
+ * @property string $is_email_verified
+ * @property string $password_hash
+ * @property string $password_reset_token
+ * @property string $email_confirmation_token
+ * @property string $email
+ * @property string $auth_key
+ * @property integer $role
+ * @property integer $status
+ * @property string $created_at
+ * @property string $updated_at
+ * @property string $password write-only password
+ */
+class User extends ActiveRecord implements IdentityInterface
+{
+    const STATUS_DELETED = 0;
+    const STATUS_ACTIVE = 10;
+
+    const ROLE_USER = 10;
+    /**
+     * 管理员
+     */
+    const ROLE_ADMIN = 1;
+
+    /**
+     * 开发者
+     */
+    const ROLE_DEV   = 2;
+    /**
+     * @var string|null the current password value from form input
+     */
+    protected $_password;
+
+    /**
+     * @return UserQuery custom query class with user scopes
+     */
+    public static function find()
+    {
+        return new UserQuery(get_called_class());
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function scenarios()
+    {
+        return array_merge(parent::scenarios(), [
+            'signup' => ['username','email','password','role'],
+        ]);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributeLabels()
+    {
+        return [
+            'username' => '用户名',
+            'email' => '邮箱',
+            'password' => '密码',
+            'role' => '角色',
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function rules()
+    {
+        return [
+            [['username','email','password','role'], 'required', 'on'=>'signup'],
+
+            ['status', 'default', 'value' => self::STATUS_ACTIVE],
+            ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
+
+            ['role', 'default', 'value' => self::ROLE_DEV],
+            ['role', 'in', 'range' => [self::ROLE_USER, self::ROLE_DEV, self::ROLE_ADMIN]],
+
+            ['username', 'filter', 'filter' => 'trim'],
+            ['username', 'unique'],
+            ['username', 'string', 'min' => 2, 'max' => 255],
+
+            ['email', 'filter', 'filter' => 'trim'],
+            ['email', 'validateEmail'],
+            ['email', 'email'],
+            ['email', 'unique'],
+        ];
+    }
+
+    public function validateEmail($attribute, $params) {
+        if (!preg_match('/.*@social-touch.com$/', $this->$attribute)) {
+            $this->addError($attribute, '我猜你丫是外星人,没有st邮箱不可注册:)');
+        }
+    }
+    /**
+     * @inheritdoc
+     */
+    public function behaviors()
+    {
+        return [
+            'timestamp' => [
+                'class' => TimestampBehavior::className(),
+            ],
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function beforeSave($insert)
+    {
+        if ($this->isNewRecord) {
+            $this->generateAuthKey();
+            $this->generateEmailConfirmationToken();
+        }
+        $this->realname = $this->username;
+        $this->username = $this->email;
+
+        return parent::beforeSave($insert);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public static function findIdentity($id)
+    {
+        return static::findOne($id);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public static function findIdentityByAccessToken($token, $type = null)
+    {
+        throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getId()
+    {
+        return $this->getPrimaryKey();
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getName()
+    {
+        return $this->realname;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getAuthKey()
+    {
+        return $this->auth_key;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function validateAuthKey($authKey)
+    {
+        return $this->getAuthKey() === $authKey;
+    }
+
+    /**
+     * Validates password
+     *
+     * @param  string  $password password to validate
+     * @return boolean if password provided is valid for current user
+     */
+    public function validatePassword($password)
+    {
+        return Yii::$app->security->validatePassword($password, $this->password_hash);
+    }
+
+    /**
+     * Generates password hash from password and sets it to the model
+     *
+     * @param string $password
+     */
+    public function setPassword($password)
+    {
+        $this->_password = $password;
+        if (!empty($password)) {
+            $this->password_hash = Yii::$app->security->generatePasswordHash($password);
+        }
+    }
+
+    /**
+     * @return string|null the current password value, if set from form. Null otherwise.
+     */
+    public function getPassword()
+    {
+        return $this->_password;
+    }
+
+    /**
+     * Generates "remember me" authentication key
+     */
+    public function generateAuthKey()
+    {
+        $this->auth_key = Yii::$app->security->generateRandomString();
+    }
+
+    /**
+     * Generates new email confirmation token
+     */
+    public function generateEmailConfirmationToken()
+    {
+        $this->email_confirmation_token = Yii::$app->security->generateRandomString() . '_' . time();
+    }
+
+    /**
+     * Generates new password reset token
+     */
+    public function generatePasswordResetToken()
+    {
+        $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
+    }
+
+    /**
+     * Removes password reset token
+     * @param bool $save whether to save the record. Default is `false`.
+     * @return bool|null whether the save was successful or null if $save was false.
+     */
+    public function removePasswordResetToken($save = false)
+    {
+        $this->password_reset_token = null;
+        if ($save) {
+            return $this->save();
+        }
+    }
+
+    /**
+     * Removes email confirmation token and sets is_email_verified to true
+     * @param bool $save whether to save the record. Default is `false`.
+     * @return bool|null whether the save was successful or null if $save was false.
+     */
+    public function removeEmailConfirmationToken($save = false)
+    {
+        $this->email_confirmation_token = null;
+        $this->is_email_verified = 1;
+        if ($save) {
+            return $this->save();
+        }
+    }
+}

+ 20 - 0
models/behaviors/TimestampBehavior.php

@@ -0,0 +1,20 @@
+<?php
+namespace app\models\behaviors;
+
+use yii\db\ActiveRecord;
+use yii\db\Expression;
+use yii\behaviors\TimestampBehavior as BaseTimestampBehavior;
+
+class TimestampBehavior extends BaseTimestampBehavior
+{
+    public $attributes = [
+        ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
+        ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
+    ];
+
+    public function init()
+    {
+        parent::init();
+        $this->value = new Expression('NOW()');
+    }
+}

+ 76 - 0
models/forms/LoginForm.php

@@ -0,0 +1,76 @@
+<?php
+
+namespace app\models\forms;
+
+use Yii;
+use yii\base\Model;
+use app\models\User;
+
+/**
+ * LoginForm is the model behind the login form.
+ */
+class LoginForm extends Model
+{
+    public $username;
+    public $password;
+    public $rememberMe = true;
+
+    private $_user = false;
+
+    /**
+     * @return array the validation rules.
+     */
+    public function rules()
+    {
+        return [
+            // username and password are both required
+            [['username', 'password'], 'required'],
+            // rememberMe must be a boolean value
+            ['rememberMe', 'boolean'],
+            // password is validated by validatePassword()
+            ['password', 'validatePassword'],
+        ];
+    }
+
+    /**
+     * Validates the password.
+     * This method serves as the inline validation for password.
+     */
+    public function validatePassword()
+    {
+        if (!$this->hasErrors()) {
+            $user = $this->getUser();
+
+            if (!$user || !$user->validatePassword($this->password)) {
+                $this->addError('password', 'Incorrect username or password.');
+            }
+        }
+    }
+
+    /**
+     * Logs in a user using the provided username and password.
+     * @return boolean whether the user is logged in successfully
+     */
+    public function login()
+    {
+        if ($this->validate()) {
+            return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Finds user by [[username]]
+     *
+     * @return User|null
+     */
+    public function getUser()
+    {
+        if ($this->_user === false) {
+            $this->_user = User::find()->canLogin()->username($this->username)->one();
+        }
+
+        return $this->_user;
+    }
+}

+ 56 - 0
models/forms/PasswordResetRequestForm.php

@@ -0,0 +1,56 @@
+<?php
+namespace app\models\forms;
+
+use Yii;
+use yii\base\Model;
+use app\models\User;
+
+/**
+ * Password reset request form
+ */
+class PasswordResetRequestForm extends Model
+{
+    public $email;
+
+    /**
+     * @inheritdoc
+     */
+    public function rules()
+    {
+        return [
+            ['email', 'filter', 'filter' => 'trim'],
+            ['email', 'required'],
+            ['email', 'email'],
+            ['email', 'exist',
+                'targetClass' => '\app\models\User',
+                'filter' => ['status' => User::STATUS_ACTIVE],
+                'message' => 'There is no user with such email.'
+            ],
+        ];
+    }
+
+    /**
+     * Sends an email with a link, for resetting the password.
+     *
+     * @return boolean whether the email was send
+     */
+    public function sendEmail()
+    {
+        /** @var User $user */
+        $user = User::find()->canLogin()->email($this->email)->one();
+
+        if ($user) {
+            $user->generatePasswordResetToken();
+            if ($user->save()) {
+                $params = Yii::$app->params;
+                return Yii::$app->mail->compose('passwordResetToken', ['user' => $user])
+                    ->setFrom([$params['support.email'] => $params['support.name']])
+                    ->setTo($this->email)
+                    ->setSubject('Password reset for ' . Yii::$app->name)
+                    ->send();
+            }
+        }
+
+        return false;
+    }
+}

+ 64 - 0
models/forms/ResetPasswordForm.php

@@ -0,0 +1,64 @@
+<?php
+namespace app\models\forms;
+
+use Yii;
+use yii\base\InvalidParamException;
+use yii\base\Model;
+use app\models\User;
+
+/**
+ * Password reset form
+ */
+class ResetPasswordForm extends Model
+{
+    public $password;
+
+    /**
+     * @var \common\models\User
+     */
+    private $_user;
+
+    /**
+     * Creates a form model given a token.
+     *
+     * @param  string                          $token
+     * @param  array                           $config name-value pairs that will be used to initialize the object properties
+     * @throws \yii\base\InvalidParamException if token is empty or not valid
+     */
+    public function __construct($token, $config = [])
+    {
+        if (empty($token) || !is_string($token)) {
+            throw new InvalidParamException('Password reset token cannot be blank.');
+        }
+        $this->_user = User::find()->canLogin()->passwordResetToken($token)->one();
+        if (!$this->_user) {
+            throw new InvalidParamException('Wrong password reset token.');
+        }
+        parent::__construct($config);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function rules()
+    {
+        return [
+            ['password', 'required'],
+            ['password', 'string', 'min' => 6],
+        ];
+    }
+
+    /**
+     * Resets password.
+     *
+     * @return boolean if password was reset.
+     */
+    public function resetPassword()
+    {
+        $user = $this->_user;
+        $user->password = $this->password;
+        $user->removePasswordResetToken();
+
+        return $user->save();
+    }
+}

+ 19 - 0
models/old.kafkaoffset.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace app\models;
+
+use yii\mongodb\ActiveRecord;
+
+class KafkaOffset extends ActiveRecord {
+
+    /**
+     * @inheritdoc
+     */
+    public static function collectionName() {
+        return 'kafkfa_offset';
+    }
+    
+	public function attributes() {
+	    return ['_id', 'name', 'offset',];
+	}
+}

+ 67 - 0
models/queries/UserQuery.php

@@ -0,0 +1,67 @@
+<?php
+namespace app\models\queries;
+
+use yii\db\ActiveQuery;
+use app\models\User;
+
+class UserQuery extends ActiveQuery
+{
+    /**
+     * @return UserQuery the query with conditions for users that can login applied
+     */
+    public function canLogin()
+    {
+        return $this->andWhere([
+            'status' => User::STATUS_ACTIVE,
+            'is_email_verified' => 1,
+        ]);
+    }
+
+    /**
+     * @return UserQuery the query with condition for given email applied
+     */
+    public function email($email)
+    {
+        return $this->andWhere(['email' => $email]);
+    }
+
+    /**
+     * @return UserQuery the query with condition for given username applied
+     */
+    public function username($username)
+    {
+        return $this->andWhere(['username' => $username]);
+    }
+
+    /**
+     * @param string $token the password reset token
+     * @return UserQuery the query with conditions for valid password reset token applied
+     */
+    public function passwordResetToken($token)
+    {
+        $expire = \Yii::$app->params['user.passwordResetTokenExpire'];
+        $parts = explode('_', $token);
+        $timestamp = (int) end($parts);
+        if ($timestamp + $expire < time()) {
+            // token expired
+            return $this->andWhere('FALSE');
+        }
+        return $this->andWhere(['password_reset_token' => $token]);
+    }
+
+    /**
+     * @param string $token the email confirmation token
+     * @return UserQuery the query with conditions for valid email confirmation token applied
+     */
+    public function emailConfirmationToken($token)
+    {
+        $expire = \Yii::$app->params['user.emailConfirmationTokenExpire'];
+        $parts = explode('_', $token);
+        $timestamp = (int) end($parts);
+        if ($timestamp + $expire < time()) {
+            // token expired
+            return $this->andWhere('FALSE');
+        }
+        return $this->andWhere(['email_confirmation_token' => $token]);
+    }
+}

+ 4 - 0
runtime/.gitignore

@@ -0,0 +1,4 @@
+*
+!debug
+!logs
+!.gitignore

+ 9 - 0
submit.sh

@@ -0,0 +1,9 @@
+#!/usr/bin/env
+
+from="/Users/wushuiyong/workspace/git/walle-web";
+to="/Users/wushuiyong/workspace/git/walle-web-git/";
+
+cd $from
+cp -rf README.md assets components composer.json console controllers mail messages migrations models views web widgets yii $to
+
+gst

+ 459 - 0
views/layouts/main.php

@@ -0,0 +1,459 @@
+<?php
+use yii\helpers\Html;
+use yii\bootstrap\Nav;
+use yii\bootstrap\NavBar;
+use yii\widgets\Breadcrumbs;
+use app\models\User;
+use app\assets\AppAsset;
+use app\widgets\Alert;
+
+$user = User::findOne(\Yii::$app->user->id);
+$userName =  \Yii::$app->user->id ? $user->getName() : '';
+?>
+<?php $this->beginPage() ?>
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8" />
+    <title><?= Html::encode($this->title) ?> - Walle 瓦力平台</title>
+    <link href="/dist/css/bootstrap.min.css" rel="stylesheet" />
+    <link href="/dist/css/font-awesome.min.css" rel="stylesheet" />
+
+    <!--[if IE 7]>
+    <link rel="stylesheet" href="/dist/css/font-awesome-ie7.min.css" />
+    <![endif]-->
+
+    <!-- page specific plugin styles -->
+
+
+    <!-- ace styles -->
+
+    <link rel="stylesheet" href="/dist/css/ace.min.css" />
+    <link rel="stylesheet" href="/dist/css/ace-rtl.min.css" />
+    <link rel="stylesheet" href="/dist/css/ace-skins.min.css" />
+
+    <!--[if lte IE 8]>
+    <link rel="stylesheet" href="/dist/css/ace-ie.min.css" />
+    <![endif]-->
+    <!--[if !IE]> -->
+
+    <script type="text/javascript">
+        window.jQuery || document.write("<script src='/dist/js/jquery-2.0.3.min.js'>"+"<"+"script>");
+    </script>
+
+    <!-- <![endif]-->
+
+    <!--[if IE]>
+    <script type="text/javascript">
+        window.jQuery || document.write("<script src='/dist/js/jquery-1.10.2.min.js'>"+"<"+"script>");
+    </script>
+    <![endif]-->
+    <!-- inline styles related to this page -->
+
+    <!-- ace settings handler -->
+
+    <script src="/dist/js/ace-extra.min.js"></script>
+
+    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+
+    <!--[if lt IE 9]>
+    <script src="/dist/js/html5shiv.js"></script>
+    <script src="/dist/js/respond.min.js"></script>
+    <![endif]-->
+</head>
+
+<body>
+
+<div class="navbar navbar-default" id="navbar">
+    <script type="text/javascript">
+        try{ace.settings.check('navbar' , 'fixed')}catch(e){}
+    </script>
+
+    <div class="navbar-container" id="navbar-container">
+        <div class="navbar-header pull-left">
+            <a href="#" class="navbar-brand">
+                <small>Walle</small>
+            </a><!-- /.brand -->
+        </div><!-- /.navbar-header -->
+
+        <div class="navbar-header pull-right" role="navigation">
+            <ul class="nav ace-nav">
+
+                <li class="light-blue">
+                    <a data-toggle="dropdown" href="#" class="dropdown-toggle">
+                        <span class="user-info"><?= $userName ?></span>
+                        <i class="icon-caret-down"></i>
+                    </a>
+
+                    <ul class="user-menu pull-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
+                        <li>
+                            <a href="#">
+                                <i class="icon-cog"></i>
+                                设置
+                            </a>
+                        </li>
+
+                        <li>
+                            <a href="#">
+                                <i class="icon-user"></i>
+                                个人资料
+                            </a>
+                        </li>
+
+                        <li class="divider"></li>
+
+                        <li>
+                            <a href="/site/logout">
+                                <i class="icon-off"></i>
+                                退出
+                            </a>
+                        </li>
+                    </ul>
+                </li>
+            </ul><!-- /.ace-nav -->
+        </div><!-- /.navbar-header -->
+    </div><!-- /.container -->
+</div>
+
+<div class="main-container" id="main-container">
+    <script type="text/javascript">
+        try{ace.settings.check('main-container' , 'fixed')}catch(e){}
+    </script>
+
+    <div class="main-container-inner">
+        <a class="menu-toggler" id="menu-toggler" href="#">
+            <span class="menu-text"></span>
+        </a>
+
+        <div class="sidebar" id="sidebar">
+            <script type="text/javascript">
+                try{ace.settings.check('sidebar' , 'fixed')}catch(e){}
+            </script>
+
+            <ul class="nav nav-list">
+                <li>
+                    <a href="#" class="dropdown-toggle">
+                        <i class="icon-desktop"></i>
+                        <span class="menu-text"> 上线部署 </span>
+                        <b class="arrow icon-angle-down"></b>
+                    </a>
+
+                    <ul class="submenu">
+                        <li>
+                            <a href="/walle/config/">
+                                <i class="icon-double-angle-right"></i>
+                                项目配置
+                            </a>
+                        </li>
+
+                        <li>
+                            <a href="/walle/index">
+                                <i class="icon-double-angle-right"></i>
+                                我的上线任务
+                            </a>
+                        </li>
+
+                        <li>
+                            <a href="/walle/submit/">
+                                <i class="icon-double-angle-right"></i>
+                                提交上线任务
+                            </a>
+                        </li>
+
+                    </ul>
+                </li>
+<!---->
+<!--                <li>-->
+<!--                    <a href="#" class="dropdown-toggle">-->
+<!--                        <i class="icon-list"></i>-->
+<!--                        <span class="menu-text"> 日志监控 </span>-->
+<!---->
+<!--                        <b class="arrow icon-angle-down"></b>-->
+<!--                    </a>-->
+<!---->
+<!--                    <ul class="submenu">-->
+<!--                        <li>-->
+<!--                            <a href="/logger/search">-->
+<!--                                <i class="icon-double-angle-right"></i>-->
+<!--                                日志查看-->
+<!--                            </a>-->
+<!--                        </li>-->
+<!--                        <li>-->
+<!--                            <a href="/subscribe/index">-->
+<!--                                <i class="icon-double-angle-right"></i>-->
+<!--                                日志订阅-->
+<!--                            </a>-->
+<!--                        </li>-->
+<!--                        <li>-->
+<!--                            <a href="/logger/index">-->
+<!--                                <i class="icon-double-angle-right"></i>-->
+<!--                                报表-->
+<!--                            </a>-->
+<!--                        </li>-->
+<!--                    </ul>-->
+<!--                </li>-->
+
+            </ul><!-- /.nav-list -->
+
+        </div>
+
+        <div class="main-content">
+            <div class="breadcrumbs" id="breadcrumbs">
+                <ul class="breadcrumb">
+                    <li>
+                        <i class="icon-home home-icon"></i>
+                        <a href="/">首页</a>
+                    </li>
+                    <li class="active"><?= $this->title ?></li>
+                </ul><!-- .breadcrumb -->
+            </div>
+
+            <div class="page-content">
+                <div class="row">
+                    <div class="col-xs-12">
+                    <?= $content ?>
+                    </div><!-- /.col -->
+                </div><!-- /.row -->
+            </div><!-- /.page-content -->
+        </div><!-- /.main-content -->
+
+    </div><!-- /.main-container-inner -->
+
+    <a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
+        <i class="icon-double-angle-up icon-only bigger-110"></i>
+    </a>
+</div><!-- /.main-container -->
+
+<!-- basic scripts -->
+
+
+
+
+<script type="text/javascript">
+    if("ontouchend" in document) document.write("<script src='/dist/js/jquery.mobile.custom.min.js'>"+"<"+"script>");
+</script>
+<script src="/dist/js/bootstrap.min.js"></script>
+<script src="/dist/js/typeahead-bs2.min.js"></script>
+
+<!-- page specific plugin scripts -->
+
+<!--[if lte IE 8]>
+<script src="/dist/js/excanvas.min.js"></script>
+<![endif]-->
+
+<script src="/dist/js/jquery-ui-1.10.3.custom.min.js"></script>
+<script src="/dist/js/jquery.ui.touch-punch.min.js"></script>
+<script src="/dist/js/jquery.slimscroll.min.js"></script>
+<script src="/dist/js/jquery.easy-pie-chart.min.js"></script>
+<script src="/dist/js/jquery.sparkline.min.js"></script>
+<script src="/dist/js/flot/jquery.flot.min.js"></script>
+<script src="/dist/js/flot/jquery.flot.pie.min.js"></script>
+<script src="/dist/js/flot/jquery.flot.resize.min.js"></script>
+
+<!-- ace scripts -->
+
+<script src="/dist/js/ace-elements.min.js"></script>
+<script src="/dist/js/ace.min.js"></script>
+
+<!-- inline scripts related to this page -->
+
+<script type="text/javascript">
+    jQuery(function($) {
+        $('.easy-pie-chart.percentage').each(function(){
+            var $box = $(this).closest('.infobox');
+            var barColor = $(this).data('color') || (!$box.hasClass('infobox-dark') ? $box.css('color') : 'rgba(255,255,255,0.95)');
+            var trackColor = barColor == 'rgba(255,255,255,0.95)' ? 'rgba(255,255,255,0.25)' : '#E2E2E2';
+            var size = parseInt($(this).data('size')) || 50;
+            $(this).easyPieChart({
+                barColor: barColor,
+                trackColor: trackColor,
+                scaleColor: false,
+                lineCap: 'butt',
+                lineWidth: parseInt(size/10),
+                animate: /msie\s*(8|7|6)/.test(navigator.userAgent.toLowerCase()) ? false : 1000,
+                size: size
+            });
+        })
+
+        $('.sparkline').each(function(){
+            var $box = $(this).closest('.infobox');
+            var barColor = !$box.hasClass('infobox-dark') ? $box.css('color') : '#FFF';
+            $(this).sparkline('html', {tagValuesAttribute:'data-values', type: 'bar', barColor: barColor , chartRangeMin:$(this).data('min') || 0} );
+        });
+
+
+
+
+        var placeholder = $('#piechart-placeholder').css({'width':'90%' , 'min-height':'150px'});
+        var data = [
+            { label: "social networks",  data: 38.7, color: "#68BC31"},
+            { label: "search engines",  data: 24.5, color: "#2091CF"},
+            { label: "ad campaigns",  data: 8.2, color: "#AF4E96"},
+            { label: "direct traffic",  data: 18.6, color: "#DA5430"},
+            { label: "other",  data: 10, color: "#FEE074"}
+        ]
+        function drawPieChart(placeholder, data, position) {
+            $.plot(placeholder, data, {
+                series: {
+                    pie: {
+                        show: true,
+                        tilt:0.8,
+                        highlight: {
+                            opacity: 0.25
+                        },
+                        stroke: {
+                            color: '#fff',
+                            width: 2
+                        },
+                        startAngle: 2
+                    }
+                },
+                legend: {
+                    show: true,
+                    position: position || "ne",
+                    labelBoxBorderColor: null,
+                    margin:[-30,15]
+                }
+                ,
+                grid: {
+                    hoverable: true,
+                    clickable: true
+                }
+            })
+        }
+        drawPieChart(placeholder, data);
+
+        /**
+         we saved the drawing function and the data to redraw with different position later when switching to RTL mode dynamically
+         so that's not needed actually.
+         */
+        placeholder.data('chart', data);
+        placeholder.data('draw', drawPieChart);
+
+
+
+        var $tooltip = $("<div class='tooltip top in'><div class='tooltip-inner'></div></div>").hide().appendTo('body');
+        var previousPoint = null;
+
+        placeholder.on('plothover', function (event, pos, item) {
+            if(item) {
+                if (previousPoint != item.seriesIndex) {
+                    previousPoint = item.seriesIndex;
+                    var tip = item.series['label'] + " : " + item.series['percent']+'%';
+                    $tooltip.show().children(0).text(tip);
+                }
+                $tooltip.css({top:pos.pageY + 10, left:pos.pageX + 10});
+            } else {
+                $tooltip.hide();
+                previousPoint = null;
+            }
+
+        });
+
+
+
+
+
+
+        var d1 = [];
+        for (var i = 0; i < Math.PI * 2; i += 0.5) {
+            d1.push([i, Math.sin(i)]);
+        }
+
+        var d2 = [];
+        for (var i = 0; i < Math.PI * 2; i += 0.5) {
+            d2.push([i, Math.cos(i)]);
+        }
+
+        var d3 = [];
+        for (var i = 0; i < Math.PI * 2; i += 0.2) {
+            d3.push([i, Math.tan(i)]);
+        }
+
+
+        var sales_charts = $('#sales-charts').css({'width':'100%' , 'height':'220px'});
+        $.plot("#sales-charts", [
+            { label: "Domains", data: d1 },
+            { label: "Hosting", data: d2 },
+            { label: "Services", data: d3 }
+        ], {
+            hoverable: true,
+            shadowSize: 0,
+            series: {
+                lines: { show: true },
+                points: { show: true }
+            },
+            xaxis: {
+                tickLength: 0
+            },
+            yaxis: {
+                ticks: 10,
+                min: -2,
+                max: 2,
+                tickDecimals: 3
+            },
+            grid: {
+                backgroundColor: { colors: [ "#fff", "#fff" ] },
+                borderWidth: 1,
+                borderColor:'#555'
+            }
+        });
+
+
+        $('#recent-box [data-rel="tooltip"]').tooltip({placement: tooltip_placement});
+        function tooltip_placement(context, source) {
+            var $source = $(source);
+            var $parent = $source.closest('.tab-content')
+            var off1 = $parent.offset();
+            var w1 = $parent.width();
+
+            var off2 = $source.offset();
+            var w2 = $source.width();
+
+            if( parseInt(off2.left) < parseInt(off1.left) + parseInt(w1 / 2) ) return 'right';
+            return 'left';
+        }
+
+
+        $('.dialogs,.comments').slimScroll({
+            height: '300px'
+        });
+
+
+        //Android's default browser somehow is confused when tapping on label which will lead to dragging the task
+        //so disable dragging when clicking on label
+        var agent = navigator.userAgent.toLowerCase();
+        if("ontouchstart" in document && /applewebkit/.test(agent) && /android/.test(agent))
+            $('#tasks').on('touchstart', function(e){
+                var li = $(e.target).closest('#tasks li');
+                if(li.length == 0)return;
+                var label = li.find('label.inline').get(0);
+                if(label == e.target || $.contains(label, e.target)) e.stopImmediatePropagation() ;
+            });
+
+        $('#tasks').sortable({
+                opacity:0.8,
+                revert:true,
+                forceHelperSize:true,
+                placeholder: 'draggable-placeholder',
+                forcePlaceholderSize:true,
+                tolerance:'pointer',
+                stop: function( event, ui ) {//just for Chrome!!!! so that dropdowns on items don't appear below other items after being moved
+                    $(ui.item).css('z-index', 'auto');
+                }
+            }
+        );
+        $('#tasks').disableSelection();
+        $('#tasks input:checkbox').removeAttr('checked').on('click', function(){
+            if(this.checked) $(this).closest('li').addClass('selected');
+            else $(this).closest('li').removeClass('selected');
+        });
+
+
+    })
+</script>
+    <?php $this->endBody() ?>
+  </body>
+</html>
+<?php $this->endPage() ?>
+

+ 114 - 0
views/layouts/site.php

@@ -0,0 +1,114 @@
+<?php
+use yii\helpers\Html;
+use yii\widgets\ActiveForm;
+
+/**
+ * @var yii\web\View $this
+ * @var yii\widgets\ActiveForm $form
+ * @var \app\models\forms\LoginForm $model
+ */
+$this->title = 'Login';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8" />
+    <title>登录 - 瓦力平台</title>
+    <!-- basic styles -->
+
+    <link href="/dist/css/bootstrap.min.css" rel="stylesheet" />
+    <link rel="stylesheet" href="/dist/css/font-awesome.min.css" />
+
+    <!--[if IE 7]>
+    <link rel="stylesheet" href="/dist/css/font-awesome-ie7.min.css" />
+    <![endif]-->
+
+    <!-- page specific plugin styles -->
+    <!-- ace styles -->
+
+    <link rel="stylesheet" href="/dist/css/ace.min.css" />
+    <link rel="stylesheet" href="/dist/css/ace-rtl.min.css" />
+
+    <!--[if lte IE 8]>
+    <link rel="stylesheet" href="/dist/css/ace-ie.min.css" />
+    <![endif]-->
+
+    <!-- inline styles related to this page -->
+
+    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+
+    <!--[if lt IE 9]>
+    <script src="/dist/js/html5shiv.js"></script>
+    <script src="/dist/js/respond.min.js"></script>
+    <![endif]-->
+</head>
+
+<body class="login-layout">
+
+<style>
+    A.applink:hover {border: 2px dotted #DCE6F4;padding:2px;background-color:#ffff00;color:green;text-decoration:none}
+    A.applink       {border: 2px dotted #DCE6F4;padding:2px;color:#2F5BFF;background:transparent;text-decoration:none}
+    A.info          {color:#2F5BFF;background:transparent;text-decoration:none}
+    A.info:hover    {color:green;background:transparent;text-decoration:underline}
+</style>
+
+
+<div class="main-container">
+    <div class="main-content">
+        <div class="row">
+            <div class="col-sm-10 col-sm-offset-1">
+                <div class="login-container">
+                    <div class="center">
+                        <h1>
+                            <i class="icon-leaf green"></i>
+                            <span class="red">Walle</span>
+                            <span class="white">瓦力平台</span>
+                        </h1>
+                        <h4 class="blue">&copy; 时趣广告</h4>
+                    </div>
+
+                    <div class="space-6"></div>
+
+                    <?= $content ?>
+                </div>
+            </div><!-- /.col -->
+        </div><!-- /.row -->
+    </div>
+</div><!-- /.main-container -->
+
+<!-- basic scripts -->
+
+
+<!--[if !IE]> -->
+
+<script type="text/javascript">
+    window.jQuery || document.write("<script src='/dist/js/jquery-2.0.3.min.js'>"+"<"+"/script>");
+</script>
+
+<!-- <![endif]-->
+
+<!--[if IE]>
+<script type="text/javascript">
+    window.jQuery || document.write("<script src='/dist/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
+</script>
+<![endif]-->
+
+<script type="text/javascript">
+    if("ontouchend" in document) document.write("<script src='/dist/js/jquery.mobile.custom.min.js'>"+"<"+"/script>");
+</script>
+
+<!-- inline scripts related to this page -->
+
+<script type="text/javascript">
+    function show_box(id) {
+        jQuery('.widget-box.visible').removeClass('visible');
+        jQuery('#'+id).addClass('visible');
+    }
+</script>
+</body>
+</html>
+
+
+
+

+ 54 - 0
views/logger/index.php

@@ -0,0 +1,54 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = 'My Yii Application';
+?>
+<div class="box">
+<div class="box-header">
+  <h3 class="box-title">Responsive Hover Table</h3>
+  <form action="/logger/search" method="POST">
+  <div class="box-tools">
+    <div class="input-group" style="width: 150px;">
+    <input type="text" name="kw" class="form-control input-sm pull-right" placeholder="Search" value="social">
+      <div class="input-group-btn">
+        <input class="btn btn-sm btn-default" type="submit" value="搜索"><i class="fa fa-search"></i></input>
+      </div>
+    </div>
+  </div>
+  </form>
+</div><!-- /.box-header -->
+<div class="box-body table-responsive no-padding">
+  <table class="table table-hover">
+    <tbody><tr>
+      <th>错误域</th>
+      <th>日志细节</th>
+      <th>时间</th>
+<!--      <th>debug</th>-->
+      <th>级别</th>
+    </tr>
+    <?php foreach ($rows as $row) { ?>
+    <tr>
+    <td><?= $row['name'] ?></td>
+    <td class="click-show-traces" data-id="<?= $row['_id'] ?>">
+        <div class="box box-default-clear collapsed-box">
+            <div class="box-header with-border">
+                <span class="box-title f14"><?= $row['log'] ?></span>
+                <div class="box-tools pull-right">
+                    <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-plus"></i></button>
+                </div><!-- /.box-tools -->
+            </div><!-- /.box-header -->
+            <div class="box-body" style="display: none;">
+                <?= join('<br>', (array)json_decode($row['trace'])) ?>
+            </div>
+        </div>
+    </td>
+    <td><?= $row['time'] ?></td>
+<!--    <td>--><?//= json_decode($row['trace'])[0] ?><!--</td>-->
+      <td><span class="label <?= \Yii::t('log', 'class-' . $row['level']) ?>"><?= \Yii::t('log', $row['level']) ?></span></td>
+    </tr>
+    <?php } ?>
+  </tbody></table>
+</div><!-- /.box-body -->
+</div>
+

+ 42 - 0
views/logger/info.php

@@ -0,0 +1,42 @@
+<?php
+/**
+* @var yii\web\View $this
+*/
+$this->title = 'My Yii Application';
+?>
+<div class="box">
+    <div class="box-header with-border">
+        <h3 class="box-title">您订阅的日志</h3>
+    </div><!-- /.box-header -->
+    <div class="box-body">
+        <table class="table table-bordered">
+            <tbody><tr>
+                <th>topic</th>
+                <th>计数</th>
+                <th>操作</th>
+            </tr>
+            <?php foreach ($detail as $name => $row) {?>
+            <tr>
+                <td><?= $name ?></td>
+                <td><span class="badge bg-red"><?= $row['error'] ?></span>
+                    <span class="badge bg-yellow"><?= $row['warning'] ?></span>
+                    <span class="badge bg-light-blue"><?= $row['notice'] ?></span>
+                </td>
+                <td><span class="badge bg-red">55%</span></td>
+            </tr>
+            <?php } ?>
+            </tbody>
+        </table>
+    </div><!-- /.box-body -->
+<!--    <div class="box-footer clearfix">-->
+<!--        <ul class="pagination pagination-sm no-margin pull-right">-->
+<!--            <li><a href="#">«</a></li>-->
+<!--            <li><a href="#">1</a></li>-->
+<!--            <li><a href="#">2</a></li>-->
+<!--            <li><a href="#">3</a></li>-->
+<!--            <li><a href="#">»</a></li>-->
+<!--        </ul>-->
+<!--    </div>-->
+</div><!-- /.box -->
+
+

+ 21 - 0
views/site/emailConfirmationFailed.php

@@ -0,0 +1,21 @@
+<?php
+use yii\helpers\Html;
+use yii\widgets\ActiveForm;
+
+/**
+ * @var yii\web\View $this
+ * @var yii\widgets\ActiveForm $form
+ * @var \frontend\models\User $model
+ */
+$this->title = 'Signup';
+$this->params['breadcrumbs'][] = $this->title;
+$params = Yii::$app->params;
+?>
+<div class="site-signup alert alert-danger">
+    <h1>Could not complete registration</h1>
+
+    <p>You either supplied an invalid confirmation link or the link has meanwhile expired.
+    Please contact our support under <?= Html::mailTo($params['support.name'], $params['support.email']) ?>.
+    </p>
+
+</div>

+ 26 - 0
views/site/error.php

@@ -0,0 +1,26 @@
+<?php
+
+use yii\helpers\Html;
+
+/**
+ * @var yii\web\View $this
+ * @var string $name
+ * @var string $message
+ * @var Exception $exception
+ */
+
+$this->title = $name;
+?>
+<div class="site-error">
+
+    <h1><?= Html::encode($this->title) ?></h1>
+
+    <div class="alert alert-danger">
+        <?= nl2br(Html::encode($message)) ?>
+    </div>
+
+    <p>
+        <?= $exception ?>
+    </p>
+
+</div>

Diferenças do arquivo suprimidas por serem muito extensas
+ 1105 - 0
views/site/index.html


+ 60 - 0
views/site/index.php

@@ -0,0 +1,60 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = 'My Yii Application';
+?>
+<div class="box">
+<div class="box-header">
+  <h3 class="box-title">Responsive Hover Table</h3>
+  <form action="/log/search" method="POST">
+  <div class="box-tools">
+    <div class="input-group" style="width: 150px;">
+    <input type="text" name="kw" class="form-control input-sm pull-right" placeholder="Search">
+      <div class="input-group-btn">
+        <input class="btn btn-sm btn-default" type="submit" value="搜索"><i class="fa fa-search"></i></input>
+      </div>
+    </div>
+  </div>
+  </form>
+</div><!-- /.box-header -->
+<div class="box-body table-responsive no-padding">
+  <table class="table table-hover">
+    <tbody><tr>
+      <th>ID</th>
+      <th>User</th>
+      <th>Date</th>
+      <th>Status</th>
+      <th>Reason</th>
+    </tr>
+    <tr>
+      <td>183</td>
+      <td>John Doe</td>
+      <td>11-7-2014</td>
+      <td><span class="label label-success">Approved</span></td>
+      <td>Bacon ipsum dolor sit amet salami venison chicken flank fatback doner.</td>
+    </tr>
+    <tr>
+      <td>219</td>
+      <td>Alexander Pierce</td>
+      <td>11-7-2014</td>
+      <td><span class="label label-warning">Pending</span></td>
+      <td>Bacon ipsum dolor sit amet salami venison chicken flank fatback doner.</td>
+    </tr>
+    <tr>
+      <td>657</td>
+      <td>Bob Doe</td>
+      <td>11-7-2014</td>
+      <td><span class="label label-primary">Approved</span></td>
+      <td>Bacon ipsum dolor sit amet salami venison chicken flank fatback doner.</td>
+    </tr>
+    <tr>
+      <td>175</td>
+      <td>Mike Doe</td>
+      <td>11-7-2014</td>
+      <td><span class="label label-danger">Denied</span></td>
+      <td>Bacon ipsum dolor sit amet salami venison chicken flank fatback doner.</td>
+    </tr>
+  </tbody></table>
+</div><!-- /.box-body -->
+</div>

+ 55 - 0
views/site/login.php

@@ -0,0 +1,55 @@
+<?php
+use yii\helpers\Html;
+use yii\widgets\ActiveForm;
+use app\models\User;
+
+/**
+ * @var yii\web\View $this
+ * @var yii\widgets\ActiveForm $form
+ * @var \frontend\models\User $model
+ */
+$this->title = 'Signup';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+<div class="position-relative">
+<div id="login-box" class="login-box visible widget-box no-border">
+    <div class="widget-body">
+        <div class="widget-main">
+            <h4 class="header blue lighter bigger">
+                <i class="icon-coffee green"></i>
+                登录平台
+            </h4>
+
+            <div class="space-6"></div>
+            <?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
+            <?= $form->field($model, 'username')->label('用户名') ?>
+            <?= $form->field($model, 'password')->label('密码')->passwordInput() ?>
+            <?= $form->field($model, 'rememberMe')->label('记住我')->checkbox() ?>
+
+            <div class="form-group">
+                <?= Html::submitButton('登录', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
+            </div>
+            <?php ActiveForm::end(); ?>
+
+        </div><!-- /widget-main -->
+
+        <div class="toolbar clearfix">
+            <div>
+                <a href="/site/request-password-reset" class="forgot-password-link">
+                    <i class="icon-arrow-left"></i>
+                    忘记密码
+                </a>
+            </div>
+
+            <div>
+                <a href="/site/signup" class="user-signup-link">
+                    注册账号
+                    <i class="icon-arrow-right"></i>
+                </a>
+            </div>
+        </div>
+
+    </div><!-- /widget-body -->
+</div><!-- /login-box -->
+
+</div><!-- /position-relative -->

+ 43 - 0
views/site/requestPasswordResetToken.php

@@ -0,0 +1,43 @@
+<?php
+use yii\helpers\Html;
+use yii\widgets\ActiveForm;
+
+/**
+ * @var yii\web\View $this
+ * @var yii\widgets\ActiveForm $form
+ * @var \app\models\forms\PasswordResetRequestForm $model
+ */
+$this->title = 'Request password reset';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+
+
+
+<div class="position-relative">
+    <div id="forgot-box" class="forgot-box visible widget-box no-border">
+        <div class="widget-body">
+            <div class="widget-main">
+                <h4 class="header red lighter bigger">
+                    <i class="icon-key"></i>
+                    忘记密码
+                </h4>
+
+                <div class="space-6"></div>
+                <?php $form = ActiveForm::begin(['id' => 'request-password-reset-form']); ?>
+                <?= $form->field($model, 'email')->label('请确认你的邮箱') ?>
+                <div class="form-group">
+                    <?= Html::submitButton('发送', ['class' => 'btn btn-primary']) ?>
+                </div>
+                <?php ActiveForm::end(); ?>
+            </div><!-- /widget-main -->
+
+            <div class="toolbar center">
+                <a href="/site/login" class="back-to-login-link">
+                    返回登录<i class="icon-arrow-right"></i>
+                </a>
+            </div>
+        </div><!-- /widget-body -->
+    </div><!-- /forgot-box -->
+
+    </div><!-- /signup-box -->
+</div><!-- /position-relative -->

+ 28 - 0
views/site/resetPassword.php

@@ -0,0 +1,28 @@
+<?php
+use yii\helpers\Html;
+use yii\widgets\ActiveForm;
+
+/**
+ * @var yii\web\View $this
+ * @var yii\widgets\ActiveForm $form
+ * @var \app\models\forms\ResetPasswordForm $model
+ */
+$this->title = 'Reset password';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+<div class="site-reset-password">
+    <h1><?= Html::encode($this->title) ?></h1>
+
+    <p>Please choose your new password:</p>
+
+    <div class="row">
+        <div class="col-lg-5">
+            <?php $form = ActiveForm::begin(['id' => 'reset-password-form']); ?>
+                <?= $form->field($model, 'password')->passwordInput() ?>
+                <div class="form-group">
+                    <?= Html::submitButton('Save', ['class' => 'btn btn-primary']) ?>
+                </div>
+            <?php ActiveForm::end(); ?>
+        </div>
+    </div>
+</div>

+ 18 - 0
views/site/signedUp.php

@@ -0,0 +1,18 @@
+<?php
+use yii\helpers\Html;
+use yii\widgets\ActiveForm;
+
+/**
+ * @var yii\web\View $this
+ * @var yii\widgets\ActiveForm $form
+ * @var \frontend\models\User $model
+ */
+$this->title = 'Signup';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+<div class="site-signup alert alert-info">
+    <h1>Thank You</h1>
+
+    <p>We have sent you an email with a confirmation link. Please check your Inbox.</p>
+
+</div>

+ 47 - 0
views/site/signup.php

@@ -0,0 +1,47 @@
+<?php
+use yii\helpers\Html;
+use yii\widgets\ActiveForm;
+use app\models\User;
+
+/**
+ * @var yii\web\View $this
+ * @var yii\widgets\ActiveForm $form
+ * @var \frontend\models\User $model
+ */
+$this->title = 'Signup';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+<div class="position-relative">
+    <div id="signup-box" class="signup-box visible widget-box no-border">
+        <div class="widget-body">
+            <div class="widget-main">
+                <h4 class="header green lighter bigger">
+                    <i class="icon-group blue"></i>
+                    注册平台
+                </h4>
+
+                <div class="space-6"></div>
+                <?php $form = ActiveForm::begin(['id' => 'form-signup']); ?>
+                <?= $form->field($model, 'email')->label('邮箱') ?>
+                <?= $form->field($model, 'username')->label('名字') ?>
+                <?= $form->field($model, 'password')->passwordInput() ?>
+                <?= $form->field($model, 'role')->dropDownList([
+                    User::ROLE_DEV => \Yii::t('status', 'user_role_' . User::ROLE_DEV),
+                    User::ROLE_ADMIN => \Yii::t('status', 'user_role_' . User::ROLE_ADMIN),
+                ]) ?>
+                <div class="form-group">
+                    <?= Html::submitButton('提交', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
+                </div>
+                <?php ActiveForm::end(); ?>
+            </div>
+
+            <div class="toolbar center">
+                <a href="/site/login" class="back-to-login-link">
+                    返回登录<i class="icon-arrow-right"></i>
+                </a>
+            </div>
+        </div>
+        <!-- /widget-body -->
+    </div>
+    <!-- /signup-box -->
+</div><!-- /position-relative -->

+ 42 - 0
views/subscribe/index.php

@@ -0,0 +1,42 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = 'My Yii Application';
+?>
+<div class="box">
+    <div class="box-header with-border">
+        <h3 class="box-title">您订阅的日志</h3>
+    </div><!-- /.box-header -->
+    <div class="box-body">
+        <table class="table table-bordered">
+            <tbody><tr>
+                <th>topic</th>
+                <th>计数</th>
+                <th>操作</th>
+            </tr>
+            <?php foreach ($detail as $name => $row) {?>
+                <tr>
+                    <td><?= $name ?></td>
+                    <td><span class="badge bg-red"><?= $row['error'] ?></span>
+                        <span class="badge bg-yellow"><?= $row['warning'] ?></span>
+                        <span class="badge bg-light-blue"><?= $row['notice'] ?></span>
+                    </td>
+                    <td><span class="badge bg-red">55%</span></td>
+                </tr>
+            <?php } ?>
+            </tbody>
+        </table>
+    </div><!-- /.box-body -->
+    <!--    <div class="box-footer clearfix">-->
+    <!--        <ul class="pagination pagination-sm no-margin pull-right">-->
+    <!--            <li><a href="#">«</a></li>-->
+    <!--            <li><a href="#">1</a></li>-->
+    <!--            <li><a href="#">2</a></li>-->
+    <!--            <li><a href="#">3</a></li>-->
+    <!--            <li><a href="#">»</a></li>-->
+    <!--        </ul>-->
+    <!--    </div>-->
+</div><!-- /.box -->
+
+

+ 63 - 0
views/walle/admin-list.php

@@ -0,0 +1,63 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = '上线任务列表';
+use \app\models\Task;
+?>
+<div class="box">
+    <div class="box-header">
+<!--        <h3 class="box-title">Responsive Hover Table</h3>-->
+        <form action="/logger/search" method="POST">
+            <div class="box-tools">
+                <div class="input-group" style="width: 150px;">
+                    <input type="text" name="kw" class="form-control input-sm pull-right" placeholder="Search" value="">
+                    <div class="input-group-btn">
+                        <input class="btn btn-sm btn-default" type="submit" value="搜索"><i class="fa fa-search"></i></input>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div><!-- /.box-header -->
+    <div class="box-body table-responsive no-padding">
+        <table class="table table-hover">
+            <tbody><tr>
+                <th>开发者</th>
+                <th>任务名称</th>
+                <th>上线commit号</th>
+                <th>当前状态</th>
+                <th>操作</th>
+            </tr>
+            <?php foreach ($list as $item) { ?>
+            <tr>
+                <td><?= $item['username'] ?></td>
+                <td><?= $item['title'] ?></td>
+                <td><?= $item['commit_id'] ?></td>
+                <td><?= \Yii::t('status', 'task_status_' . $item['status']) ?></td>
+                <td class="<?= \Yii::t('status', 'task_status_' . $item['status'] . '_color') ?>">
+                    <?php if (!in_array($item['status'],[Task::STATUS_DONE, Task::STATUS_FAILED])) { ?>
+                        <button class="btn btn-xs btn-success task-operation" data-id="<?= $item['id'] ?>" data-action="pass">通过</button>
+                        <button class="btn btn-xs btn-danger task-operation" data-id="<?= $item['id'] ?>" data-action="refuse">拒绝</button>
+                    <?php } else { ?>
+                        <?= \Yii::t('status', 'task_status_' . $item['status']) ?>
+                    <?php } ?>
+                </td>
+            </tr>
+            <?php } ?>
+
+            </tbody></table>
+    </div><!-- /.box-body -->
+</div>
+
+<script type="text/javascript">
+    $(function() {
+        $('.task-operation').click(function() {
+            $this = $(this);
+            $.get("/walle/task-operation", {id: $(this).data('id'), operation: $(this).data('action')},
+                function(data) {
+                    $this.parent().prev().text(data.data.status);
+                }
+            );
+        })
+    })
+</script>

+ 38 - 0
views/walle/config-edit.php

@@ -0,0 +1,38 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = '配置项目';
+use app\models\Conf;
+?>
+<div class="box">
+    <form role="form" method="POST" action="/walle/config-edit?projectId=<?= !isset($_GET['projectId']) ? '' : (int)$_GET['projectId'] ?>">
+      <div class="box-body">
+        <div class="form-group">
+          <label for="exampleInputEmail1">项目名字</label>
+          <input class="form-control" id="exampleInputEmail1" placeholder="瓦力" type="name" name="name" value="<?= $conf->name ?>">
+        </div>
+      <div class="form-group">
+          <label for="exampleInputEmail1">项目配置英文名</label>
+          <input class="form-control" id="exampleInputEmail1" placeholder="walle" type="name" name="conf" value="<?= $conf->conf ?>">
+      </div>
+        <div class="form-group">
+	        <label>项目环境级别</label>
+	        <select name="level" aria-hidden="true" tabindex="-1" id="commit_history" class="form-control select2 select2-hidden-accessible">
+	            <option value="<?= Conf::LEVEL_TEST ?>" selected="<?= $conf->level == Conf::LEVEL_TEST ? true : false ?>">测试环境</option>
+                <option value="<?= Conf::LEVEL_SIMU ?>" selected="<?= $conf->level == Conf::LEVEL_SIMU ? true : false ?>">模拟线上环境</option>
+                <option value="<?= Conf::LEVEL_PROD ?>" selected="<?= $conf->level == Conf::LEVEL_PROD ? true : false ?>">线上环境</option>
+            </select>
+	      </div>
+      </div><!-- /.box-body -->
+
+        <div class="form-group">
+            <label for="exampleInputEmail1">配置</label>
+            <textarea class="form-control" type="name" name="context" style="width: 800px;height: 600px" value=""><?= $conf->context ?>
+            </textarea>
+        </div>
+      <div class="box-footer">
+        <input type="submit" class="btn btn-primary" value="提交">
+      </div>
+    </form>
+</div>

+ 56 - 0
views/walle/config.php

@@ -0,0 +1,56 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = '项目配置';
+?>
+<div class="box">
+    <div class="box-header">
+        <!--        <h3 class="box-title">Responsive Hover Table</h3>-->
+        <form action="/walle/config" method="POST">
+
+            <div class="col-xs-12 col-sm-8" style="padding-left: 0;margin-bottom: 10px;">
+                <div class="input-group">
+                    <input type="text" name="kw" class="form-control search-query" placeholder="上线标题、commit号">
+                    <span class="input-group-btn">
+                        <button type="submit"
+                                class="btn btn-default btn-sm">
+                            Search
+                            <i class="icon-search icon-on-right bigger-110"></i>
+                        </button>
+                    </span>
+                </div>
+            </div>
+        </form>
+        <a class="btn btn-default btn-sm" href="/walle/config-edit">
+            <i class="icon-pencil align-top bigger-125"></i>
+            新建项目
+        </a>
+    </div><!-- /.box-header -->
+    <div class="box-body table-responsive no-padding">
+        <table class="table table-striped table-bordered table-hover">
+            <tbody><tr>
+                <th>项目名称</th>
+                <th>项目配置名</th>
+                <th>环境</th>
+                <th>状态</th>
+                <th>操作</th>
+            </tr>
+            <?php foreach ($list as $item) { ?>
+                <tr>
+                    <td><?= $item['name'] ?></td>
+                    <td><?= $item['conf'] ?></td>
+                    <td><?= \Yii::t('status', 'conf_level_' . $item['level']) ?></td>
+                    <td><?= \Yii::t('status', 'conf_status_' . $item['status']) ?></td>
+                    <td class="<?= \Yii::t('status', 'conf_status_' . $item['status'] . '_color') ?>">
+
+                        <a class="btn btn-xs btn-success" href="/walle/config-edit?projectId=<?= $item['id'] ?>">
+                            <i class="icon-edit bigger-120"></i>修改
+                        </a>
+                    </td>
+                </tr>
+            <?php } ?>
+
+            </tbody></table>
+    </div><!-- /.box-body -->
+</div>

+ 105 - 0
views/walle/deploy.php

@@ -0,0 +1,105 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = '部署上线';
+use \app\models\Task;
+?>
+<style>
+    .status > span {
+        float: left;
+        font-size: 12px;
+        width: 25%;
+        text-align: right;
+    }
+    .btn-deploy {
+        margin-left: 30px;
+    }
+    .btn-return {
+        /*float: right;*/
+        margin-left: 30px;
+    }
+</style>
+<div class="box" style="height: 100%">
+    <h4 class="box-title"><?= $task->title ?> - <?= $task->commit_id ?>
+        <?php if (in_array($task->status, [Task::STATUS_PASS, Task::STATUS_FAILED])) { ?>
+            <button type="submit" class="btn btn-primary btn-deploy" data-id="<?= $task->id ?>">部署</button>
+        <?php } ?>
+        <a class="btn btn-success btn-return" href="/walle/index">返回</a></h4>
+
+    <div class="status">
+        <span><i class="fa fa-circle-o text-yellow step-1"></i>权限、目录检查</span>
+        <span><i class="fa fa-circle-o text-yellow step-2"></i>代码检出</span>
+        <span><i class="fa fa-circle-o text-yellow step-3"></i>同步至服务器</span>
+        <span><i class="fa fa-circle-o text-yellow step-4"></i>更新全量服务器</span>
+    </div>
+    <div style="clear:both"></div>
+    <div class="progress progress-small progress-striped active">
+        <div class="progress-bar progress-status progress-status" style="width: 0%;"></div>
+    </div>
+
+    <div class="alert alert-block alert-success result-success" style="<?php if ($task->status != Task::STATUS_DONE) { ?>display: none <?php } ?>">
+        <h4>上线成功!</h4>
+        <p>辛苦了,小主:)</p>
+
+    </div>
+
+    <div class="alert alert-block alert-danger result-failed" style="display: none">
+        <h4>上线出错:(</h4>
+        <span class="error-msg">
+        </span>
+    </div>
+
+</div>
+
+<script type="text/javascript">
+    $(function() {
+        $('.btn-deploy').click(function() {
+            $this = $(this);
+            $this.addClass('disabled');
+            var task_id = $(this).data('id');
+            $.post("/walle/start-deploy", {taskId: task_id});
+            $('.progress-status').attr('aria-valuenow', 10).width('10%');
+            $('.result-failed').hide();
+            function getProcess() {
+                $.get("/walle/get-process?taskId=" + task_id, function (ret) {
+                    data = ret.data;
+                    if (0 == data.status) {
+                        clearInterval(timer);
+                        $('.step-' + data.step).removeClass('text-yellow').addClass('text-red');
+                        $('.progress-status').removeClass('progress-bar-success').addClass('progress-bar-danger');
+                        $('.error-msg').text(data.memo);
+                        $('.result-failed').show();
+                        $this.removeClass('disabled');
+                        return;
+                    } else {
+                        $('.progress-status')
+                            .removeClass('progress-bar-danger progress-bar-striped')
+                            .addClass('progress-bar-success')
+                    }
+                    if (0 != data.percent) {
+                        $('.progress-status').attr('aria-valuenow', data.percent).width(data.percent + '%');
+                    }
+                    if (100 == data.percent) {
+                        $('.progress-status').removeClass('progress-bar-striped').addClass('progress-bar-success');
+                        $('.progress-status').parent().removeClass('progress-striped');
+                        $('.result-success').show();
+                        clearInterval(timer)
+                    }
+                    for (var i = 1; i <= data.step; i++) {
+                        $('.step-' + i).removeClass('text-yellow text-red')
+                            .addClass('text-green progress-bar-striped')
+                    }
+                });
+            }
+            timer = setInterval(getProcess, 100);
+        })
+
+        function setProcessStatus() {
+            $.get("/walle/get-process?taskId=" + task_id, function (data) {
+
+            })
+        }
+    })
+
+</script>

+ 70 - 0
views/walle/dev-list.php

@@ -0,0 +1,70 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = '上线任务列表';
+use app\models\Task;
+?>
+<div class="box">
+    <div class="box-header">
+<!--        <h3 class="box-title">Responsive Hover Table</h3>-->
+        <form action="/walle/index" method="POST">
+
+            <div class="col-xs-12 col-sm-8" style="padding-left: 0;margin-bottom: 10px;">
+                <div class="input-group">
+                    <input type="text" name="kw" class="form-control search-query" placeholder="上线标题、commit号">
+                    <span class="input-group-btn">
+                        <button type="submit"
+                                class="btn btn-default btn-sm">
+                            Search
+                            <i class="icon-search icon-on-right bigger-110"></i>
+                        </button>
+                    </span>
+                </div>
+            </div>
+        </form>
+        <a class="btn btn-default btn-sm" href="/walle/submit/">
+            <i class="icon-pencil align-top bigger-125"></i>
+            创建上线任务
+        </a>
+    </div><!-- /.box-header -->
+    <div class="box-body table-responsive no-padding">
+        <table class="table table-striped table-bordered table-hover">
+            <tbody><tr>
+                <th>任务名称</th>
+                <th>上线commit号</th>
+                <th>当前状态</th>
+                <th>操作</th>
+            </tr>
+            <?php foreach ($list as $item) { ?>
+            <tr>
+                <td><?= $item['title'] ?></td>
+                <td><?= $item['commit_id'] ?></td>
+                <td class="<?= \Yii::t('status', 'task_status_' . $item['status'] . '_color') ?>">
+                    <?= \Yii::t('status', 'task_status_' . $item['status']) ?>
+                </td>
+                <td>
+                    <?php if (in_array($item['status'], [Task::STATUS_PASS, Task::STATUS_FAILED])) { ?>
+                    <a class="btn btn-xs btn-success task-operation" href="/walle/deploy?taskId=<?= $item['id'] ?>">发起上线</a>
+                    <?php } elseif ($item['status'] == Task::STATUS_DONE) { ?>
+                        <button class="btn btn-xs btn-warning task-operation task-rollback" data-id="<?= $item['id'] ?>">回滚此次上线</button>
+                    <?php } ?>
+                </td>
+            </tr>
+            <?php } ?>
+
+            </tbody></table>
+    </div><!-- /.box-body -->
+</div>
+<script>
+    $('.task-rollback').click(function(e) {
+        $this = $(this);
+        $.post('/walle/rollback', {taskId: $this.data('id')}, function(o) {
+            if (!o.code) {
+                window.location.href="/walle/deploy?taskId=" + o.data.taskId;
+            } else {
+                alert(o.msg);
+            }
+        })
+    })
+</script>

+ 34 - 0
views/walle/index.php

@@ -0,0 +1,34 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = 'My Yii Application';
+?>
+<div class="box">
+<div class="box-header">
+  <h3 class="box-title">Responsive Hover Table</h3>
+  <form action="/logger/search" method="POST">
+  <div class="box-tools">
+    <div class="input-group" style="width: 150px;">
+    <input type="text" name="kw" class="form-control input-sm pull-right" placeholder="Search" value="social">
+      <div class="input-group-btn">
+        <input class="btn btn-sm btn-default" type="submit" value="搜索"><i class="fa fa-search"></i></input>
+      </div>
+    </div>
+  </div>
+  </form>
+</div><!-- /.box-header -->
+<div class="box-body table-responsive no-padding">
+  <table class="table table-hover">
+    <tbody><tr>
+      <th>错误域</th>
+      <th>日志细节</th>
+      <th>时间</th>
+<!--      <th>debug</th>-->
+      <th>级别</th>
+    </tr>
+    
+  </tbody></table>
+</div><!-- /.box-body -->
+</div>
+

+ 58 - 0
views/walle/list.php

@@ -0,0 +1,58 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = '上线任务列表';
+?>
+<div class="box">
+    <div class="box-header">
+<!--        <h3 class="box-title">Responsive Hover Table</h3>-->
+        <form action="/logger/search" method="POST">
+            <div class="box-tools">
+                <div class="input-group" style="width: 150px;">
+                    <input type="text" name="kw" class="form-control input-sm pull-right" placeholder="Search" value="">
+                    <div class="input-group-btn">
+                        <input class="btn btn-sm btn-default" type="submit" value="搜索"><i class="fa fa-search"></i></input>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div><!-- /.box-header -->
+    <div class="box-body table-responsive no-padding">
+        <table class="table table-hover">
+            <tbody><tr>
+                <th>开发者</th>
+                <th>任务名称</th>
+                <th>上线commit号</th>
+                <th>当前状态</th>
+                <th>操作</th>
+            </tr>
+            <?php foreach ($list as $item) { ?>
+            <tr>
+                <td><?= $item['username'] ?></td>
+                <td><?= $item['title'] ?></td>
+                <td><?= $item['commit_id'] ?></td>
+                <td><?= \Yii::t('status', 'task_status_' . $item['status']) ?></td>
+                <td>
+                    <button class="btn btn-xs btn-success task-operation" data-id="<?= $item['id'] ?>" data-action="pass">通过</button>
+                    <button class="btn btn-xs btn-danger task-operation" data-id="<?= $item['id'] ?>" data-action="refuse">拒绝</button>
+                </td>
+            </tr>
+            <?php } ?>
+
+            </tbody></table>
+    </div><!-- /.box-body -->
+</div>
+
+<script type="text/javascript">
+    $(function() {
+        $('.task-operation').click(function() {
+            $this = $(this);
+            $.get("/walle/task-operation", {id: $(this).data('id'), operation: $(this).data('action')},
+                function(data) {
+                    $this.parent().prev().text(data.data.status);
+                }
+            );
+        })
+    })
+</script>

+ 14 - 0
views/walle/select-project.php

@@ -0,0 +1,14 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = '选择项目';
+?>
+<div class="box">
+    <br><br>
+    <?php foreach ($projects as $project) { ?>
+    <a class="btn btn-inline btn-warning" style="width:150px;margin-left: 40px;" href="/walle/submit?projectId=<?= $project['id'] ?>"><?= $project['name'] ?></a>
+    <?php } ?>
+    <br><br><br><br><br><br><br><br><br><br><br><br>
+
+</div>

+ 39 - 0
views/walle/submit.php

@@ -0,0 +1,39 @@
+<?php
+/**
+ * @var yii\web\View $this
+ */
+$this->title = '发起上线';
+?>
+<div class="box">
+    <form role="form" method="POST" action="/walle/submit?projectId=<?= (int)$_GET['projectId'] ?>">
+      <div class="box-body">
+        <div class="form-group">
+          <label for="exampleInputEmail1">任务标题</label>
+          <input class="form-control" id="exampleInputEmail1" placeholder="上线标题" type="name" name="title">
+        </div>
+        <div class="form-group">
+	        <label>版本选取</label>
+	        <select name="commit" aria-hidden="true" tabindex="-1" id="commit_history" class="form-control select2 select2-hidden-accessible">
+	        </select>
+	      </div>
+      </div><!-- /.box-body -->
+
+      <div class="box-footer">
+        <input type="submit" class="btn btn-primary" value="提交">
+      </div>
+    </form>
+</div>
+
+<script type="text/javascript">
+	$(function() {
+		$.get("/walle/get-commit-history?projectId=" + <?= (int)$_GET['projectId'] ?>, function(data) {
+			var select = '';
+			$.each(data.data, function (key, value) {
+				select += '<option value="' + value.id + '">' + value.message +'</option>';
+			})
+			$('#commit_history').append(select);
+		});
+		
+	})
+
+</script>

+ 9 - 0
web/.gitignore

@@ -0,0 +1,9 @@
+*.DS_Store
+.idea
+/nbproject/private/
+/nbproject/
+/node_modules/
+TODO
+*.zip
+test.html
+*.log

+ 46 - 0
web/ace/.!11657!ace.html

@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>控制台 - Bootstrap后台管理系统模版Ace下载</title>
+		<meta name="keywords" content="Bootstrap模版,Bootstrap模版下载,Bootstrap教程,Bootstrap中文" />
+		<meta name="description" content="站长素材提供Bootstrap模版,Bootstrap教程,Bootstrap中文翻译等相关Bootstrap插件下载" />
+		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+		<!-- basic styles -->
+		<link href="/dist/css/bootstrap.min.css" rel="stylesheet" />
+		<link rel="stylesheet" href="/dist/css/font-awesome.min.css" />
+
+		<!--[if IE 7]>
+		  <link rel="stylesheet" href="/dist/css/font-awesome-ie7.min.css" />
+		<![endif]-->
+
+		<!-- page specific plugin styles -->
+
+
+		<!-- ace styles -->
+
+		<link rel="stylesheet" href="/dist/css/ace.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-rtl.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-skins.min.css" />
+
+		<!--[if lte IE 8]>
+		  <link rel="stylesheet" href="/dist/css/ace-ie.min.css" />
+		<![endif]-->
+
+		<!-- inline styles related to this page -->
+
+		<!-- ace settings handler -->
+
+		<script src="/dist/js/ace-extra.min.js"></script>
+
+		<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+
+		<!--[if lt IE 9]>
+		<script src="/dist/js/html5shiv.js"></script>
+		<script src="/dist/js/respond.min.js"></script>
+		<![endif]-->
+	</head>
+
+	<body>
+
+

Diferenças do arquivo suprimidas por serem muito extensas
+ 2134 - 0
web/ace/ace.html


+ 801 - 0
web/ace/blank.html

@@ -0,0 +1,801 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>空白页 - Bootstrap后台管理系统模版Ace下载</title>
+		<meta name="keywords" content="Bootstrap模版,Bootstrap模版下载,Bootstrap教程,Bootstrap中文" />
+		<meta name="description" content="站长素材提供Bootstrap模版,Bootstrap教程,Bootstrap中文翻译等相关Bootstrap插件下载" />
+		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+		<!-- basic styles -->
+
+		<link href="/dist/css/bootstrap.min.css" rel="stylesheet" />
+		<link rel="stylesheet" href="/dist/css/font-awesome.min.css" />
+
+		<!--[if IE 7]>
+		  <link rel="stylesheet" href="/dist/css/font-awesome-ie7.min.css" />
+		<![endif]-->
+
+		<!-- page specific plugin styles -->
+
+		<!-- fonts -->
+
+		<!-- ace styles -->
+
+		<link rel="stylesheet" href="/dist/css/ace.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-rtl.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-skins.min.css" />
+
+		<!--[if lte IE 8]>
+		  <link rel="stylesheet" href="/dist/css/ace-ie.min.css" />
+		<![endif]-->
+
+		<!-- inline styles related to this page -->
+
+		<!-- ace settings handler -->
+
+		<script src="/dist/js/ace-extra.min.js"></script>
+
+		<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+
+		<!--[if lt IE 9]>
+		<script src="/dist/js/html5shiv.js"></script>
+		<script src="/dist/js/respond.min.js"></script>
+		<![endif]-->
+	</head>
+
+	<body>
+
+
+		<div class="navbar navbar-default" id="navbar">
+			<script type="text/javascript">
+				try{ace.settings.check('navbar' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="navbar-container" id="navbar-container">
+				<div class="navbar-header pull-left">
+					<a href="#" class="navbar-brand">
+						<small>
+							<i class="icon-leaf"></i>
+							Ace Admin
+						</small>
+					</a><!-- /.brand -->
+				</div><!-- /.navbar-header -->
+
+				<div class="navbar-header pull-right" role="navigation">
+					<ul class="nav ace-nav">
+						<li class="grey">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-tasks"></i>
+								<span class="badge badge-grey">4</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-ok"></i>
+									4 Tasks to complete
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Software Update</span>
+											<span class="pull-right">65%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:65%" class="progress-bar "></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Hardware Upgrade</span>
+											<span class="pull-right">35%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:35%" class="progress-bar progress-bar-danger"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Unit Testing</span>
+											<span class="pull-right">15%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:15%" class="progress-bar progress-bar-warning"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Bug Fixes</span>
+											<span class="pull-right">90%</span>
+										</div>
+
+										<div class="progress progress-mini progress-striped active">
+											<div style="width:90%" class="progress-bar progress-bar-success"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See tasks with details
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="purple">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-bell-alt icon-animated-bell"></i>
+								<span class="badge badge-important">8</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar navbar-pink dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-warning-sign"></i>
+									8 Notifications
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-pink icon-comment"></i>
+												New Comments
+											</span>
+											<span class="pull-right badge badge-info">+12</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="btn btn-xs btn-primary icon-user"></i>
+										Bob just signed up as an editor ...
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-success icon-shopping-cart"></i>
+												New Orders
+											</span>
+											<span class="pull-right badge badge-success">+8</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-info icon-twitter"></i>
+												Followers
+											</span>
+											<span class="pull-right badge badge-info">+11</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See all notifications
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="green">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-envelope icon-animated-vertical"></i>
+								<span class="badge badge-success">5</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-envelope-alt"></i>
+									5 Messages
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar.png" class="msg-photo" alt="Alex's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Alex:</span>
+												Ciao sociis natoque penatibus et auctor ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>a moment ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar3.png" class="msg-photo" alt="Susan's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Susan:</span>
+												Vestibulum id ligula porta felis euismod ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>20 minutes ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar4.png" class="msg-photo" alt="Bob's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Bob:</span>
+												Nullam quis risus eget urna mollis ornare ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>3:15 pm</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										See all messages
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="light-blue">
+							<a data-toggle="dropdown" href="#" class="dropdown-toggle">
+								<img class="nav-user-photo" src="/dist/avatars/user.jpg" alt="Jason's Photo" />
+								<span class="user-info">
+									<small>Welcome,</small>
+									Jason
+								</span>
+
+								<i class="icon-caret-down"></i>
+							</a>
+
+							<ul class="user-menu pull-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
+								<li>
+									<a href="#">
+										<i class="icon-cog"></i>
+										Settings
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="icon-user"></i>
+										Profile
+									</a>
+								</li>
+
+								<li class="divider"></li>
+
+								<li>
+									<a href="#">
+										<i class="icon-off"></i>
+										Logout
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.ace-nav -->
+				</div><!-- /.navbar-header -->
+			</div><!-- /.container -->
+		</div>
+
+		<div class="main-container" id="main-container">
+			<script type="text/javascript">
+				try{ace.settings.check('main-container' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="main-container-inner">
+				<a class="menu-toggler" id="menu-toggler" href="#">
+					<span class="menu-text"></span>
+				</a>
+
+				<div class="sidebar" id="sidebar">
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'fixed')}catch(e){}
+					</script>
+
+					<div class="sidebar-shortcuts" id="sidebar-shortcuts">
+						<div class="sidebar-shortcuts-large" id="sidebar-shortcuts-large">
+							<button class="btn btn-success">
+								<i class="icon-signal"></i>
+							</button>
+
+							<button class="btn btn-info">
+								<i class="icon-pencil"></i>
+							</button>
+
+							<button class="btn btn-warning">
+								<i class="icon-group"></i>
+							</button>
+
+							<button class="btn btn-danger">
+								<i class="icon-cogs"></i>
+							</button>
+						</div>
+
+						<div class="sidebar-shortcuts-mini" id="sidebar-shortcuts-mini">
+							<span class="btn btn-success"></span>
+
+							<span class="btn btn-info"></span>
+
+							<span class="btn btn-warning"></span>
+
+							<span class="btn btn-danger"></span>
+						</div>
+					</div><!-- #sidebar-shortcuts -->
+
+					<ul class="nav nav-list">
+						<li class="active">
+							<a href="index.html">
+								<i class="icon-dashboard"></i>
+								<span class="menu-text"> 控制台 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="typography.html">
+								<i class="icon-text-width"></i>
+								<span class="menu-text"> 文字排版 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-desktop"></i>
+								<span class="menu-text"> UI 组件 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="elements.html">
+										<i class="icon-double-angle-right"></i>
+										组件
+									</a>
+								</li>
+
+								<li>
+									<a href="buttons.html">
+										<i class="icon-double-angle-right"></i>
+										按钮 &amp; 图表
+									</a>
+								</li>
+
+								<li>
+									<a href="treeview.html">
+										<i class="icon-double-angle-right"></i>
+										树菜单
+									</a>
+								</li>
+
+								<li>
+									<a href="jquery-ui.html">
+										<i class="icon-double-angle-right"></i>
+										jQuery UI
+									</a>
+								</li>
+
+								<li>
+									<a href="nestable-list.html">
+										<i class="icon-double-angle-right"></i>
+										可拖拽列表
+									</a>
+								</li>
+
+								<li>
+									<a href="#" class="dropdown-toggle">
+										<i class="icon-double-angle-right"></i>
+
+										三级菜单
+										<b class="arrow icon-angle-down"></b>
+									</a>
+
+									<ul class="submenu">
+										<li>
+											<a href="#">
+												<i class="icon-leaf"></i>
+												第一级
+											</a>
+										</li>
+
+										<li>
+											<a href="#" class="dropdown-toggle">
+												<i class="icon-pencil"></i>
+
+												第四级
+												<b class="arrow icon-angle-down"></b>
+											</a>
+
+											<ul class="submenu">
+												<li>
+													<a href="#">
+														<i class="icon-plus"></i>
+														添加产品
+													</a>
+												</li>
+
+												<li>
+													<a href="#">
+														<i class="icon-eye-open"></i>
+														查看商品
+													</a>
+												</li>
+											</ul>
+										</li>
+									</ul>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-list"></i>
+								<span class="menu-text"> 表格 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="tables.html">
+										<i class="icon-double-angle-right"></i>
+										简单 &amp; 动态
+									</a>
+								</li>
+
+								<li>
+									<a href="jqgrid.html">
+										<i class="icon-double-angle-right"></i>
+										jqGrid plugin
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-edit"></i>
+								<span class="menu-text"> 表单 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="form-elements.html">
+										<i class="icon-double-angle-right"></i>
+										表单组件
+									</a>
+								</li>
+
+								<li>
+									<a href="form-wizard.html">
+										<i class="icon-double-angle-right"></i>
+										向导提示 &amp; 验证
+									</a>
+								</li>
+
+								<li>
+									<a href="wysiwyg.html">
+										<i class="icon-double-angle-right"></i>
+										编辑器
+									</a>
+								</li>
+
+								<li>
+									<a href="dropzone.html">
+										<i class="icon-double-angle-right"></i>
+										文件上传
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="widgets.html">
+								<i class="icon-list-alt"></i>
+								<span class="menu-text"> 插件 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="calendar.html">
+								<i class="icon-calendar"></i>
+
+								<span class="menu-text">
+									日历
+									<span class="badge badge-transparent tooltip-error" title="2&nbsp;Important&nbsp;Events">
+										<i class="icon-warning-sign red bigger-130"></i>
+									</span>
+								</span>
+							</a>
+						</li>
+
+						<li>
+							<a href="gallery.html">
+								<i class="icon-picture"></i>
+								<span class="menu-text"> 相册 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-tag"></i>
+								<span class="menu-text"> 更多页面 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="profile.html">
+										<i class="icon-double-angle-right"></i>
+										用户信息
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										<i class="icon-double-angle-right"></i>
+										收件箱
+									</a>
+								</li>
+
+								<li>
+									<a href="pricing.html">
+										<i class="icon-double-angle-right"></i>
+										售价单
+									</a>
+								</li>
+
+								<li>
+									<a href="invoice.html">
+										<i class="icon-double-angle-right"></i>
+										购物车
+									</a>
+								</li>
+
+								<li>
+									<a href="timeline.html">
+										<i class="icon-double-angle-right"></i>
+										时间轴
+									</a>
+								</li>
+
+								<li>
+									<a href="login.html">
+										<i class="icon-double-angle-right"></i>
+										登录 &amp; 注册
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="active open">
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-file-alt"></i>
+
+								<span class="menu-text">
+									其他页面
+									<span class="badge badge-primary ">5</span>
+								</span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="faq.html">
+										<i class="icon-double-angle-right"></i>
+										帮助
+									</a>
+								</li>
+
+								<li>
+									<a href="error-404.html">
+										<i class="icon-double-angle-right"></i>
+										404错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="error-500.html">
+										<i class="icon-double-angle-right"></i>
+										500错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="grid.html">
+										<i class="icon-double-angle-right"></i>
+										网格
+									</a>
+								</li>
+
+								<li class="active">
+									<a href="blank.html">
+										<i class="icon-double-angle-right"></i>
+										空白页面
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.nav-list -->
+
+					<div class="sidebar-collapse" id="sidebar-collapse">
+						<i class="icon-double-angle-left" data-icon1="icon-double-angle-left" data-icon2="icon-double-angle-right"></i>
+					</div>
+
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'collapsed')}catch(e){}
+					</script>
+				</div>
+
+				<div class="main-content">
+					<div class="breadcrumbs" id="breadcrumbs">
+						<script type="text/javascript">
+							try{ace.settings.check('breadcrumbs' , 'fixed')}catch(e){}
+						</script>
+
+						<ul class="breadcrumb">
+							<li>
+								<i class="icon-home home-icon"></i>
+								<a href="#">Home</a>
+							</li>
+
+							<li>
+								<a href="#">Other Pages</a>
+							</li>
+							<li class="active">Blank Page</li>
+						</ul><!-- .breadcrumb -->
+
+						<div class="nav-search" id="nav-search">
+							<form class="form-search">
+								<span class="input-icon">
+									<input type="text" placeholder="Search ..." class="nav-search-input" id="nav-search-input" autocomplete="off" />
+									<i class="icon-search nav-search-icon"></i>
+								</span>
+							</form>
+						</div><!-- #nav-search -->
+					</div>
+
+					<div class="page-content">
+						<div class="row">
+							<div class="col-xs-12">
+								<!-- PAGE CONTENT BEGINS -->
+
+								<!-- PAGE CONTENT ENDS -->
+							</div><!-- /.col -->
+						</div><!-- /.row -->
+					</div><!-- /.page-content -->
+				</div><!-- /.main-content -->
+
+				<div class="ace-settings-container" id="ace-settings-container">
+					<div class="btn btn-app btn-xs btn-warning ace-settings-btn" id="ace-settings-btn">
+						<i class="icon-cog bigger-150"></i>
+					</div>
+
+					<div class="ace-settings-box" id="ace-settings-box">
+						<div>
+							<div class="pull-left">
+								<select id="skin-colorpicker" class="hide">
+									<option data-skin="default" value="#438EB9">#438EB9</option>
+									<option data-skin="skin-1" value="#222A2D">#222A2D</option>
+									<option data-skin="skin-2" value="#C6487E">#C6487E</option>
+									<option data-skin="skin-3" value="#D0D0D0">#D0D0D0</option>
+								</select>
+							</div>
+							<span>&nbsp; Choose Skin</span>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-navbar" />
+							<label class="lbl" for="ace-settings-navbar"> Fixed Navbar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-sidebar" />
+							<label class="lbl" for="ace-settings-sidebar"> Fixed Sidebar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-breadcrumbs" />
+							<label class="lbl" for="ace-settings-breadcrumbs"> Fixed Breadcrumbs</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-rtl" />
+							<label class="lbl" for="ace-settings-rtl"> Right To Left (rtl)</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-add-container" />
+							<label class="lbl" for="ace-settings-add-container">
+								Inside
+								<b>.container</b>
+							</label>
+						</div>
+					</div>
+				</div><!-- /#ace-settings-container -->
+			</div><!-- /.main-container-inner -->
+
+			<a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
+				<i class="icon-double-angle-up icon-only bigger-110"></i>
+			</a>
+		</div><!-- /.main-container -->
+
+		<!-- basic scripts -->
+
+
+
+		<!--[if !IE]> -->
+
+		<script type="text/javascript">
+			window.jQuery || document.write("<script src='/dist/js/jquery-2.0.3.min.js'>"+"<"+"/script>");
+		</script>
+
+		<!-- <![endif]-->
+
+		<!--[if IE]>
+<script type="text/javascript">
+ window.jQuery || document.write("<script src='/dist/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
+</script>
+<![endif]-->
+
+		<script type="text/javascript">
+			if("ontouchend" in document) document.write("<script src='/dist/js/jquery.mobile.custom.min.js'>"+"<"+"/script>");
+		</script>
+		<script src="/dist/js/bootstrap.min.js"></script>
+		<script src="/dist/js/typeahead-bs2.min.js"></script>
+
+		<!-- page specific plugin scripts -->
+
+		<!-- ace scripts -->
+
+		<script src="/dist/js/ace-elements.min.js"></script>
+		<script src="/dist/js/ace.min.js"></script>
+
+		<!-- inline scripts related to this page -->
+<script type="text/javascript">
+var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
+document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fe9e1d61340ff3d9495a8cca04ebdb49d' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<a href="http://www.iteblog.com/">过往记忆</a>
+</body>
+</html>

Diferenças do arquivo suprimidas por serem muito extensas
+ 2064 - 0
web/ace/buttons.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 1042 - 0
web/ace/calendar.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 853 - 0
web/ace/dropzone.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 1865 - 0
web/ace/elements.html


+ 856 - 0
web/ace/error-404.html

@@ -0,0 +1,856 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>404错误页面 - Bootstrap后台管理系统模版Ace下载</title>
+		<meta name="keywords" content="Bootstrap模版,Bootstrap模版下载,Bootstrap教程,Bootstrap中文" />
+		<meta name="description" content="站长素材提供Bootstrap模版,Bootstrap教程,Bootstrap中文翻译等相关Bootstrap插件下载" />
+		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+		<!-- basic styles -->
+
+		<link href="/dist/css/bootstrap.min.css" rel="stylesheet" />
+		<link rel="stylesheet" href="/dist/css/font-awesome.min.css" />
+
+		<!--[if IE 7]>
+		  <link rel="stylesheet" href="/dist/css/font-awesome-ie7.min.css" />
+		<![endif]-->
+
+		<!-- page specific plugin styles -->
+
+		<!-- ace styles -->
+
+		<link rel="stylesheet" href="/dist/css/ace.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-rtl.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-skins.min.css" />
+
+		<!--[if lte IE 8]>
+		  <link rel="stylesheet" href="/dist/css/ace-ie.min.css" />
+		<![endif]-->
+
+		<!-- inline styles related to this page -->
+
+		<!-- ace settings handler -->
+
+		<script src="/dist/js/ace-extra.min.js"></script>
+
+		<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+
+		<!--[if lt IE 9]>
+		<script src="/dist/js/html5shiv.js"></script>
+		<script src="/dist/js/respond.min.js"></script>
+		<![endif]-->
+	</head>
+
+	<body>
+
+
+		<div class="navbar navbar-default" id="navbar">
+			<script type="text/javascript">
+				try{ace.settings.check('navbar' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="navbar-container" id="navbar-container">
+				<div class="navbar-header pull-left">
+					<a href="#" class="navbar-brand">
+						<small>
+							<i class="icon-leaf"></i>
+							Ace Admin
+						</small>
+					</a><!-- /.brand -->
+				</div><!-- /.navbar-header -->
+
+				<div class="navbar-header pull-right" role="navigation">
+					<ul class="nav ace-nav">
+						<li class="grey">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-tasks"></i>
+								<span class="badge badge-grey">4</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-ok"></i>
+									4 Tasks to complete
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Software Update</span>
+											<span class="pull-right">65%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:65%" class="progress-bar "></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Hardware Upgrade</span>
+											<span class="pull-right">35%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:35%" class="progress-bar progress-bar-danger"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Unit Testing</span>
+											<span class="pull-right">15%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:15%" class="progress-bar progress-bar-warning"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Bug Fixes</span>
+											<span class="pull-right">90%</span>
+										</div>
+
+										<div class="progress progress-mini progress-striped active">
+											<div style="width:90%" class="progress-bar progress-bar-success"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See tasks with details
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="purple">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-bell-alt icon-animated-bell"></i>
+								<span class="badge badge-important">8</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar navbar-pink dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-warning-sign"></i>
+									8 Notifications
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-pink icon-comment"></i>
+												New Comments
+											</span>
+											<span class="pull-right badge badge-info">+12</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="btn btn-xs btn-primary icon-user"></i>
+										Bob just signed up as an editor ...
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-success icon-shopping-cart"></i>
+												New Orders
+											</span>
+											<span class="pull-right badge badge-success">+8</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-info icon-twitter"></i>
+												Followers
+											</span>
+											<span class="pull-right badge badge-info">+11</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See all notifications
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="green">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-envelope icon-animated-vertical"></i>
+								<span class="badge badge-success">5</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-envelope-alt"></i>
+									5 Messages
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar.png" class="msg-photo" alt="Alex's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Alex:</span>
+												Ciao sociis natoque penatibus et auctor ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>a moment ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar3.png" class="msg-photo" alt="Susan's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Susan:</span>
+												Vestibulum id ligula porta felis euismod ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>20 minutes ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar4.png" class="msg-photo" alt="Bob's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Bob:</span>
+												Nullam quis risus eget urna mollis ornare ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>3:15 pm</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										See all messages
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="light-blue">
+							<a data-toggle="dropdown" href="#" class="dropdown-toggle">
+								<img class="nav-user-photo" src="/dist/avatars/user.jpg" alt="Jason's Photo" />
+								<span class="user-info">
+									<small>Welcome,</small>
+									Jason
+								</span>
+
+								<i class="icon-caret-down"></i>
+							</a>
+
+							<ul class="user-menu pull-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
+								<li>
+									<a href="#">
+										<i class="icon-cog"></i>
+										Settings
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="icon-user"></i>
+										Profile
+									</a>
+								</li>
+
+								<li class="divider"></li>
+
+								<li>
+									<a href="#">
+										<i class="icon-off"></i>
+										Logout
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.ace-nav -->
+				</div><!-- /.navbar-header -->
+			</div><!-- /.container -->
+		</div>
+
+		<div class="main-container" id="main-container">
+			<script type="text/javascript">
+				try{ace.settings.check('main-container' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="main-container-inner">
+				<a class="menu-toggler" id="menu-toggler" href="#">
+					<span class="menu-text"></span>
+				</a>
+
+				<div class="sidebar" id="sidebar">
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'fixed')}catch(e){}
+					</script>
+
+					<div class="sidebar-shortcuts" id="sidebar-shortcuts">
+						<div class="sidebar-shortcuts-large" id="sidebar-shortcuts-large">
+							<button class="btn btn-success">
+								<i class="icon-signal"></i>
+							</button>
+
+							<button class="btn btn-info">
+								<i class="icon-pencil"></i>
+							</button>
+
+							<button class="btn btn-warning">
+								<i class="icon-group"></i>
+							</button>
+
+							<button class="btn btn-danger">
+								<i class="icon-cogs"></i>
+							</button>
+						</div>
+
+						<div class="sidebar-shortcuts-mini" id="sidebar-shortcuts-mini">
+							<span class="btn btn-success"></span>
+
+							<span class="btn btn-info"></span>
+
+							<span class="btn btn-warning"></span>
+
+							<span class="btn btn-danger"></span>
+						</div>
+					</div><!-- #sidebar-shortcuts -->
+
+					<ul class="nav nav-list">
+						<li class="active">
+							<a href="index.html">
+								<i class="icon-dashboard"></i>
+								<span class="menu-text"> 控制台 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="typography.html">
+								<i class="icon-text-width"></i>
+								<span class="menu-text"> 文字排版 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-desktop"></i>
+								<span class="menu-text"> UI 组件 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="elements.html">
+										<i class="icon-double-angle-right"></i>
+										组件
+									</a>
+								</li>
+
+								<li>
+									<a href="buttons.html">
+										<i class="icon-double-angle-right"></i>
+										按钮 &amp; 图表
+									</a>
+								</li>
+
+								<li>
+									<a href="treeview.html">
+										<i class="icon-double-angle-right"></i>
+										树菜单
+									</a>
+								</li>
+
+								<li>
+									<a href="jquery-ui.html">
+										<i class="icon-double-angle-right"></i>
+										jQuery UI
+									</a>
+								</li>
+
+								<li>
+									<a href="nestable-list.html">
+										<i class="icon-double-angle-right"></i>
+										可拖拽列表
+									</a>
+								</li>
+
+								<li>
+									<a href="#" class="dropdown-toggle">
+										<i class="icon-double-angle-right"></i>
+
+										三级菜单
+										<b class="arrow icon-angle-down"></b>
+									</a>
+
+									<ul class="submenu">
+										<li>
+											<a href="#">
+												<i class="icon-leaf"></i>
+												第一级
+											</a>
+										</li>
+
+										<li>
+											<a href="#" class="dropdown-toggle">
+												<i class="icon-pencil"></i>
+
+												第四级
+												<b class="arrow icon-angle-down"></b>
+											</a>
+
+											<ul class="submenu">
+												<li>
+													<a href="#">
+														<i class="icon-plus"></i>
+														添加产品
+													</a>
+												</li>
+
+												<li>
+													<a href="#">
+														<i class="icon-eye-open"></i>
+														查看商品
+													</a>
+												</li>
+											</ul>
+										</li>
+									</ul>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-list"></i>
+								<span class="menu-text"> 表格 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="tables.html">
+										<i class="icon-double-angle-right"></i>
+										简单 &amp; 动态
+									</a>
+								</li>
+
+								<li>
+									<a href="jqgrid.html">
+										<i class="icon-double-angle-right"></i>
+										jqGrid plugin
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-edit"></i>
+								<span class="menu-text"> 表单 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="form-elements.html">
+										<i class="icon-double-angle-right"></i>
+										表单组件
+									</a>
+								</li>
+
+								<li>
+									<a href="form-wizard.html">
+										<i class="icon-double-angle-right"></i>
+										向导提示 &amp; 验证
+									</a>
+								</li>
+
+								<li>
+									<a href="wysiwyg.html">
+										<i class="icon-double-angle-right"></i>
+										编辑器
+									</a>
+								</li>
+
+								<li>
+									<a href="dropzone.html">
+										<i class="icon-double-angle-right"></i>
+										文件上传
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="widgets.html">
+								<i class="icon-list-alt"></i>
+								<span class="menu-text"> 插件 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="calendar.html">
+								<i class="icon-calendar"></i>
+
+								<span class="menu-text">
+									日历
+									<span class="badge badge-transparent tooltip-error" title="2&nbsp;Important&nbsp;Events">
+										<i class="icon-warning-sign red bigger-130"></i>
+									</span>
+								</span>
+							</a>
+						</li>
+
+						<li>
+							<a href="gallery.html">
+								<i class="icon-picture"></i>
+								<span class="menu-text"> 相册 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-tag"></i>
+								<span class="menu-text"> 更多页面 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="profile.html">
+										<i class="icon-double-angle-right"></i>
+										用户信息
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										<i class="icon-double-angle-right"></i>
+										收件箱
+									</a>
+								</li>
+
+								<li>
+									<a href="pricing.html">
+										<i class="icon-double-angle-right"></i>
+										售价单
+									</a>
+								</li>
+
+								<li>
+									<a href="invoice.html">
+										<i class="icon-double-angle-right"></i>
+										购物车
+									</a>
+								</li>
+
+								<li>
+									<a href="timeline.html">
+										<i class="icon-double-angle-right"></i>
+										时间轴
+									</a>
+								</li>
+
+								<li>
+									<a href="login.html">
+										<i class="icon-double-angle-right"></i>
+										登录 &amp; 注册
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="active open">
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-file-alt"></i>
+
+								<span class="menu-text">
+									其他页面
+									<span class="badge badge-primary ">5</span>
+								</span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li >
+									<a href="faq.html">
+										<i class="icon-double-angle-right"></i>
+										帮助
+									</a>
+								</li>
+
+								<li class="active">
+									<a href="error-404.html">
+										<i class="icon-double-angle-right"></i>
+										404错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="error-500.html">
+										<i class="icon-double-angle-right"></i>
+										500错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="grid.html">
+										<i class="icon-double-angle-right"></i>
+										网格
+									</a>
+								</li>
+
+								<li>
+									<a href="blank.html">
+										<i class="icon-double-angle-right"></i>
+										空白页面
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.nav-list -->
+
+					<div class="sidebar-collapse" id="sidebar-collapse">
+						<i class="icon-double-angle-left" data-icon1="icon-double-angle-left" data-icon2="icon-double-angle-right"></i>
+					</div>
+
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'collapsed')}catch(e){}
+					</script>
+				</div>
+
+				<div class="main-content">
+					<div class="breadcrumbs" id="breadcrumbs">
+						<script type="text/javascript">
+							try{ace.settings.check('breadcrumbs' , 'fixed')}catch(e){}
+						</script>
+
+						<ul class="breadcrumb">
+							<li>
+								<i class="icon-home home-icon"></i>
+								<a href="#">Home</a>
+							</li>
+
+							<li>
+								<a href="#">Other Pages</a>
+							</li>
+							<li class="active">Error 404</li>
+						</ul><!-- .breadcrumb -->
+
+						<div class="nav-search" id="nav-search">
+							<form class="form-search">
+								<span class="input-icon">
+									<input type="text" placeholder="Search ..." class="nav-search-input" id="nav-search-input" autocomplete="off" />
+									<i class="icon-search nav-search-icon"></i>
+								</span>
+							</form>
+						</div><!-- #nav-search -->
+					</div>
+
+					<div class="page-content">
+						<div class="row">
+							<div class="col-xs-12">
+								<!-- PAGE CONTENT BEGINS -->
+
+								<div class="error-container">
+									<div class="well">
+										<h1 class="grey lighter smaller">
+											<span class="blue bigger-125">
+												<i class="icon-sitemap"></i>
+												404
+											</span>
+											Page Not Found
+										</h1>
+
+										<hr />
+										<h3 class="lighter smaller">We looked everywhere but we couldn't find it!</h3>
+
+										<div>
+											<form class="form-search">
+												<span class="input-icon align-middle">
+													<i class="icon-search"></i>
+
+													<input type="text" class="search-query" placeholder="Give it a search..." />
+												</span>
+												<button class="btn btn-sm" onclick="return false;">Go!</button>
+											</form>
+
+											<div class="space"></div>
+											<h4 class="smaller">Try one of the following:</h4>
+
+											<ul class="list-unstyled spaced inline bigger-110 margin-15">
+												<li>
+													<i class="icon-hand-right blue"></i>
+													Re-check the url for typos
+												</li>
+
+												<li>
+													<i class="icon-hand-right blue"></i>
+													Read the faq
+												</li>
+
+												<li>
+													<i class="icon-hand-right blue"></i>
+													Tell us about it
+												</li>
+											</ul>
+										</div>
+
+										<hr />
+										<div class="space"></div>
+
+										<div class="center">
+											<a href="#" class="btn btn-grey">
+												<i class="icon-arrow-left"></i>
+												Go Back
+											</a>
+
+											<a href="#" class="btn btn-primary">
+												<i class="icon-dashboard"></i>
+												Dashboard
+											</a>
+										</div>
+									</div>
+								</div><!-- PAGE CONTENT ENDS -->
+							</div><!-- /.col -->
+						</div><!-- /.row -->
+					</div><!-- /.page-content -->
+				</div><!-- /.main-content -->
+
+				<div class="ace-settings-container" id="ace-settings-container">
+					<div class="btn btn-app btn-xs btn-warning ace-settings-btn" id="ace-settings-btn">
+						<i class="icon-cog bigger-150"></i>
+					</div>
+
+					<div class="ace-settings-box" id="ace-settings-box">
+						<div>
+							<div class="pull-left">
+								<select id="skin-colorpicker" class="hide">
+									<option data-skin="default" value="#438EB9">#438EB9</option>
+									<option data-skin="skin-1" value="#222A2D">#222A2D</option>
+									<option data-skin="skin-2" value="#C6487E">#C6487E</option>
+									<option data-skin="skin-3" value="#D0D0D0">#D0D0D0</option>
+								</select>
+							</div>
+							<span>&nbsp; Choose Skin</span>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-navbar" />
+							<label class="lbl" for="ace-settings-navbar"> Fixed Navbar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-sidebar" />
+							<label class="lbl" for="ace-settings-sidebar"> Fixed Sidebar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-breadcrumbs" />
+							<label class="lbl" for="ace-settings-breadcrumbs"> Fixed Breadcrumbs</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-rtl" />
+							<label class="lbl" for="ace-settings-rtl"> Right To Left (rtl)</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-add-container" />
+							<label class="lbl" for="ace-settings-add-container">
+								Inside
+								<b>.container</b>
+							</label>
+						</div>
+					</div>
+				</div><!-- /#ace-settings-container -->
+			</div><!-- /.main-container-inner -->
+
+			<a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
+				<i class="icon-double-angle-up icon-only bigger-110"></i>
+			</a>
+		</div><!-- /.main-container -->
+
+		<!-- basic scripts -->
+
+		<!--[if !IE]> -->
+
+		<script type="text/javascript">
+			window.jQuery || document.write("<script src='/dist/js/jquery-2.0.3.min.js'>"+"<"+"/script>");
+		</script>
+
+		<!-- <![endif]-->
+
+		<!--[if IE]>
+<script type="text/javascript">
+ window.jQuery || document.write("<script src='/dist/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
+</script>
+<![endif]-->
+
+		<script type="text/javascript">
+			if("ontouchend" in document) document.write("<script src='/dist/js/jquery.mobile.custom.min.js'>"+"<"+"/script>");
+		</script>
+		<script src="/dist/js/bootstrap.min.js"></script>
+		<script src="/dist/js/typeahead-bs2.min.js"></script>
+
+		<!-- page specific plugin scripts -->
+
+		<!-- ace scripts -->
+
+		<script src="/dist/js/ace-elements.min.js"></script>
+		<script src="/dist/js/ace.min.js"></script>
+
+		<!-- inline scripts related to this page -->
+<script type="text/javascript">
+var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
+document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fe9e1d61340ff3d9495a8cca04ebdb49d' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<a href="http://www.iteblog.com/">过往记忆</a>
+</body>
+</html>

+ 848 - 0
web/ace/error-500.html

@@ -0,0 +1,848 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>500错误页面 - Bootstrap后台管理系统模版Ace下载</title>
+		<meta name="keywords" content="Bootstrap模版,Bootstrap模版下载,Bootstrap教程,Bootstrap中文" />
+		<meta name="description" content="站长素材提供Bootstrap模版,Bootstrap教程,Bootstrap中文翻译等相关Bootstrap插件下载" />
+		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+		<!-- basic styles -->
+
+		<link href="/dist/css/bootstrap.min.css" rel="stylesheet" />
+		<link rel="stylesheet" href="/dist/css/font-awesome.min.css" />
+
+		<!--[if IE 7]>
+		  <link rel="stylesheet" href="/dist/css/font-awesome-ie7.min.css" />
+		<![endif]-->
+
+		<!-- page specific plugin styles -->
+
+		<!-- ace styles -->
+
+		<link rel="stylesheet" href="/dist/css/ace.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-rtl.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-skins.min.css" />
+
+		<!--[if lte IE 8]>
+		  <link rel="stylesheet" href="/dist/css/ace-ie.min.css" />
+		<![endif]-->
+
+		<!-- inline styles related to this page -->
+
+		<!-- ace settings handler -->
+
+		<script src="/dist/js/ace-extra.min.js"></script>
+
+		<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+
+		<!--[if lt IE 9]>
+		<script src="/dist/js/html5shiv.js"></script>
+		<script src="/dist/js/respond.min.js"></script>
+		<![endif]-->
+	</head>
+
+	<body>
+
+		<div class="navbar navbar-default" id="navbar">
+			<script type="text/javascript">
+				try{ace.settings.check('navbar' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="navbar-container" id="navbar-container">
+				<div class="navbar-header pull-left">
+					<a href="#" class="navbar-brand">
+						<small>
+							<i class="icon-leaf"></i>
+							Ace Admin
+						</small>
+					</a><!-- /.brand -->
+				</div><!-- /.navbar-header -->
+
+				<div class="navbar-header pull-right" role="navigation">
+					<ul class="nav ace-nav">
+						<li class="grey">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-tasks"></i>
+								<span class="badge badge-grey">4</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-ok"></i>
+									4 Tasks to complete
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Software Update</span>
+											<span class="pull-right">65%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:65%" class="progress-bar "></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Hardware Upgrade</span>
+											<span class="pull-right">35%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:35%" class="progress-bar progress-bar-danger"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Unit Testing</span>
+											<span class="pull-right">15%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:15%" class="progress-bar progress-bar-warning"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Bug Fixes</span>
+											<span class="pull-right">90%</span>
+										</div>
+
+										<div class="progress progress-mini progress-striped active">
+											<div style="width:90%" class="progress-bar progress-bar-success"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See tasks with details
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="purple">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-bell-alt icon-animated-bell"></i>
+								<span class="badge badge-important">8</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar navbar-pink dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-warning-sign"></i>
+									8 Notifications
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-pink icon-comment"></i>
+												New Comments
+											</span>
+											<span class="pull-right badge badge-info">+12</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="btn btn-xs btn-primary icon-user"></i>
+										Bob just signed up as an editor ...
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-success icon-shopping-cart"></i>
+												New Orders
+											</span>
+											<span class="pull-right badge badge-success">+8</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-info icon-twitter"></i>
+												Followers
+											</span>
+											<span class="pull-right badge badge-info">+11</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See all notifications
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="green">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-envelope icon-animated-vertical"></i>
+								<span class="badge badge-success">5</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-envelope-alt"></i>
+									5 Messages
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar.png" class="msg-photo" alt="Alex's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Alex:</span>
+												Ciao sociis natoque penatibus et auctor ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>a moment ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar3.png" class="msg-photo" alt="Susan's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Susan:</span>
+												Vestibulum id ligula porta felis euismod ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>20 minutes ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar4.png" class="msg-photo" alt="Bob's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Bob:</span>
+												Nullam quis risus eget urna mollis ornare ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>3:15 pm</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										See all messages
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="light-blue">
+							<a data-toggle="dropdown" href="#" class="dropdown-toggle">
+								<img class="nav-user-photo" src="/dist/avatars/user.jpg" alt="Jason's Photo" />
+								<span class="user-info">
+									<small>Welcome,</small>
+									Jason
+								</span>
+
+								<i class="icon-caret-down"></i>
+							</a>
+
+							<ul class="user-menu pull-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
+								<li>
+									<a href="#">
+										<i class="icon-cog"></i>
+										Settings
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="icon-user"></i>
+										Profile
+									</a>
+								</li>
+
+								<li class="divider"></li>
+
+								<li>
+									<a href="#">
+										<i class="icon-off"></i>
+										Logout
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.ace-nav -->
+				</div><!-- /.navbar-header -->
+			</div><!-- /.container -->
+		</div>
+
+		<div class="main-container" id="main-container">
+			<script type="text/javascript">
+				try{ace.settings.check('main-container' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="main-container-inner">
+				<a class="menu-toggler" id="menu-toggler" href="#">
+					<span class="menu-text"></span>
+				</a>
+
+				<div class="sidebar" id="sidebar">
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'fixed')}catch(e){}
+					</script>
+
+					<div class="sidebar-shortcuts" id="sidebar-shortcuts">
+						<div class="sidebar-shortcuts-large" id="sidebar-shortcuts-large">
+							<button class="btn btn-success">
+								<i class="icon-signal"></i>
+							</button>
+
+							<button class="btn btn-info">
+								<i class="icon-pencil"></i>
+							</button>
+
+							<button class="btn btn-warning">
+								<i class="icon-group"></i>
+							</button>
+
+							<button class="btn btn-danger">
+								<i class="icon-cogs"></i>
+							</button>
+						</div>
+
+						<div class="sidebar-shortcuts-mini" id="sidebar-shortcuts-mini">
+							<span class="btn btn-success"></span>
+
+							<span class="btn btn-info"></span>
+
+							<span class="btn btn-warning"></span>
+
+							<span class="btn btn-danger"></span>
+						</div>
+					</div><!-- #sidebar-shortcuts -->
+
+					<ul class="nav nav-list">
+						<li class="active">
+							<a href="index.html">
+								<i class="icon-dashboard"></i>
+								<span class="menu-text"> 控制台 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="typography.html">
+								<i class="icon-text-width"></i>
+								<span class="menu-text"> 文字排版 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-desktop"></i>
+								<span class="menu-text"> UI 组件 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="elements.html">
+										<i class="icon-double-angle-right"></i>
+										组件
+									</a>
+								</li>
+
+								<li>
+									<a href="buttons.html">
+										<i class="icon-double-angle-right"></i>
+										按钮 &amp; 图表
+									</a>
+								</li>
+
+								<li>
+									<a href="treeview.html">
+										<i class="icon-double-angle-right"></i>
+										树菜单
+									</a>
+								</li>
+
+								<li>
+									<a href="jquery-ui.html">
+										<i class="icon-double-angle-right"></i>
+										jQuery UI
+									</a>
+								</li>
+
+								<li>
+									<a href="nestable-list.html">
+										<i class="icon-double-angle-right"></i>
+										可拖拽列表
+									</a>
+								</li>
+
+								<li>
+									<a href="#" class="dropdown-toggle">
+										<i class="icon-double-angle-right"></i>
+
+										三级菜单
+										<b class="arrow icon-angle-down"></b>
+									</a>
+
+									<ul class="submenu">
+										<li>
+											<a href="#">
+												<i class="icon-leaf"></i>
+												第一级
+											</a>
+										</li>
+
+										<li>
+											<a href="#" class="dropdown-toggle">
+												<i class="icon-pencil"></i>
+
+												第四级
+												<b class="arrow icon-angle-down"></b>
+											</a>
+
+											<ul class="submenu">
+												<li>
+													<a href="#">
+														<i class="icon-plus"></i>
+														添加产品
+													</a>
+												</li>
+
+												<li>
+													<a href="#">
+														<i class="icon-eye-open"></i>
+														查看商品
+													</a>
+												</li>
+											</ul>
+										</li>
+									</ul>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-list"></i>
+								<span class="menu-text"> 表格 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="tables.html">
+										<i class="icon-double-angle-right"></i>
+										简单 &amp; 动态
+									</a>
+								</li>
+
+								<li>
+									<a href="jqgrid.html">
+										<i class="icon-double-angle-right"></i>
+										jqGrid plugin
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-edit"></i>
+								<span class="menu-text"> 表单 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="form-elements.html">
+										<i class="icon-double-angle-right"></i>
+										表单组件
+									</a>
+								</li>
+
+								<li>
+									<a href="form-wizard.html">
+										<i class="icon-double-angle-right"></i>
+										向导提示 &amp; 验证
+									</a>
+								</li>
+
+								<li>
+									<a href="wysiwyg.html">
+										<i class="icon-double-angle-right"></i>
+										编辑器
+									</a>
+								</li>
+
+								<li>
+									<a href="dropzone.html">
+										<i class="icon-double-angle-right"></i>
+										文件上传
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="widgets.html">
+								<i class="icon-list-alt"></i>
+								<span class="menu-text"> 插件 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="calendar.html">
+								<i class="icon-calendar"></i>
+
+								<span class="menu-text">
+									日历
+									<span class="badge badge-transparent tooltip-error" title="2&nbsp;Important&nbsp;Events">
+										<i class="icon-warning-sign red bigger-130"></i>
+									</span>
+								</span>
+							</a>
+						</li>
+
+						<li>
+							<a href="gallery.html">
+								<i class="icon-picture"></i>
+								<span class="menu-text"> 相册 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-tag"></i>
+								<span class="menu-text"> 更多页面 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="profile.html">
+										<i class="icon-double-angle-right"></i>
+										用户信息
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										<i class="icon-double-angle-right"></i>
+										收件箱
+									</a>
+								</li>
+
+								<li>
+									<a href="pricing.html">
+										<i class="icon-double-angle-right"></i>
+										售价单
+									</a>
+								</li>
+
+								<li>
+									<a href="invoice.html">
+										<i class="icon-double-angle-right"></i>
+										购物车
+									</a>
+								</li>
+
+								<li>
+									<a href="timeline.html">
+										<i class="icon-double-angle-right"></i>
+										时间轴
+									</a>
+								</li>
+
+								<li>
+									<a href="login.html">
+										<i class="icon-double-angle-right"></i>
+										登录 &amp; 注册
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="active open">
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-file-alt"></i>
+
+								<span class="menu-text">
+									其他页面
+									<span class="badge badge-primary ">5</span>
+								</span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="faq.html">
+										<i class="icon-double-angle-right"></i>
+										帮助
+									</a>
+								</li>
+
+								<li>
+									<a href="error-404.html">
+										<i class="icon-double-angle-right"></i>
+										404错误页面
+									</a>
+								</li>
+
+								<li class="active">
+									<a href="error-500.html">
+										<i class="icon-double-angle-right"></i>
+										500错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="grid.html">
+										<i class="icon-double-angle-right"></i>
+										网格
+									</a>
+								</li>
+
+								<li>
+									<a href="blank.html">
+										<i class="icon-double-angle-right"></i>
+										空白页面
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.nav-list -->
+
+					<div class="sidebar-collapse" id="sidebar-collapse">
+						<i class="icon-double-angle-left" data-icon1="icon-double-angle-left" data-icon2="icon-double-angle-right"></i>
+					</div>
+
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'collapsed')}catch(e){}
+					</script>
+				</div>
+
+				<div class="main-content">
+					<div class="breadcrumbs" id="breadcrumbs">
+						<script type="text/javascript">
+							try{ace.settings.check('breadcrumbs' , 'fixed')}catch(e){}
+						</script>
+
+						<ul class="breadcrumb">
+							<li>
+								<i class="icon-home home-icon"></i>
+								<a href="#">Home</a>
+							</li>
+
+							<li>
+								<a href="#">Other Pages</a>
+							</li>
+							<li class="active">Error 500</li>
+						</ul><!-- .breadcrumb -->
+
+						<div class="nav-search" id="nav-search">
+							<form class="form-search">
+								<span class="input-icon">
+									<input type="text" placeholder="Search ..." class="nav-search-input" id="nav-search-input" autocomplete="off" />
+									<i class="icon-search nav-search-icon"></i>
+								</span>
+							</form>
+						</div><!-- #nav-search -->
+					</div>
+
+					<div class="page-content">
+						<div class="row">
+							<div class="col-xs-12">
+								<!-- PAGE CONTENT BEGINS -->
+
+								<div class="error-container">
+									<div class="well">
+										<h1 class="grey lighter smaller">
+											<span class="blue bigger-125">
+												<i class="icon-random"></i>
+												500
+											</span>
+											Something Went Wrong
+										</h1>
+
+										<hr />
+										<h3 class="lighter smaller">
+											But we are working
+											<i class="icon-wrench icon-animated-wrench bigger-125"></i>
+											on it!
+										</h3>
+
+										<div class="space"></div>
+
+										<div>
+											<h4 class="lighter smaller">Meanwhile, try one of the following:</h4>
+
+											<ul class="list-unstyled spaced inline bigger-110 margin-15">
+												<li>
+													<i class="icon-hand-right blue"></i>
+													Read the faq
+												</li>
+
+												<li>
+													<i class="icon-hand-right blue"></i>
+													Give us more info on how this specific error occurred!
+												</li>
+											</ul>
+										</div>
+
+										<hr />
+										<div class="space"></div>
+
+										<div class="center">
+											<a href="#" class="btn btn-grey">
+												<i class="icon-arrow-left"></i>
+												Go Back
+											</a>
+
+											<a href="#" class="btn btn-primary">
+												<i class="icon-dashboard"></i>
+												Dashboard
+											</a>
+										</div>
+									</div>
+								</div>
+
+								<!-- PAGE CONTENT ENDS -->
+							</div><!-- /.col -->
+						</div><!-- /.row -->
+					</div><!-- /.page-content -->
+				</div><!-- /.main-content -->
+
+				<div class="ace-settings-container" id="ace-settings-container">
+					<div class="btn btn-app btn-xs btn-warning ace-settings-btn" id="ace-settings-btn">
+						<i class="icon-cog bigger-150"></i>
+					</div>
+
+					<div class="ace-settings-box" id="ace-settings-box">
+						<div>
+							<div class="pull-left">
+								<select id="skin-colorpicker" class="hide">
+									<option data-skin="default" value="#438EB9">#438EB9</option>
+									<option data-skin="skin-1" value="#222A2D">#222A2D</option>
+									<option data-skin="skin-2" value="#C6487E">#C6487E</option>
+									<option data-skin="skin-3" value="#D0D0D0">#D0D0D0</option>
+								</select>
+							</div>
+							<span>&nbsp; Choose Skin</span>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-navbar" />
+							<label class="lbl" for="ace-settings-navbar"> Fixed Navbar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-sidebar" />
+							<label class="lbl" for="ace-settings-sidebar"> Fixed Sidebar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-breadcrumbs" />
+							<label class="lbl" for="ace-settings-breadcrumbs"> Fixed Breadcrumbs</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-rtl" />
+							<label class="lbl" for="ace-settings-rtl"> Right To Left (rtl)</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-add-container" />
+							<label class="lbl" for="ace-settings-add-container">
+								Inside
+								<b>.container</b>
+							</label>
+						</div>
+					</div>
+				</div><!-- /#ace-settings-container -->
+			</div><!-- /.main-container-inner -->
+
+			<a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
+				<i class="icon-double-angle-up icon-only bigger-110"></i>
+			</a>
+		</div><!-- /.main-container -->
+
+		<!-- basic scripts -->
+
+		<!--[if !IE]> -->
+
+		<script type="text/javascript">
+			window.jQuery || document.write("<script src='/dist/js/jquery-2.0.3.min.js'>"+"<"+"/script>");
+		</script>
+
+		<!-- <![endif]-->
+
+		<!--[if IE]>
+<script type="text/javascript">
+ window.jQuery || document.write("<script src='/dist/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
+</script>
+<![endif]-->
+
+		<script type="text/javascript">
+			if("ontouchend" in document) document.write("<script src='/dist/js/jquery.mobile.custom.min.js'>"+"<"+"/script>");
+		</script>
+		<script src="/dist/js/bootstrap.min.js"></script>
+		<script src="/dist/js/typeahead-bs2.min.js"></script>
+
+		<!-- page specific plugin scripts -->
+
+		<!-- ace scripts -->
+
+		<script src="/dist/js/ace-elements.min.js"></script>
+		<script src="/dist/js/ace.min.js"></script>
+
+		<!-- inline scripts related to this page -->
+<script type="text/javascript">
+var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
+document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fe9e1d61340ff3d9495a8cca04ebdb49d' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<a href="http://www.iteblog.com/">过往记忆</a>
+</body>
+</html>

Diferenças do arquivo suprimidas por serem muito extensas
+ 1240 - 0
web/ace/faq.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 2255 - 0
web/ace/form-elements.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 1473 - 0
web/ace/form-wizard.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 1053 - 0
web/ace/gallery.html


+ 970 - 0
web/ace/grid.html

@@ -0,0 +1,970 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Bootstrap网格 - Bootstrap后台管理系统模版Ace下载</title>
+		<meta name="keywords" content="Bootstrap模版,Bootstrap模版下载,Bootstrap教程,Bootstrap中文" />
+		<meta name="description" content="站长素材提供Bootstrap模版,Bootstrap教程,Bootstrap中文翻译等相关Bootstrap插件下载" />
+		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+		<!-- basic styles -->
+
+		<link href="/dist/css/bootstrap.min.css" rel="stylesheet" />
+		<link rel="stylesheet" href="/dist/css/font-awesome.min.css" />
+
+		<!--[if IE 7]>
+		  <link rel="stylesheet" href="/dist/css/font-awesome-ie7.min.css" />
+		<![endif]-->
+
+		<!-- page specific plugin styles -->
+
+		<!-- ace styles -->
+
+		<link rel="stylesheet" href="/dist/css/ace.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-rtl.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-skins.min.css" />
+
+		<!--[if lte IE 8]>
+		  <link rel="stylesheet" href="/dist/css/ace-ie.min.css" />
+		<![endif]-->
+
+		<!-- inline styles related to this page -->
+
+		<style>
+			.center {
+	text-align:center;
+}
+.center [class*="col-"] {
+	margin-top:2px;
+	margin-bottom:2px;
+	padding-top:4px;
+	padding-bottom:4px;
+
+	position:relative;
+	text-overflow:ellipsis;
+}
+.center [class*="col-"]  span{
+  position:relative;
+  z-index:2;
+	
+  display: inline-block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+
+  width: 100%;
+}
+.center [class*="col-"]:before {
+	position:absolute;
+	top:0; bottom:0;
+	left:2px; right:2px;
+	content:"";
+	display:block;
+	border:1px solid #DDD;
+	z-index: 1;
+}
+
+.center [class*="col-"]:hover:before {
+	background-color:#FCE6A6;
+	border-color:#EFD27A;
+}
+		</style>
+
+		<!-- ace settings handler -->
+
+		<script src="/dist/js/ace-extra.min.js"></script>
+
+		<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+
+		<!--[if lt IE 9]>
+		<script src="/dist/js/html5shiv.js"></script>
+		<script src="/dist/js/respond.min.js"></script>
+		<![endif]-->
+	</head>
+
+	<body>
+
+		<div class="navbar navbar-default" id="navbar">
+			<script type="text/javascript">
+				try{ace.settings.check('navbar' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="navbar-container" id="navbar-container">
+				<div class="navbar-header pull-left">
+					<a href="#" class="navbar-brand">
+						<small>
+							<i class="icon-leaf"></i>
+							Ace Admin
+						</small>
+					</a><!-- /.brand -->
+				</div><!-- /.navbar-header -->
+
+				<div class="navbar-header pull-right" role="navigation">
+					<ul class="nav ace-nav">
+						<li class="grey">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-tasks"></i>
+								<span class="badge badge-grey">4</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-ok"></i>
+									4 Tasks to complete
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Software Update</span>
+											<span class="pull-right">65%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:65%" class="progress-bar "></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Hardware Upgrade</span>
+											<span class="pull-right">35%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:35%" class="progress-bar progress-bar-danger"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Unit Testing</span>
+											<span class="pull-right">15%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:15%" class="progress-bar progress-bar-warning"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Bug Fixes</span>
+											<span class="pull-right">90%</span>
+										</div>
+
+										<div class="progress progress-mini progress-striped active">
+											<div style="width:90%" class="progress-bar progress-bar-success"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See tasks with details
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="purple">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-bell-alt icon-animated-bell"></i>
+								<span class="badge badge-important">8</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar navbar-pink dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-warning-sign"></i>
+									8 Notifications
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-pink icon-comment"></i>
+												New Comments
+											</span>
+											<span class="pull-right badge badge-info">+12</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="btn btn-xs btn-primary icon-user"></i>
+										Bob just signed up as an editor ...
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-success icon-shopping-cart"></i>
+												New Orders
+											</span>
+											<span class="pull-right badge badge-success">+8</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-info icon-twitter"></i>
+												Followers
+											</span>
+											<span class="pull-right badge badge-info">+11</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See all notifications
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="green">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-envelope icon-animated-vertical"></i>
+								<span class="badge badge-success">5</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-envelope-alt"></i>
+									5 Messages
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar.png" class="msg-photo" alt="Alex's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Alex:</span>
+												Ciao sociis natoque penatibus et auctor ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>a moment ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar3.png" class="msg-photo" alt="Susan's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Susan:</span>
+												Vestibulum id ligula porta felis euismod ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>20 minutes ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar4.png" class="msg-photo" alt="Bob's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Bob:</span>
+												Nullam quis risus eget urna mollis ornare ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>3:15 pm</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										See all messages
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="light-blue">
+							<a data-toggle="dropdown" href="#" class="dropdown-toggle">
+								<img class="nav-user-photo" src="/dist/avatars/user.jpg" alt="Jason's Photo" />
+								<span class="user-info">
+									<small>Welcome,</small>
+									Jason
+								</span>
+
+								<i class="icon-caret-down"></i>
+							</a>
+
+							<ul class="user-menu pull-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
+								<li>
+									<a href="#">
+										<i class="icon-cog"></i>
+										Settings
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="icon-user"></i>
+										Profile
+									</a>
+								</li>
+
+								<li class="divider"></li>
+
+								<li>
+									<a href="#">
+										<i class="icon-off"></i>
+										Logout
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.ace-nav -->
+				</div><!-- /.navbar-header -->
+			</div><!-- /.container -->
+		</div>
+
+		<div class="main-container" id="main-container">
+			<script type="text/javascript">
+				try{ace.settings.check('main-container' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="main-container-inner">
+				<a class="menu-toggler" id="menu-toggler" href="#">
+					<span class="menu-text"></span>
+				</a>
+
+				<div class="sidebar" id="sidebar">
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'fixed')}catch(e){}
+					</script>
+
+					<div class="sidebar-shortcuts" id="sidebar-shortcuts">
+						<div class="sidebar-shortcuts-large" id="sidebar-shortcuts-large">
+							<button class="btn btn-success">
+								<i class="icon-signal"></i>
+							</button>
+
+							<button class="btn btn-info">
+								<i class="icon-pencil"></i>
+							</button>
+
+							<button class="btn btn-warning">
+								<i class="icon-group"></i>
+							</button>
+
+							<button class="btn btn-danger">
+								<i class="icon-cogs"></i>
+							</button>
+						</div>
+
+						<div class="sidebar-shortcuts-mini" id="sidebar-shortcuts-mini">
+							<span class="btn btn-success"></span>
+
+							<span class="btn btn-info"></span>
+
+							<span class="btn btn-warning"></span>
+
+							<span class="btn btn-danger"></span>
+						</div>
+					</div><!-- #sidebar-shortcuts -->
+
+					<ul class="nav nav-list">
+						<li class="active">
+							<a href="index.html">
+								<i class="icon-dashboard"></i>
+								<span class="menu-text"> 控制台 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="typography.html">
+								<i class="icon-text-width"></i>
+								<span class="menu-text"> 文字排版 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-desktop"></i>
+								<span class="menu-text"> UI 组件 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="elements.html">
+										<i class="icon-double-angle-right"></i>
+										组件
+									</a>
+								</li>
+
+								<li>
+									<a href="buttons.html">
+										<i class="icon-double-angle-right"></i>
+										按钮 &amp; 图表
+									</a>
+								</li>
+
+								<li>
+									<a href="treeview.html">
+										<i class="icon-double-angle-right"></i>
+										树菜单
+									</a>
+								</li>
+
+								<li>
+									<a href="jquery-ui.html">
+										<i class="icon-double-angle-right"></i>
+										jQuery UI
+									</a>
+								</li>
+
+								<li>
+									<a href="nestable-list.html">
+										<i class="icon-double-angle-right"></i>
+										可拖拽列表
+									</a>
+								</li>
+
+								<li>
+									<a href="#" class="dropdown-toggle">
+										<i class="icon-double-angle-right"></i>
+
+										三级菜单
+										<b class="arrow icon-angle-down"></b>
+									</a>
+
+									<ul class="submenu">
+										<li>
+											<a href="#">
+												<i class="icon-leaf"></i>
+												第一级
+											</a>
+										</li>
+
+										<li>
+											<a href="#" class="dropdown-toggle">
+												<i class="icon-pencil"></i>
+
+												第四级
+												<b class="arrow icon-angle-down"></b>
+											</a>
+
+											<ul class="submenu">
+												<li>
+													<a href="#">
+														<i class="icon-plus"></i>
+														添加产品
+													</a>
+												</li>
+
+												<li>
+													<a href="#">
+														<i class="icon-eye-open"></i>
+														查看商品
+													</a>
+												</li>
+											</ul>
+										</li>
+									</ul>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-list"></i>
+								<span class="menu-text"> 表格 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="tables.html">
+										<i class="icon-double-angle-right"></i>
+										简单 &amp; 动态
+									</a>
+								</li>
+
+								<li>
+									<a href="jqgrid.html">
+										<i class="icon-double-angle-right"></i>
+										jqGrid plugin
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-edit"></i>
+								<span class="menu-text"> 表单 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="form-elements.html">
+										<i class="icon-double-angle-right"></i>
+										表单组件
+									</a>
+								</li>
+
+								<li>
+									<a href="form-wizard.html">
+										<i class="icon-double-angle-right"></i>
+										向导提示 &amp; 验证
+									</a>
+								</li>
+
+								<li>
+									<a href="wysiwyg.html">
+										<i class="icon-double-angle-right"></i>
+										编辑器
+									</a>
+								</li>
+
+								<li>
+									<a href="dropzone.html">
+										<i class="icon-double-angle-right"></i>
+										文件上传
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="widgets.html">
+								<i class="icon-list-alt"></i>
+								<span class="menu-text"> 插件 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="calendar.html">
+								<i class="icon-calendar"></i>
+
+								<span class="menu-text">
+									日历
+									<span class="badge badge-transparent tooltip-error" title="2&nbsp;Important&nbsp;Events">
+										<i class="icon-warning-sign red bigger-130"></i>
+									</span>
+								</span>
+							</a>
+						</li>
+
+						<li>
+							<a href="gallery.html">
+								<i class="icon-picture"></i>
+								<span class="menu-text"> 相册 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-tag"></i>
+								<span class="menu-text"> 更多页面 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="profile.html">
+										<i class="icon-double-angle-right"></i>
+										用户信息
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										<i class="icon-double-angle-right"></i>
+										收件箱
+									</a>
+								</li>
+
+								<li>
+									<a href="pricing.html">
+										<i class="icon-double-angle-right"></i>
+										售价单
+									</a>
+								</li>
+
+								<li>
+									<a href="invoice.html">
+										<i class="icon-double-angle-right"></i>
+										购物车
+									</a>
+								</li>
+
+								<li>
+									<a href="timeline.html">
+										<i class="icon-double-angle-right"></i>
+										时间轴
+									</a>
+								</li>
+
+								<li>
+									<a href="login.html">
+										<i class="icon-double-angle-right"></i>
+										登录 &amp; 注册
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="active open">
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-file-alt"></i>
+
+								<span class="menu-text">
+									其他页面
+									<span class="badge badge-primary ">5</span>
+								</span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="faq.html">
+										<i class="icon-double-angle-right"></i>
+										帮助
+									</a>
+								</li>
+
+								<li>
+									<a href="error-404.html">
+										<i class="icon-double-angle-right"></i>
+										404错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="error-500.html">
+										<i class="icon-double-angle-right"></i>
+										500错误页面
+									</a>
+								</li>
+
+								<li class="active">
+									<a href="grid.html">
+										<i class="icon-double-angle-right"></i>
+										网格
+									</a>
+								</li>
+
+								<li>
+									<a href="blank.html">
+										<i class="icon-double-angle-right"></i>
+										空白页面
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.nav-list -->
+
+					<div class="sidebar-collapse" id="sidebar-collapse">
+						<i class="icon-double-angle-left" data-icon1="icon-double-angle-left" data-icon2="icon-double-angle-right"></i>
+					</div>
+
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'collapsed')}catch(e){}
+					</script>
+				</div>
+
+				<div class="main-content">
+					<div class="breadcrumbs" id="breadcrumbs">
+						<script type="text/javascript">
+							try{ace.settings.check('breadcrumbs' , 'fixed')}catch(e){}
+						</script>
+
+						<ul class="breadcrumb">
+							<li>
+								<i class="icon-home home-icon"></i>
+								<a href="#">Home</a>
+							</li>
+
+							<li>
+								<a href="#">Other Pages</a>
+							</li>
+							<li class="active">Grid</li>
+						</ul><!-- .breadcrumb -->
+
+						<div class="nav-search" id="nav-search">
+							<form class="form-search">
+								<span class="input-icon">
+									<input type="text" placeholder="Search ..." class="nav-search-input" id="nav-search-input" autocomplete="off" />
+									<i class="icon-search nav-search-icon"></i>
+								</span>
+							</form>
+						</div><!-- #nav-search -->
+					</div>
+
+					<div class="page-content">
+						<div class="page-header">
+							<h1>
+								Grid
+								<small>
+									<i class="icon-double-angle-right"></i>
+									bootstrap grid sizing
+								</small>
+							</h1>
+						</div><!-- /.page-header -->
+
+						<div class="row">
+							<div class="col-xs-12">
+								<!-- PAGE CONTENT BEGINS -->
+
+								<div class="center">
+									<div class="row">
+										<div class="col-xs-12">
+											<span>.col-xs-12</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-1">
+											<span>.col-xs-1</span>
+										</div>
+
+										<div class="col-xs-11">
+											<span>.col-xs-11</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-6 col-sm-2">
+											<span>.col-xs-6.col-sm-2</span>
+										</div>
+
+										<div class="col-xs-6 col-sm-10">
+											<span>.col-xs-6.col-sm-10</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-12 col-lg-6">
+											<span>.col-xs-12.col-lg-6</span>
+										</div>
+
+										<div class="col-xs-12 col-lg-6">
+											<span>.col-xs-12.col-lg-6</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-4">
+											<span>.col-xs-4</span>
+										</div>
+
+										<div class="col-xs-8">
+											<span>.col-xs-8</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-5">
+											<span>.col-xs-5</span>
+										</div>
+
+										<div class="col-xs-7">
+											<span>.col-xs-7</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-6">
+											<span>.col-xs-6</span>
+										</div>
+
+										<div class="col-xs-6">
+											<span>.col-xs-6</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-7">
+											<span>.col-xs-7</span>
+										</div>
+
+										<div class="col-xs-5">
+											<span>.col-xs-5</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-8">
+											<span>.col-xs-8</span>
+										</div>
+
+										<div class="col-xs-4">
+											<span>.col-xs-4</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-9">
+											<span>.col-xs-9</span>
+										</div>
+
+										<div class="col-xs-3">
+											<span>.col-xs-3</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-10">
+											<span>.col-xs-10</span>
+										</div>
+
+										<div class="col-xs-2">
+											<span>.col-xs-2</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-11">
+											<span>.col-xs-11</span>
+										</div>
+
+										<div class="col-xs-1">
+											<span>.col-xs-1</span>
+										</div>
+									</div>
+
+									<div class="row">
+										<div class="col-xs-12">
+											<span>.col-xs-12</span>
+										</div>
+									</div>
+								</div>
+
+								<!-- PAGE CONTENT ENDS -->
+							</div><!-- /.col -->
+						</div><!-- /.row -->
+					</div><!-- /.page-content -->
+				</div><!-- /.main-content -->
+
+				<div class="ace-settings-container" id="ace-settings-container">
+					<div class="btn btn-app btn-xs btn-warning ace-settings-btn" id="ace-settings-btn">
+						<i class="icon-cog bigger-150"></i>
+					</div>
+
+					<div class="ace-settings-box" id="ace-settings-box">
+						<div>
+							<div class="pull-left">
+								<select id="skin-colorpicker" class="hide">
+									<option data-skin="default" value="#438EB9">#438EB9</option>
+									<option data-skin="skin-1" value="#222A2D">#222A2D</option>
+									<option data-skin="skin-2" value="#C6487E">#C6487E</option>
+									<option data-skin="skin-3" value="#D0D0D0">#D0D0D0</option>
+								</select>
+							</div>
+							<span>&nbsp; Choose Skin</span>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-navbar" />
+							<label class="lbl" for="ace-settings-navbar"> Fixed Navbar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-sidebar" />
+							<label class="lbl" for="ace-settings-sidebar"> Fixed Sidebar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-breadcrumbs" />
+							<label class="lbl" for="ace-settings-breadcrumbs"> Fixed Breadcrumbs</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-rtl" />
+							<label class="lbl" for="ace-settings-rtl"> Right To Left (rtl)</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-add-container" />
+							<label class="lbl" for="ace-settings-add-container">
+								Inside
+								<b>.container</b>
+							</label>
+						</div>
+					</div>
+				</div><!-- /#ace-settings-container -->
+			</div><!-- /.main-container-inner -->
+
+			<a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
+				<i class="icon-double-angle-up icon-only bigger-110"></i>
+			</a>
+		</div><!-- /.main-container -->
+
+		<!-- basic scripts -->
+
+		<!--[if !IE]> -->
+
+		<script type="text/javascript">
+			window.jQuery || document.write("<script src='/dist/js/jquery-2.0.3.min.js'>"+"<"+"/script>");
+		</script>
+
+		<!-- <![endif]-->
+
+		<!--[if IE]>
+<script type="text/javascript">
+ window.jQuery || document.write("<script src='/dist/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
+</script>
+<![endif]-->
+
+		<script type="text/javascript">
+			if("ontouchend" in document) document.write("<script src='/dist/js/jquery.mobile.custom.min.js'>"+"<"+"/script>");
+		</script>
+		<script src="/dist/js/bootstrap.min.js"></script>
+		<script src="/dist/js/typeahead-bs2.min.js"></script>
+
+		<!-- page specific plugin scripts -->
+
+		<!-- ace scripts -->
+
+		<script src="/dist/js/ace-elements.min.js"></script>
+		<script src="/dist/js/ace.min.js"></script>
+
+		<!-- inline scripts related to this page -->
+<script type="text/javascript">
+var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
+document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fe9e1d61340ff3d9495a8cca04ebdb49d' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<a href="http://www.iteblog.com/">过往记忆</a>
+</body>
+</html>

Diferenças do arquivo suprimidas por serem muito extensas
+ 2072 - 0
web/ace/inbox.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 2135 - 0
web/ace/index.html


+ 990 - 0
web/ace/invoice.html

@@ -0,0 +1,990 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>购物车界面 - Bootstrap后台管理系统模版Ace下载</title>
+		<meta name="keywords" content="Bootstrap模版,Bootstrap模版下载,Bootstrap教程,Bootstrap中文" />
+		<meta name="description" content="站长素材提供Bootstrap模版,Bootstrap教程,Bootstrap中文翻译等相关Bootstrap插件下载" />
+		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+		<!-- basic styles -->
+
+		<link href="/dist/css/bootstrap.min.css" rel="stylesheet" />
+		<link rel="stylesheet" href="/dist/css/font-awesome.min.css" />
+
+		<!--[if IE 7]>
+		  <link rel="stylesheet" href="/dist/css/font-awesome-ie7.min.css" />
+		<![endif]-->
+
+		<!-- page specific plugin styles -->
+
+
+		<!-- ace styles -->
+
+		<link rel="stylesheet" href="/dist/css/ace.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-rtl.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-skins.min.css" />
+
+		<!--[if lte IE 8]>
+		  <link rel="stylesheet" href="/dist/css/ace-ie.min.css" />
+		<![endif]-->
+
+		<!-- inline styles related to this page -->
+
+		<!-- ace settings handler -->
+
+		<script src="/dist/js/ace-extra.min.js"></script>
+
+		<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+
+		<!--[if lt IE 9]>
+		<script src="/dist/js/html5shiv.js"></script>
+		<script src="/dist/js/respond.min.js"></script>
+		<![endif]-->
+	</head>
+
+	<body>
+
+
+		<div class="navbar navbar-default" id="navbar">
+			<script type="text/javascript">
+				try{ace.settings.check('navbar' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="navbar-container" id="navbar-container">
+				<div class="navbar-header pull-left">
+					<a href="#" class="navbar-brand">
+						<small>
+							<i class="icon-leaf"></i>
+							Ace Admin
+						</small>
+					</a><!-- /.brand -->
+				</div><!-- /.navbar-header -->
+
+				<div class="navbar-header pull-right" role="navigation">
+					<ul class="nav ace-nav">
+						<li class="grey">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-tasks"></i>
+								<span class="badge badge-grey">4</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-ok"></i>
+									4 Tasks to complete
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Software Update</span>
+											<span class="pull-right">65%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:65%" class="progress-bar "></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Hardware Upgrade</span>
+											<span class="pull-right">35%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:35%" class="progress-bar progress-bar-danger"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Unit Testing</span>
+											<span class="pull-right">15%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:15%" class="progress-bar progress-bar-warning"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Bug Fixes</span>
+											<span class="pull-right">90%</span>
+										</div>
+
+										<div class="progress progress-mini progress-striped active">
+											<div style="width:90%" class="progress-bar progress-bar-success"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See tasks with details
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="purple">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-bell-alt icon-animated-bell"></i>
+								<span class="badge badge-important">8</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar navbar-pink dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-warning-sign"></i>
+									8 Notifications
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-pink icon-comment"></i>
+												New Comments
+											</span>
+											<span class="pull-right badge badge-info">+12</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="btn btn-xs btn-primary icon-user"></i>
+										Bob just signed up as an editor ...
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-success icon-shopping-cart"></i>
+												New Orders
+											</span>
+											<span class="pull-right badge badge-success">+8</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-info icon-twitter"></i>
+												Followers
+											</span>
+											<span class="pull-right badge badge-info">+11</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See all notifications
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="green">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-envelope icon-animated-vertical"></i>
+								<span class="badge badge-success">5</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-envelope-alt"></i>
+									5 Messages
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar.png" class="msg-photo" alt="Alex's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Alex:</span>
+												Ciao sociis natoque penatibus et auctor ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>a moment ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar3.png" class="msg-photo" alt="Susan's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Susan:</span>
+												Vestibulum id ligula porta felis euismod ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>20 minutes ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar4.png" class="msg-photo" alt="Bob's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Bob:</span>
+												Nullam quis risus eget urna mollis ornare ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>3:15 pm</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										See all messages
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="light-blue">
+							<a data-toggle="dropdown" href="#" class="dropdown-toggle">
+								<img class="nav-user-photo" src="/dist/avatars/user.jpg" alt="Jason's Photo" />
+								<span class="user-info">
+									<small>Welcome,</small>
+									Jason
+								</span>
+
+								<i class="icon-caret-down"></i>
+							</a>
+
+							<ul class="user-menu pull-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
+								<li>
+									<a href="#">
+										<i class="icon-cog"></i>
+										Settings
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="icon-user"></i>
+										Profile
+									</a>
+								</li>
+
+								<li class="divider"></li>
+
+								<li>
+									<a href="#">
+										<i class="icon-off"></i>
+										Logout
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.ace-nav -->
+				</div><!-- /.navbar-header -->
+			</div><!-- /.container -->
+		</div>
+
+		<div class="main-container" id="main-container">
+			<script type="text/javascript">
+				try{ace.settings.check('main-container' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="main-container-inner">
+				<a class="menu-toggler" id="menu-toggler" href="#">
+					<span class="menu-text"></span>
+				</a>
+
+				<div class="sidebar" id="sidebar">
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'fixed')}catch(e){}
+					</script>
+
+					<div class="sidebar-shortcuts" id="sidebar-shortcuts">
+						<div class="sidebar-shortcuts-large" id="sidebar-shortcuts-large">
+							<button class="btn btn-success">
+								<i class="icon-signal"></i>
+							</button>
+
+							<button class="btn btn-info">
+								<i class="icon-pencil"></i>
+							</button>
+
+							<button class="btn btn-warning">
+								<i class="icon-group"></i>
+							</button>
+
+							<button class="btn btn-danger">
+								<i class="icon-cogs"></i>
+							</button>
+						</div>
+
+						<div class="sidebar-shortcuts-mini" id="sidebar-shortcuts-mini">
+							<span class="btn btn-success"></span>
+
+							<span class="btn btn-info"></span>
+
+							<span class="btn btn-warning"></span>
+
+							<span class="btn btn-danger"></span>
+						</div>
+					</div><!-- #sidebar-shortcuts -->
+
+					<ul class="nav nav-list">
+						<li class="active">
+							<a href="index.html">
+								<i class="icon-dashboard"></i>
+								<span class="menu-text"> 控制台 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="typography.html">
+								<i class="icon-text-width"></i>
+								<span class="menu-text"> 文字排版 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-desktop"></i>
+								<span class="menu-text"> UI 组件 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="elements.html">
+										<i class="icon-double-angle-right"></i>
+										组件
+									</a>
+								</li>
+
+								<li>
+									<a href="buttons.html">
+										<i class="icon-double-angle-right"></i>
+										按钮 &amp; 图表
+									</a>
+								</li>
+
+								<li>
+									<a href="treeview.html">
+										<i class="icon-double-angle-right"></i>
+										树菜单
+									</a>
+								</li>
+
+								<li>
+									<a href="jquery-ui.html">
+										<i class="icon-double-angle-right"></i>
+										jQuery UI
+									</a>
+								</li>
+
+								<li>
+									<a href="nestable-list.html">
+										<i class="icon-double-angle-right"></i>
+										可拖拽列表
+									</a>
+								</li>
+
+								<li>
+									<a href="#" class="dropdown-toggle">
+										<i class="icon-double-angle-right"></i>
+
+										三级菜单
+										<b class="arrow icon-angle-down"></b>
+									</a>
+
+									<ul class="submenu">
+										<li>
+											<a href="#">
+												<i class="icon-leaf"></i>
+												第一级
+											</a>
+										</li>
+
+										<li>
+											<a href="#" class="dropdown-toggle">
+												<i class="icon-pencil"></i>
+
+												第四级
+												<b class="arrow icon-angle-down"></b>
+											</a>
+
+											<ul class="submenu">
+												<li>
+													<a href="#">
+														<i class="icon-plus"></i>
+														添加产品
+													</a>
+												</li>
+
+												<li>
+													<a href="#">
+														<i class="icon-eye-open"></i>
+														查看商品
+													</a>
+												</li>
+											</ul>
+										</li>
+									</ul>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-list"></i>
+								<span class="menu-text"> 表格 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="tables.html">
+										<i class="icon-double-angle-right"></i>
+										简单 &amp; 动态
+									</a>
+								</li>
+
+								<li>
+									<a href="jqgrid.html">
+										<i class="icon-double-angle-right"></i>
+										jqGrid plugin
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-edit"></i>
+								<span class="menu-text"> 表单 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="form-elements.html">
+										<i class="icon-double-angle-right"></i>
+										表单组件
+									</a>
+								</li>
+
+								<li>
+									<a href="form-wizard.html">
+										<i class="icon-double-angle-right"></i>
+										向导提示 &amp; 验证
+									</a>
+								</li>
+
+								<li>
+									<a href="wysiwyg.html">
+										<i class="icon-double-angle-right"></i>
+										编辑器
+									</a>
+								</li>
+
+								<li>
+									<a href="dropzone.html">
+										<i class="icon-double-angle-right"></i>
+										文件上传
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="widgets.html">
+								<i class="icon-list-alt"></i>
+								<span class="menu-text"> 插件 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="calendar.html">
+								<i class="icon-calendar"></i>
+
+								<span class="menu-text">
+									日历
+									<span class="badge badge-transparent tooltip-error" title="2&nbsp;Important&nbsp;Events">
+										<i class="icon-warning-sign red bigger-130"></i>
+									</span>
+								</span>
+							</a>
+						</li>
+
+						<li>
+							<a href="gallery.html">
+								<i class="icon-picture"></i>
+								<span class="menu-text"> 相册 </span>
+							</a>
+						</li>
+
+						<li class="active open">
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-tag"></i>
+								<span class="menu-text"> 更多页面 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="profile.html">
+										<i class="icon-double-angle-right"></i>
+										用户信息
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										<i class="icon-double-angle-right"></i>
+										收件箱
+									</a>
+								</li>
+
+								<li>
+									<a href="pricing.html">
+										<i class="icon-double-angle-right"></i>
+										售价单
+									</a>
+								</li>
+
+								<li class="active">
+									<a href="invoice.html">
+										<i class="icon-double-angle-right"></i>
+										购物车
+									</a>
+								</li>
+
+								<li>
+									<a href="timeline.html">
+										<i class="icon-double-angle-right"></i>
+										时间轴
+									</a>
+								</li>
+
+								<li>
+									<a href="login.html">
+										<i class="icon-double-angle-right"></i>
+										登录 &amp; 注册
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-file-alt"></i>
+
+								<span class="menu-text">
+									其他页面
+									<span class="badge badge-primary ">5</span>
+								</span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="faq.html">
+										<i class="icon-double-angle-right"></i>
+										帮助
+									</a>
+								</li>
+
+								<li>
+									<a href="error-404.html">
+										<i class="icon-double-angle-right"></i>
+										404错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="error-500.html">
+										<i class="icon-double-angle-right"></i>
+										500错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="grid.html">
+										<i class="icon-double-angle-right"></i>
+										网格
+									</a>
+								</li>
+
+								<li>
+									<a href="blank.html">
+										<i class="icon-double-angle-right"></i>
+										空白页面
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.nav-list -->
+
+					<div class="sidebar-collapse" id="sidebar-collapse">
+						<i class="icon-double-angle-left" data-icon1="icon-double-angle-left" data-icon2="icon-double-angle-right"></i>
+					</div>
+
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'collapsed')}catch(e){}
+					</script>
+				</div>
+
+				<div class="main-content">
+					<div class="breadcrumbs" id="breadcrumbs">
+						<script type="text/javascript">
+							try{ace.settings.check('breadcrumbs' , 'fixed')}catch(e){}
+						</script>
+
+						<ul class="breadcrumb">
+							<li>
+								<i class="icon-home home-icon"></i>
+								<a href="#">Home</a>
+							</li>
+
+							<li>
+								<a href="#">More Pages</a>
+							</li>
+							<li class="active">Invoice</li>
+						</ul><!-- .breadcrumb -->
+
+						<div class="nav-search" id="nav-search">
+							<form class="form-search">
+								<span class="input-icon">
+									<input type="text" placeholder="Search ..." class="nav-search-input" id="nav-search-input" autocomplete="off" />
+									<i class="icon-search nav-search-icon"></i>
+								</span>
+							</form>
+						</div><!-- #nav-search -->
+					</div>
+
+					<div class="page-content">
+						<div class="row">
+							<div class="col-xs-12">
+								<!-- PAGE CONTENT BEGINS -->
+
+								<div class="space-6"></div>
+
+								<div class="row">
+									<div class="col-sm-10 col-sm-offset-1">
+										<div class="widget-box transparent invoice-box">
+											<div class="widget-header widget-header-large">
+												<h3 class="grey lighter pull-left position-relative">
+													<i class="icon-leaf green"></i>
+													Customer Invoice
+												</h3>
+
+												<div class="widget-toolbar no-border invoice-info">
+													<span class="invoice-info-label">Invoice:</span>
+													<span class="red">#121212</span>
+
+													<br />
+													<span class="invoice-info-label">Date:</span>
+													<span class="blue">03/03/2013</span>
+												</div>
+
+												<div class="widget-toolbar hidden-480">
+													<a href="#">
+														<i class="icon-print"></i>
+													</a>
+												</div>
+											</div>
+
+											<div class="widget-body">
+												<div class="widget-main padding-24">
+													<div class="row">
+														<div class="col-sm-6">
+															<div class="row">
+																<div class="col-xs-11 label label-lg label-info arrowed-in arrowed-right">
+																	<b>Company Info</b>
+																</div>
+															</div>
+
+															<div class="row">
+																<ul class="list-unstyled spaced">
+																	<li>
+																		<i class="icon-caret-right blue"></i>
+																		Street, City
+																	</li>
+
+																	<li>
+																		<i class="icon-caret-right blue"></i>
+																		Zip Code
+																	</li>
+
+																	<li>
+																		<i class="icon-caret-right blue"></i>
+																		State, Country
+																	</li>
+
+																	<li>
+																		<i class="icon-caret-right blue"></i>
+																		Phone:
+																		<b class="red">111-111-111</b>
+																	</li>
+
+																	<li class="divider"></li>
+
+																	<li>
+																		<i class="icon-caret-right blue"></i>
+																		Paymant Info
+																	</li>
+																</ul>
+															</div>
+														</div><!-- /span -->
+
+														<div class="col-sm-6">
+															<div class="row">
+																<div class="col-xs-11 label label-lg label-success arrowed-in arrowed-right">
+																	<b>Customer Info</b>
+																</div>
+															</div>
+
+															<div>
+																<ul class="list-unstyled  spaced">
+																	<li>
+																		<i class="icon-caret-right green"></i>
+																		Street, City
+																	</li>
+
+																	<li>
+																		<i class="icon-caret-right green"></i>
+																		Zip Code
+																	</li>
+
+																	<li>
+																		<i class="icon-caret-right green"></i>
+																		State, Country
+																	</li>
+
+																	<li class="divider"></li>
+
+																	<li>
+																		<i class="icon-caret-right green"></i>
+																		Contact Info
+																	</li>
+																</ul>
+															</div>
+														</div><!-- /span -->
+													</div><!-- row -->
+
+													<div class="space"></div>
+
+													<div>
+														<table class="table table-striped table-bordered">
+															<thead>
+																<tr>
+																	<th class="center">#</th>
+																	<th>Product</th>
+																	<th class="hidden-xs">Description</th>
+																	<th class="hidden-480">Discount</th>
+																	<th>Total</th>
+																</tr>
+															</thead>
+
+															<tbody>
+																<tr>
+																	<td class="center">1</td>
+
+																	<td>
+																		<a href="#">google.com</a>
+																	</td>
+																	<td class="hidden-xs">
+																		1 year domain registration
+																	</td>
+																	<td class="hidden-480"> --- </td>
+																	<td>$10</td>
+																</tr>
+
+																<tr>
+																	<td class="center">2</td>
+
+																	<td>
+																		<a href="#">yahoo.com</a>
+																	</td>
+																	<td class="hidden-xs">
+																		5 year domain registration
+																	</td>
+																	<td class="hidden-480"> 5% </td>
+																	<td>$45</td>
+																</tr>
+
+																<tr>
+																	<td class="center">3</td>
+																	<td>Hosting</td>
+																	<td class="hidden-xs">
+																		1 year basic hosting
+																	</td>
+																	<td class="hidden-480"> 10% </td>
+																	<td>$90</td>
+																</tr>
+
+																<tr>
+																	<td class="center">4</td>
+																	<td>Design</td>
+																	<td class="hidden-xs">
+																		Theme customization
+																	</td>
+																	<td class="hidden-480"> 50% </td>
+																	<td>$250</td>
+																</tr>
+															</tbody>
+														</table>
+													</div>
+
+													<div class="hr hr8 hr-double hr-dotted"></div>
+
+													<div class="row">
+														<div class="col-sm-5 pull-right">
+															<h4 class="pull-right">
+																Total amount :
+																<span class="red">$395</span>
+															</h4>
+														</div>
+														<div class="col-sm-7 pull-left"> Extra Information </div>
+													</div>
+
+													<div class="space-6"></div>
+													<div class="well">
+														Thank you for choosing Ace Company products.
+					We believe you will be satisfied by our services.
+													</div>
+												</div>
+											</div>
+										</div>
+									</div>
+								</div>
+
+								<!-- PAGE CONTENT ENDS -->
+							</div><!-- /.col -->
+						</div><!-- /.row -->
+					</div><!-- /.page-content -->
+				</div><!-- /.main-content -->
+
+				<div class="ace-settings-container" id="ace-settings-container">
+					<div class="btn btn-app btn-xs btn-warning ace-settings-btn" id="ace-settings-btn">
+						<i class="icon-cog bigger-150"></i>
+					</div>
+
+					<div class="ace-settings-box" id="ace-settings-box">
+						<div>
+							<div class="pull-left">
+								<select id="skin-colorpicker" class="hide">
+									<option data-skin="default" value="#438EB9">#438EB9</option>
+									<option data-skin="skin-1" value="#222A2D">#222A2D</option>
+									<option data-skin="skin-2" value="#C6487E">#C6487E</option>
+									<option data-skin="skin-3" value="#D0D0D0">#D0D0D0</option>
+								</select>
+							</div>
+							<span>&nbsp; Choose Skin</span>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-navbar" />
+							<label class="lbl" for="ace-settings-navbar"> Fixed Navbar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-sidebar" />
+							<label class="lbl" for="ace-settings-sidebar"> Fixed Sidebar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-breadcrumbs" />
+							<label class="lbl" for="ace-settings-breadcrumbs"> Fixed Breadcrumbs</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-rtl" />
+							<label class="lbl" for="ace-settings-rtl"> Right To Left (rtl)</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-add-container" />
+							<label class="lbl" for="ace-settings-add-container">
+								Inside
+								<b>.container</b>
+							</label>
+						</div>
+					</div>
+				</div><!-- /#ace-settings-container -->
+			</div><!-- /.main-container-inner -->
+
+			<a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
+				<i class="icon-double-angle-up icon-only bigger-110"></i>
+			</a>
+		</div><!-- /.main-container -->
+
+		<!-- basic scripts -->
+
+		<!--[if !IE]> -->
+
+		<script type="text/javascript">
+			window.jQuery || document.write("<script src='/dist/js/jquery-2.0.3.min.js'>"+"<"+"/script>");
+		</script>
+
+		<!-- <![endif]-->
+
+		<!--[if IE]>
+<script type="text/javascript">
+ window.jQuery || document.write("<script src='/dist/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
+</script>
+<![endif]-->
+
+		<script type="text/javascript">
+			if("ontouchend" in document) document.write("<script src='/dist/js/jquery.mobile.custom.min.js'>"+"<"+"/script>");
+		</script>
+		<script src="/dist/js/bootstrap.min.js"></script>
+		<script src="/dist/js/typeahead-bs2.min.js"></script>
+
+		<!-- page specific plugin scripts -->
+
+		<!-- ace scripts -->
+
+		<script src="/dist/js/ace-elements.min.js"></script>
+		<script src="/dist/js/ace.min.js"></script>
+
+		<!-- inline scripts related to this page -->
+<script type="text/javascript">
+var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
+document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fe9e1d61340ff3d9495a8cca04ebdb49d' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<a href="http://www.iteblog.com/">过往记忆</a>
+</body>
+</html>

Diferenças do arquivo suprimidas por serem muito extensas
+ 1146 - 0
web/ace/jqgrid.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 1399 - 0
web/ace/jquery-ui.html


+ 298 - 0
web/ace/login.html

@@ -0,0 +1,298 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>登录 - Bootstrap后台管理系统模版Ace下载</title>
+		<meta name="keywords" content="Bootstrap模版,Bootstrap模版下载,Bootstrap教程,Bootstrap中文" />
+		<meta name="description" content="站长素材提供Bootstrap模版,Bootstrap教程,Bootstrap中文翻译等相关Bootstrap插件下载" />
+		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+		<!-- basic styles -->
+
+		<link href="/dist/css/bootstrap.min.css" rel="stylesheet" />
+		<link rel="stylesheet" href="/dist/css/font-awesome.min.css" />
+
+		<!--[if IE 7]>
+		  <link rel="stylesheet" href="/dist/css/font-awesome-ie7.min.css" />
+		<![endif]-->
+
+		<!-- page specific plugin styles -->
+
+
+		<!-- ace styles -->
+
+		<link rel="stylesheet" href="/dist/css/ace.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-rtl.min.css" />
+
+		<!--[if lte IE 8]>
+		  <link rel="stylesheet" href="/dist/css/ace-ie.min.css" />
+		<![endif]-->
+
+		<!-- inline styles related to this page -->
+
+		<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+
+		<!--[if lt IE 9]>
+		<script src="/dist/js/html5shiv.js"></script>
+		<script src="/dist/js/respond.min.js"></script>
+		<![endif]-->
+	</head>
+
+	<body class="login-layout">
+
+		<div class="main-container">
+			<div class="main-content">
+				<div class="row">
+					<div class="col-sm-10 col-sm-offset-1">
+						<div class="login-container">
+							<div class="center">
+								<h1>
+									<i class="icon-leaf green"></i>
+									<span class="red">Ace</span>
+									<span class="white">Application</span>
+								</h1>
+								<h4 class="blue">&copy; Company Name</h4>
+							</div>
+
+							<div class="space-6"></div>
+
+							<div class="position-relative">
+								<div id="login-box" class="login-box visible widget-box no-border">
+									<div class="widget-body">
+										<div class="widget-main">
+											<h4 class="header blue lighter bigger">
+												<i class="icon-coffee green"></i>
+												Please Enter Your Information
+											</h4>
+
+											<div class="space-6"></div>
+
+											<form>
+												<fieldset>
+													<label class="block clearfix">
+														<span class="block input-icon input-icon-right">
+															<input type="text" class="form-control" placeholder="Username" />
+															<i class="icon-user"></i>
+														</span>
+													</label>
+
+													<label class="block clearfix">
+														<span class="block input-icon input-icon-right">
+															<input type="password" class="form-control" placeholder="Password" />
+															<i class="icon-lock"></i>
+														</span>
+													</label>
+
+													<div class="space"></div>
+
+													<div class="clearfix">
+														<label class="inline">
+															<input type="checkbox" class="ace" />
+															<span class="lbl"> Remember Me</span>
+														</label>
+
+														<button type="button" class="width-35 pull-right btn btn-sm btn-primary">
+															<i class="icon-key"></i>
+															Login
+														</button>
+													</div>
+
+													<div class="space-4"></div>
+												</fieldset>
+											</form>
+
+											<div class="social-or-login center">
+												<span class="bigger-110">Or Login Using</span>
+											</div>
+
+											<div class="social-login center">
+												<a class="btn btn-primary">
+													<i class="icon-facebook"></i>
+												</a>
+
+												<a class="btn btn-info">
+													<i class="icon-twitter"></i>
+												</a>
+
+												<a class="btn btn-danger">
+													<i class="icon-google-plus"></i>
+												</a>
+											</div>
+										</div><!-- /widget-main -->
+
+										<div class="toolbar clearfix">
+											<div>
+												<a href="#" onclick="show_box('forgot-box'); return false;" class="forgot-password-link">
+													<i class="icon-arrow-left"></i>
+													I forgot my password
+												</a>
+											</div>
+
+											<div>
+												<a href="#" onclick="show_box('signup-box'); return false;" class="user-signup-link">
+													I want to register
+													<i class="icon-arrow-right"></i>
+												</a>
+											</div>
+										</div>
+									</div><!-- /widget-body -->
+								</div><!-- /login-box -->
+
+								<div id="forgot-box" class="forgot-box widget-box no-border">
+									<div class="widget-body">
+										<div class="widget-main">
+											<h4 class="header red lighter bigger">
+												<i class="icon-key"></i>
+												Retrieve Password
+											</h4>
+
+											<div class="space-6"></div>
+											<p>
+												Enter your email and to receive instructions
+											</p>
+
+											<form>
+												<fieldset>
+													<label class="block clearfix">
+														<span class="block input-icon input-icon-right">
+															<input type="email" class="form-control" placeholder="Email" />
+															<i class="icon-envelope"></i>
+														</span>
+													</label>
+
+													<div class="clearfix">
+														<button type="button" class="width-35 pull-right btn btn-sm btn-danger">
+															<i class="icon-lightbulb"></i>
+															Send Me!
+														</button>
+													</div>
+												</fieldset>
+											</form>
+										</div><!-- /widget-main -->
+
+										<div class="toolbar center">
+											<a href="#" onclick="show_box('login-box'); return false;" class="back-to-login-link">
+												Back to login
+												<i class="icon-arrow-right"></i>
+											</a>
+										</div>
+									</div><!-- /widget-body -->
+								</div><!-- /forgot-box -->
+
+								<div id="signup-box" class="signup-box widget-box no-border">
+									<div class="widget-body">
+										<div class="widget-main">
+											<h4 class="header green lighter bigger">
+												<i class="icon-group blue"></i>
+												New User Registration
+											</h4>
+
+											<div class="space-6"></div>
+											<p> Enter your details to begin: </p>
+
+											<form>
+												<fieldset>
+													<label class="block clearfix">
+														<span class="block input-icon input-icon-right">
+															<input type="email" class="form-control" placeholder="Email" />
+															<i class="icon-envelope"></i>
+														</span>
+													</label>
+
+													<label class="block clearfix">
+														<span class="block input-icon input-icon-right">
+															<input type="text" class="form-control" placeholder="Username" />
+															<i class="icon-user"></i>
+														</span>
+													</label>
+
+													<label class="block clearfix">
+														<span class="block input-icon input-icon-right">
+															<input type="password" class="form-control" placeholder="Password" />
+															<i class="icon-lock"></i>
+														</span>
+													</label>
+
+													<label class="block clearfix">
+														<span class="block input-icon input-icon-right">
+															<input type="password" class="form-control" placeholder="Repeat password" />
+															<i class="icon-retweet"></i>
+														</span>
+													</label>
+
+													<label class="block">
+														<input type="checkbox" class="ace" />
+														<span class="lbl">
+															I accept the
+															<a href="#">User Agreement</a>
+														</span>
+													</label>
+
+													<div class="space-24"></div>
+
+													<div class="clearfix">
+														<button type="reset" class="width-30 pull-left btn btn-sm">
+															<i class="icon-refresh"></i>
+															Reset
+														</button>
+
+														<button type="button" class="width-65 pull-right btn btn-sm btn-success">
+															Register
+															<i class="icon-arrow-right icon-on-right"></i>
+														</button>
+													</div>
+												</fieldset>
+											</form>
+										</div>
+
+										<div class="toolbar center">
+											<a href="#" onclick="show_box('login-box'); return false;" class="back-to-login-link">
+												<i class="icon-arrow-left"></i>
+												Back to login
+											</a>
+										</div>
+									</div><!-- /widget-body -->
+								</div><!-- /signup-box -->
+							</div><!-- /position-relative -->
+						</div>
+					</div><!-- /.col -->
+				</div><!-- /.row -->
+			</div>
+		</div><!-- /.main-container -->
+
+		<!-- basic scripts -->
+
+
+		<!--[if !IE]> -->
+
+		<script type="text/javascript">
+			window.jQuery || document.write("<script src='/dist/js/jquery-2.0.3.min.js'>"+"<"+"/script>");
+		</script>
+
+		<!-- <![endif]-->
+
+		<!--[if IE]>
+<script type="text/javascript">
+ window.jQuery || document.write("<script src='/dist/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
+</script>
+<![endif]-->
+
+		<script type="text/javascript">
+			if("ontouchend" in document) document.write("<script src='/dist/js/jquery.mobile.custom.min.js'>"+"<"+"/script>");
+		</script>
+
+		<!-- inline scripts related to this page -->
+
+		<script type="text/javascript">
+			function show_box(id) {
+			 jQuery('.widget-box.visible').removeClass('visible');
+			 jQuery('#'+id).addClass('visible');
+			}
+		</script>
+<script type="text/javascript">
+var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
+document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fe9e1d61340ff3d9495a8cca04ebdb49d' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<a href="http://www.iteblog.com/">过往记忆</a>
+</body>
+</html>

+ 984 - 0
web/ace/nestable-list.html

@@ -0,0 +1,984 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>可拖拽面板 - Bootstrap后台管理系统模版Ace下载</title>
+		<meta name="keywords" content="Bootstrap模版,Bootstrap模版下载,Bootstrap教程,Bootstrap中文" />
+		<meta name="description" content="站长素材提供Bootstrap模版,Bootstrap教程,Bootstrap中文翻译等相关Bootstrap插件下载" />
+		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+		<!-- basic styles -->
+
+		<link href="/dist/css/bootstrap.min.css" rel="stylesheet" />
+		<link rel="stylesheet" href="/dist/css/font-awesome.min.css" />
+
+		<!--[if IE 7]>
+		  <link rel="stylesheet" href="/dist/css/font-awesome-ie7.min.css" />
+		<![endif]-->
+
+		<!-- page specific plugin styles -->
+
+		<!-- ace styles -->
+
+		<link rel="stylesheet" href="/dist/css/ace.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-rtl.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-skins.min.css" />
+
+		<!--[if lte IE 8]>
+		  <link rel="stylesheet" href="/dist/css/ace-ie.min.css" />
+		<![endif]-->
+
+		<!-- inline styles related to this page -->
+
+		<!-- ace settings handler -->
+
+		<script src="/dist/js/ace-extra.min.js"></script>
+
+		<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+
+		<!--[if lt IE 9]>
+		<script src="/dist/js/html5shiv.js"></script>
+		<script src="/dist/js/respond.min.js"></script>
+		<![endif]-->
+	</head>
+
+	<body>
+		<div class="navbar navbar-default" id="navbar">
+			<script type="text/javascript">
+				try{ace.settings.check('navbar' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="navbar-container" id="navbar-container">
+				<div class="navbar-header pull-left">
+					<a href="#" class="navbar-brand">
+						<small>
+							<i class="icon-leaf"></i>
+							Ace Admin
+						</small>
+					</a><!-- /.brand -->
+				</div><!-- /.navbar-header -->
+
+				<div class="navbar-header pull-right" role="navigation">
+					<ul class="nav ace-nav">
+						<li class="grey">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-tasks"></i>
+								<span class="badge badge-grey">4</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-ok"></i>
+									4 Tasks to complete
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Software Update</span>
+											<span class="pull-right">65%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:65%" class="progress-bar "></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Hardware Upgrade</span>
+											<span class="pull-right">35%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:35%" class="progress-bar progress-bar-danger"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Unit Testing</span>
+											<span class="pull-right">15%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:15%" class="progress-bar progress-bar-warning"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Bug Fixes</span>
+											<span class="pull-right">90%</span>
+										</div>
+
+										<div class="progress progress-mini progress-striped active">
+											<div style="width:90%" class="progress-bar progress-bar-success"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See tasks with details
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="purple">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-bell-alt icon-animated-bell"></i>
+								<span class="badge badge-important">8</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar navbar-pink dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-warning-sign"></i>
+									8 Notifications
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-pink icon-comment"></i>
+												New Comments
+											</span>
+											<span class="pull-right badge badge-info">+12</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="btn btn-xs btn-primary icon-user"></i>
+										Bob just signed up as an editor ...
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-success icon-shopping-cart"></i>
+												New Orders
+											</span>
+											<span class="pull-right badge badge-success">+8</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-info icon-twitter"></i>
+												Followers
+											</span>
+											<span class="pull-right badge badge-info">+11</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See all notifications
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="green">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-envelope icon-animated-vertical"></i>
+								<span class="badge badge-success">5</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-envelope-alt"></i>
+									5 Messages
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar.png" class="msg-photo" alt="Alex's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Alex:</span>
+												Ciao sociis natoque penatibus et auctor ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>a moment ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar3.png" class="msg-photo" alt="Susan's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Susan:</span>
+												Vestibulum id ligula porta felis euismod ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>20 minutes ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar4.png" class="msg-photo" alt="Bob's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Bob:</span>
+												Nullam quis risus eget urna mollis ornare ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>3:15 pm</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										See all messages
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="light-blue">
+							<a data-toggle="dropdown" href="#" class="dropdown-toggle">
+								<img class="nav-user-photo" src="/dist/avatars/user.jpg" alt="Jason's Photo" />
+								<span class="user-info">
+									<small>Welcome,</small>
+									Jason
+								</span>
+
+								<i class="icon-caret-down"></i>
+							</a>
+
+							<ul class="user-menu pull-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
+								<li>
+									<a href="#">
+										<i class="icon-cog"></i>
+										Settings
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="icon-user"></i>
+										Profile
+									</a>
+								</li>
+
+								<li class="divider"></li>
+
+								<li>
+									<a href="#">
+										<i class="icon-off"></i>
+										Logout
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.ace-nav -->
+				</div><!-- /.navbar-header -->
+			</div><!-- /.container -->
+		</div>
+
+		<div class="main-container" id="main-container">
+			<script type="text/javascript">
+				try{ace.settings.check('main-container' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="main-container-inner">
+				<a class="menu-toggler" id="menu-toggler" href="#">
+					<span class="menu-text"></span>
+				</a>
+
+				<div class="sidebar" id="sidebar">
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'fixed')}catch(e){}
+					</script>
+
+					<div class="sidebar-shortcuts" id="sidebar-shortcuts">
+						<div class="sidebar-shortcuts-large" id="sidebar-shortcuts-large">
+							<button class="btn btn-success">
+								<i class="icon-signal"></i>
+							</button>
+
+							<button class="btn btn-info">
+								<i class="icon-pencil"></i>
+							</button>
+
+							<button class="btn btn-warning">
+								<i class="icon-group"></i>
+							</button>
+
+							<button class="btn btn-danger">
+								<i class="icon-cogs"></i>
+							</button>
+						</div>
+
+						<div class="sidebar-shortcuts-mini" id="sidebar-shortcuts-mini">
+							<span class="btn btn-success"></span>
+
+							<span class="btn btn-info"></span>
+
+							<span class="btn btn-warning"></span>
+
+							<span class="btn btn-danger"></span>
+						</div>
+					</div><!-- #sidebar-shortcuts -->
+
+					<ul class="nav nav-list">
+						<li class="active">
+							<a href="index.html">
+								<i class="icon-dashboard"></i>
+								<span class="menu-text"> 控制台 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="typography.html">
+								<i class="icon-text-width"></i>
+								<span class="menu-text"> 文字排版 </span>
+							</a>
+						</li>
+
+						<li class="active open">
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-desktop"></i>
+								<span class="menu-text"> UI 组件 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="elements.html">
+										<i class="icon-double-angle-right"></i>
+										组件
+									</a>
+								</li>
+
+								<li>
+									<a href="buttons.html">
+										<i class="icon-double-angle-right"></i>
+										按钮 &amp; 图表
+									</a>
+								</li>
+
+								<li>
+									<a href="treeview.html">
+										<i class="icon-double-angle-right"></i>
+										树菜单
+									</a>
+								</li>
+
+								<li>
+									<a href="jquery-ui.html">
+										<i class="icon-double-angle-right"></i>
+										jQuery UI
+									</a>
+								</li>
+
+								<li class="active">
+									<a href="nestable-list.html">
+										<i class="icon-double-angle-right"></i>
+										可拖拽列表
+									</a>
+								</li>
+
+								<li>
+									<a href="#" class="dropdown-toggle">
+										<i class="icon-double-angle-right"></i>
+
+										三级菜单
+										<b class="arrow icon-angle-down"></b>
+									</a>
+
+									<ul class="submenu">
+										<li>
+											<a href="#">
+												<i class="icon-leaf"></i>
+												第一级
+											</a>
+										</li>
+
+										<li>
+											<a href="#" class="dropdown-toggle">
+												<i class="icon-pencil"></i>
+
+												第四级
+												<b class="arrow icon-angle-down"></b>
+											</a>
+
+											<ul class="submenu">
+												<li>
+													<a href="#">
+														<i class="icon-plus"></i>
+														添加产品
+													</a>
+												</li>
+
+												<li>
+													<a href="#">
+														<i class="icon-eye-open"></i>
+														查看商品
+													</a>
+												</li>
+											</ul>
+										</li>
+									</ul>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-list"></i>
+								<span class="menu-text"> 表格 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="tables.html">
+										<i class="icon-double-angle-right"></i>
+										简单 &amp; 动态
+									</a>
+								</li>
+
+								<li>
+									<a href="jqgrid.html">
+										<i class="icon-double-angle-right"></i>
+										jqGrid plugin
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-edit"></i>
+								<span class="menu-text"> 表单 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="form-elements.html">
+										<i class="icon-double-angle-right"></i>
+										表单组件
+									</a>
+								</li>
+
+								<li>
+									<a href="form-wizard.html">
+										<i class="icon-double-angle-right"></i>
+										向导提示 &amp; 验证
+									</a>
+								</li>
+
+								<li>
+									<a href="wysiwyg.html">
+										<i class="icon-double-angle-right"></i>
+										编辑器
+									</a>
+								</li>
+
+								<li>
+									<a href="dropzone.html">
+										<i class="icon-double-angle-right"></i>
+										文件上传
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="widgets.html">
+								<i class="icon-list-alt"></i>
+								<span class="menu-text"> 插件 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="calendar.html">
+								<i class="icon-calendar"></i>
+
+								<span class="menu-text">
+									日历
+									<span class="badge badge-transparent tooltip-error" title="2&nbsp;Important&nbsp;Events">
+										<i class="icon-warning-sign red bigger-130"></i>
+									</span>
+								</span>
+							</a>
+						</li>
+
+						<li>
+							<a href="gallery.html">
+								<i class="icon-picture"></i>
+								<span class="menu-text"> 相册 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-tag"></i>
+								<span class="menu-text"> 更多页面 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="profile.html">
+										<i class="icon-double-angle-right"></i>
+										用户信息
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										<i class="icon-double-angle-right"></i>
+										收件箱
+									</a>
+								</li>
+
+								<li>
+									<a href="pricing.html">
+										<i class="icon-double-angle-right"></i>
+										售价单
+									</a>
+								</li>
+
+								<li>
+									<a href="invoice.html">
+										<i class="icon-double-angle-right"></i>
+										购物车
+									</a>
+								</li>
+
+								<li>
+									<a href="timeline.html">
+										<i class="icon-double-angle-right"></i>
+										时间轴
+									</a>
+								</li>
+
+								<li>
+									<a href="login.html">
+										<i class="icon-double-angle-right"></i>
+										登录 &amp; 注册
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-file-alt"></i>
+
+								<span class="menu-text">
+									其他页面
+									<span class="badge badge-primary ">5</span>
+								</span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="faq.html">
+										<i class="icon-double-angle-right"></i>
+										帮助
+									</a>
+								</li>
+
+								<li>
+									<a href="error-404.html">
+										<i class="icon-double-angle-right"></i>
+										404错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="error-500.html">
+										<i class="icon-double-angle-right"></i>
+										500错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="grid.html">
+										<i class="icon-double-angle-right"></i>
+										网格
+									</a>
+								</li>
+
+								<li>
+									<a href="blank.html">
+										<i class="icon-double-angle-right"></i>
+										空白页面
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.nav-list -->
+
+					<div class="sidebar-collapse" id="sidebar-collapse">
+						<i class="icon-double-angle-left" data-icon1="icon-double-angle-left" data-icon2="icon-double-angle-right"></i>
+					</div>
+
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'collapsed')}catch(e){}
+					</script>
+				</div>
+
+				<div class="main-content">
+					<div class="breadcrumbs" id="breadcrumbs">
+						<script type="text/javascript">
+							try{ace.settings.check('breadcrumbs' , 'fixed')}catch(e){}
+						</script>
+
+						<ul class="breadcrumb">
+							<li>
+								<i class="icon-home home-icon"></i>
+								<a href="#">Home</a>
+							</li>
+
+							<li>
+								<a href="#">UI Elements</a>
+							</li>
+							<li class="active">Nestable Lists</li>
+						</ul><!-- .breadcrumb -->
+
+						<div class="nav-search" id="nav-search">
+							<form class="form-search">
+								<span class="input-icon">
+									<input type="text" placeholder="Search ..." class="nav-search-input" id="nav-search-input" autocomplete="off" />
+									<i class="icon-search nav-search-icon"></i>
+								</span>
+							</form>
+						</div><!-- #nav-search -->
+					</div>
+
+					<div class="page-content">
+						<div class="page-header">
+							<h1>
+								Nestable lists
+								<small>
+									<i class="icon-double-angle-right"></i>
+									Drag &amp; drop hierarchical list
+								</small>
+							</h1>
+						</div><!-- /.page-header -->
+
+						<div class="row">
+							<div class="col-xs-12">
+								<!-- PAGE CONTENT BEGINS -->
+
+								<div class="row">
+									<div class="col-sm-6">
+										<div class="dd" id="nestable">
+											<ol class="dd-list">
+												<li class="dd-item" data-id="1">
+													<div class="dd-handle">
+														Item 1
+														<i class="pull-right bigger-130 icon-warning-sign orange2"></i>
+													</div>
+												</li>
+
+												<li class="dd-item" data-id="2">
+													<div class="dd-handle">Item 2</div>
+
+													<ol class="dd-list">
+														<li class="dd-item" data-id="3">
+															<div class="dd-handle">
+																Item 3
+																<a data-rel="tooltip" data-placement="left" title="Change Event Date" href="#" class="badge badge-primary radius-5 tooltip-info pull-right white no-hover-underline">
+																	<i class="bigger-120 icon-calendar"></i>
+																</a>
+															</div>
+														</li>
+
+														<li class="dd-item" data-id="4">
+															<div class="dd-handle">
+																<span class="orange">Item 4</span>
+																<span class="lighter grey">
+																	&nbsp; with some description
+																</span>
+															</div>
+														</li>
+
+														<li class="dd-item" data-id="5">
+															<div class="dd-handle">
+																Item 5
+																<div class="pull-right action-buttons">
+																	<a class="blue" href="#">
+																		<i class="icon-pencil bigger-130"></i>
+																	</a>
+
+																	<a class="red" href="#">
+																		<i class="icon-trash bigger-130"></i>
+																	</a>
+																</div>
+															</div>
+
+															<ol class="dd-list">
+																<li class="dd-item item-orange" data-id="6">
+																	<div class="dd-handle"> Item 6 </div>
+																</li>
+
+																<li class="dd-item item-red" data-id="7">
+																	<div class="dd-handle">Item 7</div>
+																</li>
+
+																<li class="dd-item item-blue2" data-id="8">
+																	<div class="dd-handle">Item 8</div>
+																</li>
+															</ol>
+														</li>
+
+														<li class="dd-item" data-id="9">
+															<div class="dd-handle btn-yellow no-hover">Item 9</div>
+														</li>
+
+														<li class="dd-item" data-id="10">
+															<div class="dd-handle">Item 10</div>
+														</li>
+													</ol>
+												</li>
+
+												<li class="dd-item" data-id="11">
+													<div class="dd-handle">
+														Item 11
+														<span class="sticker">
+															<span class="label label-success arrowed-in">
+																<i class="icon-ok bigger-110"></i>
+															</span>
+														</span>
+													</div>
+												</li>
+
+												<li class="dd-item" data-id="12">
+													<div class="dd-handle">Item 12</div>
+												</li>
+											</ol>
+										</div>
+									</div>
+
+									<div class="vspace-sm-16"></div>
+
+									<div class="col-sm-6">
+										<div class="dd dd-draghandle">
+											<ol class="dd-list">
+												<li class="dd-item dd2-item" data-id="13">
+													<div class="dd-handle dd2-handle">
+														<i class="normal-icon icon-comments blue bigger-130"></i>
+
+														<i class="drag-icon icon-move bigger-125"></i>
+													</div>
+													<div class="dd2-content">Click on an icon to start dragging</div>
+												</li>
+
+												<li class="dd-item dd2-item" data-id="14">
+													<div class="dd-handle dd2-handle">
+														<i class="normal-icon icon-time pink bigger-130"></i>
+
+														<i class="drag-icon icon-move bigger-125"></i>
+													</div>
+													<div class="dd2-content">Recent Posts</div>
+												</li>
+
+												<li class="dd-item dd2-item" data-id="15">
+													<div class="dd-handle dd2-handle">
+														<i class="normal-icon icon-signal orange bigger-130"></i>
+
+														<i class="drag-icon icon-move bigger-125"></i>
+													</div>
+													<div class="dd2-content">Statistics</div>
+
+													<ol class="dd-list">
+														<li class="dd-item dd2-item" data-id="16">
+															<div class="dd-handle dd2-handle">
+																<i class="normal-icon icon-user red bigger-130"></i>
+
+																<i class="drag-icon icon-move bigger-125"></i>
+															</div>
+															<div class="dd2-content">Active Users</div>
+														</li>
+
+														<li class="dd-item dd2-item dd-colored" data-id="17">
+															<div class="dd-handle dd2-handle btn-info">
+																<i class="normal-icon icon-edit bigger-130"></i>
+
+																<i class="drag-icon icon-move bigger-125"></i>
+															</div>
+															<div class="dd2-content btn-info no-hover">Published Articles</div>
+														</li>
+
+														<li class="dd-item dd2-item" data-id="18">
+															<div class="dd-handle dd2-handle">
+																<i class="normal-icon icon-eye-open green bigger-130"></i>
+
+																<i class="drag-icon icon-move bigger-125"></i>
+															</div>
+															<div class="dd2-content">Visitors</div>
+														</li>
+													</ol>
+												</li>
+
+												<li class="dd-item dd2-item" data-id="19">
+													<div class="dd-handle dd2-handle">
+														<i class="normal-icon icon-reorder blue bigger-130"></i>
+
+														<i class="drag-icon icon-move bigger-125"></i>
+													</div>
+													<div class="dd2-content">Menu</div>
+												</li>
+											</ol>
+										</div>
+									</div>
+								</div><!-- PAGE CONTENT ENDS -->
+							</div><!-- /.col -->
+						</div><!-- /.row -->
+					</div><!-- /.page-content -->
+				</div><!-- /.main-content -->
+
+				<div class="ace-settings-container" id="ace-settings-container">
+					<div class="btn btn-app btn-xs btn-warning ace-settings-btn" id="ace-settings-btn">
+						<i class="icon-cog bigger-150"></i>
+					</div>
+
+					<div class="ace-settings-box" id="ace-settings-box">
+						<div>
+							<div class="pull-left">
+								<select id="skin-colorpicker" class="hide">
+									<option data-skin="default" value="#438EB9">#438EB9</option>
+									<option data-skin="skin-1" value="#222A2D">#222A2D</option>
+									<option data-skin="skin-2" value="#C6487E">#C6487E</option>
+									<option data-skin="skin-3" value="#D0D0D0">#D0D0D0</option>
+								</select>
+							</div>
+							<span>&nbsp; Choose Skin</span>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-navbar" />
+							<label class="lbl" for="ace-settings-navbar"> Fixed Navbar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-sidebar" />
+							<label class="lbl" for="ace-settings-sidebar"> Fixed Sidebar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-breadcrumbs" />
+							<label class="lbl" for="ace-settings-breadcrumbs"> Fixed Breadcrumbs</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-rtl" />
+							<label class="lbl" for="ace-settings-rtl"> Right To Left (rtl)</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-add-container" />
+							<label class="lbl" for="ace-settings-add-container">
+								Inside
+								<b>.container</b>
+							</label>
+						</div>
+					</div>
+				</div><!-- /#ace-settings-container -->
+			</div><!-- /.main-container-inner -->
+
+			<a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
+				<i class="icon-double-angle-up icon-only bigger-110"></i>
+			</a>
+		</div><!-- /.main-container -->
+
+		<!-- basic scripts -->
+
+
+		<!--[if !IE]> -->
+
+		<script type="text/javascript">
+			window.jQuery || document.write("<script src='/dist/js/jquery-2.0.3.min.js'>"+"<"+"/script>");
+		</script>
+
+		<!-- <![endif]-->
+
+		<!--[if IE]>
+<script type="text/javascript">
+ window.jQuery || document.write("<script src='/dist/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
+</script>
+<![endif]-->
+
+		<script type="text/javascript">
+			if("ontouchend" in document) document.write("<script src='/dist/js/jquery.mobile.custom.min.js'>"+"<"+"/script>");
+		</script>
+		<script src="/dist/js/bootstrap.min.js"></script>
+		<script src="/dist/js/typeahead-bs2.min.js"></script>
+
+		<!-- page specific plugin scripts -->
+
+		<script src="/dist/js/jquery.nestable.min.js"></script>
+
+		<!-- ace scripts -->
+
+		<script src="/dist/js/ace-elements.min.js"></script>
+		<script src="/dist/js/ace.min.js"></script>
+
+		<!-- inline scripts related to this page -->
+
+		<script type="text/javascript">
+			jQuery(function($){
+			
+				$('.dd').nestable();
+			
+				$('.dd-handle a').on('mousedown', function(e){
+					e.stopPropagation();
+				});
+				
+				$('[data-rel="tooltip"]').tooltip();
+			
+			});
+		</script>
+<script type="text/javascript">
+var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
+document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fe9e1d61340ff3d9495a8cca04ebdb49d' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<a href="http://www.iteblog.com/">过往记忆</a>
+</body>
+</html>

Diferenças do arquivo suprimidas por serem muito extensas
+ 1251 - 0
web/ace/pricing.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 3188 - 0
web/ace/profile.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 3013 - 0
web/ace/tables.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 1392 - 0
web/ace/timeline.html


+ 885 - 0
web/ace/treeview.html

@@ -0,0 +1,885 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>机构树菜单树 - Bootstrap后台管理系统模版Ace下载</title>
+		<meta name="keywords" content="Bootstrap模版,Bootstrap模版下载,Bootstrap教程,Bootstrap中文" />
+		<meta name="description" content="站长素材提供Bootstrap模版,Bootstrap教程,Bootstrap中文翻译等相关Bootstrap插件下载" />
+		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+		<!-- basic styles -->
+
+		<link href="/dist/css/bootstrap.min.css" rel="stylesheet" />
+		<link rel="stylesheet" href="/dist/css/font-awesome.min.css" />
+
+		<!--[if IE 7]>
+		  <link rel="stylesheet" href="/dist/css/font-awesome-ie7.min.css" />
+		<![endif]-->
+
+		<!-- page specific plugin styles -->
+
+		<!-- ace styles -->
+
+		<link rel="stylesheet" href="/dist/css/ace.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-rtl.min.css" />
+		<link rel="stylesheet" href="/dist/css/ace-skins.min.css" />
+
+		<!--[if lte IE 8]>
+		  <link rel="stylesheet" href="/dist/css/ace-ie.min.css" />
+		<![endif]-->
+
+		<!-- inline styles related to this page -->
+
+		<!-- ace settings handler -->
+
+		<script src="/dist/js/ace-extra.min.js"></script>
+
+		<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+
+		<!--[if lt IE 9]>
+		<script src="/dist/js/html5shiv.js"></script>
+		<script src="/dist/js/respond.min.js"></script>
+		<![endif]-->
+	</head>
+
+	<body>
+
+		<div class="navbar navbar-default" id="navbar">
+			<script type="text/javascript">
+				try{ace.settings.check('navbar' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="navbar-container" id="navbar-container">
+				<div class="navbar-header pull-left">
+					<a href="#" class="navbar-brand">
+						<small>
+							<i class="icon-leaf"></i>
+							Ace Admin
+						</small>
+					</a><!-- /.brand -->
+				</div><!-- /.navbar-header -->
+
+				<div class="navbar-header pull-right" role="navigation">
+					<ul class="nav ace-nav">
+						<li class="grey">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-tasks"></i>
+								<span class="badge badge-grey">4</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-ok"></i>
+									4 Tasks to complete
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Software Update</span>
+											<span class="pull-right">65%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:65%" class="progress-bar "></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Hardware Upgrade</span>
+											<span class="pull-right">35%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:35%" class="progress-bar progress-bar-danger"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Unit Testing</span>
+											<span class="pull-right">15%</span>
+										</div>
+
+										<div class="progress progress-mini ">
+											<div style="width:15%" class="progress-bar progress-bar-warning"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">Bug Fixes</span>
+											<span class="pull-right">90%</span>
+										</div>
+
+										<div class="progress progress-mini progress-striped active">
+											<div style="width:90%" class="progress-bar progress-bar-success"></div>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See tasks with details
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="purple">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-bell-alt icon-animated-bell"></i>
+								<span class="badge badge-important">8</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar navbar-pink dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-warning-sign"></i>
+									8 Notifications
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-pink icon-comment"></i>
+												New Comments
+											</span>
+											<span class="pull-right badge badge-info">+12</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="btn btn-xs btn-primary icon-user"></i>
+										Bob just signed up as an editor ...
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-success icon-shopping-cart"></i>
+												New Orders
+											</span>
+											<span class="pull-right badge badge-success">+8</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<div class="clearfix">
+											<span class="pull-left">
+												<i class="btn btn-xs no-hover btn-info icon-twitter"></i>
+												Followers
+											</span>
+											<span class="pull-right badge badge-info">+11</span>
+										</div>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										See all notifications
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="green">
+							<a data-toggle="dropdown" class="dropdown-toggle" href="#">
+								<i class="icon-envelope icon-animated-vertical"></i>
+								<span class="badge badge-success">5</span>
+							</a>
+
+							<ul class="pull-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close">
+								<li class="dropdown-header">
+									<i class="icon-envelope-alt"></i>
+									5 Messages
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar.png" class="msg-photo" alt="Alex's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Alex:</span>
+												Ciao sociis natoque penatibus et auctor ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>a moment ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar3.png" class="msg-photo" alt="Susan's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Susan:</span>
+												Vestibulum id ligula porta felis euismod ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>20 minutes ago</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<img src="/dist/avatars/avatar4.png" class="msg-photo" alt="Bob's Avatar" />
+										<span class="msg-body">
+											<span class="msg-title">
+												<span class="blue">Bob:</span>
+												Nullam quis risus eget urna mollis ornare ...
+											</span>
+
+											<span class="msg-time">
+												<i class="icon-time"></i>
+												<span>3:15 pm</span>
+											</span>
+										</span>
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										See all messages
+										<i class="icon-arrow-right"></i>
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li class="light-blue">
+							<a data-toggle="dropdown" href="#" class="dropdown-toggle">
+								<img class="nav-user-photo" src="/dist/avatars/user.jpg" alt="Jason's Photo" />
+								<span class="user-info">
+									<small>Welcome,</small>
+									Jason
+								</span>
+
+								<i class="icon-caret-down"></i>
+							</a>
+
+							<ul class="user-menu pull-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
+								<li>
+									<a href="#">
+										<i class="icon-cog"></i>
+										Settings
+									</a>
+								</li>
+
+								<li>
+									<a href="#">
+										<i class="icon-user"></i>
+										Profile
+									</a>
+								</li>
+
+								<li class="divider"></li>
+
+								<li>
+									<a href="#">
+										<i class="icon-off"></i>
+										Logout
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.ace-nav -->
+				</div><!-- /.navbar-header -->
+			</div><!-- /.container -->
+		</div>
+
+		<div class="main-container" id="main-container">
+			<script type="text/javascript">
+				try{ace.settings.check('main-container' , 'fixed')}catch(e){}
+			</script>
+
+			<div class="main-container-inner">
+				<a class="menu-toggler" id="menu-toggler" href="#">
+					<span class="menu-text"></span>
+				</a>
+
+				<div class="sidebar" id="sidebar">
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'fixed')}catch(e){}
+					</script>
+
+					<div class="sidebar-shortcuts" id="sidebar-shortcuts">
+						<div class="sidebar-shortcuts-large" id="sidebar-shortcuts-large">
+							<button class="btn btn-success">
+								<i class="icon-signal"></i>
+							</button>
+
+							<button class="btn btn-info">
+								<i class="icon-pencil"></i>
+							</button>
+
+							<button class="btn btn-warning">
+								<i class="icon-group"></i>
+							</button>
+
+							<button class="btn btn-danger">
+								<i class="icon-cogs"></i>
+							</button>
+						</div>
+
+						<div class="sidebar-shortcuts-mini" id="sidebar-shortcuts-mini">
+							<span class="btn btn-success"></span>
+
+							<span class="btn btn-info"></span>
+
+							<span class="btn btn-warning"></span>
+
+							<span class="btn btn-danger"></span>
+						</div>
+					</div><!-- #sidebar-shortcuts -->
+
+					<ul class="nav nav-list">
+						<li class="active">
+							<a href="index.html">
+								<i class="icon-dashboard"></i>
+								<span class="menu-text"> 控制台 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="typography.html">
+								<i class="icon-text-width"></i>
+								<span class="menu-text"> 文字排版 </span>
+							</a>
+						</li>
+
+						<li class="active open">
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-desktop"></i>
+								<span class="menu-text"> UI 组件 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="elements.html">
+										<i class="icon-double-angle-right"></i>
+										组件
+									</a>
+								</li>
+
+								<li>
+									<a href="buttons.html">
+										<i class="icon-double-angle-right"></i>
+										按钮 &amp; 图表
+									</a>
+								</li>
+
+								<li class="active">
+									<a href="treeview.html">
+										<i class="icon-double-angle-right"></i>
+										树菜单
+									</a>
+								</li>
+
+								<li>
+									<a href="jquery-ui.html">
+										<i class="icon-double-angle-right"></i>
+										jQuery UI
+									</a>
+								</li>
+
+								<li>
+									<a href="nestable-list.html">
+										<i class="icon-double-angle-right"></i>
+										可拖拽列表
+									</a>
+								</li>
+
+								<li>
+									<a href="#" class="dropdown-toggle">
+										<i class="icon-double-angle-right"></i>
+
+										三级菜单
+										<b class="arrow icon-angle-down"></b>
+									</a>
+
+									<ul class="submenu">
+										<li>
+											<a href="#">
+												<i class="icon-leaf"></i>
+												第一级
+											</a>
+										</li>
+
+										<li>
+											<a href="#" class="dropdown-toggle">
+												<i class="icon-pencil"></i>
+
+												第四级
+												<b class="arrow icon-angle-down"></b>
+											</a>
+
+											<ul class="submenu">
+												<li>
+													<a href="#">
+														<i class="icon-plus"></i>
+														添加产品
+													</a>
+												</li>
+
+												<li>
+													<a href="#">
+														<i class="icon-eye-open"></i>
+														查看商品
+													</a>
+												</li>
+											</ul>
+										</li>
+									</ul>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-list"></i>
+								<span class="menu-text"> 表格 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="tables.html">
+										<i class="icon-double-angle-right"></i>
+										简单 &amp; 动态
+									</a>
+								</li>
+
+								<li>
+									<a href="jqgrid.html">
+										<i class="icon-double-angle-right"></i>
+										jqGrid plugin
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-edit"></i>
+								<span class="menu-text"> 表单 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="form-elements.html">
+										<i class="icon-double-angle-right"></i>
+										表单组件
+									</a>
+								</li>
+
+								<li>
+									<a href="form-wizard.html">
+										<i class="icon-double-angle-right"></i>
+										向导提示 &amp; 验证
+									</a>
+								</li>
+
+								<li>
+									<a href="wysiwyg.html">
+										<i class="icon-double-angle-right"></i>
+										编辑器
+									</a>
+								</li>
+
+								<li>
+									<a href="dropzone.html">
+										<i class="icon-double-angle-right"></i>
+										文件上传
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="widgets.html">
+								<i class="icon-list-alt"></i>
+								<span class="menu-text"> 插件 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="calendar.html">
+								<i class="icon-calendar"></i>
+
+								<span class="menu-text">
+									日历
+									<span class="badge badge-transparent tooltip-error" title="2&nbsp;Important&nbsp;Events">
+										<i class="icon-warning-sign red bigger-130"></i>
+									</span>
+								</span>
+							</a>
+						</li>
+
+						<li>
+							<a href="gallery.html">
+								<i class="icon-picture"></i>
+								<span class="menu-text"> 相册 </span>
+							</a>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-tag"></i>
+								<span class="menu-text"> 更多页面 </span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="profile.html">
+										<i class="icon-double-angle-right"></i>
+										用户信息
+									</a>
+								</li>
+
+								<li>
+									<a href="inbox.html">
+										<i class="icon-double-angle-right"></i>
+										收件箱
+									</a>
+								</li>
+
+								<li>
+									<a href="pricing.html">
+										<i class="icon-double-angle-right"></i>
+										售价单
+									</a>
+								</li>
+
+								<li>
+									<a href="invoice.html">
+										<i class="icon-double-angle-right"></i>
+										购物车
+									</a>
+								</li>
+
+								<li>
+									<a href="timeline.html">
+										<i class="icon-double-angle-right"></i>
+										时间轴
+									</a>
+								</li>
+
+								<li>
+									<a href="login.html">
+										<i class="icon-double-angle-right"></i>
+										登录 &amp; 注册
+									</a>
+								</li>
+							</ul>
+						</li>
+
+						<li>
+							<a href="#" class="dropdown-toggle">
+								<i class="icon-file-alt"></i>
+
+								<span class="menu-text">
+									其他页面
+									<span class="badge badge-primary ">5</span>
+								</span>
+
+								<b class="arrow icon-angle-down"></b>
+							</a>
+
+							<ul class="submenu">
+								<li>
+									<a href="faq.html">
+										<i class="icon-double-angle-right"></i>
+										帮助
+									</a>
+								</li>
+
+								<li>
+									<a href="error-404.html">
+										<i class="icon-double-angle-right"></i>
+										404错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="error-500.html">
+										<i class="icon-double-angle-right"></i>
+										500错误页面
+									</a>
+								</li>
+
+								<li>
+									<a href="grid.html">
+										<i class="icon-double-angle-right"></i>
+										网格
+									</a>
+								</li>
+
+								<li>
+									<a href="blank.html">
+										<i class="icon-double-angle-right"></i>
+										空白页面
+									</a>
+								</li>
+							</ul>
+						</li>
+					</ul><!-- /.nav-list -->
+
+					<div class="sidebar-collapse" id="sidebar-collapse">
+						<i class="icon-double-angle-left" data-icon1="icon-double-angle-left" data-icon2="icon-double-angle-right"></i>
+					</div>
+
+					<script type="text/javascript">
+						try{ace.settings.check('sidebar' , 'collapsed')}catch(e){}
+					</script>
+				</div>
+
+				<div class="main-content">
+					<div class="breadcrumbs" id="breadcrumbs">
+						<script type="text/javascript">
+							try{ace.settings.check('breadcrumbs' , 'fixed')}catch(e){}
+						</script>
+
+						<ul class="breadcrumb">
+							<li>
+								<i class="icon-home home-icon"></i>
+								<a href="#">Home</a>
+							</li>
+
+							<li>
+								<a href="#">UI Elements</a>
+							</li>
+							<li class="active">Treeview</li>
+						</ul><!-- .breadcrumb -->
+
+						<div class="nav-search" id="nav-search">
+							<form class="form-search">
+								<span class="input-icon">
+									<input type="text" placeholder="Search ..." class="nav-search-input" id="nav-search-input" autocomplete="off" />
+									<i class="icon-search nav-search-icon"></i>
+								</span>
+							</form>
+						</div><!-- #nav-search -->
+					</div>
+
+					<div class="page-content">
+						<div class="page-header">
+							<h1>
+								Treeview
+								<small>
+									<i class="icon-double-angle-right"></i>
+									with selectable items(single &amp; multiple) and custom icons
+								</small>
+							</h1>
+						</div><!-- /.page-header -->
+
+						<div class="row">
+							<div class="col-xs-12">
+								<!-- PAGE CONTENT BEGINS -->
+
+								<div class="row">
+									<div class="col-sm-6">
+										<div class="widget-box">
+											<div class="widget-header header-color-blue2">
+												<h4 class="lighter smaller">Choose Categories</h4>
+											</div>
+
+											<div class="widget-body">
+												<div class="widget-main padding-8">
+													<div id="tree1" class="tree"></div>
+												</div>
+											</div>
+										</div>
+									</div>
+
+									<div class="col-sm-6">
+										<div class="widget-box">
+											<div class="widget-header header-color-green2">
+												<h4 class="lighter smaller">Browse Files</h4>
+											</div>
+
+											<div class="widget-body">
+												<div class="widget-main padding-8">
+													<div id="tree2" class="tree"></div>
+												</div>
+											</div>
+										</div>
+									</div>
+								</div>
+
+								<script type="text/javascript">
+									var $/dist = "/dist";//this will be used in fuelux.tree-sampledata.js
+								</script>
+
+								<!-- PAGE CONTENT ENDS -->
+							</div><!-- /.col -->
+						</div><!-- /.row -->
+					</div><!-- /.page-content -->
+				</div><!-- /.main-content -->
+
+				<div class="ace-settings-container" id="ace-settings-container">
+					<div class="btn btn-app btn-xs btn-warning ace-settings-btn" id="ace-settings-btn">
+						<i class="icon-cog bigger-150"></i>
+					</div>
+
+					<div class="ace-settings-box" id="ace-settings-box">
+						<div>
+							<div class="pull-left">
+								<select id="skin-colorpicker" class="hide">
+									<option data-skin="default" value="#438EB9">#438EB9</option>
+									<option data-skin="skin-1" value="#222A2D">#222A2D</option>
+									<option data-skin="skin-2" value="#C6487E">#C6487E</option>
+									<option data-skin="skin-3" value="#D0D0D0">#D0D0D0</option>
+								</select>
+							</div>
+							<span>&nbsp; Choose Skin</span>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-navbar" />
+							<label class="lbl" for="ace-settings-navbar"> Fixed Navbar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-sidebar" />
+							<label class="lbl" for="ace-settings-sidebar"> Fixed Sidebar</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-breadcrumbs" />
+							<label class="lbl" for="ace-settings-breadcrumbs"> Fixed Breadcrumbs</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-rtl" />
+							<label class="lbl" for="ace-settings-rtl"> Right To Left (rtl)</label>
+						</div>
+
+						<div>
+							<input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-add-container" />
+							<label class="lbl" for="ace-settings-add-container">
+								Inside
+								<b>.container</b>
+							</label>
+						</div>
+					</div>
+				</div><!-- /#ace-settings-container -->
+			</div><!-- /.main-container-inner -->
+
+			<a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
+				<i class="icon-double-angle-up icon-only bigger-110"></i>
+			</a>
+		</div><!-- /.main-container -->
+
+		<!-- basic scripts -->
+
+		<!--[if !IE]> -->
+
+		<script type="text/javascript">
+			window.jQuery || document.write("<script src='/dist/js/jquery-2.0.3.min.js'>"+"<"+"/script>");
+		</script>
+
+		<!-- <![endif]-->
+
+		<!--[if IE]>
+<script type="text/javascript">
+ window.jQuery || document.write("<script src='/dist/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
+</script>
+<![endif]-->
+
+		<script type="text/javascript">
+			if("ontouchend" in document) document.write("<script src='/dist/js/jquery.mobile.custom.min.js'>"+"<"+"/script>");
+		</script>
+		<script src="/dist/js/bootstrap.min.js"></script>
+		<script src="/dist/js/typeahead-bs2.min.js"></script>
+
+		<!-- page specific plugin scripts -->
+
+		<script src="/dist/js/fuelux/data/fuelux.tree-sampledata.js"></script>
+		<script src="/dist/js/fuelux/fuelux.tree.min.js"></script>
+
+		<!-- ace scripts -->
+
+		<script src="/dist/js/ace-elements.min.js"></script>
+		<script src="/dist/js/ace.min.js"></script>
+
+		<!-- inline scripts related to this page -->
+
+		<script type="text/javascript">
+			jQuery(function($){
+
+		$('#tree1').ace_tree({
+			dataSource: treeDataSource ,
+			multiSelect:true,
+			loadingHTML:'<div class="tree-loading"><i class="icon-refresh icon-spin blue"></i></div>',
+			'open-icon' : 'icon-minus',
+			'close-icon' : 'icon-plus',
+			'selectable' : true,
+			'selected-icon' : 'icon-ok',
+			'unselected-icon' : 'icon-remove'
+		});
+
+		$('#tree2').ace_tree({
+			dataSource: treeDataSource2 ,
+			loadingHTML:'<div class="tree-loading"><i class="icon-refresh icon-spin blue"></i></div>',
+			'open-icon' : 'icon-folder-open',
+			'close-icon' : 'icon-folder-close',
+			'selectable' : false,
+			'selected-icon' : null,
+			'unselected-icon' : null
+		});
+
+
+
+		/**
+		$('#tree1').on('loaded', function (evt, data) {
+		});
+
+		$('#tree1').on('opened', function (evt, data) {
+		});
+
+		$('#tree1').on('closed', function (evt, data) {
+		});
+
+		$('#tree1').on('selected', function (evt, data) {
+		});
+		*/
+});
+		</script>
+<script type="text/javascript">
+var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
+document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fe9e1d61340ff3d9495a8cca04ebdb49d' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<a href="http://www.iteblog.com/">过往记忆</a>
+</body>
+</html>

Diferenças do arquivo suprimidas por serem muito extensas
+ 1091 - 0
web/ace/typography.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 1476 - 0
web/ace/widgets.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 1076 - 0
web/ace/wysiwyg.html


+ 0 - 0
web/assets/714e5a5a/bg.png


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff