Просмотр исходного кода

新增短信发送单IP总数限制
新增$selectpageFields字段用于控制selectpage的字段
修复指定语言不起作用的Bug
修复Selectpage过滤字段不起作用的Bug
优化跳转页面,允许页面停留显示
优化弹窗内部显示,去除min-height限制
优化Citypicker城市数据,使用最新数据源
优化install.php错误提醒
优化部分多语言显示

Karson 7 лет назад
Родитель
Сommit
3920be0f2b

+ 8 - 0
application/admin/lang/zh-cn/index.php

@@ -38,6 +38,14 @@ return [
     'Wipe template cache'                                        => '清除模板缓存',
     'Wipe addons cache'                                          => '清除插件缓存',
     'Check for updates'                                          => '检测更新',
+    'Discover new version'                                       => '发现新版本',
+    'Go to download'                                             => '去下载更新',
+    'Currently is the latest version'                            => '当前已经是最新版本',
+    'Ignore this version'                                        => '忽略此次更新',
+    'Do not remind again'                                        => '不再提示',
+    'Your current version'                                       => '你的版本是',
+    'New version'                                                => '新版本',
+    'Release notes'                                              => '更新说明',
     'Latest news'                                                => '最新消息',
     'View more'                                                  => '查看更多',
     'Links'                                                      => '相关链接',

+ 1 - 0
application/admin/library/Auth.php

@@ -377,6 +377,7 @@ class Auth extends \fast\Auth
                 continue;
             }
             $select_id = $v['name'] == $fixedPage ? $v['id'] : $select_id;
+            $v['icon'] = $v['icon'] . ' fa-fw';
             $v['url'] = '/' . $module . '/' . $v['name'];
             $v['badge'] = isset($badgeList[$v['name']]) ? $badgeList[$v['name']] : '';
             $v['py'] = $pinyin->abbr($v['title'], '');

+ 84 - 145
application/admin/library/traits/Backend.php

@@ -12,24 +12,22 @@ trait Backend
     {
         //设置过滤方法
         $this->request->filter(['strip_tags']);
-        if ($this->request->isAjax())
-        {
+        if ($this->request->isAjax()) {
             //如果发送的来源是Selectpage,则转发到Selectpage
-            if ($this->request->request('keyField'))
-            {
+            if ($this->request->request('keyField')) {
                 return $this->selectpage();
             }
             list($where, $sort, $order, $offset, $limit) = $this->buildparams();
             $total = $this->model
-                    ->where($where)
-                    ->order($sort, $order)
-                    ->count();
+                ->where($where)
+                ->order($sort, $order)
+                ->count();
 
             $list = $this->model
-                    ->where($where)
-                    ->order($sort, $order)
-                    ->limit($offset, $limit)
-                    ->select();
+                ->where($where)
+                ->order($sort, $order)
+                ->limit($offset, $limit)
+                ->select();
 
             $list = collection($list)->toArray();
             $result = array("total" => $total, "rows" => $list);
@@ -46,21 +44,20 @@ trait Backend
     {
         //设置过滤方法
         $this->request->filter(['strip_tags']);
-        if ($this->request->isAjax())
-        {
+        if ($this->request->isAjax()) {
             list($where, $sort, $order, $offset, $limit) = $this->buildparams();
             $total = $this->model
-                    ->onlyTrashed()
-                    ->where($where)
-                    ->order($sort, $order)
-                    ->count();
+                ->onlyTrashed()
+                ->where($where)
+                ->order($sort, $order)
+                ->count();
 
             $list = $this->model
-                    ->onlyTrashed()
-                    ->where($where)
-                    ->order($sort, $order)
-                    ->limit($offset, $limit)
-                    ->select();
+                ->onlyTrashed()
+                ->where($where)
+                ->order($sort, $order)
+                ->limit($offset, $limit)
+                ->select();
 
             $result = array("total" => $total, "rows" => $list);
 
@@ -74,36 +71,26 @@ trait Backend
      */
     public function add()
     {
-        if ($this->request->isPost())
-        {
+        if ($this->request->isPost()) {
             $params = $this->request->post("row/a");
-            if ($params)
-            {
-                if ($this->dataLimit && $this->dataLimitFieldAutoFill)
-                {
+            if ($params) {
+                if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
                     $params[$this->dataLimitField] = $this->auth->id;
                 }
-                try
-                {
+                try {
                     //是否采用模型验证
-                    if ($this->modelValidate)
-                    {
+                    if ($this->modelValidate) {
                         $name = basename(str_replace('\\', '/', get_class($this->model)));
                         $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : true) : $this->modelValidate;
                         $this->model->validate($validate);
                     }
                     $result = $this->model->allowField(true)->save($params);
-                    if ($result !== false)
-                    {
+                    if ($result !== false) {
                         $this->success();
-                    }
-                    else
-                    {
+                    } else {
                         $this->error($this->model->getError());
                     }
-                }
-                catch (\think\exception\PDOException $e)
-                {
+                } catch (\think\exception\PDOException $e) {
                     $this->error($e->getMessage());
                 }
             }
@@ -121,39 +108,28 @@ trait Backend
         if (!$row)
             $this->error(__('No Results were found'));
         $adminIds = $this->getDataLimitAdminIds();
-        if (is_array($adminIds))
-        {
-            if (!in_array($row[$this->dataLimitField], $adminIds))
-            {
+        if (is_array($adminIds)) {
+            if (!in_array($row[$this->dataLimitField], $adminIds)) {
                 $this->error(__('You have no permission'));
             }
         }
-        if ($this->request->isPost())
-        {
+        if ($this->request->isPost()) {
             $params = $this->request->post("row/a");
-            if ($params)
-            {
-                try
-                {
+            if ($params) {
+                try {
                     //是否采用模型验证
-                    if ($this->modelValidate)
-                    {
+                    if ($this->modelValidate) {
                         $name = basename(str_replace('\\', '/', get_class($this->model)));
                         $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : true) : $this->modelValidate;
                         $row->validate($validate);
                     }
                     $result = $row->allowField(true)->save($params);
-                    if ($result !== false)
-                    {
+                    if ($result !== false) {
                         $this->success();
-                    }
-                    else
-                    {
+                    } else {
                         $this->error($row->getError());
                     }
-                }
-                catch (\think\exception\PDOException $e)
-                {
+                } catch (\think\exception\PDOException $e) {
                     $this->error($e->getMessage());
                 }
             }
@@ -168,26 +144,20 @@ trait Backend
      */
     public function del($ids = "")
     {
-        if ($ids)
-        {
+        if ($ids) {
             $pk = $this->model->getPk();
             $adminIds = $this->getDataLimitAdminIds();
-            if (is_array($adminIds))
-            {
+            if (is_array($adminIds)) {
                 $count = $this->model->where($this->dataLimitField, 'in', $adminIds);
             }
             $list = $this->model->where($pk, 'in', $ids)->select();
             $count = 0;
-            foreach ($list as $k => $v)
-            {
+            foreach ($list as $k => $v) {
                 $count += $v->delete();
             }
-            if ($count)
-            {
+            if ($count) {
                 $this->success();
-            }
-            else
-            {
+            } else {
                 $this->error(__('No rows were deleted'));
             }
         }
@@ -201,26 +171,20 @@ trait Backend
     {
         $pk = $this->model->getPk();
         $adminIds = $this->getDataLimitAdminIds();
-        if (is_array($adminIds))
-        {
+        if (is_array($adminIds)) {
             $count = $this->model->where($this->dataLimitField, 'in', $adminIds);
         }
-        if ($ids)
-        {
+        if ($ids) {
             $this->model->where($pk, 'in', $ids);
         }
         $count = 0;
         $list = $this->model->onlyTrashed()->select();
-        foreach ($list as $k => $v)
-        {
+        foreach ($list as $k => $v) {
             $count += $v->delete(true);
         }
-        if ($count)
-        {
+        if ($count) {
             $this->success();
-        }
-        else
-        {
+        } else {
             $this->error(__('No rows were deleted'));
         }
         $this->error(__('Parameter %s can not be empty', 'ids'));
@@ -233,17 +197,18 @@ trait Backend
     {
         $pk = $this->model->getPk();
         $adminIds = $this->getDataLimitAdminIds();
-        if (is_array($adminIds))
-        {
+        if (is_array($adminIds)) {
             $this->model->where($this->dataLimitField, 'in', $adminIds);
         }
-        if ($ids)
-        {
+        if ($ids) {
             $this->model->where($pk, 'in', $ids);
         }
-        $count = $this->model->restore('1=1');
-        if ($count)
-        {
+        $count = 0;
+        $list = $this->model->onlyTrashed()->select();
+        foreach ($list as $index => $item) {
+            $count += $item->restore();
+        }
+        if ($count) {
             $this->success();
         }
         $this->error(__('No rows were updated'));
@@ -255,32 +220,26 @@ trait Backend
     public function multi($ids = "")
     {
         $ids = $ids ? $ids : $this->request->param("ids");
-        if ($ids)
-        {
-            if ($this->request->has('params'))
-            {
+        if ($ids) {
+            if ($this->request->has('params')) {
                 parse_str($this->request->post("params"), $values);
                 $values = array_intersect_key($values, array_flip(is_array($this->multiFields) ? $this->multiFields : explode(',', $this->multiFields)));
-                if ($values)
-                {
+                if ($values) {
                     $adminIds = $this->getDataLimitAdminIds();
-                    if (is_array($adminIds))
-                    {
+                    if (is_array($adminIds)) {
                         $this->model->where($this->dataLimitField, 'in', $adminIds);
                     }
-                    $this->model->where($this->model->getPk(), 'in', $ids);
-                    $count = $this->model->allowField(true)->isUpdate(true)->save($values);
-                    if ($count)
-                    {
-                        $this->success();
+                    $count = 0;
+                    $list = $this->model->where($this->model->getPk(), 'in', $ids)->select();
+                    foreach ($list as $index => $item) {
+                        $count += $item->allowField(true)->isUpdate(true)->save($values);
                     }
-                    else
-                    {
+                    if ($count) {
+                        $this->success();
+                    } else {
                         $this->error(__('No rows were updated'));
                     }
-                }
-                else
-                {
+                } else {
                     $this->error(__('You have no permission'));
                 }
             }
@@ -294,24 +253,19 @@ trait Backend
     protected function import()
     {
         $file = $this->request->request('file');
-        if (!$file)
-        {
+        if (!$file) {
             $this->error(__('Parameter %s can not be empty', 'file'));
         }
         $filePath = ROOT_PATH . DS . 'public' . DS . $file;
-        if (!is_file($filePath))
-        {
+        if (!is_file($filePath)) {
             $this->error(__('No results were found'));
         }
         $PHPReader = new \PHPExcel_Reader_Excel2007();
-        if (!$PHPReader->canRead($filePath))
-        {
+        if (!$PHPReader->canRead($filePath)) {
             $PHPReader = new \PHPExcel_Reader_Excel5();
-            if (!$PHPReader->canRead($filePath))
-            {
+            if (!$PHPReader->canRead($filePath)) {
                 $PHPReader = new \PHPExcel_Reader_CSV();
-                if (!$PHPReader->canRead($filePath))
-                {
+                if (!$PHPReader->canRead($filePath)) {
                     $this->error(__('Unknown data format'));
                 }
             }
@@ -324,14 +278,10 @@ trait Backend
         $database = \think\Config::get('database.database');
         $fieldArr = [];
         $list = db()->query("SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?", [$table, $database]);
-        foreach ($list as $k => $v)
-        {
-            if ($importHeadType == 'comment')
-            {
+        foreach ($list as $k => $v) {
+            if ($importHeadType == 'comment') {
                 $fieldArr[$v['COLUMN_COMMENT']] = $v['COLUMN_NAME'];
-            }
-            else
-            {
+            } else {
                 $fieldArr[$v['COLUMN_NAME']] = $v['COLUMN_NAME'];
             }
         }
@@ -341,47 +291,36 @@ trait Backend
         $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号
         $allRow = $currentSheet->getHighestRow(); //取得一共有多少行
         $maxColumnNumber = \PHPExcel_Cell::columnIndexFromString($allColumn);
-        for ($currentRow = 1; $currentRow <= 1; $currentRow++)
-        {
-            for ($currentColumn = 0; $currentColumn < $maxColumnNumber; $currentColumn++)
-            {
+        for ($currentRow = 1; $currentRow <= 1; $currentRow++) {
+            for ($currentColumn = 0; $currentColumn < $maxColumnNumber; $currentColumn++) {
                 $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
                 $fields[] = $val;
             }
         }
         $insert = [];
-        for ($currentRow = 2; $currentRow <= $allRow; $currentRow++)
-        {
+        for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
             $values = [];
-            for ($currentColumn = 0; $currentColumn < $maxColumnNumber; $currentColumn++)
-            {
+            for ($currentColumn = 0; $currentColumn < $maxColumnNumber; $currentColumn++) {
                 $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
                 $values[] = is_null($val) ? '' : $val;
             }
             $row = [];
             $temp = array_combine($fields, $values);
-            foreach ($temp as $k => $v)
-            {
-                if (isset($fieldArr[$k]) && $k !== '')
-                {
+            foreach ($temp as $k => $v) {
+                if (isset($fieldArr[$k]) && $k !== '') {
                     $row[$fieldArr[$k]] = $v;
                 }
             }
-            if ($row)
-            {
+            if ($row) {
                 $insert[] = $row;
             }
         }
-        if (!$insert)
-        {
+        if (!$insert) {
             $this->error(__('No rows were updated'));
         }
-        try
-        {
+        try {
             $this->model->saveAll($insert);
-        }
-        catch (\think\exception\PDOException $exception)
-        {
+        } catch (\think\exception\PDOException $exception) {
             $this->error($exception->getMessage());
         }
 

+ 1 - 1
application/admin/view/auth/rule/tpl.html

@@ -24,7 +24,7 @@
         <div>
             <form onsubmit="return false;">
                 <div class="input-group input-groupp-md">
-                    <div class="input-group-addon">搜索图标</div>
+                    <div class="input-group-addon">{:__('Search icon')}</div>
                     <input class="js-icon-search form-control" type="text" placeholder="">
                 </div>
             </form>

+ 28 - 37
application/api/controller/Sms.php

@@ -23,8 +23,8 @@ class Sms extends Api
     /**
      * 发送验证码
      *
-     * @param string    $mobile     手机号
-     * @param string    $event      事件名称
+     * @param string $mobile 手机号
+     * @param string $event 事件名称
      */
     public function send()
     {
@@ -32,37 +32,34 @@ class Sms extends Api
         $event = $this->request->request("event");
         $event = $event ? $event : 'register';
 
+        if (!$mobile || !\think\Validate::regex($mobile, "^1\d{10}$")) {
+            $this->error(__('手机号不正确'));
+        }
         $last = Smslib::get($mobile, $event);
-        if ($last && time() - $last['createtime'] < 60)
-        {
+        if ($last && time() - $last['createtime'] < 60) {
+            $this->error(__('发送频繁'));
+        }
+        $ipSendTotal = \app\common\model\Sms::where(['ip' => $this->request->ip()])->whereTime('createtime', '-1 hours')->count();
+        if ($ipSendTotal >= 5) {
             $this->error(__('发送频繁'));
         }
-        if ($event)
-        {
+        if ($event) {
             $userinfo = User::getByMobile($mobile);
-            if ($event == 'register' && $userinfo)
-            {
+            if ($event == 'register' && $userinfo) {
                 //已被注册
                 $this->error(__('已被注册'));
-            }
-            else if (in_array($event, ['changemobile']) && $userinfo)
-            {
+            } else if (in_array($event, ['changemobile']) && $userinfo) {
                 //被占用
                 $this->error(__('已被占用'));
-            }
-            else if (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo)
-            {
+            } else if (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
                 //未注册
                 $this->error(__('未注册'));
             }
         }
         $ret = Smslib::send($mobile, NULL, $event);
-        if ($ret)
-        {
+        if ($ret) {
             $this->success(__('发送成功'));
-        }
-        else
-        {
+        } else {
             $this->error(__('发送失败'));
         }
     }
@@ -70,9 +67,9 @@ class Sms extends Api
     /**
      * 检测验证码
      *
-     * @param string    $mobile     手机号
-     * @param string    $event      事件名称
-     * @param string    $captcha    验证码
+     * @param string $mobile 手机号
+     * @param string $event 事件名称
+     * @param string $captcha 验证码
      */
     public function check()
     {
@@ -81,32 +78,26 @@ class Sms extends Api
         $event = $event ? $event : 'register';
         $captcha = $this->request->request("captcha");
 
-        if ($event)
-        {
+        if (!$mobile || !\think\Validate::regex($mobile, "^1\d{10}$")) {
+            $this->error(__('手机号不正确'));
+        }
+        if ($event) {
             $userinfo = User::getByMobile($mobile);
-            if ($event == 'register' && $userinfo)
-            {
+            if ($event == 'register' && $userinfo) {
                 //已被注册
                 $this->error(__('已被注册'));
-            }
-            else if (in_array($event, ['changemobile']) && $userinfo)
-            {
+            } else if (in_array($event, ['changemobile']) && $userinfo) {
                 //被占用
                 $this->error(__('已被占用'));
-            }
-            else if (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo)
-            {
+            } else if (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
                 //未注册
                 $this->error(__('未注册'));
             }
         }
         $ret = Smslib::check($mobile, $captcha, $event);
-        if ($ret)
-        {
+        if ($ret) {
             $this->success(__('成功'));
-        }
-        else
-        {
+        } else {
             $this->error(__('验证码不正确'));
         }
     }

+ 1 - 1
application/common/controller/Api.php

@@ -153,7 +153,7 @@ class Api
      */
     protected function loadlang($name)
     {
-        Lang::load(APP_PATH . $this->request->module() . '/lang/' . Lang::detect() . '/' . str_replace('.', '/', $name) . '.php');
+        Lang::load(APP_PATH . $this->request->module() . '/lang/' . $this->request->langset() . '/' . str_replace('.', '/', $name) . '.php');
     }
 
     /**

+ 20 - 9
application/common/controller/Backend.php

@@ -89,6 +89,11 @@ class Backend extends Controller
     protected $multiFields = 'status';
 
     /**
+     * Selectpage可显示的字段
+     */
+    protected $selectpageFields = '*';
+
+    /**
      * 导入文件首行类型
      * 支持comment/name
      * 表示注释或字段名
@@ -166,7 +171,7 @@ class Backend extends Controller
         }
 
         // 语言检测
-        $lang = strip_tags(Lang::detect());
+        $lang = strip_tags($this->request->langset());
 
         $site = Config::get("site");
 
@@ -212,7 +217,7 @@ class Backend extends Controller
      */
     protected function loadlang($name)
     {
-        Lang::load(APP_PATH . $this->request->module() . '/lang/' . Lang::detect() . '/' . str_replace('.', '/', $name) . '.php');
+        Lang::load(APP_PATH . $this->request->module() . '/lang/' . $this->request->langset() . '/' . str_replace('.', '/', $name) . '.php');
     }
 
     /**
@@ -402,7 +407,7 @@ class Backend extends Controller
         //分页大小
         $pagesize = $this->request->request("pageSize");
         //搜索条件
-        $andor = $this->request->request("andOr");
+        $andor = $this->request->request("andOr", "and", "strtoupper");
         //排序方式
         $orderby = (array)$this->request->request("orderBy/a");
         //显示的字段
@@ -426,10 +431,10 @@ class Backend extends Controller
             $where = [$primarykey => ['in', $primaryvalue]];
         } else {
             $where = function ($query) use ($word, $andor, $field, $searchfield, $custom) {
+                $logic = $andor == 'AND' ? '&' : '|';
+                $searchfield = is_array($searchfield) ? implode($logic, $searchfield) : $searchfield;
                 foreach ($word as $k => $v) {
-                    foreach ($searchfield as $m => $n) {
-                        $query->where($n, "like", "%{$v}%", $andor);
-                    }
+                    $query->where(str_replace(',', $logic, $searchfield), "like", "%{$v}%");
                 }
                 if ($custom && is_array($custom)) {
                     foreach ($custom as $k => $v) {
@@ -448,12 +453,18 @@ class Backend extends Controller
             if (is_array($adminIds)) {
                 $this->model->where($this->dataLimitField, 'in', $adminIds);
             }
-            $list = $this->model->where($where)
+            $datalist = $this->model->where($where)
                 ->order($order)
                 ->page($page, $pagesize)
-                ->field("{$primarykey},{$field}")
-                ->field("password,salt", true)
+                ->field($this->selectpageFields)
                 ->select();
+            foreach ($datalist as $index => $item) {
+                unset($item['password'], $item['salt']);
+                $list[] = [
+                    $primarykey => isset($item[$primarykey]) ? $item[$primarykey] : '',
+                    $field      => isset($item[$field]) ? $item[$field] : ''
+                ];
+            }
         }
         //这里一定要返回有list这个字段,total是可选的,如果total<=list的数量,则会隐藏分页按钮
         return json(['list' => $list, 'total' => $total]);

+ 11 - 19
application/common/controller/Frontend.php

@@ -34,7 +34,7 @@ class Frontend extends Controller
 
     /**
      * 权限Auth
-     * @var Auth 
+     * @var Auth
      */
     protected $auth = null;
 
@@ -47,8 +47,7 @@ class Frontend extends Controller
         $actionname = strtolower($this->request->action());
 
         // 如果有使用模板布局
-        if ($this->layout)
-        {
+        if ($this->layout) {
             $this->view->engine->layout('layout/' . $this->layout);
         }
         $this->auth = Auth::instance();
@@ -60,30 +59,23 @@ class Frontend extends Controller
         // 设置当前请求的URI
         $this->auth->setRequestUri($path);
         // 检测是否需要验证登录
-        if (!$this->auth->match($this->noNeedLogin))
-        {
+        if (!$this->auth->match($this->noNeedLogin)) {
             //初始化
             $this->auth->init($token);
             //检测是否登录
-            if (!$this->auth->isLogin())
-            {
+            if (!$this->auth->isLogin()) {
                 $this->error(__('Please login first'), 'user/login');
             }
             // 判断是否需要验证权限
-            if (!$this->auth->match($this->noNeedRight))
-            {
+            if (!$this->auth->match($this->noNeedRight)) {
                 // 判断控制器和方法判断是否有对应权限
-                if (!$this->auth->check($path))
-                {
+                if (!$this->auth->check($path)) {
                     $this->error(__('You have no permission'));
                 }
             }
-        }
-        else
-        {
+        } else {
             // 如果有传递token才验证是否登录状态
-            if ($token)
-            {
+            if ($token) {
                 $this->auth->init($token);
             }
         }
@@ -91,7 +83,7 @@ class Frontend extends Controller
         $this->view->assign('user', $this->auth->getUser());
 
         // 语言检测
-        $lang = strip_tags(Lang::detect());
+        $lang = strip_tags($this->request->langset());
 
         $site = Config::get("site");
 
@@ -129,13 +121,13 @@ class Frontend extends Controller
      */
     protected function loadlang($name)
     {
-        Lang::load(APP_PATH . $this->request->module() . '/lang/' . Lang::detect() . '/' . str_replace('.', '/', $name) . '.php');
+        Lang::load(APP_PATH . $this->request->module() . '/lang/' . $this->request->langset() . '/' . str_replace('.', '/', $name) . '.php');
     }
 
     /**
      * 渲染配置信息
      * @param mixed $name 键名或数组
-     * @param mixed $value 值 
+     * @param mixed $value 值
      */
     protected function assignconfig($name, $value = '')
     {

+ 63 - 57
application/common/view/tpl/dispatch_jump.tpl

@@ -1,60 +1,66 @@
 {__NOLAYOUT__}<!DOCTYPE html>
 <html>
-    <head>
-        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-        <title>{:__('Warning')}</title>
-        <meta name="viewport" content="width=device-width, initial-scale=1.0">
-        <link rel="shortcut icon" href="__CDN__/assets/img/favicon.ico" />
-        <style type="text/css">
-            *{box-sizing:border-box;margin:0;padding:0;font-family:Lantinghei SC,Open Sans,Arial,Hiragino Sans GB,Microsoft YaHei,"微软雅黑",STHeiti,WenQuanYi Micro Hei,SimSun,sans-serif;-webkit-font-smoothing:antialiased}
-            body{padding:70px 0;background:#edf1f4;font-weight:400;font-size:1pc;-webkit-text-size-adjust:none;color:#333}
-            a{outline:0;color:#3498db;text-decoration:none;cursor:pointer}
-            .system-message{margin:20px 5%;padding:40px 20px;background:#fff;box-shadow:1px 1px 1px hsla(0,0%,39%,.1);text-align:center}
-            .system-message h1{margin:0;margin-bottom:9pt;color:#444;font-weight:400;font-size:40px}
-            .system-message .jump,.system-message .image{margin:20px 0;padding:0;padding:10px 0;font-weight:400}
-            .system-message .jump{font-size:14px}
-            .system-message .jump a{color:#333}
-            .system-message p{font-size:9pt;line-height:20px}
-            .system-message .btn{display:inline-block;margin-right:10px;width:138px;height:2pc;border:1px solid #44a0e8;border-radius:30px;color:#44a0e8;text-align:center;font-size:1pc;line-height:2pc;margin-bottom:5px;}
-            .success .btn{border-color:#69bf4e;color:#69bf4e}
-            .error .btn{border-color:#ff8992;color:#ff8992}
-            .info .btn{border-color:#3498db;color:#3498db}
-            .copyright p{width:100%;color:#919191;text-align:center;font-size:10px}
-            .system-message .btn-grey{border-color:#bbb;color:#bbb}
-            .clearfix:after{clear:both;display:block;visibility:hidden;height:0;content:"."}
-            @media (max-width:768px){body {padding:20px 0;}}
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>{:__('Warning')}</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <link rel="shortcut icon" href="__CDN__/assets/img/favicon.ico" />
+    <style type="text/css">
+        *{box-sizing:border-box;margin:0;padding:0;font-family:Lantinghei SC,Open Sans,Arial,Hiragino Sans GB,Microsoft YaHei,"微软雅黑",STHeiti,WenQuanYi Micro Hei,SimSun,sans-serif;-webkit-font-smoothing:antialiased}
+        body{padding:70px 0;background:#edf1f4;font-weight:400;font-size:1pc;-webkit-text-size-adjust:none;color:#333}
+        a{outline:0;color:#3498db;text-decoration:none;cursor:pointer}
+        .system-message{margin:20px 5%;padding:40px 20px;background:#fff;box-shadow:1px 1px 1px hsla(0,0%,39%,.1);text-align:center}
+        .system-message h1{margin:0;margin-bottom:9pt;color:#444;font-weight:400;font-size:40px}
+        .system-message .jump,.system-message .image{margin:20px 0;padding:0;padding:10px 0;font-weight:400}
+        .system-message .jump{font-size:14px}
+        .system-message .jump a{color:#333}
+        .system-message p{font-size:9pt;line-height:20px}
+        .system-message .btn{display:inline-block;margin-right:10px;width:138px;height:2pc;border:1px solid #44a0e8;border-radius:30px;color:#44a0e8;text-align:center;font-size:1pc;line-height:2pc;margin-bottom:5px;}
+        .success .btn{border-color:#69bf4e;color:#69bf4e}
+        .error .btn{border-color:#ff8992;color:#ff8992}
+        .info .btn{border-color:#3498db;color:#3498db}
+        .copyright p{width:100%;color:#919191;text-align:center;font-size:10px}
+        .system-message .btn-grey{border-color:#bbb;color:#bbb}
+        .clearfix:after{clear:both;display:block;visibility:hidden;height:0;content:"."}
+        @media (max-width:768px){body {padding:20px 0;}}
             @media (max-width:480px){.system-message h1{font-size:30px;}}
-        </style>
-    </head>
-    <body>
-        {php}$codeText=$code == 1 ? 'success' : ($code == 0 ? 'error' : 'info');{/php}
-        <div class="system-message {$codeText}">
-            <div class="image">
-                <img src="__CDN__/assets/img/{$codeText}.svg" alt="" width="150" />
-            </div>
-            <h1>{$msg}</h1>
-            <p class="jump">
-                {:__('This page will be re-directed in %s seconds', '<span id="wait">' . $wait . '</span>')}
-            </p>
-            <p class="clearfix">
-                <a href="javascript:history.go(-1);" class="btn btn-grey">{:__('Go back')}</a>
-                <a href="{$url}" class="btn btn-primary">{:__('Jump now')}</a>
-            </p>
-        </div>
-        <div class="copyright">
-            <p>Powered by <a href="https://www.fastadmin.net/?ref=jump">FastAdmin</a></p>
-        </div>
-        <script type="text/javascript">
-            (function () {
-                var wait = document.getElementById('wait');
-                var interval = setInterval(function () {
-                    var time = --wait.innerHTML;
-                    if (time <= 0) {
-                        location.href = "{$url}";
-                        clearInterval(interval);
-                    }
-                }, 1000);
-            })();
-        </script>
-    </body>
-</html>
+    </style>
+</head>
+<body>
+{php}$codeText=$code == 1 ? 'success' : ($code == 0 ? 'error' : 'info');{/php}
+<div class="system-message {$codeText}">
+    <div class="image">
+        <img src="__CDN__/assets/img/{$codeText}.svg" alt="" width="150" />
+    </div>
+    <h1>{$msg}</h1>
+    {if $url}
+        <p class="jump">
+            {:__('This page will be re-directed in %s seconds', '<span id="wait">' . $wait . '</span>')}
+        </p>
+    {/if}
+    <p class="clearfix">
+        <a href="__PUBLIC__" class="btn btn-grey">{:__('Go back')}</a>
+        {if $url}
+            <a href="{$url}" class="btn btn-primary">{:__('Jump now')}</a>
+        {/if}
+    </p>
+</div>
+<div class="copyright">
+    <p>Powered by <a href="https://www.fastadmin.net/?ref=jump">FastAdmin</a></p>
+</div>
+{if $url}
+    <script type="text/javascript">
+        (function () {
+            var wait = document.getElementById('wait');
+            var interval = setInterval(function () {
+                var time = --wait.innerHTML;
+                if (time <= 0) {
+                    location.href = "{$url}";
+                    clearInterval(interval);
+                }
+            }, 1000);
+        })();
+    </script>
+{/if}
+</body>
+</html>

+ 1 - 1
application/config.php

@@ -272,7 +272,7 @@ return [
         //自动检测更新
         'checkupdate'         => false,
         //版本号
-        'version'             => '1.0.0.20180513_beta',
+        'version'             => '1.0.0.20180618_beta',
         //API接口地址
         'api_url'             => 'https://api.fastadmin.net',
     ],

+ 4 - 4
application/index/view/common/sidenav.html

@@ -1,9 +1,9 @@
 <div class="sidenav">
     <ul class="list-group">
         <li class="list-group-heading">{:__('User center')}</li>
-        <li class="list-group-item {:$config['actionname']=='index'?'active':''}"> <a href="{:url('user/index')}"><i class="fa fa-user-circle"></i> {:__('User center')}</a> </li>
-        <li class="list-group-item {:$config['actionname']=='profile'?'active':''}"> <a href="{:url('user/profile')}"><i class="fa fa-user-o"></i> {:__('Profile')}</a> </li>
-        <li class="list-group-item {:$config['actionname']=='changepwd'?'active':''}"> <a href="{:url('user/changepwd')}"><i class="fa fa-key"></i> {:__('Change password')}</a> </li>
-        <li class="list-group-item {:$config['actionname']=='logout'?'active':''}"> <a href="{:url('user/logout')}"><i class="fa fa-sign-out"></i> {:__('Sign out')}</a> </li>
+        <li class="list-group-item {:$config['actionname']=='index'?'active':''}"> <a href="{:url('user/index')}"><i class="fa fa-user-circle fa-fw"></i> {:__('User center')}</a> </li>
+        <li class="list-group-item {:$config['actionname']=='profile'?'active':''}"> <a href="{:url('user/profile')}"><i class="fa fa-user-o fa-fw"></i> {:__('Profile')}</a> </li>
+        <li class="list-group-item {:$config['actionname']=='changepwd'?'active':''}"> <a href="{:url('user/changepwd')}"><i class="fa fa-key fa-fw"></i> {:__('Change password')}</a> </li>
+        <li class="list-group-item {:$config['actionname']=='logout'?'active':''}"> <a href="{:url('user/logout')}"><i class="fa fa-sign-out fa-fw"></i> {:__('Sign out')}</a> </li>
     </ul>
 </div>

+ 6 - 6
application/index/view/layout/default.html

@@ -38,13 +38,13 @@
                             {/if}
                             <ul class="dropdown-menu">
                                 {if $user}
-                                <li><a href="{:url('user/index')}"><i class="fa fa-user-circle"></i>{:__('User center')}</a></li>
-                                <li><a href="{:url('user/profile')}"><i class="fa fa-user-o"></i>{:__('Profile')}</a></li>
-                                <li><a href="{:url('user/changepwd')}"><i class="fa fa-key"></i>{:__('Change password')}</a></li>
-                                <li><a href="{:url('user/logout')}"><i class="fa fa-sign-out"></i>{:__('Sign out')}</a></li>
+                                <li><a href="{:url('user/index')}"><i class="fa fa-user-circle fa-fw"></i>{:__('User center')}</a></li>
+                                <li><a href="{:url('user/profile')}"><i class="fa fa-user-o fa-fw"></i>{:__('Profile')}</a></li>
+                                <li><a href="{:url('user/changepwd')}"><i class="fa fa-key fa-fw"></i>{:__('Change password')}</a></li>
+                                <li><a href="{:url('user/logout')}"><i class="fa fa-sign-out fa-fw"></i>{:__('Sign out')}</a></li>
                                 {else /}
-                                <li><a href="{:url('user/login')}"><i class="fa fa-sign-in"></i> {:__('Sign in')}</a></li>
-                                <li><a href="{:url('user/register')}"><i class="fa fa-user-o"></i> {:__('Sign up')}</a></li>
+                                <li><a href="{:url('user/login')}"><i class="fa fa-sign-in fa-fw"></i> {:__('Sign in')}</a></li>
+                                <li><a href="{:url('user/register')}"><i class="fa fa-user-o fa-fw"></i> {:__('Sign up')}</a></li>
                                 {/if}
 
                             </ul>

+ 46 - 28
application/index/view/user/index.html

@@ -1,3 +1,16 @@
+<style>
+    .basicinfo {
+        margin: 15px 0;
+    }
+
+    .basicinfo .row > .col-xs-4 {
+        padding-right: 0;
+    }
+
+    .basicinfo .row > div {
+        margin: 5px 0;
+    }
+</style>
 <div id="content-container" class="container">
     <div class="row">
         <div class="col-md-3">
@@ -6,48 +19,53 @@
         <div class="col-md-9">
             <div class="panel panel-default ">
                 <div class="panel-body">
-                    <h2 class="page-header">{:__('User center')}</h2>
+                    <h2 class="page-header">
+                        {:__('User center')}
+                        <a href="{:url('user/profile')}" class="btn btn-success pull-right"><i class="fa fa-pencil"></i>
+                            {:__('Profile')}</a>
+                    </h2>
                     <div class="row user-baseinfo">
                         <div class="col-md-3 col-sm-3 col-xs-2 text-center user-center">
                             <a href="{:url('user/profile')}" title="{:__('Click to edit')}">
                                 <span class="avatar-img"><img src="{$user.avatar}" alt=""></span>
                             </a>
                         </div>
-                        <div class="col-md-7 col-sm-7 col-xs-10">
+                        <div class="col-md-9 col-sm-9 col-xs-10">
                             <!-- Content -->
                             <div class="ui-content">
                                 <!-- Heading -->
-                                <h4><a href="{:url('user/profile')}">{$user.username}</a></h4>
+                                <h4><a href="{:url('user/profile')}">{$user.nickname}</a></h4>
                                 <!-- Paragraph -->
-                                <p><a href="{:url('user/profile')}">{$user.bio|default=__("This guy hasn't written anything yet")}</a></p>
+                                <p>
+                                    <a href="{:url('user/profile')}">
+                                        {$user.bio|default=__("This guy hasn't written anything yet")}
+                                    </a>
+                                </p>
                                 <!-- Success -->
-                                <div style="margin-top:15px;">
-                                    <table class="table">	
-                                        <tbody><tr>
-                                                <th>{:__('Lv')}</th>
-                                                <td><a href="javascript:;" class="viewlv">{$user.level}</a></td>
-                                                <th>{:__('Score')}</th>
-                                                <td><a href="javascript:;" class="viewscore">{$user.score}</a></td>
-                                            </tr>
-                                            <tr>
-                                                <th>{:__('Successions')}</th>
-                                                <td>{$user.successions} {:__('Day')}</td>
-                                                <th>{:__('Maxsuccessions')}</th>
-                                                <td>{$user.maxsuccessions} {:__('Day')}</td>
-                                            </tr>
-                                            <tr>
-                                                <th>{:__('Logintime')}</th>
-                                                <td>{$user.logintime|date="Y-m-d H:i:s",###}</td>
-                                                <th>{:__('Prevtime')}</th>
-                                                <td>{$user.prevtime|date="Y-m-d H:i:s",###}</td>
-                                            </tr>
-                                        </tbody></table>
+                                <div class="basicinfo">
+                                    <div class="row">
+                                        <div class="col-xs-4 col-md-2">{:__('Lv')}</div>
+                                        <div class="col-xs-8 col-md-4"><a href="javascript:;" class="viewlv">{$user.level}</a>
+                                        </div>
+                                        <div class="col-xs-4 col-md-2">{:__('Score')}</div>
+                                        <div class="col-xs-8 col-md-4"><a href="javascript:;" class="viewscore">{$user.score}</a>
+                                        </div>
+                                    </div>
+                                    <div class="row">
+                                        <div class="col-xs-4 col-md-2">{:__('Successions')}</div>
+                                        <div class="col-xs-8 col-md-4">{$user.successions} {:__('Day')}</div>
+                                        <div class="col-xs-4 col-md-2">{:__('Maxsuccessions')}</div>
+                                        <div class="col-xs-8 col-md-4">{$user.maxsuccessions} {:__('Day')}</div>
+                                    </div>
+                                    <div class="row">
+                                        <div class="col-xs-4 col-md-2">{:__('Logintime')}</div>
+                                        <div class="col-xs-8 col-md-4">{$user.logintime|date="Y-m-d H:i:s",###}</div>
+                                        <div class="col-xs-4 col-md-2">{:__('Prevtime')}</div>
+                                        <div class="col-xs-8 col-md-4">{$user.prevtime|date="Y-m-d H:i:s",###}</div>
+                                    </div>
                                 </div>
                             </div>
                         </div>
-                        <div class="col-md-2 col-sm-2 col-xs-0 col-pad">
-                            <a href="{:url('user/profile')}" class="btn btn-success hidden-xs"><i class="fa fa-pencil"></i> {:__('Profile')}</a>	
-                        </div>
                     </div>
                 </div>
             </div>

+ 1 - 1
bower.json

@@ -28,7 +28,7 @@
     "art-template": "^3.1.3",
     "requirejs-plugins": "~1.0.3",
     "bootstrap-daterangepicker": "~2.1.25",
-    "city-picker": "~1.1.0",
+    "fastadmin-citypicker": "~1.3.0",
     "fastadmin-cxselect": "~1.4.0",
     "fastadmin-dragsort": "~1.0.0",
     "fastadmin-addtabs": "~1.0.0",

+ 3 - 9
public/assets/css/backend.css

@@ -44,9 +44,6 @@ html.ios-fix body {
   overflow: auto;
   -webkit-overflow-scrolling: touch;
 }
-.content {
-  min-height: 500px;
-}
 #header {
   background: #fff;
 }
@@ -293,9 +290,6 @@ form.form-horizontal .control-label {
   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: 50px;
   line-height: 50px;
@@ -419,9 +413,6 @@ form.form-horizontal .control-label {
   background: none;
   border: none;
 }
-#secondnav .nav-addtabs > li > a i {
-  margin-right: 3px;
-}
 #secondnav .nav-addtabs > li.active {
   border-color: #bdbebd;
   background-color: #f7f7f7;
@@ -493,6 +484,9 @@ form.form-horizontal .control-label {
 .sidebar-menu > li .badge {
   margin-top: 0;
 }
+.sidebar-menu .treeview-menu > li > a {
+  font-size: inherit;
+}
 .sidebar-collapse .user-panel > .image img {
   width: 25px;
   height: 25px;

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
public/assets/css/backend.min.css


+ 12 - 8
public/assets/js/backend/index.js

@@ -125,10 +125,10 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form'], functi
                     success: function (ret) {
                         if (ret.data && ignoreversion !== ret.data.newversion) {
                             Layer.open({
-                                title: '发现新版本',
+                                title: __('Discover new version'),
                                 maxHeight: 400,
-                                content: '<h5 style="background-color:#f7f7f7; font-size:14px; padding: 10px;">你的版本是:' + ret.data.version + ',新版本:' + ret.data.newversion + '</h5><span class="label label-danger">更新说明</span><br/>' + ret.data.upgradetext,
-                                btn: ['去下载更新', '忽略此次更新', '不再提示'],
+                                content: '<h5 style="background-color:#f7f7f7; font-size:14px; padding: 10px;">' + __('Your current version') + ':' + ret.data.version + ',' + __('New version') + ':' + ret.data.newversion + '</h5><span class="label label-danger">'+__('Release notes')+'</span><br/>' + ret.data.upgradetext,
+                                btn: [__('Go to download'), __('Ignore this version'), __('Do not remind again')],
                                 btn2: function (index, layero) {
                                     localStorage.setItem("ignoreversion", ret.data.newversion);
                                 },
@@ -141,12 +141,12 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form'], functi
                             });
                         } else {
                             if (tips) {
-                                Toastr.success("当前已经是最新版本");
+                                Toastr.success(__('Currently is the latest version'));
                             }
                         }
                     }, error: function (e) {
                         if (tips) {
-                            Toastr.error("发生未知错误:" + e.message);
+                            Toastr.error(__('Unknown data format') + ":" + e.message);
                         }
                     }
                 });
@@ -257,11 +257,15 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form'], functi
                     if ($(this).attr("url") == "javascript:;") {
                         var sonlist = $(".sidebar-menu > li[pid='" + $(this).attr("addtabs") + "']");
                         sonlist.removeClass("hidden");
+                        var sidenav;
                         var last_id = $(this).attr("last-id");
                         if (last_id) {
-                            $(".sidebar-menu > li[pid='" + $(this).attr("addtabs") + "'] a[addtabs='" + last_id + "']").trigger('click');
+                            sidenav = $(".sidebar-menu > li[pid='" + $(this).attr("addtabs") + "'] a[addtabs='" + last_id + "']");
                         } else {
-                            $(".sidebar-menu > li[pid='" + $(this).attr("addtabs") + "']:first > a").trigger('click');
+                            sidenav = $(".sidebar-menu > li[pid='" + $(this).attr("addtabs") + "']:first > a");
+                        }
+                        if (sidenav) {
+                            sidenav.attr("href") != "javascript:;" && sidenav.trigger('click');
                         }
                     } else {
 
@@ -286,7 +290,7 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form'], functi
                 });
 
                 var mobilenav = $(".mobilenav");
-                $("#firstnav .nav-addtabs li a").each(function(){
+                $("#firstnav .nav-addtabs li a").each(function () {
                     mobilenav.append($(this).clone().addClass("btn btn-app"));
                 });
 

+ 3 - 1
public/assets/js/frontend.js

@@ -1,4 +1,4 @@
-define(['fast', 'template'], function (Fast, Template) {
+define(['fast', 'template', 'moment'], function (Fast, Template, Moment) {
     var Frontend = {
         api: Fast.api,
         init: function () {
@@ -59,6 +59,8 @@ define(['fast', 'template'], function (Fast, Template) {
     Frontend.api = $.extend(Fast.api, Frontend.api);
     //将Template渲染至全局,以便于在子框架中调用
     window.Template = Template;
+    //将Moment渲染至全局,以便于在子框架中调用
+    window.Moment = Moment;
     //将Frontend渲染至全局,以便于在子框架中调用
     window.Frontend = Frontend;
 

+ 3 - 3
public/assets/js/require-backend.js

@@ -48,8 +48,8 @@ require.config({
         'cxselect': '../libs/fastadmin-cxselect/js/jquery.cxselect',
         'template': '../libs/art-template/dist/template-native',
         'selectpage': '../libs/fastadmin-selectpage/selectpage',
-        'citypicker': '../libs/city-picker/dist/js/city-picker.min',
-        'citypicker-data': '../libs/city-picker/dist/js/city-picker.data',
+        'citypicker': '../libs/fastadmin-citypicker/dist/js/city-picker.min',
+        'citypicker-data': '../libs/fastadmin-citypicker/dist/js/city-picker.data',
     },
     // shim依赖配置
     shim: {
@@ -114,7 +114,7 @@ require.config({
 //        'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'],
         'validator-lang': ['validator-core'],
 //        'selectpage': ['css!../libs/fastadmin-selectpage/selectpage.css'],
-        'citypicker': ['citypicker-data', 'css!../libs/city-picker/dist/css/city-picker.css']
+        'citypicker': ['citypicker-data', 'css!../libs/fastadmin-citypicker/dist/css/city-picker.css']
     },
     baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径
     map: {

+ 3 - 3
public/assets/js/require-backend.min.js

@@ -62,8 +62,8 @@ require.config({
         'cxselect': '../libs/fastadmin-cxselect/js/jquery.cxselect',
         'template': '../libs/art-template/dist/template-native',
         'selectpage': '../libs/fastadmin-selectpage/selectpage',
-        'citypicker': '../libs/city-picker/dist/js/city-picker.min',
-        'citypicker-data': '../libs/city-picker/dist/js/city-picker.data',
+        'citypicker': '../libs/fastadmin-citypicker/dist/js/city-picker.min',
+        'citypicker-data': '../libs/fastadmin-citypicker/dist/js/city-picker.data',
     },
     // shim依赖配置
     shim: {
@@ -128,7 +128,7 @@ require.config({
 //        'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'],
         'validator-lang': ['validator-core'],
 //        'selectpage': ['css!../libs/fastadmin-selectpage/selectpage.css'],
-        'citypicker': ['citypicker-data', 'css!../libs/city-picker/dist/css/city-picker.css']
+        'citypicker': ['citypicker-data', 'css!../libs/fastadmin-citypicker/dist/css/city-picker.css']
     },
     baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径
     map: {

+ 3 - 3
public/assets/js/require-frontend.js

@@ -48,8 +48,8 @@ require.config({
         'cxselect': '../libs/fastadmin-cxselect/js/jquery.cxselect',
         'template': '../libs/art-template/dist/template-native',
         'selectpage': '../libs/fastadmin-selectpage/selectpage',
-        'citypicker': '../libs/city-picker/dist/js/city-picker.min',
-        'citypicker-data': '../libs/city-picker/dist/js/city-picker.data'
+        'citypicker': '../libs/fastadmin-citypicker/dist/js/city-picker.min',
+        'citypicker-data': '../libs/fastadmin-citypicker/dist/js/city-picker.data'
     },
     // shim依赖配置
     shim: {
@@ -114,7 +114,7 @@ require.config({
 //        'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'],
         'validator-lang': ['validator-core'],
 //        'selectpage': ['css!../libs/fastadmin-selectpage/selectpage.css'],
-        'citypicker': ['citypicker-data', 'css!../libs/city-picker/dist/css/city-picker.css']
+        'citypicker': ['citypicker-data', 'css!../libs/fastadmin-citypicker/dist/css/city-picker.css']
     },
     baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径
     map: {

Разница между файлами не показана из-за своего большого размера
+ 4242 - 4
public/assets/js/require-frontend.min.js


+ 3 - 10
public/assets/less/backend.less

@@ -57,10 +57,6 @@ html.ios-fix, html.ios-fix body {
   -webkit-overflow-scrolling: touch;
 }
 
-.content {
-  min-height: 500px;
-}
-
 #header {
   background: #fff;
   //box-shadow: 0 2px 2px rgba(0,0,0,.05),0 1px 0 rgba(0,0,0,.05);
@@ -346,9 +342,6 @@ form.form-horizontal .control-label {
         color: #2c3e50;
         border-right: 1px solid rgba(0, 0, 0, 0.05);
       }
-      i {
-        margin-right: 3px;
-      }
     }
     &.active > a {
       height: 50px;
@@ -479,9 +472,6 @@ form.form-horizontal .control-label {
         overflow: hidden;
         background: none;
         border: none;
-        i {
-          margin-right: 3px;
-        }
       }
       &.active {
         border-color: #bdbebd;
@@ -565,6 +555,9 @@ form.form-horizontal .control-label {
   > li .badge {
     margin-top: 0;
   }
+  .treeview-menu > li > a {
+    font-size:inherit;
+  }
 }
 
 .sidebar-collapse {

Разница между файлами не показана из-за своего большого размера
+ 300 - 293
public/install.php