作者 Karson

新增buttons按钮组click事件

新增系统配置开关控件
修复后台管理员头像在启用云储存时的错误
修复前台公用库切换为jsdelivr.net公用库
1 FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。 1 FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。
2 -===============  
3 2
4 3
5 ## **主要特性** 4 ## **主要特性**
6 5
7 -* 基于Auth的权限管理系统 6 +* 基于`Auth`验证的权限管理系统
8 * 支持无限级父子级权限继承,父级的管理员可任意增删改子级管理员及权限设置 7 * 支持无限级父子级权限继承,父级的管理员可任意增删改子级管理员及权限设置
9 * 支持单管理员多角色 8 * 支持单管理员多角色
10 * 支持管理子级数据或个人数据 9 * 支持管理子级数据或个人数据
@@ -13,17 +12,18 @@ FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。 @@ -13,17 +12,18 @@ FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。
13 * 一键压缩打包JS和CSS文件,一键CDN静态资源部署 12 * 一键压缩打包JS和CSS文件,一键CDN静态资源部署
14 * 一键生成控制器菜单和规则 13 * 一键生成控制器菜单和规则
15 * 一键生成API接口文档 14 * 一键生成API接口文档
16 -* 完善的前端功能组件  
17 - * 基于AdminLTE二次开发  
18 - * 基于Bootstrap开发,自适应手机、平板、PC  
19 - * 基于RequireJS进行JS模块管理,按需加载  
20 - * 基于Bower进行前端组件包管理 15 +* 完善的前端功能组件开发
  16 + * 基于`AdminLTE`二次开发
  17 + * 基于`Bootstrap`开发,自适应手机、平板、PC
  18 + * 基于`RequireJS`进行JS模块管理,按需加载
  19 + * 基于`Less`进行样式开发
  20 + * 基于`Bower`进行前端组件包管理
21 * 强大的插件扩展功能,在线安装卸载升级插件 21 * 强大的插件扩展功能,在线安装卸载升级插件
22 * 通用的会员模块和API模块 22 * 通用的会员模块和API模块
23 * 共用同一账号体系的Web端会员中心权限验证和API接口会员权限验证 23 * 共用同一账号体系的Web端会员中心权限验证和API接口会员权限验证
24 * 二级域名部署支持,同时域名支持绑定到插件 24 * 二级域名部署支持,同时域名支持绑定到插件
25 * 多语言支持,服务端及客户端支持 25 * 多语言支持,服务端及客户端支持
26 -* 强大的第三方模块支持(CMS、博客、文档生成) 26 +* 强大的第三方模块支持([CMS](https://www.fastadmin.net/store/cms.html)[博客](https://www.fastadmin.net/store/blog.html)[文档生成](https://www.fastadmin.net/store/docs.html)[个人免签支付](https://www.fastadmin.net/store/pay.html))
27 * 整合第三方短信接口(阿里云、创蓝短信) 27 * 整合第三方短信接口(阿里云、创蓝短信)
28 * 无缝整合第三方云存储(七牛、阿里云OSS、又拍云)功能 28 * 无缝整合第三方云存储(七牛、阿里云OSS、又拍云)功能
29 * 第三方富文本编辑器支持(Summernote、Tinymce、百度编辑器) 29 * 第三方富文本编辑器支持(Summernote、Tinymce、百度编辑器)
@@ -53,7 +53,7 @@ https://demo.fastadmin.net @@ -53,7 +53,7 @@ https://demo.fastadmin.net
53 53
54 交流社区: https://forum.fastadmin.net 54 交流社区: https://forum.fastadmin.net
55 55
56 -QQ群: [636393962](https://jq.qq.com/?_wv=1027&k=487PNBb)(交流群①) [708784003](https://jq.qq.com/?_wv=1027&k=5ObjtwM)(交流群②) [696992864](https://jq.qq.com/?_wv=1027&k=5R2AB00)(高级群,付费加入) 56 +QQ群: [636393962](https://jq.qq.com/?_wv=1027&k=487PNBb)(交流群①) [708784003](https://jq.qq.com/?_wv=1027&k=5ObjtwM)(交流群②) [696992864](https://jq.qq.com/?_wv=1027&k=5R2AB00)(高级群,邀请加入)
57 57
58 Email: (karsonzhang#163.com, 把#换成@) 58 Email: (karsonzhang#163.com, 把#换成@)
59 59
@@ -80,7 +80,7 @@ Nice-validator: https://validator.niceue.com @@ -80,7 +80,7 @@ Nice-validator: https://validator.niceue.com
80 SelectPage: https://github.com/TerryZ/SelectPage 80 SelectPage: https://github.com/TerryZ/SelectPage
81 81
82 82
83 -## 版权信息 83 +## **版权信息**
84 84
85 FastAdmin遵循Apache2开源协议发布,并提供免费使用。 85 FastAdmin遵循Apache2开源协议发布,并提供免费使用。
86 86
@@ -27,6 +27,7 @@ return [ @@ -27,6 +27,7 @@ return [
27 'Files' => '文件(多)', 27 'Files' => '文件(多)',
28 'Select' => '列表', 28 'Select' => '列表',
29 'Selects' => '列表(多选)', 29 'Selects' => '列表(多选)',
  30 + 'Switch' => '开关',
30 'Checkbox' => '复选', 31 'Checkbox' => '复选',
31 'Radio' => '单选', 32 'Radio' => '单选',
32 'Array' => '数组', 33 'Array' => '数组',
@@ -89,13 +89,13 @@ @@ -89,13 +89,13 @@
89 <!-- 账号信息下拉框 --> 89 <!-- 账号信息下拉框 -->
90 <li class="dropdown user user-menu"> 90 <li class="dropdown user user-menu">
91 <a href="#" class="dropdown-toggle" data-toggle="dropdown"> 91 <a href="#" class="dropdown-toggle" data-toggle="dropdown">
92 - <img src="__CDN__{$admin.avatar}" class="user-image" alt="{$admin.nickname}"> 92 + <img src="{$admin.avatar|cdnurl}" class="user-image" alt="{$admin.nickname}">
93 <span class="hidden-xs">{$admin.nickname}</span> 93 <span class="hidden-xs">{$admin.nickname}</span>
94 </a> 94 </a>
95 <ul class="dropdown-menu"> 95 <ul class="dropdown-menu">
96 <!-- User image --> 96 <!-- User image -->
97 <li class="user-header"> 97 <li class="user-header">
98 - <img src="__CDN__{$admin.avatar}" class="img-circle" alt=""> 98 + <img src="{$admin.avatar|cdnurl}" class="img-circle" alt="">
99 99
100 <p> 100 <p>
101 {$admin.nickname} 101 {$admin.nickname}
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <!-- 管理员信息 --> 3 <!-- 管理员信息 -->
4 <div class="user-panel hidden-xs"> 4 <div class="user-panel hidden-xs">
5 <div class="pull-left image"> 5 <div class="pull-left image">
6 - <a href="general/profile" class="addtabsit"><img src="__CDN__{$admin.avatar}" class="img-circle" /></a> 6 + <a href="general/profile" class="addtabsit"><img src="{$admin.avatar|cdnurl}" class="img-circle" /></a>
7 </div> 7 </div>
8 <div class="pull-left info"> 8 <div class="pull-left info">
9 <p>{$admin.nickname}</p> 9 <p>{$admin.nickname}</p>
@@ -104,6 +104,12 @@ @@ -104,6 +104,12 @@
104 <span><button type="button" id="fachoose-{$item.name}" class="btn btn-primary fachoose" data-input-id="c-{$item.name}" data-multiple="{$item.type=='file'?'false':'true'}"><i class="fa fa-list"></i> {:__('Choose')}</button></span> 104 <span><button type="button" id="fachoose-{$item.name}" class="btn btn-primary fachoose" data-input-id="c-{$item.name}" data-multiple="{$item.type=='file'?'false':'true'}"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
105 </div> 105 </div>
106 {/case} 106 {/case}
  107 + {case switch}
  108 + <input id="c-{$item.name}" name="row[{$item.name}]" type="hidden" value="{:$item.value?1:0}">
  109 + <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-{$item.name}" data-yes="1" data-no="0" >
  110 + <i class="fa fa-toggle-on text-success {if !$item.value}fa-flip-horizontal text-gray{/if} fa-2x"></i>
  111 + </a>
  112 + {/case}
107 {case bool} 113 {case bool}
108 <label for="row[{$item.name}]-yes"><input id="row[{$item.name}]-yes" name="row[{$item.name}]" type="radio" value="1" {$item.value?'checked':''} data-tip="{$item.tip}" /> {:__('Yes')}</label> 114 <label for="row[{$item.name}]-yes"><input id="row[{$item.name}]-yes" name="row[{$item.name}]" type="radio" value="1" {$item.value?'checked':''} data-tip="{$item.tip}" /> {:__('Yes')}</label>
109 <label for="row[{$item.name}]-no"><input id="row[{$item.name}]-no" name="row[{$item.name}]" type="radio" value="0" {$item.value?'':'checked'} data-tip="{$item.tip}" /> {:__('No')}</label> 115 <label for="row[{$item.name}]-no"><input id="row[{$item.name}]-no" name="row[{$item.name}]" type="radio" value="0" {$item.value?'':'checked'} data-tip="{$item.tip}" /> {:__('No')}</label>
1 <style> 1 <style>
2 .profile-avatar-container { 2 .profile-avatar-container {
3 - position:relative;  
4 - width:100px;margin:0 auto; 3 + position: relative;
  4 + width: 100px;
  5 + margin: 0 auto;
5 } 6 }
6 - .profile-avatar-container .profile-user-img{  
7 - width:100px;  
8 - height:100px; 7 +
  8 + .profile-avatar-container .profile-user-img {
  9 + width: 100px;
  10 + height: 100px;
9 } 11 }
  12 +
10 .profile-avatar-container .profile-avatar-text { 13 .profile-avatar-container .profile-avatar-text {
11 - display:none; 14 + display: none;
12 } 15 }
  16 +
13 .profile-avatar-container:hover .profile-avatar-text { 17 .profile-avatar-container:hover .profile-avatar-text {
14 - display:block;  
15 - position:absolute;  
16 - height:100px;  
17 - width:100px;  
18 - background:#444; 18 + display: block;
  19 + position: absolute;
  20 + height: 100px;
  21 + width: 100px;
  22 + background: #444;
19 opacity: .6; 23 opacity: .6;
20 color: #fff; 24 color: #fff;
21 - top:0;  
22 - left:0; 25 + top: 0;
  26 + left: 0;
23 line-height: 100px; 27 line-height: 100px;
24 text-align: center; 28 text-align: center;
25 } 29 }
26 - .profile-avatar-container button{  
27 - position:absolute;  
28 - top:0;left:0;width:100px;height:100px;opacity: 0; 30 +
  31 + .profile-avatar-container button {
  32 + position: absolute;
  33 + top: 0;
  34 + left: 0;
  35 + width: 100px;
  36 + height: 100px;
  37 + opacity: 0;
29 } 38 }
30 </style> 39 </style>
31 <div class="row animated fadeInRight"> 40 <div class="row animated fadeInRight">
@@ -37,33 +46,33 @@ @@ -37,33 +46,33 @@
37 <div class="panel-body"> 46 <div class="panel-body">
38 47
39 <form id="update-form" role="form" data-toggle="validator" method="POST" action="{:url('general.profile/update')}"> 48 <form id="update-form" role="form" data-toggle="validator" method="POST" action="{:url('general.profile/update')}">
40 - <input type="hidden" id="c-avatar" name="row[avatar]" value="{$admin.avatar}" /> 49 + <input type="hidden" id="c-avatar" name="row[avatar]" value="{$admin.avatar}"/>
41 <div class="box-body box-profile"> 50 <div class="box-body box-profile">
42 - 51 +
43 <div class="profile-avatar-container"> 52 <div class="profile-avatar-container">
44 - <img class="profile-user-img img-responsive img-circle plupload" src="__CDN__{$admin.avatar}" alt=""> 53 + <img class="profile-user-img img-responsive img-circle plupload" src="{$admin.avatar|cdnurl}" alt="">
45 <div class="profile-avatar-text img-circle">{:__('Click to edit')}</div> 54 <div class="profile-avatar-text img-circle">{:__('Click to edit')}</div>
46 <button id="plupload-avatar" class="plupload" data-input-id="c-avatar"><i class="fa fa-upload"></i> {:__('Upload')}</button> 55 <button id="plupload-avatar" class="plupload" data-input-id="c-avatar"><i class="fa fa-upload"></i> {:__('Upload')}</button>
47 </div> 56 </div>
48 - 57 +
49 <h3 class="profile-username text-center">{$admin.username}</h3> 58 <h3 class="profile-username text-center">{$admin.username}</h3>
50 59
51 <p class="text-muted text-center">{$admin.email}</p> 60 <p class="text-muted text-center">{$admin.email}</p>
52 <div class="form-group"> 61 <div class="form-group">
53 <label for="username" class="control-label">{:__('Username')}:</label> 62 <label for="username" class="control-label">{:__('Username')}:</label>
54 - <input type="text" class="form-control" name="row[username]" value="{$admin.username}" disabled /> 63 + <input type="text" class="form-control" id="username" name="row[username]" value="{$admin.username}" disabled/>
55 </div> 64 </div>
56 <div class="form-group"> 65 <div class="form-group">
57 <label for="email" class="control-label">{:__('Email')}:</label> 66 <label for="email" class="control-label">{:__('Email')}:</label>
58 - <input type="text" class="form-control" name="row[email]" value="{$admin.email}" data-rule="required;email" /> 67 + <input type="text" class="form-control" id="email" name="row[email]" value="{$admin.email}" data-rule="required;email"/>
59 </div> 68 </div>
60 <div class="form-group"> 69 <div class="form-group">
61 <label for="nickname" class="control-label">{:__('Nickname')}:</label> 70 <label for="nickname" class="control-label">{:__('Nickname')}:</label>
62 - <input type="text" class="form-control" name="row[nickname]" value="{$admin.nickname}" data-rule="required" /> 71 + <input type="text" class="form-control" id="nickname" name="row[nickname]" value="{$admin.nickname}" data-rule="required"/>
63 </div> 72 </div>
64 <div class="form-group"> 73 <div class="form-group">
65 <label for="password" class="control-label">{:__('Password')}:</label> 74 <label for="password" class="control-label">{:__('Password')}:</label>
66 - <input type="text" class="form-control" placeholder="{:__('Leave password blank if dont want to change')}" autocomplete="new-password" name="row[password]" value=""/> 75 + <input type="text" class="form-control" id="password" placeholder="{:__('Leave password blank if dont want to change')}" autocomplete="new-password" name="row[password]" value=""/>
67 </div> 76 </div>
68 <div class="form-group"> 77 <div class="form-group">
69 <button type="submit" class="btn btn-success">{:__('Submit')}</button> 78 <button type="submit" class="btn btn-success">{:__('Submit')}</button>
@@ -41,6 +41,7 @@ class Config extends Model @@ -41,6 +41,7 @@ class Config extends Model
41 'images' => __('Images'), 41 'images' => __('Images'),
42 'file' => __('File'), 42 'file' => __('File'),
43 'files' => __('Files'), 43 'files' => __('Files'),
  44 + 'switch' => __('Switch'),
44 'checkbox' => __('Checkbox'), 45 'checkbox' => __('Checkbox'),
45 'radio' => __('Radio'), 46 'radio' => __('Radio'),
46 'array' => __('Array'), 47 'array' => __('Array'),
@@ -78,8 +79,7 @@ class Config extends Model @@ -78,8 +79,7 @@ class Config extends Model
78 public static function getGroupList() 79 public static function getGroupList()
79 { 80 {
80 $groupList = config('site.configgroup'); 81 $groupList = config('site.configgroup');
81 - foreach ($groupList as $k => &$v)  
82 - { 82 + foreach ($groupList as $k => &$v) {
83 $v = __($v); 83 $v = __($v);
84 } 84 }
85 return $groupList; 85 return $groupList;
@@ -90,10 +90,8 @@ class Config extends Model @@ -90,10 +90,8 @@ class Config extends Model
90 $fieldarr = $valuearr = []; 90 $fieldarr = $valuearr = [];
91 $field = isset($data['field']) ? $data['field'] : []; 91 $field = isset($data['field']) ? $data['field'] : [];
92 $value = isset($data['value']) ? $data['value'] : []; 92 $value = isset($data['value']) ? $data['value'] : [];
93 - foreach ($field as $m => $n)  
94 - {  
95 - if ($n != '')  
96 - { 93 + foreach ($field as $m => $n) {
  94 + if ($n != '') {
97 $fieldarr[] = $field[$m]; 95 $fieldarr[] = $field[$m];
98 $valuearr[] = $value[$m]; 96 $valuearr[] = $value[$m];
99 } 97 }
@@ -110,10 +108,8 @@ class Config extends Model @@ -110,10 +108,8 @@ class Config extends Model
110 { 108 {
111 $content = explode($split, $text); 109 $content = explode($split, $text);
112 $arr = []; 110 $arr = [];
113 - foreach ($content as $k => $v)  
114 - {  
115 - if (stripos($v, "|") !== false)  
116 - { 111 + foreach ($content as $k => $v) {
  112 + if (stripos($v, "|") !== false) {
117 $item = explode('|', $v); 113 $item = explode('|', $v);
118 $arr[$item[0]] = $item[1]; 114 $arr[$item[0]] = $item[1];
119 } 115 }
@@ -129,11 +125,9 @@ class Config extends Model @@ -129,11 +125,9 @@ class Config extends Model
129 public static function encode($array, $split = "\r\n") 125 public static function encode($array, $split = "\r\n")
130 { 126 {
131 $content = ''; 127 $content = '';
132 - if ($array && is_array($array))  
133 - { 128 + if ($array && is_array($array)) {
134 $arr = []; 129 $arr = [];
135 - foreach ($array as $k => $v)  
136 - { 130 + foreach ($array as $k => $v) {
137 $arr[] = "{$k}|{$v}"; 131 $arr[] = "{$k}|{$v}";
138 } 132 }
139 $content = implode($split, $arr); 133 $content = implode($split, $arr);
@@ -12,17 +12,17 @@ @@ -12,17 +12,17 @@
12 <title>FastAdmin - {:__('The fastest framework based on ThinkPHP5 and Bootstrap')}</title> 12 <title>FastAdmin - {:__('The fastest framework based on ThinkPHP5 and Bootstrap')}</title>
13 13
14 <!-- Bootstrap Core CSS --> 14 <!-- Bootstrap Core CSS -->
15 - <link href="//cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> 15 + <link href="//cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
16 <link href="__CDN__/assets/css/index.css" rel="stylesheet"> 16 <link href="__CDN__/assets/css/index.css" rel="stylesheet">
17 17
18 <!-- Plugin CSS --> 18 <!-- Plugin CSS -->
19 - <link href="//cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">  
20 - <link href="//cdn.bootcss.com/simple-line-icons/2.4.1/css/simple-line-icons.min.css" rel="stylesheet"> 19 + <link href="//cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
  20 + <link href="//cdn.jsdelivr.net/npm/simple-line-icons@2.4.1/css/simple-line-icons.min.css" rel="stylesheet">
21 21
22 <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> 22 <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
23 <!--[if lt IE 9]> 23 <!--[if lt IE 9]>
24 - <script src="//cdn.bootcss.com/html5shiv/3.7.0/html5shiv.min.js"></script>  
25 - <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script> 24 + <script src="//cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
  25 + <script src="//cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
26 <![endif]--> 26 <![endif]-->
27 </head> 27 </head>
28 28
@@ -163,13 +163,13 @@ @@ -163,13 +163,13 @@
163 </footer> 163 </footer>
164 164
165 <!-- jQuery --> 165 <!-- jQuery -->
166 - <script src="//cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script> 166 + <script src="//cdn.jsdelivr.net/npm/jquery@2.1.4/dist/jquery.min.js"></script>
167 167
168 <!-- Bootstrap Core JavaScript --> 168 <!-- Bootstrap Core JavaScript -->
169 - <script src="//cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 169 + <script src="//cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
170 170
171 <!-- Plugin JavaScript --> 171 <!-- Plugin JavaScript -->
172 - <script src="//cdn.bootcss.com/jquery-easing/1.4.1/jquery.easing.min.js"></script> 172 + <script src="//cdn.jsdelivr.net/npm/jquery.easing@1.4.1/jquery.easing.min.js"></script>
173 173
174 <script> 174 <script>
175 $(function () { 175 $(function () {
1 -<!DOCTYPE html>  
2 -<html>  
3 -  
4 - <head>  
5 -  
6 - <meta charset="utf-8">  
7 - <meta http-equiv="X-UA-Compatible" content="IE=edge">  
8 - <meta name="viewport" content="width=device-width, initial-scale=1">  
9 - <meta name="description" content="">  
10 - <meta name="author" content="">  
11 -  
12 - <title>FastAdmin - {:__('The fastest framework based on ThinkPHP5 and Bootstrap')}</title>  
13 -  
14 - <!-- Bootstrap Core CSS -->  
15 - <link href="//cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">  
16 -  
17 - <!-- Plugin CSS -->  
18 - <link href="//cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">  
19 -  
20 - <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->  
21 - <!--[if lt IE 9]>  
22 - <script src="//cdn.bootcss.com/html5shiv/3.7.0/html5shiv.min.js"></script>  
23 - <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>  
24 - <![endif]-->  
25 - <style>  
26 - body {  
27 - padding-top: 70px;  
28 - }  
29 - footer {  
30 - background-color: #222;  
31 - color:#9d9d9d;  
32 - padding:20px 0;  
33 - }  
34 - </style>  
35 - </head>  
36 -  
37 - <body>  
38 - <!-- Navigation -->  
39 - <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">  
40 - <div class="container">  
41 - <!-- Brand and toggle get grouped for better mobile display -->  
42 - <div class="navbar-header">  
43 - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">  
44 - <span class="sr-only">Toggle navigation</span>  
45 - <span class="icon-bar"></span>  
46 - <span class="icon-bar"></span>  
47 - <span class="icon-bar"></span>  
48 - </button>  
49 - <a class="navbar-brand" href="https://www.fastadmin.net">FastAdmin</a>  
50 - </div>  
51 - <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">  
52 - <ul class="nav navbar-nav pull-right">  
53 - <li><a href="https://www.fastadmin.net" target="_blank">{:__('Home')}</a></li>  
54 - <li><a href="https://www.fastadmin.net/store.html" target="_blank">{:__('Store')}</a></li>  
55 - <li><a href="https://www.fastadmin.net/service.html" target="_blank">{:__('Services')}</a></li>  
56 - <li><a href="https://www.fastadmin.net/download.html" target="_blank">{:__('Download')}</a></li>  
57 - <li><a href="https://www.fastadmin.net/demo.html" target="_blank">{:__('Demo')}</a></li>  
58 - <li><a href="https://www.fastadmin.net/donate.html" target="_blank">{:__('Donation')}</a></li>  
59 - <li><a href="https://forum.fastadmin.net" target="_blank">{:__('Forum')}</a></li>  
60 - <li><a href="https://doc.fastadmin.net" target="_blank">{:__('Docs')}</a></li>  
61 - </ul>  
62 - </div>  
63 - <!-- /.navbar-collapse -->  
64 - </div>  
65 - <!-- /.container -->  
66 - </nav>  
67 -  
68 - <main class="content">  
69 - {__CONTENT__}  
70 - </main>  
71 -  
72 - <footer>  
73 - <div class="container">  
74 - <!-- FastAdmin是开源程序,建议在您的网站底部保留一个FastAdmin的链接 -->  
75 - <p>&copy; 2017-2018 <a href="https://www.fastadmin.net" target="_blank">FastAdmin</a>. All Rights Reserved.</p>  
76 - <ul class="list-inline">  
77 - <li>  
78 - <a href="https://gitee.com/karson/fastadmin">{:__('Gitee')}</a>  
79 - </li>  
80 - <li>  
81 - <a href="https://github.com/karsonzhang/fastadmin">{:__('Github')}</a>  
82 - </li>  
83 - <li>  
84 - <a href="https://shang.qq.com/wpa/qunwpa?idkey=46c326e570d0f97cfae1f8257ae82322192ec8841c79b2136446df0b3b62028c">{:__('QQ group')}</a>  
85 - </li>  
86 - </ul>  
87 - </div>  
88 - </footer>  
89 -  
90 - <!-- jQuery -->  
91 - <script src="//cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>  
92 -  
93 - <!-- Bootstrap Core JavaScript -->  
94 - <script src="//cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>  
95 -  
96 - <script>  
97 - $(function () {  
98 -  
99 - });  
100 - </script>  
101 -  
102 - </body>  
103 -  
104 -</html>  
105 -  
@@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
16 <span class="icon-bar"></span> 16 <span class="icon-bar"></span>
17 <span class="icon-bar"></span> 17 <span class="icon-bar"></span>
18 </button> 18 </button>
19 - <a class="navbar-brand" href="{:url('/')}" style="padding:6px 15px;"><img src="/assets/img/logo.png" style="height:40px;" alt=""></a> 19 + <a class="navbar-brand" href="{:url('/')}" style="padding:6px 15px;"><img src="__CDN__/assets/img/logo.png" style="height:40px;" alt=""></a>
20 </div> 20 </div>
21 <div class="collapse navbar-collapse" id="header-navbar"> 21 <div class="collapse navbar-collapse" id="header-navbar">
22 <ul class="nav navbar-nav navbar-right"> 22 <ul class="nav navbar-nav navbar-right">
@@ -209,6 +209,28 @@ define(['fast', 'template', 'moment'], function (Fast, Template, Moment) { @@ -209,6 +209,28 @@ define(['fast', 'template', 'moment'], function (Fast, Template, Moment) {
209 } 209 }
210 return false; 210 return false;
211 }); 211 });
  212 + $(document).on('click', '.btn-click,.clickit', function (e) {
  213 + var that = this;
  214 + var options = $.extend({}, $(that).data() || {});
  215 + var row = {};
  216 + if (typeof options.tableId !== 'undefined') {
  217 + var index = parseInt(options.rowIndex);
  218 + var data = $("#" + options.tableId).bootstrapTable('getData');
  219 + row = typeof data[index] !== 'undefined' ? data[index] : {};
  220 + }
  221 + var button = Backend.api.gettablecolumnbutton(options);
  222 + var click = typeof button.click === 'function' ? button.click : $.noop;
  223 +
  224 + if (typeof options.confirm !== 'undefined') {
  225 + Layer.confirm(options.confirm, function (index) {
  226 + click.apply(that, [options, row, button]);
  227 + Layer.close(index);
  228 + });
  229 + } else {
  230 + click.apply(that, [options, row, button]);
  231 + }
  232 + return false;
  233 + });
212 //修复含有fixed-footer类的body边距 234 //修复含有fixed-footer类的body边距
213 if ($(".fixed-footer").size() > 0) { 235 if ($(".fixed-footer").size() > 0) {
214 $(document.body).css("padding-bottom", $(".fixed-footer").outerHeight()); 236 $(document.body).css("padding-bottom", $(".fixed-footer").outerHeight());
@@ -24,8 +24,8 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin @@ -24,8 +24,8 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
24 [ 24 [
25 {field: 'state', checkbox: true,}, 25 {field: 'state', checkbox: true,},
26 {field: 'id', title: __('Id')}, 26 {field: 'id', title: __('Id')},
27 - {field: 'admin_id', title: __('Admin_id'), visible: false, addClass:"selectpage", extend:"data-source='auth/admin/index' data-field='nickname'"},  
28 - {field: 'user_id', title: __('User_id'), visible: false, addClass:"selectpage", extend:"data-source='user/user/index' data-field='nickname'"}, 27 + {field: 'admin_id', title: __('Admin_id'), visible: false, addClass: "selectpage", extend: "data-source='auth/admin/index' data-field='nickname'"},
  28 + {field: 'user_id', title: __('User_id'), visible: false, addClass: "selectpage", extend: "data-source='user/user/index' data-field='nickname'"},
29 {field: 'url', title: __('Preview'), formatter: Controller.api.formatter.thumb, operate: false}, 29 {field: 'url', title: __('Preview'), formatter: Controller.api.formatter.thumb, operate: false},
30 {field: 'url', title: __('Url'), formatter: Controller.api.formatter.url}, 30 {field: 'url', title: __('Url'), formatter: Controller.api.formatter.url},
31 {field: 'imagewidth', title: __('Imagewidth'), sortable: true}, 31 {field: 'imagewidth', title: __('Imagewidth'), sortable: true},
@@ -77,9 +77,9 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin @@ -77,9 +77,9 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
77 {field: 'id', title: __('Id')}, 77 {field: 'id', title: __('Id')},
78 {field: 'admin_id', title: __('Admin_id'), visible: false}, 78 {field: 'admin_id', title: __('Admin_id'), visible: false},
79 {field: 'user_id', title: __('User_id'), visible: false}, 79 {field: 'user_id', title: __('User_id'), visible: false},
80 - {field: 'url', title: __('Preview'), formatter: Controller.api.formatter.thumb},  
81 - {field: 'imagewidth', title: __('Imagewidth')},  
82 - {field: 'imageheight', title: __('Imageheight')}, 80 + {field: 'url', title: __('Preview'), formatter: Controller.api.formatter.thumb, operate: false},
  81 + {field: 'imagewidth', title: __('Imagewidth'), operate: false},
  82 + {field: 'imageheight', title: __('Imageheight'), operate: false},
83 { 83 {
84 field: 'mimetype', title: __('Mimetype'), operate: 'LIKE %...%', 84 field: 'mimetype', title: __('Mimetype'), operate: 'LIKE %...%',
85 process: function (value, arg) { 85 process: function (value, arg) {
@@ -5435,6 +5435,28 @@ define('backend',['fast', 'template', 'moment'], function (Fast, Template, Momen @@ -5435,6 +5435,28 @@ define('backend',['fast', 'template', 'moment'], function (Fast, Template, Momen
5435 } 5435 }
5436 return false; 5436 return false;
5437 }); 5437 });
  5438 + $(document).on('click', '.btn-click,.clickit', function (e) {
  5439 + var that = this;
  5440 + var options = $.extend({}, $(that).data() || {});
  5441 + var row = {};
  5442 + if (typeof options.tableId !== 'undefined') {
  5443 + var index = parseInt(options.rowIndex);
  5444 + var data = $("#" + options.tableId).bootstrapTable('getData');
  5445 + row = typeof data[index] !== 'undefined' ? data[index] : {};
  5446 + }
  5447 + var button = Backend.api.gettablecolumnbutton(options);
  5448 + var click = typeof button.click === 'function' ? button.click : $.noop;
  5449 +
  5450 + if (typeof options.confirm !== 'undefined') {
  5451 + Layer.confirm(options.confirm, function (index) {
  5452 + click.apply(that, [options, row, button]);
  5453 + Layer.close(index);
  5454 + });
  5455 + } else {
  5456 + click.apply(that, [options, row, button]);
  5457 + }
  5458 + return false;
  5459 + });
5438 //修复含有fixed-footer类的body边距 5460 //修复含有fixed-footer类的body边距
5439 if ($(".fixed-footer").size() > 0) { 5461 if ($(".fixed-footer").size() > 0) {
5440 $(document.body).css("padding-bottom", $(".fixed-footer").outerHeight()); 5462 $(document.body).css("padding-bottom", $(".fixed-footer").outerHeight());
@@ -9616,7 +9638,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr @@ -9616,7 +9638,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
9616 } 9638 }
9617 } 9639 }
9618 table.bootstrapTable('refresh'); 9640 table.bootstrapTable('refresh');
9619 - }, function () { 9641 + }, function (data, ret) {
9620 var error = $(element).data("error") || $.noop; 9642 var error = $(element).data("error") || $.noop;
9621 if (typeof error === 'function') { 9643 if (typeof error === 'function') {
9622 if (false === error.call(element, data, ret)) { 9644 if (false === error.call(element, data, ret)) {
@@ -9901,7 +9923,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr @@ -9901,7 +9923,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
9901 type = typeof type === 'undefined' ? 'buttons' : type; 9923 type = typeof type === 'undefined' ? 'buttons' : type;
9902 var options = table ? table.bootstrapTable('getOptions') : {}; 9924 var options = table ? table.bootstrapTable('getOptions') : {};
9903 var html = []; 9925 var html = [];
9904 - var hidden, visible, url, classname, icon, text, title, refresh, confirm, extend; 9926 + var hidden, visible, url, classname, icon, text, title, refresh, confirm, extend, click;
9905 var fieldIndex = column.fieldIndex; 9927 var fieldIndex = column.fieldIndex;
9906 9928
9907 $.each(buttons, function (i, j) { 9929 $.each(buttons, function (i, j) {
@@ -249,7 +249,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table @@ -249,7 +249,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
249 } 249 }
250 } 250 }
251 table.bootstrapTable('refresh'); 251 table.bootstrapTable('refresh');
252 - }, function () { 252 + }, function (data, ret) {
253 var error = $(element).data("error") || $.noop; 253 var error = $(element).data("error") || $.noop;
254 if (typeof error === 'function') { 254 if (typeof error === 'function') {
255 if (false === error.call(element, data, ret)) { 255 if (false === error.call(element, data, ret)) {
@@ -534,7 +534,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table @@ -534,7 +534,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
534 type = typeof type === 'undefined' ? 'buttons' : type; 534 type = typeof type === 'undefined' ? 'buttons' : type;
535 var options = table ? table.bootstrapTable('getOptions') : {}; 535 var options = table ? table.bootstrapTable('getOptions') : {};
536 var html = []; 536 var html = [];
537 - var hidden, visible, url, classname, icon, text, title, refresh, confirm, extend; 537 + var hidden, visible, url, classname, icon, text, title, refresh, confirm, extend, click;
538 var fieldIndex = column.fieldIndex; 538 var fieldIndex = column.fieldIndex;
539 539
540 $.each(buttons, function (i, j) { 540 $.each(buttons, function (i, j) {