新增buttons按钮组click事件
新增系统配置开关控件 修复后台管理员头像在启用云储存时的错误 修复前台公用库切换为jsdelivr.net公用库
正在显示
14 个修改的文件
包含
123 行增加
和
174 行删除
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>© 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) { |
-
请 注册 或 登录 后发表评论