新增会员首字母头像功能
新增文本框挺拽上传和粘贴上传 优化注册和登录的跳转 修复后台默认皮肤保存失效的BUG
正在显示
6 个修改的文件
包含
487 行增加
和
364 行删除
@@ -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 | }); |
-
请 注册 或 登录 后发表评论