作者 Karson

新增会员首字母头像功能

新增文本框挺拽上传和粘贴上传
优化注册和登录的跳转
修复后台默认皮肤保存失效的BUG
@@ -7,14 +7,15 @@ if (!function_exists('__')) { @@ -7,14 +7,15 @@ if (!function_exists('__')) {
7 /** 7 /**
8 * 获取语言变量值 8 * 获取语言变量值
9 * @param string $name 语言变量名 9 * @param string $name 语言变量名
10 - * @param array $vars 动态变量值 10 + * @param array $vars 动态变量值
11 * @param string $lang 语言 11 * @param string $lang 语言
12 * @return mixed 12 * @return mixed
13 */ 13 */
14 function __($name, $vars = [], $lang = '') 14 function __($name, $vars = [], $lang = '')
15 { 15 {
16 - if (is_numeric($name) || !$name) 16 + if (is_numeric($name) || !$name) {
17 return $name; 17 return $name;
  18 + }
18 if (!is_array($vars)) { 19 if (!is_array($vars)) {
19 $vars = func_get_args(); 20 $vars = func_get_args();
20 array_shift($vars); 21 array_shift($vars);
@@ -22,32 +23,31 @@ if (!function_exists('__')) { @@ -22,32 +23,31 @@ if (!function_exists('__')) {
22 } 23 }
23 return \think\Lang::get($name, $vars, $lang); 24 return \think\Lang::get($name, $vars, $lang);
24 } 25 }
25 -  
26 } 26 }
27 27
28 if (!function_exists('format_bytes')) { 28 if (!function_exists('format_bytes')) {
29 29
30 /** 30 /**
31 * 将字节转换为可读文本 31 * 将字节转换为可读文本
32 - * @param int $size 大小 32 + * @param int $size 大小
33 * @param string $delimiter 分隔符 33 * @param string $delimiter 分隔符
34 * @return string 34 * @return string
35 */ 35 */
36 function format_bytes($size, $delimiter = '') 36 function format_bytes($size, $delimiter = '')
37 { 37 {
38 $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB'); 38 $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
39 - for ($i = 0; $size >= 1024 && $i < 6; $i++) 39 + for ($i = 0; $size >= 1024 && $i < 6; $i++) {
40 $size /= 1024; 40 $size /= 1024;
  41 + }
41 return round($size, 2) . $delimiter . $units[$i]; 42 return round($size, 2) . $delimiter . $units[$i];
42 } 43 }
43 -  
44 } 44 }
45 45
46 if (!function_exists('datetime')) { 46 if (!function_exists('datetime')) {
47 47
48 /** 48 /**
49 * 将时间戳转换为日期时间 49 * 将时间戳转换为日期时间
50 - * @param int $time 时间戳 50 + * @param int $time 时间戳
51 * @param string $format 日期时间格式 51 * @param string $format 日期时间格式
52 * @return string 52 * @return string
53 */ 53 */
@@ -56,14 +56,13 @@ if (!function_exists('datetime')) { @@ -56,14 +56,13 @@ if (!function_exists('datetime')) {
56 $time = is_numeric($time) ? $time : strtotime($time); 56 $time = is_numeric($time) ? $time : strtotime($time);
57 return date($format, $time); 57 return date($format, $time);
58 } 58 }
59 -  
60 } 59 }
61 60
62 if (!function_exists('human_date')) { 61 if (!function_exists('human_date')) {
63 62
64 /** 63 /**
65 * 获取语义化时间 64 * 获取语义化时间
66 - * @param int $time 时间 65 + * @param int $time 时间
67 * @param int $local 本地时间 66 * @param int $local 本地时间
68 * @return string 67 * @return string
69 */ 68 */
@@ -71,27 +70,26 @@ if (!function_exists('human_date')) { @@ -71,27 +70,26 @@ if (!function_exists('human_date')) {
71 { 70 {
72 return \fast\Date::human($time, $local); 71 return \fast\Date::human($time, $local);
73 } 72 }
74 -  
75 } 73 }
76 74
77 if (!function_exists('cdnurl')) { 75 if (!function_exists('cdnurl')) {
78 76
79 /** 77 /**
80 * 获取上传资源的CDN的地址 78 * 获取上传资源的CDN的地址
81 - * @param string $url 资源相对地址 79 + * @param string $url 资源相对地址
82 * @param boolean $domain 是否显示域名 或者直接传入域名 80 * @param boolean $domain 是否显示域名 或者直接传入域名
83 * @return string 81 * @return string
84 */ 82 */
85 function cdnurl($url, $domain = false) 83 function cdnurl($url, $domain = false)
86 { 84 {
87 - $url = preg_match("/^https?:\/\/(.*)/i", $url) ? $url : \think\Config::get('upload.cdnurl') . $url;  
88 - if ($domain && !preg_match("/^(http:\/\/|https:\/\/)/i", $url)) { 85 + $regex = "/^((?:[a-z]+:)?\/\/|data:image\/)(.*)/i";
  86 + $url = preg_match($regex, $url) ? $url : \think\Config::get('upload.cdnurl') . $url;
  87 + if ($domain && !preg_match($regex, $url)) {
89 $domain = is_bool($domain) ? request()->domain() : $domain; 88 $domain = is_bool($domain) ? request()->domain() : $domain;
90 $url = $domain . $url; 89 $url = $domain . $url;
91 } 90 }
92 return $url; 91 return $url;
93 } 92 }
94 -  
95 } 93 }
96 94
97 95
@@ -109,36 +107,37 @@ if (!function_exists('is_really_writable')) { @@ -109,36 +107,37 @@ if (!function_exists('is_really_writable')) {
109 } 107 }
110 if (is_dir($file)) { 108 if (is_dir($file)) {
111 $file = rtrim($file, '/') . '/' . md5(mt_rand()); 109 $file = rtrim($file, '/') . '/' . md5(mt_rand());
112 - if (($fp = @fopen($file, 'ab')) === FALSE) {  
113 - return FALSE; 110 + if (($fp = @fopen($file, 'ab')) === false) {
  111 + return false;
114 } 112 }
115 fclose($fp); 113 fclose($fp);
116 @chmod($file, 0777); 114 @chmod($file, 0777);
117 @unlink($file); 115 @unlink($file);
118 - return TRUE;  
119 - } elseif (!is_file($file) OR ($fp = @fopen($file, 'ab')) === FALSE) {  
120 - return FALSE; 116 + return true;
  117 + } elseif (!is_file($file) or ($fp = @fopen($file, 'ab')) === false) {
  118 + return false;
121 } 119 }
122 fclose($fp); 120 fclose($fp);
123 - return TRUE; 121 + return true;
124 } 122 }
125 -  
126 } 123 }
127 124
128 if (!function_exists('rmdirs')) { 125 if (!function_exists('rmdirs')) {
129 126
130 /** 127 /**
131 * 删除文件夹 128 * 删除文件夹
132 - * @param string $dirname 目录  
133 - * @param bool $withself 是否删除自身 129 + * @param string $dirname 目录
  130 + * @param bool $withself 是否删除自身
134 * @return boolean 131 * @return boolean
135 */ 132 */
136 function rmdirs($dirname, $withself = true) 133 function rmdirs($dirname, $withself = true)
137 { 134 {
138 - if (!is_dir($dirname)) 135 + if (!is_dir($dirname)) {
139 return false; 136 return false;
  137 + }
140 $files = new RecursiveIteratorIterator( 138 $files = new RecursiveIteratorIterator(
141 - new RecursiveDirectoryIterator($dirname, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST 139 + new RecursiveDirectoryIterator($dirname, RecursiveDirectoryIterator::SKIP_DOTS),
  140 + RecursiveIteratorIterator::CHILD_FIRST
142 ); 141 );
143 142
144 foreach ($files as $fileinfo) { 143 foreach ($files as $fileinfo) {
@@ -150,7 +149,6 @@ if (!function_exists('rmdirs')) { @@ -150,7 +149,6 @@ if (!function_exists('rmdirs')) {
150 } 149 }
151 return true; 150 return true;
152 } 151 }
153 -  
154 } 152 }
155 153
156 if (!function_exists('copydirs')) { 154 if (!function_exists('copydirs')) {
@@ -158,7 +156,7 @@ if (!function_exists('copydirs')) { @@ -158,7 +156,7 @@ if (!function_exists('copydirs')) {
158 /** 156 /**
159 * 复制文件夹 157 * 复制文件夹
160 * @param string $source 源文件夹 158 * @param string $source 源文件夹
161 - * @param string $dest 目标文件夹 159 + * @param string $dest 目标文件夹
162 */ 160 */
163 function copydirs($source, $dest) 161 function copydirs($source, $dest)
164 { 162 {
@@ -167,7 +165,9 @@ if (!function_exists('copydirs')) { @@ -167,7 +165,9 @@ if (!function_exists('copydirs')) {
167 } 165 }
168 foreach ( 166 foreach (
169 $iterator = new RecursiveIteratorIterator( 167 $iterator = new RecursiveIteratorIterator(
170 - new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST) as $item 168 + new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
  169 + RecursiveIteratorIterator::SELF_FIRST
  170 + ) as $item
171 ) { 171 ) {
172 if ($item->isDir()) { 172 if ($item->isDir()) {
173 $sontDir = $dest . DS . $iterator->getSubPathName(); 173 $sontDir = $dest . DS . $iterator->getSubPathName();
@@ -179,30 +179,28 @@ if (!function_exists('copydirs')) { @@ -179,30 +179,28 @@ if (!function_exists('copydirs')) {
179 } 179 }
180 } 180 }
181 } 181 }
182 -  
183 } 182 }
184 183
185 if (!function_exists('mb_ucfirst')) { 184 if (!function_exists('mb_ucfirst')) {
186 -  
187 function mb_ucfirst($string) 185 function mb_ucfirst($string)
188 { 186 {
189 return mb_strtoupper(mb_substr($string, 0, 1)) . mb_strtolower(mb_substr($string, 1)); 187 return mb_strtoupper(mb_substr($string, 0, 1)) . mb_strtolower(mb_substr($string, 1));
190 } 188 }
191 -  
192 } 189 }
193 190
194 if (!function_exists('addtion')) { 191 if (!function_exists('addtion')) {
195 192
196 /** 193 /**
197 * 附加关联字段数据 194 * 附加关联字段数据
198 - * @param array $items 数据列表 195 + * @param array $items 数据列表
199 * @param mixed $fields 渲染的来源字段 196 * @param mixed $fields 渲染的来源字段
200 * @return array 197 * @return array
201 */ 198 */
202 function addtion($items, $fields) 199 function addtion($items, $fields)
203 { 200 {
204 - if (!$items || !$fields) 201 + if (!$items || !$fields) {
205 return $items; 202 return $items;
  203 + }
206 $fieldsArr = []; 204 $fieldsArr = [];
207 if (!is_array($fields)) { 205 if (!is_array($fields)) {
208 $arr = explode(',', $fields); 206 $arr = explode(',', $fields);
@@ -260,14 +258,13 @@ if (!function_exists('addtion')) { @@ -260,14 +258,13 @@ if (!function_exists('addtion')) {
260 } 258 }
261 return $items; 259 return $items;
262 } 260 }
263 -  
264 } 261 }
265 262
266 if (!function_exists('var_export_short')) { 263 if (!function_exists('var_export_short')) {
267 264
268 /** 265 /**
269 * 返回打印数组结构 266 * 返回打印数组结构
270 - * @param string $var 数组 267 + * @param string $var 数组
271 * @param string $indent 缩进字符 268 * @param string $indent 缩进字符
272 * @return string 269 * @return string
273 */ 270 */
@@ -288,8 +285,80 @@ if (!function_exists('var_export_short')) { @@ -288,8 +285,80 @@ if (!function_exists('var_export_short')) {
288 case "boolean": 285 case "boolean":
289 return $var ? "TRUE" : "FALSE"; 286 return $var ? "TRUE" : "FALSE";
290 default: 287 default:
291 - return var_export($var, TRUE); 288 + return var_export($var, true);
292 } 289 }
293 } 290 }
  291 +}
294 292
295 -}  
  293 +if (!function_exists('letter_avatar')) {
  294 + /**
  295 + * 首字母头像
  296 + * @param $text
  297 + * @return string
  298 + */
  299 + function letter_avatar($text)
  300 + {
  301 + $total = unpack('L', hash('adler32', $text, true))[1];
  302 + $hue = $total % 360;
  303 + list($r, $g, $b) = hsv2rgb($hue / 360, 0.3, 0.9);
  304 +
  305 + $bg = "rgb({$r},{$g},{$b})";
  306 + $color = "#ffffff";
  307 + $first = mb_strtoupper(mb_substr($text, 0, 1));
  308 + $src = base64_encode('<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="100" width="100"><rect fill="' . $bg . '" x="0" y="0" width="100" height="100"></rect><text x="50" y="50" font-size="50" fill="' . $color . '" text-anchor="middle" alignment-baseline="central">' . $first . '</text></svg>');
  309 + $value = 'data:image/svg+xml;base64,' . $src;
  310 + return $value;
  311 + }
  312 +}
  313 +
  314 +if (!function_exists('hsv2rgb')) {
  315 + function hsv2rgb($h, $s, $v)
  316 + {
  317 + $r = $g = $b = 0;
  318 +
  319 + $i = floor($h * 6);
  320 + $f = $h * 6 - $i;
  321 + $p = $v * (1 - $s);
  322 + $q = $v * (1 - $f * $s);
  323 + $t = $v * (1 - (1 - $f) * $s);
  324 +
  325 + switch ($i % 6) {
  326 + case 0:
  327 + $r = $v;
  328 + $g = $t;
  329 + $b = $p;
  330 + break;
  331 + case 1:
  332 + $r = $q;
  333 + $g = $v;
  334 + $b = $p;
  335 + break;
  336 + case 2:
  337 + $r = $p;
  338 + $g = $v;
  339 + $b = $t;
  340 + break;
  341 + case 3:
  342 + $r = $p;
  343 + $g = $q;
  344 + $b = $v;
  345 + break;
  346 + case 4:
  347 + $r = $t;
  348 + $g = $p;
  349 + $b = $v;
  350 + break;
  351 + case 5:
  352 + $r = $v;
  353 + $g = $p;
  354 + $b = $q;
  355 + break;
  356 + }
  357 +
  358 + return [
  359 + floor($r * 255),
  360 + floor($g * 255),
  361 + floor($b * 255)
  362 + ];
  363 + }
  364 +}
@@ -39,7 +39,12 @@ class User extends Model @@ -39,7 +39,12 @@ class User extends Model
39 */ 39 */
40 public function getAvatarAttr($value, $data) 40 public function getAvatarAttr($value, $data)
41 { 41 {
42 - return $value ? $value : '/assets/img/avatar.png'; 42 + if (!$value) {
  43 + //如果不需要启用首字母头像,请使用
  44 + //$value = '/assets/img/avatar.png';
  45 + $value = letter_avatar($data['nickname']);
  46 + }
  47 + return $value;
43 } 48 }
44 49
45 /** 50 /**
@@ -27,11 +27,6 @@ class User extends Frontend @@ -27,11 +27,6 @@ class User extends Frontend
27 $this->error(__('User center already closed')); 27 $this->error(__('User center already closed'));
28 } 28 }
29 29
30 - $ucenter = get_addon_info('ucenter');  
31 - if ($ucenter && $ucenter['state']) {  
32 - include ADDON_PATH . 'ucenter' . DS . 'uc.php';  
33 - }  
34 -  
35 //监听注册登录注销的事件 30 //监听注册登录注销的事件
36 Hook::add('user_login_successed', function ($user) use ($auth) { 31 Hook::add('user_login_successed', function ($user) use ($auth) {
37 $expire = input('post.keeplogin') ? 30 * 86400 : 0; 32 $expire = input('post.keeplogin') ? 30 * 86400 : 0;
@@ -82,7 +77,7 @@ class User extends Frontend @@ -82,7 +77,7 @@ class User extends Frontend
82 { 77 {
83 $url = $this->request->request('url'); 78 $url = $this->request->request('url');
84 if ($this->auth->id) { 79 if ($this->auth->id) {
85 - $this->success(__('You\'ve logged in, do not login again'), $url); 80 + $this->success(__('You\'ve logged in, do not login again'), $url ? $url : url('user/index'));
86 } 81 }
87 if ($this->request->isPost()) { 82 if ($this->request->isPost()) {
88 $username = $this->request->post('username'); 83 $username = $this->request->post('username');
@@ -124,13 +119,7 @@ class User extends Frontend @@ -124,13 +119,7 @@ class User extends Frontend
124 $this->error(__($validate->getError()), null, ['token' => $this->request->token()]); 119 $this->error(__($validate->getError()), null, ['token' => $this->request->token()]);
125 } 120 }
126 if ($this->auth->register($username, $password, $email, $mobile)) { 121 if ($this->auth->register($username, $password, $email, $mobile)) {
127 - $synchtml = '';  
128 - ////////////////同步到Ucenter////////////////  
129 - if (defined('UC_STATUS') && UC_STATUS) {  
130 - $uc = new \addons\ucenter\library\client\Client();  
131 - $synchtml = $uc->uc_user_synregister($this->auth->id, $password);  
132 - }  
133 - $this->success(__('Sign up successful') . $synchtml, $url ? $url : url('user/index')); 122 + $this->success(__('Sign up successful'), $url ? $url : url('user/index'));
134 } else { 123 } else {
135 $this->error($this->auth->getError(), null, ['token' => $this->request->token()]); 124 $this->error($this->auth->getError(), null, ['token' => $this->request->token()]);
136 } 125 }
@@ -153,7 +142,7 @@ class User extends Frontend @@ -153,7 +142,7 @@ class User extends Frontend
153 { 142 {
154 $url = $this->request->request('url'); 143 $url = $this->request->request('url');
155 if ($this->auth->id) { 144 if ($this->auth->id) {
156 - $this->success(__('You\'ve logged in, do not login again'), $url); 145 + $this->success(__('You\'ve logged in, do not login again'), $url ? $url : url('user/index'));
157 } 146 }
158 if ($this->request->isPost()) { 147 if ($this->request->isPost()) {
159 $account = $this->request->post('account'); 148 $account = $this->request->post('account');
@@ -184,13 +173,7 @@ class User extends Frontend @@ -184,13 +173,7 @@ class User extends Frontend
184 return false; 173 return false;
185 } 174 }
186 if ($this->auth->login($account, $password)) { 175 if ($this->auth->login($account, $password)) {
187 - $synchtml = '';  
188 - ////////////////同步到Ucenter////////////////  
189 - if (defined('UC_STATUS') && UC_STATUS) {  
190 - $uc = new \addons\ucenter\library\client\Client();  
191 - $synchtml = $uc->uc_user_synlogin($this->auth->id);  
192 - }  
193 - $this->success(__('Logged in successful') . $synchtml, $url ? $url : url('user/index')); 176 + $this->success(__('Logged in successful'), $url ? $url : url('user/index'));
194 } else { 177 } else {
195 $this->error($this->auth->getError(), null, ['token' => $this->request->token()]); 178 $this->error($this->auth->getError(), null, ['token' => $this->request->token()]);
196 } 179 }
@@ -213,13 +196,7 @@ class User extends Frontend @@ -213,13 +196,7 @@ class User extends Frontend
213 { 196 {
214 //注销本站 197 //注销本站
215 $this->auth->logout(); 198 $this->auth->logout();
216 - $synchtml = '';  
217 - ////////////////同步到Ucenter////////////////  
218 - if (defined('UC_STATUS') && UC_STATUS) {  
219 - $uc = new \addons\ucenter\library\client\Client();  
220 - $synchtml = $uc->uc_user_synlogout();  
221 - }  
222 - $this->success(__('Logout successful') . $synchtml, url('user/index')); 199 + $this->success(__('Logout successful'), url('user/index'));
223 } 200 }
224 201
225 /** 202 /**
@@ -270,13 +247,7 @@ class User extends Frontend @@ -270,13 +247,7 @@ class User extends Frontend
270 247
271 $ret = $this->auth->changepwd($newpassword, $oldpassword); 248 $ret = $this->auth->changepwd($newpassword, $oldpassword);
272 if ($ret) { 249 if ($ret) {
273 - $synchtml = '';  
274 - ////////////////同步到Ucenter////////////////  
275 - if (defined('UC_STATUS') && UC_STATUS) {  
276 - $uc = new \addons\ucenter\library\client\Client();  
277 - $synchtml = $uc->uc_user_synlogout();  
278 - }  
279 - $this->success(__('Reset password successful') . $synchtml, url('user/login')); 250 + $this->success(__('Reset password successful'), url('user/login'));
280 } else { 251 } else {
281 $this->error($this->auth->getError(), null, ['token' => $this->request->token()]); 252 $this->error($this->auth->getError(), null, ['token' => $this->request->token()]);
282 } 253 }
@@ -354,7 +354,7 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form'], functi @@ -354,7 +354,7 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form'], functi
354 354
355 function setup() { 355 function setup() {
356 var tmp = localStorage.getItem('skin'); 356 var tmp = localStorage.getItem('skin');
357 - if (tmp && $.inArray(tmp, my_skins)) 357 + if (tmp && $.inArray(tmp, my_skins) != -1)
358 change_skin(tmp); 358 change_skin(tmp);
359 359
360 // 皮肤切换 360 // 皮肤切换
@@ -95,8 +95,14 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, undefine @@ -95,8 +95,14 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, undefine
95 return url; 95 return url;
96 }, 96 },
97 //获取修复后可访问的cdn链接 97 //获取修复后可访问的cdn链接
98 - cdnurl: function (url) {  
99 - return /^(?:[a-z]+:)?\/\//i.test(url) ? url : Config.upload.cdnurl + url; 98 + cdnurl: function (url, domain) {
  99 + var rule = new RegExp("^((?:[a-z]+:)?\\/\\/|data:image\\/)", "i");
  100 + var url = rule.test(url) ? url : Config.upload.cdnurl + url;
  101 + if (domain && !rule.test(url)) {
  102 + domain = typeof domain === 'string' ? domain : location.origin;
  103 + url = domain + url;
  104 + }
  105 + return url;
100 }, 106 },
101 //查询Url参数 107 //查询Url参数
102 query: function (name, url) { 108 query: function (name, url) {
1 define(['jquery', 'bootstrap', 'plupload', 'template'], function ($, undefined, Plupload, Template) { 1 define(['jquery', 'bootstrap', 'plupload', 'template'], function ($, undefined, Plupload, Template) {
2 var Upload = { 2 var Upload = {
3 - list: {},  
4 - config: {  
5 - container: document.body,  
6 - classname: '.plupload:not([initialized])',  
7 - previewtpl: '<li class="col-xs-3"><a href="<%=fullurl%>" data-url="<%=url%>" target="_blank" class="thumbnail"><img src="<%=fullurl%>" onerror="this.src=\'https://tool.fastadmin.net/icon/\'+\'<%=fullurl%>\'.split(\'.\').pop()+\'.png\';this.onerror=null;" class="img-responsive"></a><a href="javascript:;" class="btn btn-danger btn-xs btn-trash"><i class="fa fa-trash"></i></a></li>',  
8 - },  
9 - events: {  
10 - onInit: function (up) {  
11 - //修复少数安卓浏览器无法上传图片的Bug  
12 - var input = $("input[type=file]", $(up.settings.button).next());  
13 - if (input && input.prop("accept").match(/image\/jpeg/)) {  
14 - input.prop("accept", "image/jpg," + input.prop("accept"));  
15 - }  
16 - },  
17 - //初始化完成  
18 - onPostInit: function (up) {  
19 - 3 + list: {},
  4 + config: {
  5 + container: document.body,
  6 + classname: '.plupload:not([initialized])',
  7 + previewtpl: '<li class="col-xs-3"><a href="<%=fullurl%>" data-url="<%=url%>" target="_blank" class="thumbnail"><img src="<%=fullurl%>" onerror="this.src=\'https://tool.fastadmin.net/icon/\'+\'<%=fullurl%>\'.split(\'.\').pop()+\'.png\';this.onerror=null;" class="img-responsive"></a><a href="javascript:;" class="btn btn-danger btn-xs btn-trash"><i class="fa fa-trash"></i></a></li>',
20 }, 8 },
21 - //文件添加成功后  
22 - onFileAdded: function (up, files) {  
23 - var button = up.settings.button;  
24 - $(button).data("bakup-html", $(button).html());  
25 - var maxcount = $(button).data("maxcount");  
26 - var input_id = $(button).data("input-id") ? $(button).data("input-id") : "";  
27 - maxcount = typeof maxcount !== "undefined" ? maxcount : 0;  
28 - if (maxcount > 0 && input_id) {  
29 - var inputObj = $("#" + input_id);  
30 - if (inputObj.size() > 0) {  
31 - var value = $.trim(inputObj.val());  
32 - var nums = value === '' ? 0 : value.split(/\,/).length;  
33 - var remains = maxcount - nums;  
34 - if (files.length > remains) {  
35 - for (var i = 0; i < files.length; i++) {  
36 - up.removeFile(files[i]);  
37 - }  
38 - Toastr.error(__('You can upload up to %d file%s', remains));  
39 - return false;  
40 - } 9 + events: {
  10 + onInit: function (up) {
  11 + //修复少数安卓浏览器无法上传图片的Bug
  12 + var input = $("input[type=file]", $(up.settings.button).next());
  13 + if (input && input.prop("accept").match(/image\/jpeg/)) {
  14 + input.prop("accept", "image/jpg," + input.prop("accept"));
41 } 15 }
42 - }  
43 - //添加后立即上传  
44 - setTimeout(function () {  
45 - up.start();  
46 - }, 1);  
47 - },  
48 - //上传进行中的回调  
49 - onUploadProgress: function (up, file) {  
50 -  
51 - },  
52 - //上传之前的回调  
53 - onBeforeUpload: function (up, file) { 16 + },
  17 + //初始化完成
  18 + onPostInit: function (up) {
54 19
55 - },  
56 - //上传成功的回调  
57 - onUploadSuccess: function (up, ret) {  
58 - var button = up.settings.button;  
59 - var onUploadSuccess = up.settings.onUploadSuccess;  
60 - var data = typeof ret.data !== 'undefined' ? ret.data : null;  
61 - //上传成功后回调  
62 - if (button) {  
63 - //如果有文本框则填充 20 + },
  21 + //文件添加成功后
  22 + onFileAdded: function (up, files) {
  23 + var button = up.settings.button;
  24 + $(button).data("bakup-html", $(button).html());
  25 + var maxcount = $(button).data("maxcount");
64 var input_id = $(button).data("input-id") ? $(button).data("input-id") : ""; 26 var input_id = $(button).data("input-id") ? $(button).data("input-id") : "";
65 - if (input_id) {  
66 - var urlArr = []; 27 + maxcount = typeof maxcount !== "undefined" ? maxcount : 0;
  28 + if (maxcount > 0 && input_id) {
67 var inputObj = $("#" + input_id); 29 var inputObj = $("#" + input_id);
68 - if ($(button).data("multiple") && inputObj.val() !== "") {  
69 - urlArr.push(inputObj.val()); 30 + if (inputObj.size() > 0) {
  31 + var value = $.trim(inputObj.val());
  32 + var nums = value === '' ? 0 : value.split(/\,/).length;
  33 + var remains = maxcount - nums;
  34 + if (files.length > remains) {
  35 + for (var i = 0; i < files.length; i++) {
  36 + up.removeFile(files[i]);
  37 + }
  38 + Toastr.error(__('You can upload up to %d file%s', remains));
  39 + return false;
  40 + }
70 } 41 }
71 - urlArr.push(data.url);  
72 - inputObj.val(urlArr.join(",")).trigger("change");  
73 } 42 }
74 - //如果有回调函数  
75 - var onDomUploadSuccess = $(button).data("upload-success");  
76 - if (onDomUploadSuccess) {  
77 - if (typeof onDomUploadSuccess !== 'function' && typeof Upload.api.custom[onDomUploadSuccess] === 'function') {  
78 - onDomUploadSuccess = Upload.api.custom[onDomUploadSuccess]; 43 + //添加后立即上传
  44 + setTimeout(function () {
  45 + up.start();
  46 + }, 1);
  47 + },
  48 + //上传进行中的回调
  49 + onUploadProgress: function (up, file) {
  50 +
  51 + },
  52 + //上传之前的回调
  53 + onBeforeUpload: function (up, file) {
  54 +
  55 + },
  56 + //上传成功的回调
  57 + onUploadSuccess: function (up, ret) {
  58 + var button = up.settings.button;
  59 + var onUploadSuccess = up.settings.onUploadSuccess;
  60 + var data = typeof ret.data !== 'undefined' ? ret.data : null;
  61 + //上传成功后回调
  62 + if (button) {
  63 + //如果有文本框则填充
  64 + var input_id = $(button).data("input-id") ? $(button).data("input-id") : "";
  65 + if (input_id) {
  66 + var urlArr = [];
  67 + var inputObj = $("#" + input_id);
  68 + if ($(button).data("multiple") && inputObj.val() !== "") {
  69 + urlArr.push(inputObj.val());
  70 + }
  71 + urlArr.push(data.url);
  72 + inputObj.val(urlArr.join(",")).trigger("change");
79 } 73 }
80 - if (typeof onDomUploadSuccess === 'function') {  
81 - var result = onDomUploadSuccess.call(button, data, ret);  
82 - if (result === false)  
83 - return; 74 + //如果有回调函数
  75 + var onDomUploadSuccess = $(button).data("upload-success");
  76 + if (onDomUploadSuccess) {
  77 + if (typeof onDomUploadSuccess !== 'function' && typeof Upload.api.custom[onDomUploadSuccess] === 'function') {
  78 + onDomUploadSuccess = Upload.api.custom[onDomUploadSuccess];
  79 + }
  80 + if (typeof onDomUploadSuccess === 'function') {
  81 + var result = onDomUploadSuccess.call(button, data, ret);
  82 + if (result === false)
  83 + return;
  84 + }
84 } 85 }
85 } 86 }
86 - }  
87 87
88 - if (typeof onUploadSuccess === 'function') {  
89 - var result = onUploadSuccess.call(button, data, ret);  
90 - if (result === false)  
91 - return;  
92 - }  
93 - },  
94 - //上传错误的回调  
95 - onUploadError: function (up, ret) {  
96 - var button = up.settings.button;  
97 - var onUploadError = up.settings.onUploadError;  
98 - var data = typeof ret.data !== 'undefined' ? ret.data : null;  
99 - if (button) {  
100 - var onDomUploadError = $(button).data("upload-error");  
101 - if (onDomUploadError) {  
102 - if (typeof onDomUploadError !== 'function' && typeof Upload.api.custom[onDomUploadError] === 'function') {  
103 - onDomUploadError = Upload.api.custom[onDomUploadError];  
104 - }  
105 - if (typeof onDomUploadError === 'function') {  
106 - var result = onDomUploadError.call(button, data, ret);  
107 - if (result === false)  
108 - return; 88 + if (typeof onUploadSuccess === 'function') {
  89 + var result = onUploadSuccess.call(button, data, ret);
  90 + if (result === false)
  91 + return;
  92 + }
  93 + },
  94 + //上传错误的回调
  95 + onUploadError: function (up, ret) {
  96 + var button = up.settings.button;
  97 + var onUploadError = up.settings.onUploadError;
  98 + var data = typeof ret.data !== 'undefined' ? ret.data : null;
  99 + if (button) {
  100 + var onDomUploadError = $(button).data("upload-error");
  101 + if (onDomUploadError) {
  102 + if (typeof onDomUploadError !== 'function' && typeof Upload.api.custom[onDomUploadError] === 'function') {
  103 + onDomUploadError = Upload.api.custom[onDomUploadError];
  104 + }
  105 + if (typeof onDomUploadError === 'function') {
  106 + var result = onDomUploadError.call(button, data, ret);
  107 + if (result === false)
  108 + return;
  109 + }
109 } 110 }
110 } 111 }
111 - }  
112 112
113 - if (typeof onUploadError === 'function') {  
114 - var result = onUploadError.call(button, data, ret);  
115 - if (result === false) {  
116 - return;  
117 - }  
118 - }  
119 - Toastr.error(ret.msg + "(code:" + ret.code + ")");  
120 - },  
121 - //服务器响应数据后  
122 - onUploadResponse: function (response) {  
123 - try {  
124 - var ret = typeof response === 'object' ? response : JSON.parse(response);  
125 - if (!ret.hasOwnProperty('code')) {  
126 - $.extend(ret, {code: -2, msg: response, data: null}); 113 + if (typeof onUploadError === 'function') {
  114 + var result = onUploadError.call(button, data, ret);
  115 + if (result === false) {
  116 + return;
  117 + }
127 } 118 }
128 - } catch (e) {  
129 - var ret = {code: -1, msg: e.message, data: null};  
130 - }  
131 - return ret;  
132 - },  
133 - //上传全部结束后  
134 - onUploadComplete: function (up, files) {  
135 - var button = up.settings.button;  
136 - var onUploadComplete = up.settings.onUploadComplete;  
137 - if (button) {  
138 - var onDomUploadComplete = $(button).data("upload-complete");  
139 - if (onDomUploadComplete) {  
140 - if (typeof onDomUploadComplete !== 'function' && typeof Upload.api.custom[onDomUploadComplete] === 'function') {  
141 - onDomUploadComplete = Upload.api.custom[onDomUploadComplete]; 119 + Toastr.error(ret.msg + "(code:" + ret.code + ")");
  120 + },
  121 + //服务器响应数据后
  122 + onUploadResponse: function (response) {
  123 + try {
  124 + var ret = typeof response === 'object' ? response : JSON.parse(response);
  125 + if (!ret.hasOwnProperty('code')) {
  126 + $.extend(ret, {code: -2, msg: response, data: null});
142 } 127 }
143 - if (typeof onDomUploadComplete === 'function') {  
144 - var result = onDomUploadComplete.call(button, files);  
145 - if (result === false)  
146 - return; 128 + } catch (e) {
  129 + var ret = {code: -1, msg: e.message, data: null};
  130 + }
  131 + return ret;
  132 + },
  133 + //上传全部结束后
  134 + onUploadComplete: function (up, files) {
  135 + var button = up.settings.button;
  136 + var onUploadComplete = up.settings.onUploadComplete;
  137 + if (button) {
  138 + var onDomUploadComplete = $(button).data("upload-complete");
  139 + if (onDomUploadComplete) {
  140 + if (typeof onDomUploadComplete !== 'function' && typeof Upload.api.custom[onDomUploadComplete] === 'function') {
  141 + onDomUploadComplete = Upload.api.custom[onDomUploadComplete];
  142 + }
  143 + if (typeof onDomUploadComplete === 'function') {
  144 + var result = onDomUploadComplete.call(button, files);
  145 + if (result === false)
  146 + return;
  147 + }
147 } 148 }
148 } 149 }
149 - }  
150 150
151 - if (typeof onUploadComplete === 'function') {  
152 - var result = onUploadComplete.call(button, files);  
153 - if (result === false) {  
154 - return; 151 + if (typeof onUploadComplete === 'function') {
  152 + var result = onUploadComplete.call(button, files);
  153 + if (result === false) {
  154 + return;
  155 + }
155 } 156 }
156 } 157 }
157 - }  
158 - },  
159 - api: {  
160 - //Plupload上传  
161 - plupload: function (element, onUploadSuccess, onUploadError, onUploadComplete) {  
162 - element = typeof element === 'undefined' ? Upload.config.classname : element;  
163 - $(element, Upload.config.container).each(function () {  
164 - if ($(this).attr("initialized")) {  
165 - return true;  
166 - }  
167 - $(this).attr("initialized", true);  
168 - var that = this;  
169 - var id = $(this).prop("id");  
170 - var url = $(this).data("url");  
171 - var maxsize = $(this).data("maxsize");  
172 - var mimetype = $(this).data("mimetype");  
173 - var multipart = $(this).data("multipart");  
174 - var multiple = $(this).data("multiple"); 158 + },
  159 + api: {
  160 + //Plupload上传
  161 + plupload: function (element, onUploadSuccess, onUploadError, onUploadComplete) {
  162 + element = typeof element === 'undefined' ? Upload.config.classname : element;
  163 + $(element, Upload.config.container).each(function () {
  164 + if ($(this).attr("initialized")) {
  165 + return true;
  166 + }
  167 + $(this).attr("initialized", true);
  168 + var that = this;
  169 + var id = $(this).prop("id");
  170 + var url = $(this).data("url");
  171 + var maxsize = $(this).data("maxsize");
  172 + var mimetype = $(this).data("mimetype");
  173 + var multipart = $(this).data("multipart");
  174 + var multiple = $(this).data("multiple");
175 175
176 - //填充ID  
177 - var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";  
178 - //预览ID  
179 - var preview_id = $(that).data("preview-id") ? $(that).data("preview-id") : ""; 176 + //填充ID
  177 + var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";
  178 + //预览ID
  179 + var preview_id = $(that).data("preview-id") ? $(that).data("preview-id") : "";
180 180
181 - //上传URL  
182 - url = url ? url : Config.upload.uploadurl;  
183 - url = Fast.api.fixurl(url);  
184 - //最大可上传文件大小  
185 - maxsize = typeof maxsize !== "undefined" ? maxsize : Config.upload.maxsize;  
186 - //文件类型  
187 - mimetype = typeof mimetype !== "undefined" ? mimetype : Config.upload.mimetype;  
188 - //请求的表单参数  
189 - multipart = typeof multipart !== "undefined" ? multipart : Config.upload.multipart;  
190 - //是否支持批量上传  
191 - multiple = typeof multiple !== "undefined" ? multiple : Config.upload.multiple;  
192 - var mimetypeArr = new Array();  
193 - //支持后缀和Mimetype格式,以,分隔  
194 - if (mimetype && mimetype !== "*" && mimetype.indexOf("/") === -1) {  
195 - var tempArr = mimetype.split(',');  
196 - for (var i = 0; i < tempArr.length; i++) {  
197 - mimetypeArr.push({title: __('Files'), extensions: tempArr[i]}); 181 + //上传URL
  182 + url = url ? url : Config.upload.uploadurl;
  183 + url = Fast.api.fixurl(url);
  184 + //最大可上传文件大小
  185 + maxsize = typeof maxsize !== "undefined" ? maxsize : Config.upload.maxsize;
  186 + //文件类型
  187 + mimetype = typeof mimetype !== "undefined" ? mimetype : Config.upload.mimetype;
  188 + //请求的表单参数
  189 + multipart = typeof multipart !== "undefined" ? multipart : Config.upload.multipart;
  190 + //是否支持批量上传
  191 + multiple = typeof multiple !== "undefined" ? multiple : Config.upload.multiple;
  192 + var mimetypeArr = new Array();
  193 + //支持后缀和Mimetype格式,以,分隔
  194 + if (mimetype && mimetype !== "*" && mimetype.indexOf("/") === -1) {
  195 + var tempArr = mimetype.split(',');
  196 + for (var i = 0; i < tempArr.length; i++) {
  197 + mimetypeArr.push({title: __('Files'), extensions: tempArr[i]});
  198 + }
  199 + mimetype = mimetypeArr;
198 } 200 }
199 - mimetype = mimetypeArr;  
200 - }  
201 - //生成Plupload实例  
202 - Upload.list[id] = new Plupload.Uploader({  
203 - runtimes: 'html5,flash,silverlight,html4',  
204 - multi_selection: multiple, //是否允许多选批量上传  
205 - browse_button: id, // 浏览按钮的ID  
206 - container: $(this).parent().get(0), //取按钮的上级元素  
207 - flash_swf_url: '/assets/libs/plupload/js/Moxie.swf',  
208 - silverlight_xap_url: '/assets/libs/plupload/js/Moxie.xap',  
209 - drop_element: [id, $(this).data("input-id")],  
210 - filters: {  
211 - max_file_size: maxsize,  
212 - mime_types: mimetype,  
213 - },  
214 - url: url,  
215 - multipart_params: $.isArray(multipart) ? {} : multipart,  
216 - init: {  
217 - PostInit: Upload.events.onPostInit,  
218 - FilesAdded: Upload.events.onFileAdded,  
219 - BeforeUpload: Upload.events.onBeforeUpload,  
220 - UploadProgress: function (up, file) {  
221 - var button = up.settings.button;  
222 - $(button).prop("disabled", true).html("<i class='fa fa-upload'></i> " + __('Upload') + file.percent + "%");  
223 - Upload.events.onUploadProgress(up, file); 201 + //生成Plupload实例
  202 + Upload.list[id] = new Plupload.Uploader({
  203 + runtimes: 'html5,flash,silverlight,html4',
  204 + multi_selection: multiple, //是否允许多选批量上传
  205 + browse_button: id, // 浏览按钮的ID
  206 + container: $(this).parent().get(0), //取按钮的上级元素
  207 + flash_swf_url: '/assets/libs/plupload/js/Moxie.swf',
  208 + silverlight_xap_url: '/assets/libs/plupload/js/Moxie.xap',
  209 + drop_element: [id, $(this).data("input-id")],
  210 + filters: {
  211 + max_file_size: maxsize,
  212 + mime_types: mimetype,
224 }, 213 },
225 - FileUploaded: function (up, file, info) {  
226 - var button = up.settings.button;  
227 - //还原按钮文字及状态  
228 - $(button).prop("disabled", false).html($(button).data("bakup-html"));  
229 - var ret = Upload.events.onUploadResponse(info.response, info, up, file);  
230 - file.ret = ret;  
231 - if (ret.code === 1) {  
232 - Upload.events.onUploadSuccess(up, ret, file);  
233 - } else {  
234 - Upload.events.onUploadError(up, ret, file); 214 + url: url,
  215 + multipart_params: $.isArray(multipart) ? {} : multipart,
  216 + init: {
  217 + PostInit: Upload.events.onPostInit,
  218 + FilesAdded: Upload.events.onFileAdded,
  219 + BeforeUpload: Upload.events.onBeforeUpload,
  220 + UploadProgress: function (up, file) {
  221 + var button = up.settings.button;
  222 + $(button).prop("disabled", true).html("<i class='fa fa-upload'></i> " + __('Upload') + file.percent + "%");
  223 + Upload.events.onUploadProgress(up, file);
  224 + },
  225 + FileUploaded: function (up, file, info) {
  226 + var button = up.settings.button;
  227 + //还原按钮文字及状态
  228 + $(button).prop("disabled", false).html($(button).data("bakup-html"));
  229 + var ret = Upload.events.onUploadResponse(info.response, info, up, file);
  230 + file.ret = ret;
  231 + if (ret.code === 1) {
  232 + Upload.events.onUploadSuccess(up, ret, file);
  233 + } else {
  234 + Upload.events.onUploadError(up, ret, file);
  235 + }
  236 + },
  237 + UploadComplete: Upload.events.onUploadComplete,
  238 + Error: function (up, err) {
  239 + var button = up.settings.button;
  240 + $(button).prop("disabled", false).html($(button).data("bakup-html"));
  241 + var ret = {code: err.code, msg: err.message, data: null};
  242 + Upload.events.onUploadError(up, ret);
235 } 243 }
236 }, 244 },
237 - UploadComplete: Upload.events.onUploadComplete,  
238 - Error: function (up, err) {  
239 - var button = up.settings.button;  
240 - $(button).prop("disabled", false).html($(button).data("bakup-html"));  
241 - var ret = {code: err.code, msg: err.message, data: null};  
242 - Upload.events.onUploadError(up, ret);  
243 - }  
244 - },  
245 - onUploadSuccess: onUploadSuccess,  
246 - onUploadError: onUploadError,  
247 - onUploadComplete: onUploadComplete,  
248 - button: that  
249 - }); 245 + onUploadSuccess: onUploadSuccess,
  246 + onUploadError: onUploadError,
  247 + onUploadComplete: onUploadComplete,
  248 + button: that
  249 + });
250 250
251 - //拖动排序  
252 - if (preview_id && multiple) {  
253 - require(['dragsort'], function () {  
254 - $("#" + preview_id).dragsort({  
255 - dragSelector: "li a:not(.btn-trash)",  
256 - dragEnd: function () {  
257 - $("#" + preview_id).trigger("fa.preview.change");  
258 - },  
259 - placeHolderTemplate: '<li class="col-xs-3"></li>' 251 + //拖动排序
  252 + if (preview_id && multiple) {
  253 + require(['dragsort'], function () {
  254 + $("#" + preview_id).dragsort({
  255 + dragSelector: "li a:not(.btn-trash)",
  256 + dragEnd: function () {
  257 + $("#" + preview_id).trigger("fa.preview.change");
  258 + },
  259 + placeHolderTemplate: '<li class="col-xs-3"></li>'
  260 + });
260 }); 261 });
261 - });  
262 - }  
263 - if (preview_id && input_id) {  
264 - $(document.body).on("keyup change", "#" + input_id, function () {  
265 - var inputStr = $("#" + input_id).val();  
266 - var inputArr = inputStr.split(/\,/);  
267 - $("#" + preview_id).empty();  
268 - var tpl = $("#" + preview_id).data("template") ? $("#" + preview_id).data("template") : "";  
269 - $.each(inputArr, function (i, j) {  
270 - if (!j) {  
271 - return true; 262 + }
  263 + if (preview_id && input_id) {
  264 + $(document.body).on("keyup change", "#" + input_id, function () {
  265 + var inputStr = $("#" + input_id).val();
  266 + var inputArr = inputStr.split(/\,/);
  267 + $("#" + preview_id).empty();
  268 + var tpl = $("#" + preview_id).data("template") ? $("#" + preview_id).data("template") : "";
  269 + $.each(inputArr, function (i, j) {
  270 + if (!j) {
  271 + return true;
  272 + }
  273 + var data = {url: j, fullurl: Fast.api.cdnurl(j), data: $(that).data()};
  274 + var html = tpl ? Template(tpl, data) : Template.render(Upload.config.previewtpl, data);
  275 + $("#" + preview_id).append(html);
  276 + });
  277 + });
  278 + $("#" + input_id).trigger("change");
  279 + }
  280 + if (preview_id) {
  281 + // 监听事件
  282 + $(document.body).on("fa.preview.change", "#" + preview_id, function () {
  283 + var urlArr = new Array();
  284 + $("#" + preview_id + " [data-url]").each(function (i, j) {
  285 + urlArr.push($(this).data("url"));
  286 + });
  287 + if (input_id) {
  288 + $("#" + input_id).val(urlArr.join(","));
272 } 289 }
273 - var data = {url: j, fullurl: Fast.api.cdnurl(j), data: $(that).data()};  
274 - var html = tpl ? Template(tpl, data) : Template.render(Upload.config.previewtpl, data);  
275 - $("#" + preview_id).append(html);  
276 }); 290 });
277 - });  
278 - $("#" + input_id).trigger("change");  
279 - }  
280 - if (preview_id) {  
281 - // 监听事件  
282 - $(document.body).on("fa.preview.change", "#" + preview_id, function () {  
283 - var urlArr = new Array();  
284 - $("#" + preview_id + " [data-url]").each(function (i, j) {  
285 - urlArr.push($(this).data("url")); 291 + // 移除按钮事件
  292 + $(document.body).on("click", "#" + preview_id + " .btn-trash", function () {
  293 + $(this).closest("li").remove();
  294 + $("#" + preview_id).trigger("fa.preview.change");
286 }); 295 });
287 - if (input_id) {  
288 - $("#" + input_id).val(urlArr.join(","));  
289 - }  
290 - });  
291 - // 移除按钮事件  
292 - $(document.body).on("click", "#" + preview_id + " .btn-trash", function () {  
293 - $(this).closest("li").remove();  
294 - $("#" + preview_id).trigger("fa.preview.change");  
295 - }); 296 + }
  297 + if (input_id) {
  298 + //粘贴上传
  299 + $("body").on('paste', "#" + input_id, function (event) {
  300 + var that = this;
  301 + var image, pasteEvent;
  302 + pasteEvent = event.originalEvent;
  303 + if (pasteEvent.clipboardData && pasteEvent.clipboardData.items) {
  304 + image = Upload.api.getImageFromClipboard(pasteEvent);
  305 + if (image) {
  306 + event.preventDefault();
  307 + var button = $(".plupload[data-input-id='" + $(that).attr("id") + "']");
  308 + Upload.api.send(image, function (data) {
  309 + var urlArr = [];
  310 + if (button && button.data("multiple") && $(that).val() !== '') {
  311 + urlArr.push($(that).val());
  312 + }
  313 + urlArr.push(data.url);
  314 + $(that).val(urlArr.join(",")).trigger("change");
  315 + });
  316 + }
  317 + }
  318 + });
  319 + //拖拽上传
  320 + $("body").on('drop', "#" + input_id, function (event) {
  321 + var that = this;
  322 + var images, pasteEvent;
  323 + pasteEvent = event.originalEvent;
  324 + if (pasteEvent.dataTransfer && pasteEvent.dataTransfer.files) {
  325 + images = Upload.api.getImageFromDrop(pasteEvent);
  326 + if (images.length > 0) {
  327 + event.preventDefault();
  328 + var button = $(".plupload[data-input-id='" + $(that).attr("id") + "']");
  329 + $.each(images, function (i, image) {
  330 + Upload.api.send(image, function (data) {
  331 + var urlArr = [];
  332 + if (button && button.data("multiple") && $(that).val() !== '') {
  333 + urlArr.push($(that).val());
  334 + }
  335 + urlArr.push(data.url);
  336 + $(that).val(urlArr.join(",")).trigger("change");
  337 + });
  338 + });
  339 + }
  340 + }
  341 + });
  342 + }
  343 + Upload.list[id].init();
  344 + });
  345 + },
  346 + // AJAX异步上传
  347 + send: function (file, onUploadSuccess, onUploadError, onUploadComplete) {
  348 + var index = Layer.msg(__('Uploading'), {offset: 't', time: 0});
  349 + var id = Plupload.guid();
  350 + var _onPostInit = Upload.events.onPostInit;
  351 + Upload.events.onPostInit = function () {
  352 + // 当加载完成后添加文件并上传
  353 + Upload.list[id].addFile(file);
  354 + //Upload.list[id].start();
  355 + };
  356 + $('<button type="button" id="' + id + '" class="btn btn-danger hidden plupload" />').appendTo("body");
  357 + $("#" + id).data("upload-complete", function (files) {
  358 + Upload.events.onPostInit = _onPostInit;
  359 + Layer.close(index);
  360 + });
  361 + Upload.api.plupload("#" + id, onUploadSuccess, onUploadError, onUploadComplete);
  362 + },
  363 + custom: {
  364 + //自定义上传完成回调
  365 + afteruploadcallback: function (response) {
  366 + console.log(this, response);
  367 + alert("Custom Callback,Response URL:" + response.url);
  368 + },
  369 + },
  370 + getImageFromClipboard: function (data) {
  371 + var i, item;
  372 + i = 0;
  373 + while (i < data.clipboardData.items.length) {
  374 + item = data.clipboardData.items[i];
  375 + if (item.type.indexOf("image") !== -1) {
  376 + return item.getAsFile() || false;
  377 + }
  378 + i++;
296 } 379 }
297 - Upload.list[id].init();  
298 - });  
299 - },  
300 - // AJAX异步上传  
301 - send: function (file, onUploadSuccess, onUploadError, onUploadComplete) {  
302 - var index = Layer.msg(__('Uploading'), {offset: 't', time: 0});  
303 - var id = Plupload.guid();  
304 - var _onPostInit = Upload.events.onPostInit;  
305 - Upload.events.onPostInit = function () {  
306 - // 当加载完成后添加文件并上传  
307 - Upload.list[id].addFile(file);  
308 - //Upload.list[id].start();  
309 - };  
310 - $('<button type="button" id="' + id + '" class="btn btn-danger hidden plupload" />').appendTo("body");  
311 - $("#" + id).data("upload-complete", function (files) {  
312 - Upload.events.onPostInit = _onPostInit;  
313 - Layer.close(index);  
314 - });  
315 - Upload.api.plupload("#" + id, onUploadSuccess, onUploadError, onUploadComplete);  
316 - },  
317 - custom: {  
318 - //自定义上传完成回调  
319 - afteruploadcallback: function (response) {  
320 - console.log(this, response);  
321 - alert("Custom Callback,Response URL:" + response.url); 380 + return false;
322 }, 381 },
323 - }, 382 + getImageFromDrop: function (data) {
  383 + var i, item, images;
  384 + i = 0;
  385 + images = [];
  386 + while (i < data.dataTransfer.files.length) {
  387 + item = data.dataTransfer.files[i];
  388 + if (item.type.indexOf("image") !== -1) {
  389 + images.push(item);
  390 + }
  391 + i++;
  392 + }
  393 + return images;
  394 + }
  395 + }
324 } 396 }
325 - }; 397 + ;
326 398
327 return Upload; 399 return Upload;
328 }); 400 });