fileUploader.js 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. !
  2. function(a, b) {
  3. "function" == typeof define && define.amd ? define(["jquery", "underscore", "webuploader", "jquery.jplayer", "bootstrap", "filestyle"],
  4. function(c, d, e) {
  5. return a.fileUploader = b(c, d, e)
  6. }) : "object" == typeof module && "object" == typeof module.exports ? module.exports = b(require("jquery"), require("underscore"), require("webuploader"), require("jquery.jplayer"), require("bootstrap"), require("filestyle")) : a.fileUploader = b(jQuery, underscore, WebUploader)
  7. } (window,
  8. function(a, b, c) {
  9. var d = {
  10. defaultoptions: {
  11. direct: !1,
  12. global: !1,
  13. dest_dir: "",
  14. callback: null,
  15. type: "image",
  16. mode: "",
  17. multiple: !0,
  18. allowUploadVideo: !0,
  19. fileSizeLimit: !1,
  20. uploader: {},
  21. threads:1
  22. },
  23. uploader: {},
  24. show: function(a, b) {
  25. return this.init(a, b)
  26. },
  27. upload_urls : null,
  28. image_urls : null,
  29. fetch_urls : null,
  30. delete_urls : null,
  31. video_urls : null,
  32. upload_url: function(upload_urls) {
  33. this.upload_urls = upload_urls
  34. },
  35. image_url: function(image_urls) {
  36. this.image_urls = image_urls
  37. },
  38. fetch_url: function(fetch_urls) {
  39. this.fetch_urls = fetch_urls
  40. },
  41. delet_url: function(delete_urls) {
  42. this.delete_urls = delete_urls
  43. },
  44. video_url: function(video_urls) {
  45. this.video_urls = video_urls
  46. },
  47. init: function(b, c) {
  48. var d = this;
  49. let o = this.fetch_urls;
  50. if (d.options = a.extend({},
  51. d.defaultoptions, c), d.options.callback = b, this.options.isWechat) {
  52. if (c.account_error) return util.message("公众号号没有上传素材的权限", "", "info"),
  53. !1
  54. } else this.options.global ? this.options.global = "global": this.options.global = "",
  55. document.cookie = "__fileupload_type=" + escape(this.options.type),
  56. document.cookie = "__fileupload_dest_dir=" + escape(this.options.dest_dir),
  57. document.cookie = "__fileupload_global=" + escape(this.options.global);
  58. return a("#modal-webuploader").remove(),
  59. 0 == a("#modal-webuploader").length && a(document.body).append(d.buildHtml().mainDialog),
  60. d.modalobj = a("#modal-webuploader"),
  61. d.modalobj.modal("show"),
  62. d.modalobj.on("shown.bs.modal",
  63. function() {
  64. if (!a(this).data("init")) {
  65. switch (d.options.type) {
  66. case "image":
  67. case "thumb":
  68. d.options.isWechat || d.initRemote(o),
  69. d.initLocal();
  70. break;
  71. case "audio":
  72. d.initLocalAudio();
  73. break;
  74. case "voice":
  75. d.initLocalVoice();
  76. break;
  77. case "video":
  78. d.options.isWechat || d.initVideoRemote(),
  79. d.options.allowUploadVideo && d.initLocalVideo()
  80. }
  81. d.options.allowUploadVideo && d["init" + d.options.type.substring(0, 1).toUpperCase() + d.options.type.substring(1) + "Uploader"]()
  82. }
  83. }),
  84. d.modalobj
  85. },
  86. initUploader: function(b) {
  87. function e(e) {
  88. var f = a('<li id="' + e.id + '"><p class="title"' + ("audio" == b || "voice" == b ? 'style="top:40px;"': "") + ">" + e.name + '</p><p class="imgWrap"' + ("audio" == b || "voice" == b ? 'style="top:30px;"': "") + "></p></li>"),
  89. g = a('<div class="file-panel"><span class="cancel">删除</span></div>').appendTo(f),
  90. h = f.find("p.progress span"),
  91. i = f.find("p.imgWrap"),
  92. j = a('<p class="error"></p>'),
  93. k = function(a) {
  94. switch (a) {
  95. case "exceed_size":
  96. text = "文件大小超出";
  97. break;
  98. case "interrupt":
  99. text = "上传暂停";
  100. break;
  101. default:
  102. text = "上传失败,请重试"
  103. }
  104. j.text(text).appendTo(f)
  105. };
  106. "invalid" === e.getStatus() ? k(e.statusText) : ("image" == b ? (i.text("预览中"), d.makeThumb(e,
  107. function(b, c) {
  108. if (b) return void i.text("不能预览");
  109. var d = a('<img src="' + c + '">');
  110. i.empty().append(d)
  111. },
  112. thumbnailWidth, thumbnailHeight)) : i.text(c.formatSize(e.size) + " kb"), percentages[e.id] = [e.size, 0], e.rotation = 0),
  113. e.on("statuschange",
  114. function(a, c) {
  115. "progress" === c ? h.hide().width(0) : "queued" === c && (f.off("mouseenter mouseleave"), g.remove()),
  116. "error" === a || "invalid" === a ? (k(e.statusText), percentages[e.id][1] = 1) : "interrupt" === a ? k("interrupt") : "queued" === a ? percentages[e.id][1] = 0 : "progress" === a && (j.remove(), "image" == b && h.css("display", "block")),
  117. f.removeClass("state-" + c).addClass("state-" + a)
  118. }),
  119. f.on("mouseenter",
  120. function() {
  121. g.stop().animate({
  122. height: 30
  123. })
  124. }),
  125. f.on("mouseleave",
  126. function() {
  127. g.stop().animate({
  128. height: 0
  129. })
  130. }),
  131. g.on("click", "span",
  132. function() {
  133. var b, c = a(this).index();
  134. switch (c) {
  135. case 0:
  136. return void d.removeFile(e);
  137. case 1:
  138. e.rotation += 90;
  139. break;
  140. case 2:
  141. e.rotation -= 90
  142. }
  143. supportTransition ? (b = "rotate(" + e.rotation + "deg)", i.css({
  144. "-webkit-transform": b,
  145. "-mos-transform": b,
  146. "-o-transform": b,
  147. transform: b
  148. })) : i.css("filter", "progid:DXImageTransform.Microsoft.BasicImage(rotation=" + ~~ (e.rotation / 90 % 4 + 4) % 4 + ")")
  149. }),
  150. p.options.multiple && r.find(".fileinput-button").show(),
  151. f.insertBefore(r.find(".fileinput-button"))
  152. }
  153. function f(b) {
  154. var c = a("#" + b.id);
  155. delete percentages[b.id],
  156. g(),
  157. c.off().find(".file-panel").off().end().remove()
  158. }
  159. function g() {
  160. var b, c = 0,
  161. d = 0,
  162. e = w.children();
  163. a.each(percentages,
  164. function(a, b) {
  165. d += b[0],
  166. c += b[0] * b[1]
  167. }),
  168. b = d ? c / d: 0,
  169. e.eq(0).text(Math.round(100 * b) + "%"),
  170. e.eq(1).css("width", Math.round(100 * b) + "%"),
  171. h()
  172. }
  173. function h() {
  174. var a, b = "";
  175. if ("ready" === state) {
  176. if (p.options.isWechat) {
  177. if ("" == p.options.mode) var e = p.modalobj.find(".nav-pills li.active").attr("data-mode");
  178. else var e = p.options.mode;
  179. p.options.flag || (d.option("server", d.option("server") + "&mode=" + e + "&types=" + p.options.type), p.options.flag = 1)
  180. }
  181. b = "选中" + fileCount + typeUnit + j + ",共" + c.formatSize(fileSize) + "。"
  182. } else "confirm" === state ? (a = d.getStats(), a.uploadFailNum && (b = "已上传" + a.successNum + typeUnit + j + "," + a.uploadFailNum + typeUnit + j + '上传失败,<a class="retry" href="#">重新上传</a>失败' + j + '或<a class="ignore" href="#">忽略</a>')) : (a = d.getStats(), b = "共" + fileCount + typeUnit + "(" + c.formatSize(fileSize) + "),已上传" + a.successNum + typeUnit, a.uploadFailNum && (b += ",失败" + a.uploadFailNum + typeUnit));
  183. t.html(b)
  184. }
  185. function i(b) {
  186. var c;
  187. if (b !== state) {
  188. switch (u.removeClass("state-" + state), u.addClass("state-" + b), state = b, state) {
  189. case "pedding":
  190. v.removeClass("element-invisible"),
  191. r.hide(),
  192. d.refresh();
  193. break;
  194. case "ready":
  195. v.addClass("element-invisible"),
  196. p.options.isWechat && "video" == p.options.type && a("#upload form").removeClass("hide"),
  197. r.show(),
  198. d.refresh();
  199. break;
  200. case "uploading":
  201. w.show(),
  202. u.text("暂停上传");
  203. break;
  204. case "paused":
  205. w.show(),
  206. u.text("继续上传");
  207. break;
  208. case "confirm":
  209. if (w.hide(), u.text("开始上传").addClass("disabled"), c = d.getStats(), c.successNum && !c.uploadFailNum) return void i("finish");
  210. break;
  211. case "finish":
  212. if (u.removeClass("disabled"), c = d.getStats(), c.successNum) {
  213. if (d.uploadedFiles.length > 0) return p.finish(d.uploadedFiles),
  214. void d.resetUploader()
  215. } else state = "done",
  216. location.reload()
  217. }
  218. h()
  219. }
  220. }
  221. var j, k, l, m, n, o, p = this;
  222. switch (b) {
  223. case "image":
  224. j = "图片",
  225. typeUnit = "张",
  226. k = {
  227. title: "Images",
  228. extensions: "gif,jpg,jpeg,bmp,png,ico",
  229. mimeTypes: "image/*"
  230. },
  231. l = 30,
  232. m = 5242880,
  233. n = l * m,
  234. o = p.options.isWechat ? {
  235. quality: 80,
  236. preserveHeaders: !0,
  237. noCompressIfLarger: !0,
  238. compressSize: 1048576
  239. }: !1;
  240. break;
  241. case "audio":
  242. case "voice":
  243. j = "音频",
  244. typeUnit = "个",
  245. k = {
  246. title: "Audios",
  247. extensions: "mp3,wma,wav,amr",
  248. mimeTypes: "audio/*"
  249. },
  250. l = 30,
  251. m = 6291456,
  252. n = l * m,
  253. o = !1,
  254. p.options.isWechat && (l = 5, "temp" == p.options.mode ? (k.extensions = "mp3", m = 2097152, n = 10485760) : (m = 5242880, n = 26214400));
  255. break;
  256. case "video":
  257. j = "视频",
  258. typeUnit = "个",
  259. k = {
  260. title: "Video",
  261. extensions: "mpeg,mp4,mov",
  262. mimeTypes: "video/*"
  263. },
  264. l = 30,
  265. m = 20971520,
  266. n = l * m,
  267. o = !1,
  268. p.options.isWechat && (l = 5, "temp" == p.options.mode ? (k.extensions = "mp4", m = 10485760, n = 52428800) : (m = 20971520, n = 104857600))
  269. }
  270. p.options.isWechat ? (p.options.flag = 0, p.modalobj.find("#li_upload_perm a").html("上传永久" + j), p.modalobj.find("#li_upload_temp a").html("上传临时" + j + "(保留3天)")) : p.modalobj.find("#li_upload a").html("上传" + j),
  271. p.modalobj.find(".modal-body").append(this.buildHtml().uploaderDialog);
  272. var q = a("#uploader"),
  273. r = a('<ul class="filelist"><li class="fileinput-button js-add-image" id="filePicker2" style="display:none;background:#fff!important;border:solid 1px #ebebeb;display:flex;"> <a href="javascript:;" class="fileinput-button-icon">+</a></li></ul>').appendTo(q.find(".queueList")),
  274. s = q.find(".statusBar"),
  275. t = s.find(".info"),
  276. u = q.find(".uploadBtn"),
  277. v = q.find(".placeholder"),
  278. w = s.find(".progress").hide();
  279. q.find(".btn-primary");
  280. fileCount = 0,
  281. fileSize = 0,
  282. ratio = window.devicePixelRatio || 1,
  283. thumbnailWidth = 110 * ratio,
  284. thumbnailHeight = 110 * ratio,
  285. state = "pedding",
  286. percentages = {},
  287. supportTransition = function() {
  288. var a = document.createElement("p").style,
  289. b = "transition" in a || "WebkitTransition" in a || "MozTransition" in a || "msTransition" in a || "OTransition" in a;
  290. return a = null,
  291. b
  292. } (),
  293. d;
  294. var x = {
  295. pick: {
  296. id: "#filePicker",
  297. label: "点击选择" + j,
  298. multiple: !0
  299. },
  300. dnd: "#dndArea",
  301. paste: "#uploader",
  302. swf: "./resource/componets/webuploader/Uploader.swf",
  303. server: p.options.isWechat ? "./index.php?c=utility&a=wechat_file&do=upload": this.upload_urls + b,
  304. compress: o,
  305. accept: k,
  306. fileNumLimit: l,
  307. fileSizeLimit: n,
  308. fileSingleSizeLimit: m,
  309. threads:1
  310. };
  311. x = a.extend({},
  312. x, p.options.uploader),
  313. x.pick.multiple = p.options.multiple,
  314. x.isWechat = p.options.isWechat,
  315. x.type = p.options.type,
  316. "audio" == b || "voice" == b ? p.options.isWechat ? a("#dndArea p").html("临时语音只支持amr/mp3格式,大小不超过为2M,长度不超过60秒<br>永久语音只支持mp3/wma/wav/amr格式,大小不超过为5M,长度不超过60秒") : a("#dndArea p").html("最大支持 " + c.formatSize(x.fileSingleSizeLimit) + " MB 以内的语音 (" + x.accept.extensions + " 格式)") : "video" == b && (p.options.isWechat ? a("#dndArea p").html("临时视频只支持mp4格式,大小不超过为10M<br>永久视频只支持rm/rmvb/wmv/avi/mpg/mpeg/mp4格式,大小不超过为20M") : a("#dndArea p").html("最大支持 " + c.formatSize(x.fileSingleSizeLimit) + " MB 以内的视频 (" + x.accept.extensions + " 格式)")),
  317. p.options.fileSizeLimit && (x.fileSizeLimit = p.options.fileSizeLimit),
  318. console.dir(x),
  319. d = c.create(x),
  320. d.uploadedFiles = [],
  321. d.addButton({
  322. id: "#filePicker2",
  323. innerHTML:`<div style="color:#ebebeb;font-size:48px;line-height:96px;">+</div>`,
  324. label: "+",
  325. multiple: p.options.multiple
  326. }),
  327. k = 0,
  328. d.resetUploader = function() {
  329. if (fileCount = 0, fileSize = 0, k = 0, d.uploadedFiles = [], a.each(d.getFiles(),
  330. function(a, b) {
  331. f(b)
  332. }), p.options.isWechat) {
  333. p.options.video && (a("#upload :text[name='title']").val(""), a("#upload :text[name='introduction']").val("")),
  334. g(),
  335. d.reset(),
  336. d.refresh(),
  337. a("#dndArea").removeClass("element-invisible"),
  338. a("#uploader").find(".filelist").empty(),
  339. a("#filePicker").find(".webuploader-pick").next().css({
  340. left: "190px"
  341. });
  342. var b = a("#uploader").find(".statusBar");
  343. b.find(".info").empty(),
  344. b.find(".accept").empty(),
  345. b.hide()
  346. } else d.refresh(),
  347. d.reset(),
  348. u.removeClass("disabled"),
  349. i("pedding")
  350. },
  351. d.onUploadProgress = function(b, c) {
  352. var d = a("#" + b.id),
  353. e = d.find(".progress span");
  354. e.css("width", 100 * c + "%"),
  355. percentages[b.id][1] = c,
  356. fileid = b.id,
  357. g()
  358. },
  359. d.onFileQueued = function(a) {
  360. fileCount++,
  361. fileSize += a.size,
  362. 1 === fileCount && (v.addClass("element-invisible"), s.show()),
  363. e(a),
  364. i("ready"),
  365. g()
  366. },
  367. d.onFileDequeued = function(a) {
  368. fileCount--,
  369. fileSize -= a.size,
  370. fileCount || i("pedding"),
  371. f(a),
  372. g()
  373. },
  374. d.on("all",
  375. function(a) {
  376. switch (a) {
  377. case "uploadFinished":
  378. i("confirm");
  379. break;
  380. case "startUpload":
  381. i("uploading");
  382. break;
  383. case "stopUpload":
  384. i("paused")
  385. }
  386. }),
  387. d.on("uploadSuccess",
  388. function(b, c) {
  389. console.log(c);
  390. return c.result == 0 ? (alert(c.msg), void d.resetUploader()) : void((c.attachment || c.media_id) && (k++, d.uploadedFiles.push(c), a("#" + b.id).append('<span class="success" style="line-height: 50px;">' + c.width + "x" + c.height + "</span>"), a(".accept").text("成功上传 " + k + " " + typeUnit + j)))
  391. }),
  392. d.onError = function(a) {
  393. return "Q_EXCEED_SIZE_LIMIT" == a ? void alert("错误信息: " + j + "大于 " + c.formatSize(x.fileSizeLimit) + " 无法上传.") : "F_DUPLICATE" == a ? void alert("错误信息: 不能重复上传" + j + ".") : void alert("Eroor: " + a)
  394. },
  395. u.on("click",
  396. function() {
  397. if (a(this).hasClass("disabled")) return ! 1;
  398. if ("pedding" != state && d.options.isWechat && "video" == d.options.type) {
  399. var b = a('#upload :text[name="title"]').val(),
  400. c = a('#upload textarea[name="introduction"]').val();
  401. if (!b) return util.message("视频标题不能为空"),
  402. !1;
  403. if (!c) return util.message("视频描述不能为空"),
  404. !1;
  405. d.option("formData", {
  406. title: b,
  407. introduction: c
  408. })
  409. }
  410. "ready" === state ? d.upload() : "paused" === state ? d.upload() : "uploading" === state && d.stop()
  411. }),
  412. t.on("click", ".retry",
  413. function() {
  414. d.retry()
  415. }),
  416. t.on("click", ".ignore",
  417. function() {}),
  418. u.addClass("state-" + state),
  419. g()
  420. },
  421. initImageUploader: function() {
  422. this.initUploader("image")
  423. },
  424. initAudioUploader: function() {
  425. this.initUploader("audio")
  426. },
  427. initVoiceUploader: function() {
  428. this.initUploader("voice")
  429. },
  430. initVideoUploader: function() {
  431. this.initUploader("video")
  432. },
  433. initRemote: function(o) {
  434. var b = this;
  435. b.modalobj.find("#li_network").removeClass("hide"),
  436. b.modalobj.find(".modal-body").append(b.buildHtml().remoteDialog),
  437. b.modalobj.find(".btn-primary").click(function() {
  438. var c = b.modalobj.find("#networkurl").val();
  439. c.length > 0 && "image" == b.options.type && a.getJSON(o, {
  440. url: c
  441. },
  442. function(a) {
  443. a.message && alert(a.message),
  444. a && (b.finish([a]), a = {})
  445. })
  446. })
  447. },
  448. initVideoRemote: function() {
  449. function b(b) {
  450. if (b) {
  451. var e = c(b);
  452. e = d(e),
  453. a("#preview").html('<div style="position:absolute;top:0;margin:0;padding:120px 50px;width:100%;height:100%;font-size:20px;"><span>只支持 腾讯,优酷,土豆视频,如无法预览视频,请前往视频网址处的分享区域,复制通用地址到编辑器内部!</span></div><iframe src="' + e + '" allowfullscreen="true" style="border:0;position:absolute;top:0;left:0;margin:0;padding:0;width:100%;height:100%;"></iframe>')
  454. }
  455. }
  456. function c(a) {
  457. if (!a) return "";
  458. var b, c;
  459. if (a.indexOf("v.qq.com") >= 0) {
  460. if (b = a.match(/vid\=([^\&]*)($|\&)/), b ? c = "http://v.qq.com/iframe/player.html?vid=" + b[1] + "&tiny=0&auto=0": (b = a.match(/\/([0-9a-zA-Z]+).html/), b && (c = "http://v.qq.com/iframe/player.html?vid=" + b[1] + "&tiny=0&auto=0")), !b) return
  461. } else if (a.indexOf("v.youku.com") >= 0) b = a.match(/id_(.*)\.html/),
  462. c = "http://player.youku.com/embed/" + b[1];
  463. else {
  464. if (! (a.indexOf("tudou.com") >= 0)) return;
  465. b = a.match(/\/([-\w]+)/g),
  466. b = b[b.length - 1].substring(1),
  467. c = "http://www.tudou.com/programs/view/html5embed.action?code=" + b
  468. }
  469. return c
  470. }
  471. function d(a, b) {
  472. return a ? a.replace(b || /[<">']/g,
  473. function(a) {
  474. return {
  475. "<": "&lt;",
  476. "&": "&amp;",
  477. '"': "&quot;",
  478. ">": "&gt;",
  479. "'": "&#39;"
  480. } [a]
  481. }) : ""
  482. }
  483. var e = this;
  484. e.modalobj.find("#li_network").removeClass("hide"),
  485. e.modalobj.find(".modal-body").append(e.buildHtml().remoteVideoDialog),
  486. e.modalobj.find("#networkurl").blur(function() {
  487. var c = a(this).val();
  488. c.length > 0 ? b(c) : a("#preview").html("")
  489. }),
  490. e.modalobj.find(".btn-primary").click(function() {
  491. var a = e.modalobj.find("#networkurl").val();
  492. if (a.length > 0 && "video" == e.options.type) {
  493. var b = c(a);
  494. b = d(b),
  495. e.finish([{
  496. url: b,
  497. isRemote: !0
  498. }])
  499. }
  500. })
  501. },
  502. initLocal: function() {
  503. var a = this;
  504. a.modalobj.find("#li_history_image").removeClass("hide"),
  505. a.modalobj.find(".modal-body").append(this.buildHtml().localDialog),
  506. a.localPage(1)
  507. },
  508. localPage: function(c) {
  509. let o = this.delete_urls;
  510. var d = this;
  511. if (d.options.isWechat) var e = d.options.type,
  512. f = d.options.mode,
  513. g = "./index.php?c=utility&a=wechat_file&do=browser",
  514. h = {
  515. page: c,
  516. type: e,
  517. mode: f,
  518. psize: 32
  519. };
  520. else var i = d.modalobj.find("#select-year .btn-info").data("id"),
  521. j = d.modalobj.find("#select-month .btn-info").data("id"),
  522. g = this.image_urls,
  523. h = {
  524. page: c,
  525. year: i,
  526. month: j,
  527. psize: 32
  528. };
  529. var k = d.modalobj.find("#history_image");
  530. return a.getJSON(g, h,
  531. function(c) {
  532. c = c.message.message,
  533. k.find(".history-content").css("text-align", "center").html('<i class="fa fa-spinner fa-pulse fa-5x"></i>'),
  534. k.find("#image-list-pager").html(""),
  535. b.isEmpty(c.items) ? k.find(".history-content").css("text-align", "left").html('<i class="fa fa-info-circle"></i> 暂无数据') : (k.data("attachment", c.items), k.find(".history-content").empty(), k.find(".history-content").html(b.template(d.buildHtml().localDialogLi)(c)), k.find("#image-list-pager").html(c.pager), k.find(".pagination a").click(function() {
  536. d.localPage(a(this).attr("page"))
  537. }), k.find(".img-list li").click(function(b) {
  538. d.selectImage(a(b.target).parents("li"))
  539. }), d.options.isWechat ? d.weixinDeletefile() : d.deletefile(o))
  540. }),
  541. d.options.isWechat || d.modalobj.find(".btn-select").unbind("click").click(function() {
  542. return a(this).hasClass("btn-info") ? !1 : ("month" == a(this).data("type") && a(this).data("id") > 0 && (d.modalobj.find("#select-year .btn-info").data("id") || (d.modalobj.find("#select-year .btn-select").removeClass("btn-info"), d.modalobj.find("#select-year .btn-select").eq(1).addClass("btn-info"))), a(this).siblings().removeClass("btn-info"), a(this).addClass("btn-info"), void d.localPage(1))
  543. }),
  544. k.find(".btn-primary").unbind("click").click(function() {
  545. var b = [];
  546. k.find(".img-item-selected").each(function() {
  547. var dd = d.modalobj.find("#history_image").data("attachment");
  548. for (cc in dd) {
  549. if (dd[cc].id == a(this).attr("attachid")) {
  550. var ee = dd[cc]
  551. }
  552. };
  553. b.push(ee),
  554. a(this).removeClass("img-item-selected")
  555. }),
  556. d.finish(b)
  557. }),
  558. !1
  559. },
  560. deletefile: function(o) {
  561. var b = this;
  562. b.modalobj.find("#history_image .img-list li .btnClose").unbind().click(function() {
  563. var b = a(this),
  564. c = a(this).data("id");
  565. return c ? (a.post(o, {
  566. id: c
  567. },
  568. // function(a) { !(a.error) ? (b.parent().remove(), util.message("删除成功", "", "success")) : util.message(a.message, "", "error");
  569. function(a) { !(a.error) ? (b.parent().remove(), alert("删除成功")) : alert(a.message);
  570. }), !1) : !1
  571. })
  572. },
  573. weixinDeletefile: function() {
  574. var b = this;
  575. b.modalobj.find(".history .delete-file").off("click"),
  576. b.modalobj.find(".history .delete-file").on("click",
  577. function(b) {
  578. var c = a(this);
  579. if (confirm("确定要删除文件吗?")) {
  580. var d = a(this).parent().attr("attachid"),
  581. e = a(this).parent().attr("data-type");
  582. a.post("./index.php?c=utility&a=wechat_file&do=delete", {
  583. id: d
  584. },
  585. function(b) {
  586. var b = a.parseJSON(b);
  587. return b.error ? void("image" == e ? c.parent().remove() : "audio" != e && "voice" != e && "video" != e || c.parents("tr").remove()) : (util.message(b.message), !1)
  588. })
  589. }
  590. b.stopPropagation()
  591. })
  592. },
  593. selectImage: function(b) {
  594. var c = this;
  595. a(b).toggleClass("img-item-selected"),
  596. c.options.isWechat ? c.options.direct && c.modalobj.find("#history_image").find(".btn-primary").trigger("click") : c.options.multiple || c.modalobj.find("#history_image").find(".btn-primary").trigger("click")
  597. },
  598. initLocalAudio: function() {
  599. var a = this;
  600. a.modalobj.find("#li_history_audio").removeClass("hide"),
  601. a.modalobj.find(".modal-body").append(this.buildHtml().localAudioDialog),
  602. a.localAudioPage(1)
  603. },
  604. localAudioPage: function(c) {
  605. var d = this;
  606. if (d.options.isWechat) var e = d.options.type,
  607. f = d.options.mode,
  608. g = "./index.php?c=utility&a=wechat_file&do=browser",
  609. h = {
  610. page: c,
  611. type: e,
  612. mode: f,
  613. psize: 5
  614. };
  615. else var g = "./index.php?c=utility&a=file&do=local&type=audio&pagesize=5",
  616. h = {
  617. page: c
  618. };
  619. var i = d.modalobj.find("#history_audio");
  620. return a.getJSON(g, h,
  621. function(c) {
  622. c = c.message,
  623. i.find(".history-content").html('<i class="fa fa-spinner fa-pulse"></i>'),
  624. b.isEmpty(c.items) ? i.find(".history-content").css("text-align", "center").html('<i class="fa fa-info-circle"></i> 暂无数据') : (i.data("attachment", c.items), i.find(".history-content").empty(), i.find(".history-content").html(b.template(d.buildHtml()[d.options.isWechat ? "weixin_localAudioDialogLi": "localAudioDialogLi"])(c)), i.find("#image-list-pager").html(c.page), i.find(".pagination a").click(function() {
  625. d.localAudioPage(a(this).attr("page"))
  626. }), i.find(".js-btn-select").click(function(b) {
  627. a(b.target).toggleClass("btn-primary"),
  628. d.options.isWechat ? d.options.direct && d.modalobj.find("#history_audio").find(".modal-footer .btn-primary").trigger("click") : d.options.multiple || d.modalobj.find("#history_audio").find(".modal-footer .btn-primary").trigger("click")
  629. }), d.playAudio(), d.options.isWechat && d.weixinDeletefile())
  630. }),
  631. i.find(".modal-footer .btn-primary").unbind("click").click(function() {
  632. var b = [];
  633. i.find(".history-content .btn-primary").each(function() {
  634. b.push(d.modalobj.find("#history_audio").data("attachment")[a(this).attr("attachid")]),
  635. a(this).removeClass("btn-primary")
  636. }),
  637. d.finish(b)
  638. }),
  639. !1
  640. },
  641. playAudio: function() {
  642. var b = this,
  643. c = b.modalobj.find("#history_audio");
  644. a(".audio-player-play").click(function() {
  645. var b = a(this).attr("attach");
  646. if (b) {
  647. if (a("#player")[0]) var d = a("#player");
  648. else {
  649. var d = a('<div id="player"></div>');
  650. a(document.body).append(d)
  651. }
  652. d.data("control", a(this)),
  653. d.jPlayer({
  654. playing: function() {
  655. a(this).data("control").find("p").removeClass("fa-play").addClass("fa-stop")
  656. },
  657. pause: function(b) {
  658. a(this).data("control").find("p").removeClass("fa-stop").addClass("fa-play")
  659. },
  660. swfPath: "resource/components/jplayer",
  661. supplied: "mp3,wma,wav,amr",
  662. solution: "html, flash"
  663. }),
  664. d.jPlayer("setMedia", {
  665. mp3: a(this).attr("attach")
  666. }).jPlayer("play"),
  667. a(this).find("p").hasClass("fa-stop") ? d.jPlayer("stop") : (c.find(".fa-stop").removeClass("fa-stop").addClass("fa-play"), d.jPlayer("setMedia", {
  668. mp3: a(this).attr("attach")
  669. }).jPlayer("play"))
  670. }
  671. })
  672. },
  673. initLocalVoice: function() {
  674. this.initLocalAudio()
  675. },
  676. initLocalVideo: function() {
  677. var a = this;
  678. a.modalobj.find("#li_history_video").removeClass("hide"),
  679. a.modalobj.find(".modal-body").append(this.buildHtml().localVideoDialog),
  680. a.localVideoPage(1)
  681. },
  682. localVideoPage: function(c) {
  683. var d = this;
  684. if (d.options.isWechat) var e = d.options.type,
  685. f = "./index.php?c=utility&a=wechat_file&do=browser",
  686. g = {
  687. page: c,
  688. type: e,
  689. psize: 5
  690. };
  691. else var f = this.video_urls,
  692. g = {
  693. page: c
  694. };
  695. var h = d.modalobj.find("#history_video");
  696. return a.getJSON(f, g,
  697. function(c) {
  698. c = c.message.message,
  699. b.isEmpty(c.items) ? c: c.items = d.foritem(c.items),
  700. h.find(".history-content").html('<i class="fa fa-spinner fa-pulse"></i>'),
  701. b.isEmpty(c.items) ? h.find(".history-content").css("text-align", "left").html('<i class="fa fa-info-circle"></i> 暂无数据') : (h.data("attachment", c.items), h.find(".history-content").empty(), h.find(".history-content").html(b.template(d.buildHtml()[d.options.isWechat ? "weixin_localVideoDialogLi": "localVideoDialogLi"])(c)), h.find("#image-list-pager").html(c.pager), h.find(".pagination a").click(function() {
  702. d.localVideoPage(a(this).attr("page"))
  703. }), h.find(".js-btn-select").click(function(b) {
  704. a(b.target).toggleClass("btn-primary"),
  705. d.options.isWechat ? d.options.direct && d.modalobj.find("#history_video").find(".modal-footer .btn-primary").trigger("click") : d.options.multiple || d.modalobj.find("#history_video").find(".modal-footer .btn-primary").trigger("click")
  706. }), d.deletevideofile())
  707. }),
  708. h.find(".modal-footer .btn-primary").unbind("click").click(function() {
  709. var b = [];
  710. h.find(".history-content .btn-primary").each(function() {
  711. var dd = d.modalobj.find("#history_video").data("attachment");
  712. for (cc in dd) {
  713. if (dd[cc].id == a(this).attr("attachid")) {
  714. var ee = dd[cc]
  715. }
  716. };
  717. b.push(ee),
  718. a(this).removeClass("btn-primary")
  719. }),
  720. d.finish(b)
  721. }),
  722. !1
  723. },
  724. deletevideofile: function() {
  725. var b = this;
  726. let o = this.delete_urls;
  727. b.modalobj.find("#history_video .history-content td .delete-video-file").unbind().click(function() {
  728. if (confirm("确定要删除文件吗?")) {
  729. var b = a(this),
  730. c = a(this).data("id");
  731. return c ? (a.post(o, {
  732. id: c
  733. },
  734. function(a) { !(a.error) ? (b.parents('tr').remove(), util.message("删除成功", "", "success")) : util.message(a.message, "", "error");
  735. }), !1) : !1
  736. }
  737. })
  738. },
  739. finish: function(b) {
  740. var c = this;
  741. a.isFunction(c.options.callback) && (0 == c.options.multiple ? c.options.callback(b[0]) : c.options.callback(b), c.modalobj.modal("hide"))
  742. },
  743. foritem: function(items) {
  744. var d = this;
  745. for (obj in items) {
  746. items[obj].createtime = d.getdate(items[obj].createtime)
  747. }
  748. return items
  749. },
  750. getdate: function(date) {
  751. var now = new Date(date * 1000),
  752. y = now.getFullYear(),
  753. m = now.getMonth() + 1,
  754. day = now.getDate();
  755. return y + "-" + (m < 10 ? "0" + m: m) + "-" + (day < 10 ? "0" + day: day) + " " + now.toTimeString().substr(0, 8)
  756. },
  757. buildHtml: function() {
  758. var a = {};
  759. var myDate = new Date();
  760. var abcd = '';
  761. for (var i = myDate.getFullYear(); i > 2012; i--) {
  762. abcd += '<a href="javascript:;" data-id="' + i + '" data-type="year" class="btn btn-default btn-select">' + i + '年</a>'
  763. }
  764. return a.mainDialog = '<div id="modal-webuploader" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">\n <div class="modal-dialog" style="width:660px;">\n <div class="modal-content">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>\n <ul class="nav nav-pills" role="tablist">\n <li id="li_upload" ' + (!this.options.isWechat && this.options.allowUploadVideo ? 'class="active"': 'class="hide"') + ' role="presentation"><a href="#upload" aria-controls="upload" role="tab" data-toggle="tab" onclick="$(\'#select\').hide();">上传</a></li>\n <li id="li_upload_perm" ' + (this.options.isWechat ? 'class="active"': 'class="hide"') + ' data-mode="perm" role="presentation"><a href="#upload" aria-controls="upload" role="tab" data-toggle="tab" onclick="$(\'#select\').hide();">上传</a></li>\n <li id="li_upload_temp" ' + (this.options.isWechat ? "": 'class="hide"') + 'data-mode="temp" role="presentation"><a href="#upload" aria-controls="upload" role="tab" data-toggle="tab" onclick="$(\'#select\').hide();">上传</a></li>\n <li id="li_network" ' + (this.options.allowUploadVideo ? 'class="hide"': 'class="active"') + ' role="presentation"><a href="#network" aria-controls="network" role="tab" data-toggle="tab" onclick="$(\'#select\').hide();">提取网络' + ("video" == this.options.type ? "视频": "图片") + '</a></li>\n <li id="li_history_image" class="hide" role="presentation"><a href="#history_image" aria-controls="history_image" role="tab" data-toggle="tab" onclick="$(\'#select\').show();">浏览图片</a></li>\n <li id="li_history_audio" class="hide" role="presentation"><a href="#history_audio" aria-controls="history_audio" role="tab" data-toggle="tab" onclick="$(\'#select\').hide();">浏览音频</a></li>\n <li id="li_history_video" class="hide" role="presentation"><a href="#history_video" aria-controls="history_video" role="tab" data-toggle="tab">浏览视频</a></li>\n </ul>\n </div>\n' + (this.options.isWechat ? "": ' <div id="select" style="display: none;margin:10px 0 -10px 15px; padding-left:7px;"> <div id="select-year" style="margin-bottom:10px;"> <div class="btn-group"> <a href="javascript:;" data-id="0" data-type="year" class="btn btn-default btn-info btn-select">不限</a> ' + abcd + ' </div> </div> <div id="select-month"> <div class="btn-group"> <a href="javascript:;" data-id="0" data-type="month" class="btn btn-default btn-info btn-select">不限</a> <a href="javascript:;" data-id="1" data-type="month" class="btn btn-default btn-select">1</a> <a href="javascript:;" data-id="2" data-type="month" class="btn btn-default btn-select">2</a> <a href="javascript:;" data-id="3" data-type="month" class="btn btn-default btn-select">3</a> <a href="javascript:;" data-id="4" data-type="month" class="btn btn-default btn-select">4</a> <a href="javascript:;" data-id="5" data-type="month" class="btn btn-default btn-select">5</a> <a href="javascript:;" data-id="6" data-type="month" class="btn btn-default btn-select">6</a> <a href="javascript:;" data-id="7" data-type="month" class="btn btn-default btn-select">7</a> <a href="javascript:;" data-id="8" data-type="month" class="btn btn-default btn-select">8</a> <a href="javascript:;" data-id="9" data-type="month" class="btn btn-default btn-select">9</a> <a href="javascript:;" data-id="10" data-type="month" class="btn btn-default btn-select">10</a> <a href="javascript:;" data-id="11" data-type="month" class="btn btn-default btn-select">11</a> <a href="javascript:;" data-id="12" data-type="month" class="btn btn-default btn-select">12</a> </div> </div> </div>') + ' <div class="modal-body tab-content" style="height:90%;"></div>\n </div>\n </div>\n</div>',
  765. a.uploaderDialog = '<div role="tabpanel" class="tab-pane upload active" id="upload">\n' + (this.options.isWechat && "video" == this.options.type ? '<form class="form-horizontal hide" style="padding-right:10px;"> <div class="form-group"> <label class="col-xs-12 col-sm-2 control-label">视频标题</label> <div class="col-sm-10"> <input type="text" name="title" class="form-control" placeholder="视频标题"> </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-2 control-label">视频描述</label> <div class="col-sm-10"> <textarea name="introduction" class="form-control" placeholder="视频描述"></textarea> </div> </div></form>': "") + ' <div id="uploader" class="uploader">\n <div class="queueList">\n <div id="dndArea" class="placeholder">\n <div id="filePicker">xx</div>\n' + (this.options.multiple ? '<p id="">或将照片拖到这里,单次最多可选' + (this.options.isWechat ? 5 : 30) + "张</p>\n": '<p id="">或将照片拖到这里</p>\n') + ' </div>\n </div>\n <div class="statusBar">\n <div class="infowrap">\n <div class="progress">\n <span class="text">0%</span>\n <span class="percentage"></span>\n </div>\n <div class="info"></div>\n <div class="accept"></div>\n </div>\n <div class="btns">\n <div class="uploadBtn btn btn-primary" style="margin-top: 4px;">确定使用</div>\n <div class="modal-button-upload" style="float: right; margin-left: 5px;">\n <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n </div>\n </div>\n </div>\n </div>\n</div>',
  766. a.remoteDialog = '<div role="tabpanel" class="tab-pane network" id="network">\n <div style="margin-top: 10px;">\n <form>\n <div class="form-group">\n <input type="url" class="form-control" id="networkurl" placeholder="请输入网络图片地址">\n <input type="hidden" name="network_attachment" value="" >\n <div id="network-img" class="network-img" style="background-image:url(\'{php echo tomedia(\'images/global/nopic.jpg\');}\')">\n <span class="network-img-sizeinfo" id="network-img-sizeinfo"></span>\n </div>\n </div>\n </form>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-primary">确认</button>\n <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n </div>\n</div>',
  767. a.remoteVideoDialog = '<div role="tabpanel" class="tab-pane network' + (this.options.allowUploadVideo ? " ": " active") + '" id="network">\n <div style="margin-top: 10px;">\n <form>\n <div class="form-group">\n <div style="margin: -10px 0 10px 0;">为了在微信中有更好的体验,推荐使用<a href="http://v.qq.com" target="_blank">腾讯视频</a></div>\n <input type="url" class="form-control" id="networkurl" placeholder="请输入网络视频地址">\n <div id="preview" style="position:relative;width:600px;height:300px;margin:0 auto;margin-top:15px;text-align:center;background:#ccc;">\n </div>\n </div>\n </form>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-primary">确认</button>\n <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n </div>\n</div>',
  768. a.localDialog = '<div role="tabpanel" class="tab-pane history" id="history_image">\n <div class="history-content" style="100%"></div>\n <div class="modal-footer">\n <div style="float: left;">\n <nav id="image-list-pager">\n <ul class="pager" style="margin: 0;"></ul>\n </nav>\n </div>\n <div style="float: right;">\n <button ' + (this.options.multiple ? "": 'style="display:none;"') + ' type="button" class="btn btn-primary">确认</button>\n' + (this.options.multiple ? '<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n': "") + " </div>\n </div>\n</div>",
  769. a.localDialogLi = '<ul class="img-list clearfix">\n<%var items = _.sortBy(items, function(item) {return -item.id;});%><%_.each(items, function(item) {%> \n<li class="img-item" attachid="<%=item.id%>" title="<%=item.filename%>">\n <div class="img-container" style="background-image: url(\'<%=item.url%>\');">\n <div class="select-status"><span></span></div>\n </div>\n <div class="btnClose" data-id="<%=item.id%>"><a href=""><i class="fa fa-times"></i></a></div>\n</li>\n<%});%>\n</ul>',
  770. a.weixin_localDialogLi = '<ul class="img-list clearfix">\n<%_.each(items, function(item) {%> \n<li class="img-item" attachid="<%=item.id%>" data-type="image" title="<%=item.filename%>">\n <div class="btnClose delete-file"><a href="javascript:;"><i class="fa fa-times"></i></a></div> <div class="img-container" style="background-image: url(\'<%=item.url%>\');">\n <div class="select-status"><span></span></div>\n </div>\n</li>\n<%});%>\n</ul>',
  771. a.localAudioDialog = '<div role="tabpanel" class="tab-pane history" id="history_audio">\n <div style="height:100%">\n <table class="table table-hover">\n <thead class="navbar-inner">\n <tr>\n <th>标题</th>\n' + (this.options.isWechat ? ' <th style="width:30%;text-align:right">创建时间</th>\n <th style="width:30%;text-align:right">\n <div class="input-group input-group-sm hide">\n': ' <th style="width:20%;">创建时间</th>\n <th style="width:30%;">\n <div class="input-group input-group-sm">\n') + ' <input type="text" class="form-control">\n <span class="input-group-btn">\n <button class="btn btn-default" type="button"><i class="fa fa-search" style="font-size:12px; margin-top:0;"></i></button>\n </span>\n </div>\n </th>\n </tr>\n </thead>\n <tbody class="history-content">\n </tbody>\n </table></div>\n <div class="modal-footer">\n <div style="float: left;">\n <nav id="image-list-pager">\n <ul class="pager" style="margin: 0;"></ul>\n </nav>\n </div>\n <div style="float: right;">\n <button ' + (this.options.multiple ? "": 'style="display:none;"') + ' type="button" class="btn btn-primary">确认</button>\n' + (this.options.multiple ? '<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n': "") + " </div>\n </div>\n</div>",
  772. a.localAudioDialogLi = '<%var items = _.sortBy(items, function(item) {return -item.id;});%><%_.each(items, function(item) {%> \n<tr>\n <td><a href="#" title="<%=item.filename%>"><%=item.filename%></a></td>\n <td class="text-right"><%=item.createtime%></td>\n <td class="text-right">\n <span class="input-group-btn">\n <button class="btn btn-default audio-player-play" type="button" attach="<%=item.url%>"><p style="margin:0px;" class="fa fa-play"></p></button>\n <button attachid="<%=item.id%>" class="btn btn-default js-btn-select">选取</button>\n </span>\n </td>\n</tr>\n<%});%>\n',
  773. a.weixin_localAudioDialogLi = '<%var items = _.sortBy(items, function(item) {return -item.id;});%><%_.each(items, function(item) {%> \n<tr>\n <td><a href="<%=item.url%>" target="blank" title="<%=item.filename%>"><%=item.filename%></a></td>\n <td class="text-right"><%=item.createtime%></td>\n <td class="text-right">\n <span class="input-group-btn" attachid="<%=item.id%>" data-type="audio">\n <button class="btn btn-default audio-player-play" type="button" attach="<%=item.url%>"><p style="margin:0px;" class="fa fa-play"></p></button>\n <button class="btn btn-default delete-file">删除</button>\n <button attachid="<%=item.id%>" class="btn btn-default js-btn-select">选取</button>\n </span>\n </td>\n</tr>\n<%});%>\n',
  774. a.localVideoDialog = '<div role="tabpanel" class="tab-pane history" id="history_video">\n <div style="height:100%">\n <table class="table table-hover">\n <thead class="navbar-inner">\n <tr>\n <th>标题</th>\n <th style="width:30%;text-align:right">创建时间</th>\n <th style="width:30%;text-align:right">\n <div class="input-group input-group-sm hide">\n <input type="text" class="form-control">\n <span class="input-group-btn">\n <button class="btn btn-default" type="button"><i class="fa fa-search" style="font-size:12px; margin-top:0;"></i></button>\n </span>\n </div>\n </th>\n </tr>\n </thead>\n <tbody class="history-content">\n </tbody>\n </table></div>\n <div class="modal-footer">\n <div style="float: left;">\n <nav id="image-list-pager">\n <ul class="pager" style="margin: 0;"></ul>\n </nav>\n </div>\n <div style="float: right;">\n <button ' + (this.options.multiple ? "": 'style="display:none;"') + ' type="button" class="btn btn-primary">确认</button>\n' + (this.options.multiple ? '<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n': "") + " </div>\n </div>\n</div>",
  775. a.localVideoDialogLi = '<%var items = _.sortBy(items, function(item) {return -item.id;});%><%_.each(items, function(item) {%> \n<tr>\n <td><a href="#" title="<%=item.filename%>"><%=item.filename%></a></td>\n <td class="text-right"><%=item.createtime%></td>\n <td class="text-right">\n <span class="input-group-btn">\n <button data-id="<%=item.id%>" class="btn btn-default delete-video-file">删除</button>\n <button attachid="<%=item.id%>" class="btn btn-default js-btn-select">选取</button>\n </span>\n </td>\n</tr>\n<%});%>\n',
  776. a.weixin_localVideoDialogLi = '<%var items = _.sortBy(items, function(item) {return -item.id;});%><%_.each(items, function(item) {%> \n<tr>\n <td><a href="<%=item.url%>" target="blank" title="<%=item.filename%>"><%=item.filename%></a></td>\n <td class="text-right"><%=item.createtime%></td>\n <td class="text-right">\n <span class="input-group-btn" attachid="<%=item.id%>" data-type="audio">\n <button class="btn btn-default delete-file">删除</button>\n <button attachid="<%=item.id%>" class="btn btn-default js-btn-select">选取</button>\n </span>\n </td>\n</tr>\n<%});%>\n',
  777. a
  778. }
  779. };
  780. return d
  781. });