Browse Source

修复nice-validator在打包后台空白的BUG
将AdminLTE和Echarts从Bower中移除,极大缩减扩展资源包的大小
新增前台Ajax的处理方法
移除冗余的第三方扩展包
固定JS中第三方的语言的标识,如果需要切换语言,JS中需要手动修改
修复前台注册登录的提示错误
修复后台菜单栏在极端情况下的BUG

Karson 8 years ago
parent
commit
13942c36fa

+ 1 - 0
.gitignore

@@ -2,6 +2,7 @@
 .idea
 composer.lock
 *.log
+*.css.map
 thinkphp
 vendor
 runtime

+ 1 - 1
application/admin/command/Menu.php

@@ -180,7 +180,7 @@ class Menu extends Command
             }
         }
         //过滤掉其它字符
-        $controllerTitle = trim(preg_replace(array('/^\/\*\*(.*)[\n\r\t]/', '/[\s]+\*\//', '/\*\s@(.*)/', '/[\s|\*]+/'), '', $classComment));
+        $controllerTitle = trim(preg_replace(array('/^\/\*\*(.*)[\n\r\t]/u', '/[\s]+\*\//u', '/\*\s@(.*)/u', '/[\s|\*]+/u'), '', $classComment));
         //先定入菜单的数据
         $pid = 0;
         $name = "/admin";

+ 2 - 1
application/admin/common.php

@@ -9,7 +9,8 @@ use think\Db;
 
 /**
  * 重新生成上传的参数配置
- * @return type
+ * @param array $params
+ * @return string
  */
 function get_upload_multipart($params = [])
 {

+ 1 - 1
application/admin/view/common/control.html

@@ -22,7 +22,7 @@
             <div class="form-group"><label class="control-sidebar-subheading"><input type="checkbox" data-layout="fixed" class="pull-right"> {:__('Fixed Layout')}</label><p>{:__("You can't use fixed and boxed layouts together")}</p></div>
             <div class="form-group"><label class="control-sidebar-subheading"><input type="checkbox" data-layout="layout-boxed" class="pull-right"> {:__('Boxed Layout')}</label><p>{:__('Activate the boxed layout')}</p></div>
             <div class="form-group"><label class="control-sidebar-subheading"><input type="checkbox" data-layout="sidebar-collapse" class="pull-right"> {:__('Toggle Sidebar')}</label><p>{:__("Toggle the left sidebar's state (open or collapse)")}</p></div>
-            <!--<div class="form-group"><label class="control-sidebar-subheading"><input type="checkbox" data-enable="expandOnHover" class="pull-right"> {:__('Sidebar Expand on Hover')}</label><p>{:__('Let the sidebar mini expand on hover')}</p></div>-->
+            <div class="form-group"><label class="control-sidebar-subheading"><input type="checkbox" data-enable="expandOnHover" class="pull-right"> {:__('Sidebar Expand on Hover')}</label><p>{:__('Let the sidebar mini expand on hover')}</p></div>
             <div class="form-group"><label class="control-sidebar-subheading"><input type="checkbox" data-menu="show-submenu" class="pull-right"> {:__('Show sub menu')}</label><p>{:__('Always show sub menu')}</p></div>
             <div class="form-group"><label class="control-sidebar-subheading"><input type="checkbox" data-menu="disable-top-badge" class="pull-right"> {:__('Disable top menu badge')}</label><p>{:__('Disable top menu badge without left menu')}</p></div>
             <div class="form-group"><label class="control-sidebar-subheading"><input type="checkbox" data-controlsidebar="control-sidebar-open" class="pull-right"> {:__('Toggle Right Sidebar Slide')}</label><p>{:__('Toggle between slide over content and push content effects')}</p></div>

+ 16 - 0
application/admin/view/common/header.html

@@ -42,6 +42,22 @@
                 </ul>
             </li>
 
+            <li class="dropdown messages-menu github-commits">
+                <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                    <i class="fa fa-github"></i>
+                    <span class="label label-info"></span>
+                </a>
+                <ul class="dropdown-menu">
+                    <li class="header">{:__('Recent commits')}</li>
+                    <li>
+                        <ul class="menu">
+
+                        </ul>
+                    </li>
+                    <li class="footer"><a href="#" target="_blank">{:__('View all')}</a></li>
+                </ul>
+            </li>
+
             <li>
                 <a href="javascript:;" data-toggle="wipecache" title="清空缓存">
                     <i class="fa fa-trash"></i>

+ 3 - 3
application/admin/view/index/index.html

@@ -1,8 +1,8 @@
 <!DOCTYPE html>
-<html lang="en">
+<html lang="{$config.language}">
     <head>
         {include file="common/meta" /}
-        
+
         <script>
             //此处为FastAdmin的统计代码,正式使用请移除
             var _hmt = _hmt || [];
@@ -33,7 +33,7 @@
             <footer class="main-footer hide">
                 <div class="pull-right hidden-xs">
                 </div>
-                <strong>Copyright &copy; 2014-2016 <a href="http://fastadmin.net">Fastadmin</a>.</strong> All rights
+                <strong>Copyright &copy; 2017-2018 <a href="http://fastadmin.net">Fastadmin</a>.</strong> All rights
                 reserved.
             </footer>
 

+ 1 - 2
application/common/controller/Backend.php

@@ -213,8 +213,7 @@ class Backend extends Controller
                     break;
             }
         }
-        $where = function($query) use ($where)
-        {
+        $where = function($query) use ($where) {
             foreach ($where as $k => $v)
             {
                 if (is_array($v))

+ 119 - 0
application/index/controller/Ajax.php

@@ -0,0 +1,119 @@
+<?php
+
+namespace app\index\controller;
+
+use app\common\controller\Frontend;
+use fast\Random;
+use think\Config;
+use think\Lang;
+
+/**
+ * Ajax异步请求接口
+ * @internal
+ */
+class Ajax extends Frontend
+{
+
+    protected $noNeedLogin = ['lang'];
+    protected $noNeedRight = ['*'];
+    protected $layout = '';
+
+    /**
+     * 加载语言包
+     */
+    public function lang()
+    {
+        header('Content-Type: application/javascript');
+        $modulename = $this->request->module();
+        $callback = $this->request->get('callback');
+        $controllername = input("controllername");
+        Lang::load(APP_PATH . $modulename . '/lang/' . Lang::detect() . '/' . str_replace('.', '/', $controllername) . '.php');
+        //强制输出JSON Object
+        $result = 'define(' . json_encode(Lang::get(), JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE) . ');';
+        return $result;
+    }
+
+    /**
+     * 上传文件
+     */
+    public function upload()
+    {
+        $this->code = -1;
+        $file = $this->request->file('file');
+
+        //判断是否已经存在附件
+        $sha1 = $file->hash();
+        $uploaded = model("attachment")->where('sha1', $sha1)->find();
+        if ($uploaded)
+        {
+            $this->code = 1;
+            $this->data = [
+                'url' => $uploaded['url']
+            ];
+            return;
+        }
+
+        $upload = Config::get('upload');
+
+        preg_match('/(\d+)(\w+)/', $upload['maxsize'], $matches);
+        $type = strtolower($matches[2]);
+        $typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3];
+        $size = (int) $upload['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0);
+        $fileInfo = $file->getInfo();
+        $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION));
+        $suffix = $suffix ? $suffix : 'file';
+        $replaceArr = [
+            '{year}'     => date("Y"),
+            '{mon}'      => date("m"),
+            '{day}'      => date("d"),
+            '{hour}'     => date("H"),
+            '{min}'      => date("i"),
+            '{sec}'      => date("s"),
+            '{random}'   => Random::alnum(16),
+            '{random32}' => Random::alnum(32),
+            '{filename}' => $suffix ? substr($fileInfo['name'], 0, strripos($fileInfo['name'], '.')) : $fileInfo['name'],
+            '{suffix}'   => $suffix,
+            '{.suffix}'  => $suffix ? '.' . $suffix : '',
+            '{filemd5}'  => md5_file($fileInfo['tmp_name']),
+        ];
+        $savekey = $upload['savekey'];
+        $savekey = str_replace(array_keys($replaceArr), array_values($replaceArr), $savekey);
+
+        $uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1);
+        $fileName = substr($savekey, strripos($savekey, '/') + 1);
+        //
+        $splInfo = $file->validate(['size' => $size])->move(ROOT_PATH . '/public' . $uploadDir, $fileName);
+        if ($splInfo)
+        {
+            $imagewidth = $imageheight = 0;
+            if (in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf']))
+            {
+                $imgInfo = getimagesize($splInfo->getPathname());
+                $imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth;
+                $imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight;
+            }
+            $params = array(
+                'filesize'    => $fileInfo['size'],
+                'imagewidth'  => $imagewidth,
+                'imageheight' => $imageheight,
+                'imagetype'   => $suffix,
+                'imageframes' => 0,
+                'mimetype'    => $fileInfo['type'],
+                'url'         => $uploadDir . $splInfo->getSaveName(),
+                'uploadtime'  => time(),
+                'sha1'        => $sha1,
+            );
+            model("attachment")->create(array_filter($params));
+            $this->code = 1;
+            $this->data = [
+                'url' => $uploadDir . $splInfo->getSaveName()
+            ];
+        }
+        else
+        {
+            // 上传失败获取错误信息
+            $this->data = $file->getError();
+        }
+    }
+
+}

+ 6 - 0
application/index/controller/Index.php

@@ -19,4 +19,10 @@ class Index extends Frontend
         return $this->view->fetch();
     }
 
+    public function news()
+    {
+        $newslist = \app\common\model\Page::where('category_id', 1)->order('weigh', 'desc')->select();
+        return jsonp(['newslist' => $newslist, 'new' => count($newslist), 'url' => 'http://www.fastadmin.net?ref=news']);
+    }
+
 }

+ 2 - 2
application/index/controller/User.php

@@ -60,7 +60,7 @@ class User extends Frontend
                     $synchtml = $uc->uc_user_synregister($this->user->id, $password);
                 }
                 $referer = Cookie::get('referer_url');
-                $this->error(__('Sign up successful') . $synchtml, $url);
+                $this->success(__('Sign up successful') . $synchtml, $url);
             }
             else
             {
@@ -96,7 +96,7 @@ class User extends Frontend
                     $uc = new Client();
                     $synchtml = $uc->uc_user_synlogin($this->user->id);
                 }
-                $this->error(__('Logged in successful') . $synchtml, $url);
+                $this->success(__('Logged in successful') . $synchtml, $url);
             }
             else
             {

+ 5 - 8
bower.json

@@ -1,9 +1,9 @@
 {
-  "name": "thinkphp-admin",
-  "description": "",
+  "name": "fastadmin",
+  "description": "the fastest admin framework",
   "main": "",
-  "license": "MIT",
-  "homepage": "",
+  "license": "Apache2.0",
+  "homepage": "http://www.fastadmin.net",
   "private": true,
   "dependencies": {
     "jquery": "^2.2.3",
@@ -27,10 +27,8 @@
     "require-css": "^0.1.8",
     "less": "^2.7.1",
     "tableExport.jquery.plugin": "^1.6.4",
-    "echarts": "^3.3.1",
     "jquery-slimscroll": "slimscroll#^1.3.8",
     "jquery.cookie": "^1.4.1",
-    "dropzone": "^4.3.0",
     "Sortable": "^1.5.0",
     "typeahead.js": "^0.11.1",
     "bootstrap-tagsinput": "^0.8.0",
@@ -40,7 +38,6 @@
   "devDependencies": {
     "dragsort": "https://github.com/karsonzhang/dragsort.git",
     "jquery-addtabs": "https://github.com/karsonzhang/jquery-addtabs.git",
-    "jqcron": "https://github.com/karsonzhang/jqcron.git#",
-    "AdminLTE": "https://github.com/karsonzhang/AdminLTE.git#^2.3.7"
+    "jqcron": "https://github.com/karsonzhang/jqcron.git#"
   }
 }

+ 1 - 1
extend/fast/ucenter/client/uc_client/data/cache/apps.php

@@ -5,7 +5,7 @@ $_CACHE['apps'] = array (
     'appid' => '1',
     'type' => 'OTHER',
     'name' => 'FastAdmin',
-    'url' => 'http://www.tp.com/index/ucenter',
+    'url' => 'http://www.fa.com/index/ucenter',
     'ip' => '',
     'viewprourl' => '',
     'apifilename' => 'index',

+ 22 - 0
public/assets/css/backend-func.css

@@ -13,6 +13,22 @@ body {
   -o-transition: none;
   transition: none;
 }
+.main-header .navbar {
+  position: relative;
+}
+.main-header .navbar .sidebar-toggle {
+  position: absolute;
+  width: 45px;
+  text-align: center;
+}
+.main-header .navbar #nav {
+  position: absolute;
+  left: 45px;
+}
+.main-header .navbar .navbar-custom-menu {
+  position: absolute;
+  right: 0;
+}
 .note-dialog .modal {
   z-index: 1060;
 }
@@ -38,6 +54,12 @@ body {
   -webkit-overflow-scrolling: touch;
   overflow: auto;
 }
+.common-search-table {
+  min-height: 20px;
+  padding: 15px;
+  margin-bottom: 15px;
+  background-color: #f5f5f5;
+}
 /*
  * RIBBON
  */

File diff suppressed because it is too large
+ 1 - 1
public/assets/css/backend.min.css


+ 0 - 388
public/assets/css/dropzone.css

@@ -1,388 +0,0 @@
-/*
- * The MIT License
- * Copyright (c) 2012 Matias Meno <m@tias.me>
- */
-@-webkit-keyframes passing-through {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(40px);
-    -moz-transform: translateY(40px);
-    -ms-transform: translateY(40px);
-    -o-transform: translateY(40px);
-    transform: translateY(40px); }
-  30%, 70% {
-    opacity: 1;
-    -webkit-transform: translateY(0px);
-    -moz-transform: translateY(0px);
-    -ms-transform: translateY(0px);
-    -o-transform: translateY(0px);
-    transform: translateY(0px); }
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-40px);
-    -moz-transform: translateY(-40px);
-    -ms-transform: translateY(-40px);
-    -o-transform: translateY(-40px);
-    transform: translateY(-40px); } }
-@-moz-keyframes passing-through {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(40px);
-    -moz-transform: translateY(40px);
-    -ms-transform: translateY(40px);
-    -o-transform: translateY(40px);
-    transform: translateY(40px); }
-  30%, 70% {
-    opacity: 1;
-    -webkit-transform: translateY(0px);
-    -moz-transform: translateY(0px);
-    -ms-transform: translateY(0px);
-    -o-transform: translateY(0px);
-    transform: translateY(0px); }
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-40px);
-    -moz-transform: translateY(-40px);
-    -ms-transform: translateY(-40px);
-    -o-transform: translateY(-40px);
-    transform: translateY(-40px); } }
-@keyframes passing-through {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(40px);
-    -moz-transform: translateY(40px);
-    -ms-transform: translateY(40px);
-    -o-transform: translateY(40px);
-    transform: translateY(40px); }
-  30%, 70% {
-    opacity: 1;
-    -webkit-transform: translateY(0px);
-    -moz-transform: translateY(0px);
-    -ms-transform: translateY(0px);
-    -o-transform: translateY(0px);
-    transform: translateY(0px); }
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-40px);
-    -moz-transform: translateY(-40px);
-    -ms-transform: translateY(-40px);
-    -o-transform: translateY(-40px);
-    transform: translateY(-40px); } }
-@-webkit-keyframes slide-in {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(40px);
-    -moz-transform: translateY(40px);
-    -ms-transform: translateY(40px);
-    -o-transform: translateY(40px);
-    transform: translateY(40px); }
-  30% {
-    opacity: 1;
-    -webkit-transform: translateY(0px);
-    -moz-transform: translateY(0px);
-    -ms-transform: translateY(0px);
-    -o-transform: translateY(0px);
-    transform: translateY(0px); } }
-@-moz-keyframes slide-in {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(40px);
-    -moz-transform: translateY(40px);
-    -ms-transform: translateY(40px);
-    -o-transform: translateY(40px);
-    transform: translateY(40px); }
-  30% {
-    opacity: 1;
-    -webkit-transform: translateY(0px);
-    -moz-transform: translateY(0px);
-    -ms-transform: translateY(0px);
-    -o-transform: translateY(0px);
-    transform: translateY(0px); } }
-@keyframes slide-in {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(40px);
-    -moz-transform: translateY(40px);
-    -ms-transform: translateY(40px);
-    -o-transform: translateY(40px);
-    transform: translateY(40px); }
-  30% {
-    opacity: 1;
-    -webkit-transform: translateY(0px);
-    -moz-transform: translateY(0px);
-    -ms-transform: translateY(0px);
-    -o-transform: translateY(0px);
-    transform: translateY(0px); } }
-@-webkit-keyframes pulse {
-  0% {
-    -webkit-transform: scale(1);
-    -moz-transform: scale(1);
-    -ms-transform: scale(1);
-    -o-transform: scale(1);
-    transform: scale(1); }
-  10% {
-    -webkit-transform: scale(1.1);
-    -moz-transform: scale(1.1);
-    -ms-transform: scale(1.1);
-    -o-transform: scale(1.1);
-    transform: scale(1.1); }
-  20% {
-    -webkit-transform: scale(1);
-    -moz-transform: scale(1);
-    -ms-transform: scale(1);
-    -o-transform: scale(1);
-    transform: scale(1); } }
-@-moz-keyframes pulse {
-  0% {
-    -webkit-transform: scale(1);
-    -moz-transform: scale(1);
-    -ms-transform: scale(1);
-    -o-transform: scale(1);
-    transform: scale(1); }
-  10% {
-    -webkit-transform: scale(1.1);
-    -moz-transform: scale(1.1);
-    -ms-transform: scale(1.1);
-    -o-transform: scale(1.1);
-    transform: scale(1.1); }
-  20% {
-    -webkit-transform: scale(1);
-    -moz-transform: scale(1);
-    -ms-transform: scale(1);
-    -o-transform: scale(1);
-    transform: scale(1); } }
-@keyframes pulse {
-  0% {
-    -webkit-transform: scale(1);
-    -moz-transform: scale(1);
-    -ms-transform: scale(1);
-    -o-transform: scale(1);
-    transform: scale(1); }
-  10% {
-    -webkit-transform: scale(1.1);
-    -moz-transform: scale(1.1);
-    -ms-transform: scale(1.1);
-    -o-transform: scale(1.1);
-    transform: scale(1.1); }
-  20% {
-    -webkit-transform: scale(1);
-    -moz-transform: scale(1);
-    -ms-transform: scale(1);
-    -o-transform: scale(1);
-    transform: scale(1); } }
-.dropzone, .dropzone * {
-  box-sizing: border-box; }
-
-.dropzone {
-  min-height: 15px;
-  border: 1px solid rgba(0, 0, 0, 1);
-  background: white;
-  padding: 5px 5px; }
-  .dropzone.dz-clickable {
-    cursor: pointer; }
-    .dropzone.dz-clickable * {
-      cursor: default; }
-    .dropzone.dz-clickable .dz-message, .dropzone.dz-clickable .dz-message * {
-      cursor: pointer; }
-  .dropzone.dz-started .dz-message {
-    display: none; }
-  .dropzone.dz-drag-hover {
-    border-style: solid; }
-    .dropzone.dz-drag-hover .dz-message {
-      opacity: 0.5; }
-  .dropzone .dz-message {
-    text-align: center;
-    margin: 2em 0; }
-  .dropzone .dz-preview {
-    position: relative;
-    display: inline-block;
-    vertical-align: top;
-    margin: 3px;
-    min-height: 100px; }
-    .dropzone .dz-preview:hover {
-      z-index: 1000; }
-      .dropzone .dz-preview:hover .dz-details {
-        opacity: 1; }
-    .dropzone .dz-preview.dz-file-preview .dz-image {
-      border-radius: 10px;
-      background: #999;
-      background: linear-gradient(to bottom, #eee, #ddd); }
-    .dropzone .dz-preview.dz-file-preview .dz-details {
-      opacity: 1; }
-    .dropzone .dz-preview.dz-image-preview {
-      background: white; }
-      .dropzone .dz-preview.dz-image-preview .dz-details {
-        -webkit-transition: opacity 0.2s linear;
-        -moz-transition: opacity 0.2s linear;
-        -ms-transition: opacity 0.2s linear;
-        -o-transition: opacity 0.2s linear;
-        transition: opacity 0.2s linear; }
-    .dropzone .dz-preview .dz-remove {
-      font-size: 14px;
-      text-align: center;
-      display: block;
-      cursor: pointer;
-      border: none; }
-      .dropzone .dz-preview .dz-remove:hover {
-        text-decoration: underline; }
-    .dropzone .dz-preview:hover .dz-details {
-      opacity: 1; }
-    .dropzone .dz-preview .dz-details {
-      z-index: 20;
-      position: absolute;
-      top: 0;
-      left: 0;
-      opacity: 0;
-      font-size: 13px;
-      min-width: 100%;
-      max-width: 100%;
-      padding: 2em 1em;
-      text-align: center;
-      color: rgba(0, 0, 0, 0.9);
-      line-height: 150%; }
-      .dropzone .dz-preview .dz-details .dz-size {
-        margin-bottom: 1em;
-        font-size: 16px; }
-      .dropzone .dz-preview .dz-details .dz-filename {
-        white-space: nowrap; }
-        .dropzone .dz-preview .dz-details .dz-filename:hover span {
-          border: 1px solid rgba(200, 200, 200, 0.8);
-          background-color: rgba(255, 255, 255, 0.8); }
-        .dropzone .dz-preview .dz-details .dz-filename:not(:hover) {
-          overflow: hidden;
-          text-overflow: ellipsis; }
-          .dropzone .dz-preview .dz-details .dz-filename:not(:hover) span {
-            border: 1px solid transparent; }
-      .dropzone .dz-preview .dz-details .dz-filename span, .dropzone .dz-preview .dz-details .dz-size span {
-        background-color: rgba(255, 255, 255, 0.4);
-        padding: 0 0.4em;
-        border-radius: 3px; }
-    .dropzone .dz-preview:hover .dz-image img {
-      -webkit-transform: scale(1.05, 1.05);
-      -moz-transform: scale(1.05, 1.05);
-      -ms-transform: scale(1.05, 1.05);
-      -o-transform: scale(1.05, 1.05);
-      transform: scale(1.05, 1.05);
-      -webkit-filter: blur(8px);
-      filter: blur(8px); }
-    .dropzone .dz-preview .dz-image {
-      border-radius: 10px;
-      overflow: hidden;
-      width: 100px;
-      height: 100px;
-      position: relative;
-      display: block;
-      z-index: 10; }
-      .dropzone .dz-preview .dz-image img {
-        display: block; }
-    .dropzone .dz-preview.dz-success .dz-success-mark {
-      -webkit-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
-      -moz-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
-      -ms-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
-      -o-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
-      animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1); }
-    .dropzone .dz-preview.dz-error .dz-error-mark {
-      opacity: 1;
-      -webkit-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
-      -moz-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
-      -ms-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
-      -o-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
-      animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1); }
-    .dropzone .dz-preview .dz-success-mark, .dropzone .dz-preview .dz-error-mark {
-      pointer-events: none;
-      opacity: 0;
-      z-index: 500;
-      position: absolute;
-      display: block;
-      top: 50%;
-      left: 50%;
-      margin-left: -27px;
-      margin-top: -27px; }
-      .dropzone .dz-preview .dz-success-mark svg, .dropzone .dz-preview .dz-error-mark svg {
-        display: block;
-        width: 54px;
-        height: 54px; }
-    .dropzone .dz-preview.dz-processing .dz-progress {
-      opacity: 1;
-      -webkit-transition: all 0.2s linear;
-      -moz-transition: all 0.2s linear;
-      -ms-transition: all 0.2s linear;
-      -o-transition: all 0.2s linear;
-      transition: all 0.2s linear; }
-    .dropzone .dz-preview.dz-complete .dz-progress {
-      opacity: 0;
-      -webkit-transition: opacity 0.4s ease-in;
-      -moz-transition: opacity 0.4s ease-in;
-      -ms-transition: opacity 0.4s ease-in;
-      -o-transition: opacity 0.4s ease-in;
-      transition: opacity 0.4s ease-in; }
-    .dropzone .dz-preview:not(.dz-processing) .dz-progress {
-      -webkit-animation: pulse 6s ease infinite;
-      -moz-animation: pulse 6s ease infinite;
-      -ms-animation: pulse 6s ease infinite;
-      -o-animation: pulse 6s ease infinite;
-      animation: pulse 6s ease infinite; }
-    .dropzone .dz-preview .dz-progress {
-      opacity: 1;
-      z-index: 1000;
-      pointer-events: none;
-      position: absolute;
-      height: 16px;
-      left: 50%;
-      top: 50%;
-      margin-top: -8px;
-      width: 80px;
-      margin-left: -40px;
-      background: rgba(255, 255, 255, 0.9);
-      -webkit-transform: scale(1);
-      border-radius: 8px;
-      overflow: hidden; }
-      .dropzone .dz-preview .dz-progress .dz-upload {
-        background: #333;
-        background: linear-gradient(to bottom, #666, #444);
-        position: absolute;
-        top: 0;
-        left: 0;
-        bottom: 0;
-        width: 0;
-        -webkit-transition: width 300ms ease-in-out;
-        -moz-transition: width 300ms ease-in-out;
-        -ms-transition: width 300ms ease-in-out;
-        -o-transition: width 300ms ease-in-out;
-        transition: width 300ms ease-in-out; }
-    .dropzone .dz-preview.dz-error .dz-error-message {
-      display: block; }
-    .dropzone .dz-preview.dz-error:hover .dz-error-message {
-      opacity: 1;
-      pointer-events: auto; }
-    .dropzone .dz-preview .dz-error-message {
-      pointer-events: none;
-      z-index: 1000;
-      position: absolute;
-      display: block;
-      display: none;
-      opacity: 0;
-      -webkit-transition: opacity 0.3s ease;
-      -moz-transition: opacity 0.3s ease;
-      -ms-transition: opacity 0.3s ease;
-      -o-transition: opacity 0.3s ease;
-      transition: opacity 0.3s ease;
-      border-radius: 8px;
-      font-size: 13px;
-      top: 130px;
-      left: -10px;
-      width: 140px;
-      background: #be2626;
-      background: linear-gradient(to bottom, #be2626, #a92222);
-      padding: 0.5em 1.2em;
-      color: white; }
-      .dropzone .dz-preview .dz-error-message:after {
-        content: '';
-        position: absolute;
-        top: -6px;
-        left: 64px;
-        width: 0;
-        height: 0;
-        border-left: 6px solid transparent;
-        border-right: 6px solid transparent;
-        border-bottom: 6px solid #be2626; }

+ 451 - 0
public/assets/css/frontend-func.css

@@ -0,0 +1,451 @@
+body {
+  background: #f1f4f6;
+}
+.selection {
+  position: absolute;
+  border: 1px solid #8B9;
+  background-color: #BEC;
+}
+.note-dialog .modal {
+  z-index: 1060;
+}
+.bootstrap-dialog .modal-dialog {
+  /*width: 70%;*/
+  max-width: 885px;
+}
+#header {
+  background: #fff;
+  box-shadow: 0 2px 2px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(0, 0, 0, 0.05);
+}
+.content-wrapper {
+  position: relative;
+}
+.tab-addtabs {
+  overflow: hidden;
+}
+.tab-addtabs .tab-pane {
+  height: 100%;
+  width: 100%;
+}
+/*
+ * RIBBON
+ */
+#ribbon {
+  overflow: hidden;
+  padding: 15px 15px 0 15px;
+  position: relative;
+}
+#ribbon a {
+  color: #777 !important;
+  text-decoration: none !important;
+}
+#ribbon .breadcrumb {
+  display: inline-block;
+  margin: 0;
+  padding: 0;
+  background: none;
+  vertical-align: top;
+}
+#ribbon .breadcrumb > .active,
+#ribbon .breadcrumb li:last-child {
+  color: #aaa;
+}
+#ribbon .shortcut a {
+  margin-left: 10px;
+}
+.is-dialog #main {
+  background: #fff;
+}
+.is-dialog form label {
+  font-weight: normal;
+}
+/*panel扩展描述样式*/
+.panel-intro {
+  margin-bottom: 0;
+  border: none;
+}
+.panel-intro .panel-heading {
+  padding: 15px;
+  padding-bottom: 0;
+  background: #e8edf0;
+  border-color: #e8edf0;
+  position: relative;
+}
+.panel-intro .panel-heading .panel-lead {
+  margin-bottom: 15px;
+}
+.panel-intro .panel-heading .panel-lead em {
+  display: block;
+  font-weight: bold;
+  font-style: normal;
+}
+.panel-intro .panel-heading .panel-title {
+  height: 25px;
+  font-weight: normal;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.panel-intro .panel-heading .panel-control {
+  height: 42px;
+  position: absolute;
+  top: 8px;
+  right: 8px;
+}
+.panel-intro .panel-heading .panel-control .fa {
+  font-size: 14px;
+}
+.panel-intro .panel-heading .nav-tabs {
+  border-bottom: 0;
+  margin-bottom: 0;
+}
+.panel-intro .panel-heading .nav-tabs > li > a {
+  margin-right: 4px;
+  color: #95a5a6;
+  background-color: #d8e0e6;
+  border: 1px solid #e8edf0;
+  border-bottom-color: transparent;
+}
+.panel-intro .panel-heading .nav-tabs > li > a:hover,
+.panel-intro .panel-heading .nav-tabs > li > a:focus {
+  border: 1px solid #e8edf0;
+  color: #7b8a8b;
+  background-color: #c9d4dc;
+}
+.panel-intro .panel-heading .nav-tabs > li.active > a,
+.panel-intro .panel-heading .nav-tabs > li.active > a:hover,
+.panel-intro .panel-heading .nav-tabs > li.active > a:focus {
+  color: #7b8a8b;
+  background-color: #ffffff;
+  border-bottom-color: transparent;
+  cursor: default;
+}
+/*单表格*/
+.panel-tabs .panel-heading {
+  padding: 12px 15px 12px 15px;
+}
+.panel-tabs .panel-heading .panel-lead {
+  margin-bottom: 0px;
+}
+/*选项卡*/
+.panel-nav .panel-heading {
+  padding: 0px;
+  padding-bottom: 0;
+  background: #f1f4f6;
+  border-color: #f1f4f6;
+}
+.panel-nav .nav-tabs > li > a {
+  padding: 12px 15px;
+  background-color: #e8edf0;
+  border: 1px solid #f1f4f6;
+}
+.panel-nav .nav-tabs > li > a:hover,
+.panel-nav .nav-tabs > li > a:focus {
+  border: 1px solid #e8edf0;
+  background-color: #e8edf0;
+}
+.panel-nav .nav-tabs > li.active > a,
+.panel-nav .nav-tabs > li.active > a:hover,
+.panel-nav .nav-tabs > li.active > a:focus {
+  border-color: #f1f4f6;
+  border-bottom-color: transparent;
+}
+/*顶栏addtabs*/
+.nav-addtabs {
+  border: none;
+}
+.nav-addtabs > li {
+  margin: 0;
+}
+.nav-addtabs > li > a {
+  height: 49px;
+  line-height: 49px;
+  padding: 0 15px;
+  border-radius: 0;
+  border: none;
+  border-right: 1px solid rgba(0, 0, 0, 0.05);
+  margin: 0;
+  color: #95a5a6;
+}
+.nav-addtabs > li > a:hover,
+.nav-addtabs > li > a:focus {
+  border: none;
+  color: #2c3e50;
+  border-right: 1px solid rgba(0, 0, 0, 0.05);
+}
+.nav-addtabs > li > a i {
+  margin-right: 3px;
+}
+.nav-addtabs > li.active > a {
+  height: 49px;
+  line-height: 49px;
+  padding: 0 15px;
+  border-radius: 0;
+  border: none;
+  border-right: 1px solid rgba(0, 0, 0, 0.05);
+  background: #f1f4f6;
+  color: #2c3e50;
+  overflow: hidden;
+}
+.nav-addtabs > li.active > a:hover,
+.nav-addtabs > li.active > a:focus {
+  border: none;
+  color: #2c3e50;
+  border-right: 1px solid rgba(0, 0, 0, 0.05);
+  background: #f1f4f6;
+}
+.nav-addtabs > li .close-tab {
+  font-size: 10px;
+  position: absolute;
+  right: 5px;
+  top: 50%;
+  margin-top: -7px;
+  z-index: 100;
+  cursor: hand;
+  cursor: pointer;
+  color: #fff;
+  display: none;
+}
+.nav-addtabs .open > a:hover,
+.nav-addtabs .open > a:focus {
+  border-right: 1px solid rgba(0, 0, 0, 0.05);
+}
+.nav-addtabs ul li {
+  position: relative;
+}
+.nav-addtabs li:hover > .close-tab {
+  display: block;
+}
+#treeview .jstree-container-ul .jstree-node {
+  display: block;
+  clear: both;
+}
+#treeview .jstree-leaf:not(:first-child) {
+  float: left;
+  background: none;
+  margin-left: 0;
+  width: 80px;
+  clear: none;
+  color: #BBBDC3;
+}
+#treeview .jstree-leaf {
+  float: left;
+  margin-left: 0;
+  padding-left: 24px;
+  width: 80px;
+  clear: none;
+  color: #ccc;
+}
+#treeview .jstree-leaf > .jstree-icon,
+#treeview .jstree-leaf .jstree-themeicon {
+  display: none;
+}
+#treeview .jstree-last {
+  background-image: url("../img/32px.png");
+  background-position: -292px -4px;
+  background-repeat: repeat-y;
+}
+#treeview .jstree-children:before,
+#treeview .jstree-children:after {
+  content: " ";
+  display: table;
+}
+#treeview .jstree-children:after {
+  clear: both;
+}
+#treeview .jstree-children:before,
+#treeview .jstree-children:after {
+  content: " ";
+  display: table;
+}
+#treeview .jstree-children:after {
+  clear: both;
+}
+#treeview .jstree-themeicon {
+  display: none;
+}
+/*去除bootstrap-table的边框*/
+.fixed-table-container {
+  border: none!important;
+}
+.pjax-loader-bar .progress {
+  position: fixed;
+  top: 0;
+  left: 0;
+  height: 2px;
+  background: #77b6ff;
+  box-shadow: 0 0 10px rgba(119, 182, 255, 0.7);
+  -webkit-transition: width 0.4s ease;
+  transition: width 0.4s ease;
+}
+.dropdown-menu.text-left a,
+.dropdown-menu.text-left li {
+  text-align: left!important;
+}
+.bootstrap-table .fixed-table-toolbar .dropdown-menu {
+  overflow: visible;
+}
+.bootstrap-table table tbody tr:first-child td .bs-checkbox {
+  vertical-align: middle;
+}
+.dropdown-submenu {
+  position: relative;
+}
+.dropdown-submenu > .dropdown-menu {
+  overflow: auto;
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  -webkit-border-radius: 0 6px 6px 6px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 0 6px 6px 6px;
+  -moz-background-clip: padding;
+  border-radius: 0 6px 6px 6px;
+  background-clip: padding-box;
+}
+.dropdown-submenu:hover > .dropdown-menu {
+  display: block;
+}
+.dropdown-submenu:hover > a:after {
+  border-left-color: #fff;
+}
+.dropdown-submenu > a:after {
+  display: block;
+  content: " ";
+  float: right;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #ccc;
+  margin-top: 5px;
+  margin-right: -10px;
+}
+.dropdown-submenu.pull-left {
+  float: none;
+}
+.dropdown-submenu.pull-left > .dropdown-menu {
+  left: -100%;
+  margin-left: 10px;
+  -webkit-border-radius: 6px 0 6px 6px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 6px 0 6px 6px;
+  -moz-background-clip: padding;
+  border-radius: 6px 0 6px 6px;
+  background-clip: padding-box;
+}
+/*重写toast的几个背景色*/
+.toast-primary {
+  background-color: #48c9b0!important;
+}
+.toast-success {
+  background-color: #2ecc71!important;
+}
+.toast-error {
+  background-color: #e74c3c!important;
+}
+.toast-info {
+  background-color: #5dade2!important;
+}
+.toast-warning {
+  background-color: #f1c40f!important;
+}
+.toast-inverse {
+  background-color: #34495e!important;
+}
+.toast-default {
+  background-color: #bdc3c7!important;
+}
+.layui-layer-title {
+  background: #2c3e50!important;
+  color: #fff!important;
+}
+/*避免出现多滚动条*/
+.layui-layer-noborder {
+  border: none!important;
+  box-shadow: 1px 1px 50px rgba(0, 0, 0, 0.3) !important;
+}
+.layui-layer-moves {
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+.layui-layer-iframe {
+  overflow: hidden!important;
+}
+.layui-layer-iframe .layui-layer-content {
+  -webkit-overflow-scrolling: touch;
+  overflow-y: hidden!important;
+  overflow: hidden;
+}
+/*自定义底部灰色操作区*/
+.layui-layer-btn {
+  text-align: center!important;
+  padding: 10px!important;
+  background: #ecf0f1;
+}
+.layui-layer-footer {
+  padding: 8px 20px;
+  background-color: #ecf0f1;
+  height: auto;
+  text-align: inherit!important;
+}
+.layui-layer-btn a {
+  background-color: #95a5a6!important;
+  border-color: #95a5a6!important;
+  color: #fff!important;
+}
+.layui-layer-btn .layui-layer-btn0 {
+  background-color: #18bc9c!important;
+  border-color: #18bc9c!important;
+}
+.layui-layer-setwin {
+  top: 10px!important;
+}
+.layui-layer-setwin > a {
+  background: none!important;
+}
+.layui-layer-setwin > a cite {
+  display: none;
+}
+.layui-layer-setwin > a:after {
+  content: "\e625";
+  font-family: iconfont;
+  font-style: normal;
+  font-weight: normal;
+  text-decoration: inherit;
+  position: absolute;
+  font-size: 18px;
+  color: #fff;
+  margin: 0;
+  z-index: 1;
+}
+.layui-layer-setwin > a:hover {
+  text-decoration: none!important;
+  background: none!important;
+}
+.layui-layer-setwin > a:focus {
+  text-decoration: none!important;
+}
+.layui-layer-setwin .layui-layer-min:after {
+  content: "\e625";
+}
+.layui-layer-setwin .layui-layer-max:after {
+  content: "\e623";
+}
+.layui-layer-setwin .layui-layer-maxmin:after {
+  content: "\e624";
+}
+.layui-layer-setwin .layui-layer-close1:after {
+  content: "\e626";
+}
+/*手机版样式*/
+@media (max-width: 480px) {
+  .nav-addtabs {
+    display: none;
+  }
+}
+/*平板样式*/
+/*# sourceMappingURL=frontend-func.css.map */

+ 0 - 3
public/assets/js/backend/general/attachment.js

@@ -36,9 +36,6 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table', 'config'], function (
                         {field: 'operate', title: __('Operate'), events: Table.api.events.operate, formatter: Table.api.formatter.operate}
                     ]
                 ],
-                //普通搜索
-                commonSearch: true,
-                titleForm: '', //为空则不显示标题,不定义默认显示:普通搜索
             });
 
             // 为表格绑定事件

+ 63 - 7
public/assets/js/backend/index.js

@@ -1,5 +1,4 @@
-define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'validator'], function ($, undefined, Backend, undefined, AdminLTE, undefined) {
-
+define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'validator'], function ($, undefined, Backend, undefined, AdminLTE, Form, Validator) {
     var Controller = {
         index: function () {
             //窗口大小改变,修正主窗体最小高度
@@ -30,6 +29,59 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'validator'], f
                 }
             });
 
+            //读取FastAdmin的Commits信息
+            $.ajax({
+                url: 'https://api.github.com/repos/karsonzhang/fastadmin/commits?state=open&per_page=10&page=1&sort=updated',
+                type: 'get',
+                dataType: 'jsonp',
+                success: function (ret) {
+                    $(".github-commits > a span").text(ret.data.length);
+                    $(".github-commits .footer a").attr("href", "https://github.com/karsonzhang/fastadmin/commits/master");
+
+                    var dateDiff = function (hisTime, nowTime) {
+                        if (!arguments.length)
+                            return '';
+                        var arg = arguments,
+                                now = arg[1] ? arg[1] : new Date().getTime(),
+                                diffValue = now - arg[0],
+                                result = '',
+                                minute = 1000 * 60,
+                                hour = minute * 60,
+                                day = hour * 24,
+                                halfamonth = day * 15,
+                                month = day * 30,
+                                year = month * 12,
+                                _year = diffValue / year,
+                                _month = diffValue / month,
+                                _week = diffValue / (7 * day),
+                                _day = diffValue / day,
+                                _hour = diffValue / hour,
+                                _min = diffValue / minute;
+
+                        if (_year >= 1)
+                            result = parseInt(_year) + "年前";
+                        else if (_month >= 1)
+                            result = parseInt(_month) + "个月前";
+                        else if (_week >= 1)
+                            result = parseInt(_week) + "周前";
+                        else if (_day >= 1)
+                            result = parseInt(_day) + "天前";
+                        else if (_hour >= 1)
+                            result = parseInt(_hour) + "个小时前";
+                        else if (_min >= 1)
+                            result = parseInt(_min) + "分钟前";
+                        else
+                            result = "刚刚";
+                        return result;
+                    };
+                    $.each(ret.data, function (i, j) {
+                        var author = j.author ? j.author : {html_url: "https://github.com/karsonzhang", avatar_url: "/assets/img/avatar.png", login: "Anonymous"};
+                        var item = '<li><a href="' + j.html_url + '"><div class="pull-left"><img src="' + author.avatar_url + '" class="img-circle" alt="' + author.login + '"></div><h4>' + author.login + '<small><i class="fa fa-clock-o"></i> ' + dateDiff(new Date(j.commit.committer.date).getTime()) + '</small></h4><p>' + j.commit.message + '</p></a></li>';
+                        $(item).appendTo($(".github-commits ul.menu"));
+                    });
+                }
+            });
+
             //切换左侧sidebar显示隐藏
             $(document).on("click", ".sidebar-menu li > a", function (e) {
                 $(".sidebar-menu li").removeClass("active");
@@ -146,12 +198,16 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'validator'], f
              * @returns Boolean false to prevent link's default action
              */
             function change_skin(cls) {
-                $.each(my_skins, function (i) {
-                    $("body").removeClass(my_skins[i]);
-                });
+                if (!$("body").hasClass(cls)) {
+                    $.each(my_skins, function (i) {
+                        $("body").removeClass(my_skins[i]);
+                    });
 
-                $("body").addClass(cls);
-                store('skin', cls);
+                    $("body").addClass(cls);
+                    store('skin', cls);
+                    var cssfile = requirejs.s.contexts._.config.config.config.upload.cdnurl + "/assets/css/skins/" + cls + ".css";
+                    $('head').append('<link rel="stylesheet" href="' + cssfile + '" type="text/css" />');
+                }
                 return false;
             }
 

+ 0 - 112
public/assets/js/bootstrap-checkbox.js

@@ -1,112 +0,0 @@
-!function ($) {
-
-    /* CHECKBOX PUBLIC CLASS DEFINITION
-     * ============================== */
-
-    var Checkbox = function (element, options) {
-        this.init(element, options);
-    }
-
-    Checkbox.prototype = {
-        constructor: Checkbox
-
-        , init: function (element, options) {
-            var $el = this.$element = $(element)
-
-            this.options = $.extend({}, $.fn.checkbox.defaults, options);
-            $el.before(this.options.template);
-            this.setState();
-        }
-
-        , setState: function () {
-            var $el = this.$element
-                    , $parent = $el.closest('.checkbox');
-
-            $el.prop('disabled') && $parent.addClass('disabled');
-            $el.prop('checked') && $parent.addClass('checked');
-        }
-
-        , toggle: function () {
-            var ch = 'checked'
-                    , $el = this.$element
-                    , $parent = $el.closest('.checkbox')
-                    , checked = $el.prop(ch)
-                    , e = $.Event('toggle')
-
-            if ($el.prop('disabled') == false) {
-                $parent.toggleClass(ch) && checked ? $el.removeAttr(ch) : $el.prop(ch, ch);
-                $el.trigger(e).trigger('change');
-            }
-        }
-
-        , setCheck: function (option) {
-            var d = 'disabled'
-                    , ch = 'checked'
-                    , $el = this.$element
-                    , $parent = $el.closest('.checkbox')
-                    , checkAction = option == 'check' ? true : false
-                    , e = $.Event(option)
-
-            $parent[checkAction ? 'addClass' : 'removeClass' ](ch) && checkAction ? $el.prop(ch, ch) : $el.removeAttr(ch);
-            $el.trigger(e).trigger('change');
-        }
-
-    }
-
-
-    /* CHECKBOX PLUGIN DEFINITION
-     * ======================== */
-
-    var old = $.fn.checkbox
-
-    $.fn.checkbox = function (option) {
-        return this.each(function () {
-            var $this = $(this)
-                    , data = $this.data('checkbox')
-                    , options = $.extend({}, $.fn.checkbox.defaults, $this.data(), typeof option == 'object' && option);
-            if (!data)
-                $this.data('checkbox', (data = new Checkbox(this, options)));
-            if (option == 'toggle')
-                data.toggle()
-            if (option == 'check' || option == 'uncheck')
-                data.setCheck(option)
-            else if (option)
-                data.setState();
-        });
-    }
-
-    $.fn.checkbox.defaults = {
-        template: '<span class="icons"><span class="first-icon fa fa-square-o"></span><span class="second-icon fa fa-check-square-o"></span></span>'
-    }
-
-
-    /* CHECKBOX NO CONFLICT
-     * ================== */
-
-    $.fn.checkbox.noConflict = function () {
-        $.fn.checkbox = old;
-        return this;
-    }
-
-
-    /* CHECKBOX DATA-API
-     * =============== */
-
-    $(document).on('click.checkbox.data-api', '[data-toggle^=checkbox], .checkbox', function (e) {
-        var $checkbox = $(e.target);
-        if (e.target.tagName != "A") {
-            e && e.preventDefault() && e.stopPropagation();
-            if (!$checkbox.hasClass('checkbox'))
-                $checkbox = $checkbox.closest('.checkbox');
-            $checkbox.find(':checkbox').checkbox('toggle');
-        }
-    });
-
-    $(function () {
-        $('[data-toggle="checkbox"]').each(function () {
-            var $checkbox = $(this);
-            $checkbox.checkbox();
-        });
-    });
-
-}(window.jQuery);

+ 0 - 144
public/assets/js/bootstrap-radio.js

@@ -1,144 +0,0 @@
-/* =============================================================
- * flatui-radio v0.0.3
- * ============================================================ */
-
-!function ($) {
-
-    /* RADIO PUBLIC CLASS DEFINITION
-     * ============================== */
-
-    var Radio = function (element, options) {
-        this.init(element, options);
-    }
-
-    Radio.prototype = {
-        constructor: Radio
-
-        , init: function (element, options) {
-            var $el = this.$element = $(element)
-
-            this.options = $.extend({}, $.fn.radio.defaults, options);
-            $el.before(this.options.template);
-            this.setState();
-        }
-
-        , setState: function () {
-            var $el = this.$element
-                    , $parent = $el.closest('.radio');
-
-            $el.prop('disabled') && $parent.addClass('disabled');
-            $el.prop('checked') && $parent.addClass('checked');
-        }
-
-        , toggle: function () {
-            var d = 'disabled'
-                    , ch = 'checked'
-                    , $el = this.$element
-                    , checked = $el.prop(ch)
-                    , $parent = $el.closest('.radio')
-                    , $parentWrap = $el.closest('form').length ? $el.closest('form') : $el.closest('body')
-                    , $elemGroup = $parentWrap.find(':radio[name="' + $el.attr('name') + '"]')
-                    , e = $.Event('toggle')
-
-            if ($el.prop(d) == false) {
-                $elemGroup.not($el).each(function () {
-                    var $el = $(this)
-                            , $parent = $(this).closest('.radio');
-
-                    if ($el.prop(d) == false) {
-                        $parent.removeClass(ch) && $el.removeAttr(ch).trigger('change');
-                    }
-                });
-
-                if (checked == false)
-                    $parent.addClass(ch) && $el.prop(ch, true);
-                $el.trigger(e);
-
-                if (checked !== $el.prop(ch)) {
-                    $el.trigger('change');
-                }
-            }
-        }
-
-        , setCheck: function (option) {
-            var ch = 'checked'
-                    , $el = this.$element
-                    , $parent = $el.closest('.radio')
-                    , checkAction = option == 'check' ? true : false
-                    , checked = $el.prop(ch)
-                    , $parentWrap = $el.closest('form').length ? $el.closest('form') : $el.closest('body')
-                    , $elemGroup = $parentWrap.find(':radio[name="' + $el['attr']('name') + '"]')
-                    , e = $.Event(option)
-
-            $elemGroup.not($el).each(function () {
-                var $el = $(this)
-                        , $parent = $(this).closest('.radio');
-
-                $parent.removeClass(ch) && $el.removeAttr(ch);
-            });
-
-            $parent[checkAction ? 'addClass' : 'removeClass'](ch) && checkAction ? $el.prop(ch, ch) : $el.removeAttr(ch);
-            $el.trigger(e);
-
-            if (checked !== $el.prop(ch)) {
-                $el.trigger('change');
-            }
-        }
-
-    }
-
-
-    /* RADIO PLUGIN DEFINITION
-     * ======================== */
-
-    var old = $.fn.radio
-
-    $.fn.radio = function (option) {
-        return this.each(function () {
-            var $this = $(this)
-                    , data = $this.data('radio')
-                    , options = $.extend({}, $.fn.radio.defaults, $this.data(), typeof option == 'object' && option);
-            if (!data)
-                $this.data('radio', (data = new Radio(this, options)));
-            if (option == 'toggle')
-                data.toggle()
-            if (option == 'check' || option == 'uncheck')
-                data.setCheck(option)
-            else if (option)
-                data.setState();
-        });
-    }
-
-    $.fn.radio.defaults = {
-        template: '<span class="icons"><span class="first-icon fa fa-circle-o"></span><span class="second-icon fa fa-dot-circle-o"></span></span>'
-    }
-
-
-    /* RADIO NO CONFLICT
-     * ================== */
-
-    $.fn.radio.noConflict = function () {
-        $.fn.radio = old;
-        return this;
-    }
-
-
-    /* RADIO DATA-API
-     * =============== */
-
-    $(document).on('click.radio.data-api', '[data-toggle^=radio], .radio', function (e) {
-        var $radio = $(e.target);
-        e && e.preventDefault() && e.stopPropagation();
-        if (!$radio.hasClass('radio'))
-            $radio = $radio.closest('.radio');
-        $radio.find(':radio').radio('toggle');
-    });
-
-    $(function () {
-        $('[data-toggle="radio"]').each(function () {
-            var $radio = $(this);
-            $radio.radio();
-        });
-    });
-
-}(window.jQuery);

+ 0 - 251
public/assets/js/bootstrap-switch.js

@@ -1,251 +0,0 @@
-/* ============================================================
- * bootstrapSwitch v1.3 by Larentis Mattia @spiritualGuru
- * http://www.larentis.eu/switch/
- * ============================================================
- * Licensed under the Apache License, Version 2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- * ============================================================ */
-
-!function ($) {
-    "use strict";
-
-    $.fn['bootstrapSwitch'] = function (method) {
-        var methods = {
-            init: function () {
-                return this.each(function () {
-                    var $element = $(this)
-                            , $div
-                            , $switchLeft
-                            , $switchRight
-                            , $label
-                            , myClasses = ""
-                            , classes = $element.attr('class')
-                            , color
-                            , moving
-                            , onLabel = "开"
-                            , offLabel = "关"
-                            , icon = false;
-
-                    $.each(['switch-mini', 'switch-small', 'switch-large'], function (i, el) {
-                        if (classes.indexOf(el) >= 0)
-                            myClasses = el;
-                    });
-
-                    $element.addClass('has-switch');
-
-                    if ($element.data('on') !== undefined)
-                        color = "switch-" + $element.data('on');
-
-                    if ($element.data('on-label') !== undefined)
-                        onLabel = $element.data('on-label');
-
-                    if ($element.data('off-label') !== undefined)
-                        offLabel = $element.data('off-label');
-
-                    if ($element.data('icon') !== undefined)
-                        icon = $element.data('icon');
-
-                    $switchLeft = $('<span>')
-                            .addClass("switch-left")
-                            .addClass(myClasses)
-                            .addClass(color)
-                            .html(onLabel);
-
-                    color = '';
-                    if ($element.data('off') !== undefined)
-                        color = "switch-" + $element.data('off');
-
-                    $switchRight = $('<span>')
-                            .addClass("switch-right")
-                            .addClass(myClasses)
-                            .addClass(color)
-                            .html(offLabel);
-
-                    $label = $('<label>')
-                            .html("&nbsp;")
-                            .addClass(myClasses)
-                            .attr('for', $element.find('input').attr('id'));
-
-                    if (icon) {
-                        $label.html('<i class="' + icon + '"></i>');
-                    }
-
-                    $div = $element.find(':checkbox').wrap($('<div>')).parent().data('animated', false);
-
-                    if ($element.data('animated') !== false)
-                        $div.addClass('switch-animate').data('animated', true);
-
-                    $div
-                            .append($switchLeft)
-                            .append($label)
-                            .append($switchRight);
-
-                    $element.find('>div').addClass(
-                            $element.find('input').is(':checked') ? 'switch-on' : 'switch-off'
-                            );
-
-                    if ($element.find('input').is(':disabled'))
-                        $(this).addClass('deactivate');
-
-                    var changeStatus = function ($this) {
-                        $this.siblings('label').trigger('mousedown').trigger('mouseup').trigger('click');
-                    };
-
-                    $element.on('keydown', function (e) {
-                        if (e.keyCode === 32) {
-                            e.stopImmediatePropagation();
-                            e.preventDefault();
-                            changeStatus($(e.target).find('span:first'));
-                        }
-                    });
-
-                    $switchLeft.on('click', function (e) {
-                        changeStatus($(this));
-                    });
-
-                    $switchRight.on('click', function (e) {
-                        changeStatus($(this));
-                    });
-
-                    $element.find('input').on('change', function (e) {
-                        var $this = $(this)
-                                , $element = $this.parent()
-                                , thisState = $this.is(':checked')
-                                , state = $element.is('.switch-off');
-
-                        e.preventDefault();
-
-                        $element.css('left', '');
-
-                        if (state === thisState) {
-
-                            if (thisState)
-                                $element.removeClass('switch-off').addClass('switch-on');
-                            else
-                                $element.removeClass('switch-on').addClass('switch-off');
-
-                            if ($element.data('animated') !== false)
-                                $element.addClass("switch-animate");
-
-                            $element.parent().trigger('switch-change', {'el': $this, 'value': thisState})
-                        }
-                    });
-
-                    $element.find('label').on('mousedown touchstart', function (e) {
-                        var $this = $(this);
-                        moving = false;
-
-                        e.preventDefault();
-                        e.stopImmediatePropagation();
-
-                        $this.closest('div').removeClass('switch-animate');
-
-                        if ($this.closest('.has-switch').is('.deactivate'))
-                            $this.unbind('click');
-                        else {
-                            $this.on('mousemove touchmove', function (e) {
-                                var $element = $(this).closest('.switch')
-                                        , relativeX = (e.pageX || e.originalEvent.targetTouches[0].pageX) - $element.offset().left
-                                        , percent = (relativeX / $element.width()) * 100
-                                        , left = 25
-                                        , right = 75;
-
-                                moving = true;
-
-                                if (percent < left)
-                                    percent = left;
-                                else if (percent > right)
-                                    percent = right;
-
-                                $element.find('>div').css('left', (percent - right) + "%")
-                            });
-
-                            $this.on('click touchend', function (e) {
-                                var $this = $(this)
-                                        , $target = $(e.target)
-                                        , $myCheckBox = $target.siblings('input');
-
-                                e.stopImmediatePropagation();
-                                e.preventDefault();
-
-                                $this.unbind('mouseleave');
-
-                                if (moving)
-                                    $myCheckBox.prop('checked', !(parseInt($this.parent().css('left')) < -25));
-                                else
-                                    $myCheckBox.prop("checked", !$myCheckBox.is(":checked"));
-
-                                moving = false;
-                                $myCheckBox.trigger('change');
-                            });
-
-                            $this.on('mouseleave', function (e) {
-                                var $this = $(this)
-                                        , $myCheckBox = $this.siblings('input');
-
-                                e.preventDefault();
-                                e.stopImmediatePropagation();
-
-                                $this.unbind('mouseleave');
-                                $this.trigger('mouseup');
-
-                                $myCheckBox.prop('checked', !(parseInt($this.parent().css('left')) < -25)).trigger('change');
-                            });
-
-                            $this.on('mouseup', function (e) {
-                                e.stopImmediatePropagation();
-                                e.preventDefault();
-
-                                $(this).unbind('mousemove');
-                            });
-                        }
-                    });
-                }
-                );
-            },
-            toggleActivation: function () {
-                $(this).toggleClass('deactivate');
-            },
-            isActive: function () {
-                return !$(this).hasClass('deactivate');
-            },
-            setActive: function (active) {
-                if (active)
-                    $(this).removeClass('deactivate');
-                else
-                    $(this).addClass('deactivate');
-            },
-            toggleState: function (skipOnChange) {
-                var $input = $(this).find('input:checkbox');
-                $input.prop('checked', !$input.is(':checked')).trigger('change', skipOnChange);
-            },
-            setState: function (value, skipOnChange) {
-                $(this).find('input:checkbox').prop('checked', value).trigger('change', skipOnChange);
-            },
-            status: function () {
-                return $(this).find('input:checkbox').is(':checked');
-            },
-            destroy: function () {
-                var $div = $(this).find('div')
-                        , $checkbox;
-
-                $div.find(':not(input:checkbox)').remove();
-
-                $checkbox = $div.children();
-                $checkbox.unwrap().unwrap();
-
-                $checkbox.unbind('change');
-
-                return $checkbox;
-            }
-        };
-
-        if (methods[method])
-            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
-        else if (typeof method === 'object' || !method)
-            return methods.init.apply(this, arguments);
-        else
-            $.error('Method ' + method + ' does not exist!');
-    };
-}(jQuery);
-

+ 5 - 5
public/assets/js/bootstrap-table-advancedsearch.js

@@ -152,19 +152,19 @@
     });
     $.extend($.fn.bootstrapTable.locales, {
         formatAdvancedSearch: function () {
-            return __('Advanced search');
+            return 'Advanced search';
         },
         formatAdvancedSubmitButton: function () {
-            return __("Submit");
+            return "Submit";
         },
         formatAdvancedResetButton: function () {
-            return __("Reset");
+            return "Reset";
         },
         formatAdvancedCloseButton: function () {
-            return __("Close");
+            return "Close";
         },
         formatAdvancedChoose: function () {
-            return __("Choose");
+            return "Choose";
         }
     });
 

+ 7 - 7
public/assets/js/bootstrap-table-commonsearch.js

@@ -16,7 +16,7 @@
 
         var vFormCommon = createFormCommon(pColumns, that), timeoutId = 0;
 
-        var vModal = sprintf("<div id=\"commonSearchModalContent_%s\" class=\"well bs-component\">", that.options.idTable);
+        var vModal = sprintf("<div id=\"commonSearchModalContent_%s\" class=\"common-search-table\">", that.options.idTable);
         vModal += vFormCommon.join('');
         vModal += "</div>";
         $("#myTabContent").before($(vModal));
@@ -152,7 +152,7 @@
     $.extend($.fn.bootstrapTable.defaults, {
         commonSearch: false,
         idForm: 'commonSearch',
-        titleForm: __("Common search"),
+        titleForm: "Common search",
         actionForm: '',
         idTable: undefined,
         onColumnCommonSearch: function (field, text) {
@@ -170,19 +170,19 @@
 
     $.extend($.fn.bootstrapTable.locales, {
         formatCommonSearch: function () {
-            return __("Common search");
+            return "Common search";
         },
         formatCommonSubmitButton: function () {
-            return __("Submit");
+            return "Submit";
         },
         formatCommonResetButton: function () {
-            return __("Reset");
+            return "Reset";
         },
         formatCommonCloseButton: function () {
-            return __("Close");
+            return "Close";
         },
         formatCommonChoose: function () {
-            return __("Choose");
+            return "Choose";
         }
     });
 

File diff suppressed because it is too large
+ 35 - 0
public/assets/js/echarts.min.js


File diff suppressed because it is too large
+ 0 - 6
public/assets/js/jquery.jcrop.min.js


+ 5 - 9
public/assets/js/require-backend.js

@@ -10,14 +10,12 @@ require.config({
     paths: {
         'lang': "empty:",
         'config': 'require-config',
-        'bootstrap-checkbox': 'bootstrap-checkbox',
-        'bootstrap-radio': 'bootstrap-radio',
-        'bootstrap-switch': 'bootstrap-switch',
         'form': 'require-form',
         'table': 'require-table',
         'upload': 'require-upload',
         'drag': 'jquery.drag.min',
         'drop': 'jquery.drop.min',
+        'echarts': 'echarts.min',
         'echarts-theme': 'echarts-theme',
         'adminlte': 'adminlte',
         //
@@ -47,12 +45,11 @@ require.config({
         'slimscroll': '../libs/jquery-slimscroll/jquery.slimscroll',
         'crontab': '../libs/jqcron/src/jqCron.cn',
         'summernote': '../libs/summernote/dist/lang/summernote-zh-CN.min',
-        'validator': '../libs/nice-validator/dist/local/zh-CN',
+        'validator': '../libs/nice-validator/dist/jquery.validator.js?local=zh-CN',
         'plupload': '../libs/plupload/js/plupload.min',
         'toastr': '../libs/toastr/toastr',
         'jstree': '../libs/jstree/dist/jstree.min',
         'layer': '../libs/layer/src/layer',
-        'echarts': '../libs/echarts/dist/echarts.min',
         'cookie': '../libs/jquery.cookie/jquery.cookie',
         'template': '../libs/art-template/dist/template-native',
     },
@@ -108,7 +105,7 @@ require.config({
         'bootstrap-dialog': ['css!../libs/bootstrap3-dialog/dist/css/bootstrap-dialog.min.css'],
         'bootstrap-datetimepicker': [
             'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
-            'moment/locale/zh-cn'
+            'moment/locale/zh-cn',
         ],
         'bootstrap-tagsinput': [
             'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput-typeahead.css',
@@ -127,9 +124,7 @@ require.config({
             exports: "plupload"
         },
 //        'layer': ['css!../libs/layer/build/skin/default/layer.css'],
-        validator: {
-            deps: ['../libs/nice-validator/dist/jquery.validator', 'css!../libs/nice-validator/dist/jquery.validator.css']
-        }
+
     },
     baseUrl: requirejs.s.contexts._.config.config.config.site.cdnurl + '/assets/js/', //资源基础路径
     map: {
@@ -175,6 +170,7 @@ require(['jquery', 'bootstrap', 'config'], function ($, undefined, Config) {
             require([Config.jsname], function (Controller) {
                 Controller[Config.actionname] != undefined && Controller[Config.actionname]();
             }, function (e) {
+                console.error(e);
                 // 这里可捕获模块加载的错误
             });
         });

File diff suppressed because it is too large
+ 85 - 2328
public/assets/js/require-backend.min.js


+ 4 - 9
public/assets/js/require-frontend.js

@@ -10,14 +10,12 @@ require.config({
     paths: {
         'lang': "empty:",
         'config': 'require-config',
-        'bootstrap-checkbox': 'bootstrap-checkbox',
-        'bootstrap-radio': 'bootstrap-radio',
-        'bootstrap-switch': 'bootstrap-switch',
         'form': 'require-form',
         'table': 'require-table',
         'upload': 'require-upload',
         'drag': 'jquery.drag.min',
         'drop': 'jquery.drop.min',
+        'echarts': 'echarts.min',
         'echarts-theme': 'echarts-theme',
         'adminlte': 'adminlte',
         //
@@ -47,12 +45,11 @@ require.config({
         'slimscroll': '../libs/jquery-slimscroll/jquery.slimscroll',
         'crontab': '../libs/jqcron/src/jqCron.cn',
         'summernote': '../libs/summernote/dist/lang/summernote-zh-CN.min',
-        'validator': '../libs/nice-validator/dist/local/zh-CN',
+        'validator': '../libs/nice-validator/dist/jquery.validator.js?local=zh-CN',
         'plupload': '../libs/plupload/js/plupload.min',
         'toastr': '../libs/toastr/toastr',
         'jstree': '../libs/jstree/dist/jstree.min',
         'layer': '../libs/layer/src/layer',
-        'echarts': '../libs/echarts/dist/echarts.min',
         'cookie': '../libs/jquery.cookie/jquery.cookie',
         'template': '../libs/art-template/dist/template-native',
     },
@@ -108,7 +105,7 @@ require.config({
         'bootstrap-dialog': ['css!../libs/bootstrap3-dialog/dist/css/bootstrap-dialog.min.css'],
         'bootstrap-datetimepicker': [
             'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
-            'moment/locale/zh-cn'
+            'moment/locale/zh-cn',
         ],
         'bootstrap-tagsinput': [
             'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput-typeahead.css',
@@ -127,9 +124,7 @@ require.config({
             exports: "plupload"
         },
 //        'layer': ['css!../libs/layer/build/skin/default/layer.css'],
-        validator: {
-            deps: ['../libs/nice-validator/dist/jquery.validator', 'css!../libs/nice-validator/dist/jquery.validator.css']
-        }
+
     },
     baseUrl: requirejs.s.contexts._.config.config.config.site.cdnurl + '/assets/js/', //资源基础路径
     map: {

+ 4 - 9
public/assets/js/require-frontend.min.js

@@ -27,14 +27,12 @@ require.config({
     paths: {
         'lang': "empty:",
         'config': 'require-config',
-        'bootstrap-checkbox': 'bootstrap-checkbox',
-        'bootstrap-radio': 'bootstrap-radio',
-        'bootstrap-switch': 'bootstrap-switch',
         'form': 'require-form',
         'table': 'require-table',
         'upload': 'require-upload',
         'drag': 'jquery.drag.min',
         'drop': 'jquery.drop.min',
+        'echarts': 'echarts.min',
         'echarts-theme': 'echarts-theme',
         'adminlte': 'adminlte',
         //
@@ -64,12 +62,11 @@ require.config({
         'slimscroll': '../libs/jquery-slimscroll/jquery.slimscroll',
         'crontab': '../libs/jqcron/src/jqCron.cn',
         'summernote': '../libs/summernote/dist/lang/summernote-zh-CN.min',
-        'validator': '../libs/nice-validator/dist/local/zh-CN',
+        'validator': '../libs/nice-validator/dist/jquery.validator.js?local=zh-CN',
         'plupload': '../libs/plupload/js/plupload.min',
         'toastr': '../libs/toastr/toastr',
         'jstree': '../libs/jstree/dist/jstree.min',
         'layer': '../libs/layer/src/layer',
-        'echarts': '../libs/echarts/dist/echarts.min',
         'cookie': '../libs/jquery.cookie/jquery.cookie',
         'template': '../libs/art-template/dist/template-native',
     },
@@ -125,7 +122,7 @@ require.config({
         'bootstrap-dialog': ['css!../libs/bootstrap3-dialog/dist/css/bootstrap-dialog.min.css'],
         'bootstrap-datetimepicker': [
             'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
-            'moment/locale/zh-cn'
+            'moment/locale/zh-cn',
         ],
         'bootstrap-tagsinput': [
             'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput-typeahead.css',
@@ -144,9 +141,7 @@ require.config({
             exports: "plupload"
         },
 //        'layer': ['css!../libs/layer/build/skin/default/layer.css'],
-        validator: {
-            deps: ['../libs/nice-validator/dist/jquery.validator', 'css!../libs/nice-validator/dist/jquery.validator.css']
-        }
+
     },
     baseUrl: requirejs.s.contexts._.config.config.config.site.cdnurl + '/assets/js/', //资源基础路径
     map: {

+ 2 - 3
public/assets/js/require-table.js

@@ -1,5 +1,4 @@
 define(['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'moment', 'bootstrap-table', 'bootstrap-table-lang', 'bootstrap-table-mobile', 'bootstrap-table-export', 'bootstrap-table-advancedsearch', 'bootstrap-table-commonsearch'], function ($, undefined, Backend, Config, Toastr, Moment) {
-
     var Table = {
         list: {},
         // Bootstrap-table 基础配置
@@ -10,7 +9,7 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'moment', 'bootstr
             toolbar: "#toolbar",
             search: true,
             cache: false,
-            advancedSearch: false,
+            advancedSearch: true,
             commonSearch: false,
             titleForm: '', //为空则不显示标题,不定义默认显示:普通搜索
             idTable: 'advancedTable',
@@ -22,7 +21,7 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'moment', 'bootstr
             pagination: true,
             clickToSelect: true,
             showRefresh: false,
-            locale: Config.language.replace('_', '-'),
+            locale: 'zh-CN',
             showToggle: true,
             showColumns: true,
             sortName: 'id',

+ 22 - 0
public/assets/less/backend-func.less

@@ -31,6 +31,22 @@ body {
     .logo,.navbar {
         .transition(none);
     }
+    .navbar{
+        position:relative;
+        .sidebar-toggle{
+            position:absolute;
+            width:45px;
+            text-align: center;
+        }
+        #nav{
+            position:absolute;
+            left:45px;
+        }
+        .navbar-custom-menu {
+            position:absolute;
+            right:0;
+        }
+    }
 }
 .note-dialog .modal {z-index:1060;}
 
@@ -59,6 +75,12 @@ body {
         }
     }
 }
+.common-search-table {
+    min-height: 20px;
+    padding: 15px;
+    margin-bottom: 15px;
+    background-color: #f5f5f5;
+}
 
 /*
  * RIBBON