addons.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. define([], function () {
  2. require([], function () {
  3. //绑定data-toggle=addresspicker属性点击事件
  4. $(document).on('click', "[data-toggle='addresspicker']", function () {
  5. var that = this;
  6. var callback = $(that).data('callback');
  7. var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";
  8. var lat_id = $(that).data("lat-id") ? $(that).data("lat-id") : "";
  9. var lng_id = $(that).data("lng-id") ? $(that).data("lng-id") : "";
  10. var lat = lat_id ? $("#" + lat_id).val() : '';
  11. var lng = lng_id ? $("#" + lng_id).val() : '';
  12. var url = "/addons/address/index/select";
  13. url += (lat && lng) ? '?lat=' + lat + '&lng=' + lng : '';
  14. Fast.api.open(url, '位置选择', {
  15. callback: function (res) {
  16. input_id && $("#" + input_id).val(res.address).trigger("change");
  17. lat_id && $("#" + lat_id).val(res.lat).trigger("change");
  18. lng_id && $("#" + lng_id).val(res.lng).trigger("change");
  19. try {
  20. //执行回调函数
  21. if (typeof callback === 'function') {
  22. callback.call(that, res);
  23. }
  24. } catch (e) {
  25. }
  26. }
  27. });
  28. });
  29. });
  30. require.config({
  31. paths: {
  32. 'async': '../addons/cwmap/js/async',
  33. 'BMap3': ['//api.map.baidu.com/api?v=3.0&ak=mXijumfojHnAaN2VxpBGoqHM'],
  34. },
  35. shim: {
  36. 'BMap3': {
  37. deps: ['jquery'],
  38. exports: 'BMap3'
  39. }
  40. }
  41. });
  42. require.config({
  43. paths: {
  44. 'nkeditor': '../addons/nkeditor/js/customplugin',
  45. 'nkeditor-core': '../addons/nkeditor/nkeditor.min',
  46. 'nkeditor-lang': '../addons/nkeditor/lang/zh-CN',
  47. },
  48. shim: {
  49. 'nkeditor': {
  50. deps: [
  51. 'nkeditor-core',
  52. 'nkeditor-lang'
  53. ]
  54. },
  55. 'nkeditor-core': {
  56. deps: [
  57. 'css!../addons/nkeditor/themes/black/editor.min.css',
  58. 'css!../addons/nkeditor/css/common.css'
  59. ],
  60. exports: 'window.KindEditor'
  61. },
  62. 'nkeditor-lang': {
  63. deps: [
  64. 'nkeditor-core'
  65. ]
  66. }
  67. }
  68. });
  69. require(['form'], function (Form) {
  70. var _bindevent = Form.events.bindevent;
  71. Form.events.bindevent = function (form) {
  72. _bindevent.apply(this, [form]);
  73. if ($(".editor", form).size() > 0) {
  74. require(['nkeditor', 'upload'], function (Nkeditor, Upload) {
  75. var getImageFromClipboard, getImageFromDrop, getFileFromBase64;
  76. getImageFromClipboard = function (data) {
  77. var i, item;
  78. i = 0;
  79. while (i < data.clipboardData.items.length) {
  80. item = data.clipboardData.items[i];
  81. if (item.type.indexOf("image") !== -1) {
  82. return item.getAsFile() || false;
  83. }
  84. i++;
  85. }
  86. return false;
  87. };
  88. getImageFromDrop = function (data) {
  89. var i, item, images;
  90. i = 0;
  91. images = [];
  92. while (i < data.dataTransfer.files.length) {
  93. item = data.dataTransfer.files[i];
  94. if (item.type.indexOf("image") !== -1) {
  95. images.push(item);
  96. }
  97. i++;
  98. }
  99. return images;
  100. };
  101. getFileFromBase64 = function (data, url) {
  102. var arr = data.split(','), mime = arr[0].match(/:(.*?);/)[1],
  103. bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  104. while (n--) {
  105. u8arr[n] = bstr.charCodeAt(n);
  106. }
  107. var filename, suffix;
  108. if (typeof url != 'undefined') {
  109. var urlArr = url.split('.');
  110. filename = url.substr(url.lastIndexOf('/') + 1);
  111. suffix = urlArr.pop();
  112. } else {
  113. filename = Math.random().toString(36).substring(5, 15);
  114. }
  115. if (!suffix) {
  116. suffix = data.substring("data:image/".length, data.indexOf(";base64"));
  117. }
  118. var exp = new RegExp("\\." + suffix + "$", "i");
  119. filename = exp.test(filename) ? filename : filename + "." + suffix;
  120. var file = new File([u8arr], filename, {type: mime});
  121. return file;
  122. };
  123. var getImageFromUrl = function (url, callback, outputFormat) {
  124. var canvas = document.createElement('CANVAS'),
  125. ctx = canvas.getContext('2d'),
  126. img = new Image;
  127. img.crossOrigin = 'Anonymous';
  128. img.onload = function () {
  129. var urlArr = url.split('.');
  130. var suffix = urlArr.pop();
  131. suffix = suffix.match(/^(jpg|png|gif|bmp|jpeg)$/i) ? suffix : 'png';
  132. try {
  133. canvas.height = img.height;
  134. canvas.width = img.width;
  135. ctx.drawImage(img, 0, 0);
  136. var dataURL = canvas.toDataURL(outputFormat || 'image/' + suffix);
  137. var file = getFileFromBase64(dataURL, url);
  138. } catch (e) {
  139. callback.call(this, null);
  140. }
  141. callback.call(this, file);
  142. canvas = null;
  143. };
  144. img.onerror = function (e) {
  145. callback.call(this, null);
  146. };
  147. img.src = Fast.api.fixurl("/addons/nkeditor/index/download") + "?url=" + encodeURIComponent(url);
  148. };
  149. //上传Word图片
  150. Nkeditor.uploadwordimage = function (index, image) {
  151. var that = this;
  152. (function () {
  153. var file = getFileFromBase64(image);
  154. var placeholder = new RegExp("##" + index + "##", "g");
  155. Upload.api.send(file, function (data) {
  156. that.html(that.html().replace(placeholder, Fast.api.cdnurl(data.url)));
  157. }, function (data) {
  158. that.html(that.html().replace(placeholder, ""));
  159. });
  160. }(index, image));
  161. };
  162. Nkeditor.lang({
  163. remoteimage: '下载远程图片'
  164. });
  165. //远程下载图片
  166. Nkeditor.plugin('remoteimage', function (K) {
  167. var editor = this, name = 'remoteimage';
  168. editor.plugin.remoteimage = {
  169. download: function (e) {
  170. var that = this;
  171. var html = that.html();
  172. var staging = {}, orgined = {}, index = 0, images = 0, completed = 0, failured = 0;
  173. var checkrestore = function () {
  174. if (completed + failured >= images) {
  175. $.each(staging, function (i, j) {
  176. that.html(that.html().replace("<code>" + i + "</code>", j));
  177. });
  178. }
  179. };
  180. html.replace(/<code>([\s\S]*?)<\/code>/g, function (code) {
  181. staging[index] = code;
  182. return "<code>" + index + "</code>";
  183. }
  184. );
  185. html = html.replace(/<img([\s\S]*?)\ssrc\s*=\s*('|")((http(s?):)([\s\S]*?))('|")([\s\S]*?)[\/]?>/g, function () {
  186. images++;
  187. var url = arguments[3];
  188. var placeholder = '<img src="' + Fast.api.cdnurl("/assets/addons/nkeditor/img/downloading.png") + '" data-index="' + index + '" />';
  189. //如果是云存储的链接,则忽略
  190. if (Config.upload.cdnurl && url.indexOf(Config.upload.cdnurl) > -1) {
  191. completed++;
  192. return arguments[0];
  193. } else {
  194. orgined[index] = arguments[0];
  195. }
  196. //下载远程图片
  197. (function (index, url, placeholder) {
  198. getImageFromUrl(url, function (file) {
  199. if (!file) {
  200. failured++;
  201. that.html(that.html().replace(placeholder, orgined[index]));
  202. checkrestore();
  203. } else {
  204. Upload.api.send(file, function (data) {
  205. completed++;
  206. that.html(that.html().replace(placeholder, '<img src="' + Fast.api.cdnurl(data.url) + '" />'));
  207. checkrestore();
  208. }, function (data) {
  209. failured++;
  210. that.html(that.html().replace(placeholder, orgined[index]));
  211. checkrestore();
  212. });
  213. }
  214. });
  215. })(index, url, placeholder);
  216. index++;
  217. return placeholder;
  218. });
  219. if (index > 0) {
  220. that.html(html);
  221. } else {
  222. Toastr.info("没有需要下载的远程图片");
  223. }
  224. }
  225. };
  226. // 点击图标时执行
  227. editor.clickToolbar(name, editor.plugin.remoteimage.download);
  228. });
  229. $(".editor", form).each(function () {
  230. var that = this;
  231. Nkeditor.create(that, {
  232. width: '100%',
  233. filterMode: false,
  234. wellFormatMode: false,
  235. allowMediaUpload: true, //是否允许媒体上传
  236. allowFileManager: true,
  237. allowImageUpload: true,
  238. fontSizeTable: ['9px', '10px', '12px', '14px', '16px', '18px', '21px', '24px', '32px'],
  239. wordImageServer: typeof Config.nkeditor != 'undefined' && Config.nkeditor.wordimageserver ? "127.0.0.1:10101" : "", //word图片替换服务器的IP和端口
  240. urlType: Config.upload.cdnurl ? 'domain' : '',//给图片加前缀
  241. cssPath: Fast.api.cdnurl('/assets/addons/nkeditor/plugins/code/prism.css'),
  242. cssData: "body {font-size: 13px}",
  243. fillDescAfterUploadImage: false, //是否在上传后继续添加描述信息
  244. themeType: typeof Config.nkeditor != 'undefined' ? Config.nkeditor.theme : 'black', //编辑器皮肤,这个值从后台获取
  245. fileManagerJson: Fast.api.fixurl("/addons/nkeditor/index/attachment/module/" + Config.modulename),
  246. items: [
  247. 'source', 'undo', 'redo', 'preview', 'print', 'template', 'code', 'quote', 'cut', 'copy', 'paste',
  248. 'plainpaste', 'wordpaste', 'justifyleft', 'justifycenter', 'justifyright',
  249. 'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
  250. 'superscript', 'clearhtml', 'quickformat', 'selectall',
  251. 'formatblock', 'fontname', 'fontsize', 'forecolor', 'hilitecolor', 'bold',
  252. 'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', 'image', 'multiimage', 'graft',
  253. 'flash', 'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
  254. 'anchor', 'link', 'unlink', 'remoteimage', 'about', 'fullscreen'
  255. ],
  256. afterCreate: function () {
  257. var self = this;
  258. //Ctrl+回车提交
  259. Nkeditor.ctrl(document, 13, function () {
  260. self.sync();
  261. $(that).closest("form").submit();
  262. });
  263. Nkeditor.ctrl(self.edit.doc, 13, function () {
  264. self.sync();
  265. $(that).closest("form").submit();
  266. });
  267. //粘贴上传
  268. $("body", self.edit.doc).bind('paste', function (event) {
  269. var image, pasteEvent;
  270. pasteEvent = event.originalEvent;
  271. if (pasteEvent.clipboardData && pasteEvent.clipboardData.items) {
  272. image = getImageFromClipboard(pasteEvent);
  273. if (image) {
  274. event.preventDefault();
  275. Upload.api.send(image, function (data) {
  276. self.exec("insertimage", Fast.api.cdnurl(data.url));
  277. });
  278. }
  279. }
  280. });
  281. //挺拽上传
  282. $("body", self.edit.doc).bind('drop', function (event) {
  283. var image, pasteEvent;
  284. pasteEvent = event.originalEvent;
  285. if (pasteEvent.dataTransfer && pasteEvent.dataTransfer.files) {
  286. images = getImageFromDrop(pasteEvent);
  287. if (images.length > 0) {
  288. event.preventDefault();
  289. $.each(images, function (i, image) {
  290. Upload.api.send(image, function (data) {
  291. self.exec("insertimage", Fast.api.cdnurl(data.url));
  292. });
  293. });
  294. }
  295. }
  296. });
  297. },
  298. //FastAdmin自定义处理
  299. beforeUpload: function (callback, file) {
  300. var file = file ? file : $("input.ke-upload-file", this.form).prop('files')[0];
  301. Upload.api.send(file, function (data) {
  302. var data = {code: '000', data: {url: Fast.api.cdnurl(data.url)}, title: '', width: '', height: '', border: '', align: ''};
  303. callback(data);
  304. });
  305. },
  306. //错误处理 handler
  307. errorMsgHandler: function (message, type) {
  308. try {
  309. console.log(message, type);
  310. } catch (Error) {
  311. alert(message);
  312. }
  313. }
  314. });
  315. });
  316. });
  317. }
  318. }
  319. });
  320. });