edit.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936
  1. //编辑界面
  2. var EditingInterface = function (n) {
  3. this.n = n;
  4. //功能按钮
  5. this.mainBtn = $(".edit-hot-active"),
  6. //创建编辑热点的功能
  7. this.editHot = new EditHot(),
  8. //创建二级编辑的界面
  9. // this.editFun = new EditFun();
  10. //初始化所有基本元素和功能
  11. this.initiate();
  12. loadInfoAttrites()
  13. }
  14. //初始化界面
  15. EditingInterface.prototype.initiate = function () {
  16. $(".edit-wrap").fadeIn();
  17. this.editHot.init(this.n);
  18. this.onClick();
  19. // this.editFun.init();
  20. }
  21. EditingInterface.prototype.onClick = function () {
  22. var that = this;
  23. this.mainBtn.on("mousedown touchstart", function () {
  24. g_HotStatus = g_HotStatus == "add" ? null : "add";
  25. switch (g_HotStatus) {
  26. case "add":
  27. $("#player").css("cursor", "cell");
  28. break
  29. }
  30. })
  31. }
  32. //一级编辑界面,编辑热点的功能
  33. var EditHot = function () {
  34. this.ele = $(".edit-hot-num"),
  35. this.dataL = null, //获取最新创建热点的索引
  36. this.children = null; //创建的热点信息
  37. }
  38. EditHot.prototype.creatDom = function (index) {
  39. return "<li id='ggg_s" + index + "'>"
  40. + "<div class='edit-hotTitle'>"
  41. + "<span>热点<i class='edit-hotTitle-i'></i></span>"
  42. + "<div class='edit-remHot' data-id data-name >删除</div>"
  43. + "</div>"
  44. + "<div class='edit-content'>"
  45. + "<div class='edit-hot-data'>"
  46. + "<div>"
  47. + "<p>position:</p>"
  48. + "<p>x:<span class='edit-hot-data-p-x'></span></p>"
  49. + "<p>y:<span class='edit-hot-data-p-y'></span></p>"
  50. + "<p>z:<span class='edit-hot-data-p-z'></span></p>"
  51. + "<p>rotation:</p>"
  52. + "<p>x:<span class='edit-hot-data-r-x'></span></p>"
  53. + "<p>y:<span class='edit-hot-data-r-y'></span></p>"
  54. + "<p>z:<span class='edit-hot-data-r-z'></span></p>"
  55. + "</div>"
  56. + "<div class='edit-hot-editor'>"
  57. + '<div><span>编辑热点</span></div>'
  58. + "</div>"
  59. + "</div>"
  60. + "</div>"
  61. + "</li>"
  62. }
  63. //打开页面初始化编辑界面
  64. EditHot.prototype.init = function (n) {
  65. for (var i = 0; i < g_HotMeshes.length; i++) {
  66. this.ele.append(this.addHotList(g_HotMeshes, i));
  67. this.fillText(i);
  68. this.hotAn(i);
  69. if (n) this.remHot(n, i), this.clickEdithotBtn(i);
  70. }
  71. document.querySelector(".edit-wrap").addEventListener("mousewheel", function (event) {
  72. event.stopPropagation()
  73. });
  74. }
  75. EditHot.prototype.fillText = function (index) {
  76. var target = this.ele.children("#ggg_s" + index);
  77. target.find(".edit-hotTitle-i").text(index + 1);
  78. target.find(".edit-remHot").attr({ "data-id": g_HotMeshes[index].id, "data-name": g_HotMeshes[index].name });
  79. target.find(".edit-hot-data-p-x").text(g_HotMeshes[index].position.x);
  80. target.find(".edit-hot-data-p-y").text(g_HotMeshes[index].position.y);
  81. target.find(".edit-hot-data-p-z").text(g_HotMeshes[index].position.z);
  82. target.find(".edit-hot-data-r-x").text(g_HotMeshes[index].rotation.x);
  83. target.find(".edit-hot-data-r-y").text(g_HotMeshes[index].rotation.y);
  84. target.find(".edit-hot-data-r-z").text(g_HotMeshes[index].rotation.z);
  85. if (target[0]) {
  86. target[0].hotAttribute = g_HotMeshes[index]
  87. target.attr('data-spid', g_HotMeshes[index].belongHot.sid)
  88. }
  89. }
  90. EditHot.prototype.hotAn = function (index) {
  91. let $li = $(".edit-hot-num > #ggg_s" + index)
  92. $li.find('.edit-hotTitle').on("click", function () {
  93. var next = $(this).next();
  94. if (next.height() == 0) {
  95. next.css("height", "155px");
  96. } else {
  97. next.css("height", "0");
  98. }
  99. })
  100. $li.find('.edit-remHot').on("click", function (ev) {
  101. ev.stopPropagation()
  102. $li.remove()
  103. })
  104. }
  105. EditHot.prototype.addHotList = function (data, index) {
  106. if (!data) return;
  107. this.dataL = data.length - 1;
  108. this.ele.append(this.creatDom(index));
  109. this.fillText(this.dataL);
  110. }
  111. //删除热点
  112. EditHot.prototype.remHot = function (index, thisScene) {
  113. var deleteHot = $(".edit-remHot").eq(index), hotId, hotName;
  114. deleteHot.on("click", function () {
  115. hotId = $(this).attr("data-id");
  116. hotName = $(this).attr("data-name");
  117. for (var i = 0; i < g_HotMeshes.length; i++) {
  118. if (g_HotMeshes[i].id == hotId) {
  119. //在场景中删除这个热点模型
  120. thisScene.sceneRenderer.scene.remove(g_HotMeshes[i]);
  121. g_HotMeshes[i].visible = false;
  122. //如果热点数据中有这个热点数据就删除
  123. // if(g_newHot && g_newHot.hasOwnProperty(hotName)){
  124. // delete g_newHot[hotName];
  125. // }
  126. g_HotMeshes.splice(i, 1);
  127. console.log("删除成功:" + hotId);
  128. $(this).closest("li").remove();
  129. }
  130. }
  131. })
  132. }
  133. //点击编辑热点弹出二级编辑框
  134. EditHot.prototype.clickEdithotBtn = function (index) {
  135. $("#ggg_s" + index + " .edit-hot-editor").on("click", function () {
  136. showHotEdit(index)
  137. })
  138. }
  139. //二级编辑界面,主要编辑功能,热点功能
  140. var EditFun = function () { }
  141. EditFun.prototype.init = function () {
  142. this.addFun("addImg", "添加图片", this.addImg);
  143. this.addFun("addText", "添加文字", this.addText);
  144. this.addFun("addVideo", "添加视频", this.addVideo);
  145. this.saveBtn();
  146. }
  147. //添加功能
  148. EditFun.prototype.addFun = function (className, text, fn) {
  149. var creatDom = '<li class=edit-function-' + className + '><div><span>' + text + '</span><div></li>';
  150. $(".edit-function-console").append(creatDom);
  151. fn(className);
  152. }
  153. //保存按钮
  154. EditFun.prototype.saveBtn = function () {
  155. $(".edit-function-save").on("click", function () {
  156. $(".edit-function-wrap").hide();
  157. })
  158. }
  159. //添加图片
  160. EditFun.prototype.addImg = function (className) {
  161. var files = ["js/webuploader.html5only.min.js" + manage.time, "js/diyUpload.js" + manage.time, "css/diyUpload.css" + manage.time],
  162. imgText = '<div id="test" ></div>';
  163. $(".edit-function-" + className).attr("id", "box").append(imgText).children('div').eq(0).hide();
  164. manage.LoadJs(files, function () {
  165. $('#test').diyUpload({
  166. url: '',
  167. success: function (data) {
  168. console.info(data);
  169. },
  170. error: function (err) {
  171. console.info(err);
  172. },
  173. buttonText: '添加图片'
  174. });
  175. });
  176. }
  177. //添加文字
  178. EditFun.prototype.addText = function (className) {
  179. var textBtn = $(".edit-function-" + className),
  180. richText = '<div class="richText"><div id="toolbar">\
  181. <span>Size:</span>\
  182. <select id="size">\
  183. <option value="3">3</option>\
  184. <option value="4">4</option>\
  185. <option value="5">5</option>\
  186. <option value="6">6</option>\
  187. <option value="7">7</option>\
  188. </select>\
  189. <span>Color:</span>\
  190. <select id="color">\
  191. <option value="black" style="color:black">Black</option>\
  192. <option value="gray" style="color:gray">Gray</option>\
  193. <option value="brown" style="color:brown">Brown</option>\
  194. <option value="red" style="color:red">Red</option>\
  195. <option value="pink" style="color:pink">Pink</option>\
  196. <option value="yellow" style="color:yellow">Yellow</option>\
  197. <option value="orange" style="color:orange">Orange</option>\
  198. <option value="blue" style="color:blue">Blue</option>\
  199. <option value="Green" style="color:green">Green</option>\
  200. </select>\
  201. <span><strong>B</strong></span>\
  202. <input type="checkbox" id="bold">\
  203. <span style="text-decoration:underline">U</span>\
  204. <input type="checkbox" id="underline">\
  205. </div>\
  206. <div class="edit-F-text" contenteditable="true"></div></div>';
  207. textBtn.append(richText);
  208. textBtn.children("div").eq(0).on("click", function () {
  209. var richTextAn = $(this).next();
  210. if (richTextAn.height() == 0) {
  211. richTextAn.height("350px");
  212. } else {
  213. richTextAn.height("0");
  214. }
  215. })
  216. $(".edit-F-text").on("keydown", function (event) {
  217. event.stopPropagation()
  218. });
  219. function addEvent(id, obj) {
  220. $('.richText').find(id).on("change", function () {
  221. $('.edit-F-text').focus();
  222. switch (obj[0]) {
  223. case "FontSize":
  224. obj[2] = parseInt($('#size').val());
  225. break;
  226. case "ForeColor":
  227. obj[2] = $('#color').val();
  228. break;
  229. }
  230. document.execCommand(obj[0], obj[1], obj[2]);
  231. });
  232. }
  233. addEvent("#size", ["FontSize", false]);
  234. addEvent("#color", ["ForeColor", false]);
  235. addEvent("#bold", ["Bold"]);
  236. addEvent("#underline", ["Underline"]);
  237. }
  238. //添加视频
  239. EditFun.prototype.addVideo = function (className) {
  240. console.log(className);
  241. }
  242. //点击屏幕判断当前处于什么编辑状态,因为需要获取场景的n对象和r对象,所有把这些方法放在main.js里点击屏幕事件里执行
  243. var DownInterface = function () {
  244. this.editHot = new EditHot();
  245. }
  246. DownInterface.prototype.state = function (that, Hot) {
  247. switch (g_HotStatus) {
  248. case "add":
  249. this.addHot(that, Hot, function (thisScene) {
  250. this.editHot.addHotList(g_HotMeshes, g_HotMeshes.length - 1);
  251. this.editHot.hotAn(this.editHot.dataL);
  252. this.editHot.remHot(this.editHot.dataL, thisScene);
  253. this.editHot.clickEdithotBtn(this.editHot.dataL);
  254. });
  255. break;
  256. case "delete":
  257. break;
  258. }
  259. }
  260. //添加热点模型
  261. DownInterface.prototype.addHot = function (that, Hot, fn) {
  262. var position = that.reticule.position.toArray();
  263. var rotation = that.reticule.rotation.toArray().slice(0, 3);
  264. var sid = g_HotMeshes.length > 0 ? "sprite_" + (parseInt(g_HotMeshes[g_HotMeshes.length - 1].name.substring(7)) + 1) : "sprite_" + g_HotMeshes.length;
  265. var hot = new Hot(sid, { position: position, rotation: rotation, size: 1.05 }, that.model);
  266. //g_newHot.push(hot);
  267. that.model.hots[sid] = hot;
  268. //$('#addHot textarea')[0].value+=('添加热点:\r"'+sid + '":{ "position":['+position+'], "rotation":['+rotation+']},\r');
  269. //logData('添加热点:\r"'+sid + '":{ "position":['+position+'], "rotation":['+rotation+']},\r')
  270. g_HotStatus = false;
  271. that.mouseCouldBeClickToMove = false;
  272. $("#player").css("cursor", "");
  273. //添加完热点之后的回调函数
  274. if (g_HotMeshes && g_newHot.length === g_newHot.length++) {
  275. var thisScene = that;
  276. fn && fn.call(this, thisScene);
  277. }
  278. }
  279. // 加载所有热点的信息
  280. function loadInfoAttrites() {
  281. $.ajax(g_Prefix + "data/" + window.number + "/hot/js/data.js" + "?" + Date.now(), { dataType: "json" })
  282. .then(function (infos) {
  283. Object.keys(infos).forEach(function (key) {
  284. $('.edit-hot-num > li[data-spid="' + key + '"]')[0] && ($('.edit-hot-num > li[data-spid="' + key + '"]')[0].infoAttribute = infos[key])
  285. })
  286. })
  287. }
  288. (function () {
  289. // 热点tab切换
  290. var $heads = $('.edit-function-header a')
  291. var $body = $('.edit-function-body > div')
  292. $heads.on('click', function () {
  293. $body.hide().removeClass('active');
  294. $heads.removeClass('active')
  295. $(this).addClass('active')
  296. $('.edit-function-body > div[data-label="' + $(this).attr('data-tab') + '"]')
  297. .show()
  298. .addClass('active')
  299. })
  300. $heads.eq(0).trigger('click')
  301. // 输入框阻止事件
  302. $('#edit-title,#edit-content,.func-edit-items,#info-name,#info-summary,#share-summary').on('keydown', function (ev) {
  303. ev.stopPropagation();
  304. })
  305. // 模型与网页加载
  306. $('.insert-bottom').on('click', function () {
  307. $(this).prev().append('<label><span>热点' + $(this).attr('attr-label') + ': </span><input type="text"></label>')
  308. })
  309. })();
  310. (function () {
  311. // 视频预览控制
  312. var $videoLayout = $('.fun-view-video')
  313. $videoLayout.find('span').on('click', function () {
  314. $videoLayout.hide();
  315. $videoLayout.find('video').attr('src', '')[0].pause()
  316. })
  317. // 图片加载回调
  318. function imageSuccess(file) {
  319. if (!/image\/\w+/.test(file.type)) {
  320. alert("文件必须为图片!");
  321. return false;
  322. }
  323. var img = new Image()
  324. img.src = URL.createObjectURL(file);
  325. return img
  326. }
  327. // 视频加载回调
  328. function videoSuccess(file, $elayout) {
  329. if (!/video\/\w+/.test(file.type)) {
  330. alert("视频必须为map4格式!");
  331. return false;
  332. }
  333. $elayout.append('<span class="upload-thum">上传封面<i><input type="file"></i></span>')
  334. return '<img src="./images/play.png" class="play-video" videoURL="' + URL.createObjectURL(file) + '">'
  335. }
  336. // 视频封面回调
  337. function thumSuccess(file, $elayout) {
  338. if (!/image\/\w+/.test(file.type)) {
  339. alert("文件必须为图片!");
  340. return false;
  341. }
  342. $elayout.parent().find('img').attr('src', URL.createObjectURL(file))
  343. }
  344. // 图片与视频加载
  345. function fileHandle() {
  346. var $seft = $(this)
  347. var $layout = $seft.parent()
  348. var $elayout = $layout.parent()
  349. var $pplayout = $elayout.parent()
  350. var type = $pplayout.attr('type')
  351. var $close = $(document.createElement('span'))
  352. var file = file = this.files[0];
  353. var fnc = type === 'image' ? imageSuccess :
  354. type === 'video' ? videoSuccess : thumSuccess
  355. var $dom = fnc(file, $elayout)
  356. if (type === 'image' || type === 'video') {
  357. if (!$dom) return $seft.val('')
  358. $layout.append($close)
  359. $layout.addClass('result')
  360. var $addLayout = $(document.createElement('a'))
  361. var $addInput = $('<input type="file">')
  362. $addLayout.append($addInput)
  363. var $din = $(document.createElement('div'));
  364. $din.append($addLayout)
  365. $elayout.parent().append($din)
  366. $layout.append($dom)
  367. }
  368. }
  369. // 图片与视频加载
  370. $('.edit-fun-images').on('change', function (ev) {
  371. if (ev.target.tagName.toUpperCase() === 'INPUT') {
  372. fileHandle.call(ev.target)
  373. }
  374. })
  375. $('.edit-fun-images').on('click', function (ev) {
  376. var $tag = $(ev.target)
  377. var tagName = ev.target.tagName.toUpperCase()
  378. if (tagName === 'SPAN') {
  379. var $resf = $(ev.target)
  380. $resf.parent().parent().remove()
  381. } else if (tagName === 'IMG' && $tag.hasClass('play-video')) {
  382. $videoLayout
  383. .css('display', 'flex')
  384. .find('video')
  385. .attr('src', $tag.attr('videoURL'))[0]
  386. .play()
  387. }
  388. })
  389. })();
  390. function showHotEdit(index) {
  391. var $layout = $(".edit-function-wrap")
  392. $layout.css("display", "flex")
  393. $layout[0].targetDOM = $(".edit-hot-num > li").eq(index)[0];
  394. var info = $layout[0].targetDOM.infoAttribute || {}
  395. info.title = info.title || ''
  396. info.content = info.content || ''
  397. info.iframe = info.iframe || []
  398. info.model = info.model || []
  399. info.images = info.images || []
  400. info.video = info.video || []
  401. var iframesHTML = info.iframe.map(function (iframe) {
  402. return '<label><span>热点网页: </span><input type="text" value="' + iframe + '"></label>'
  403. })
  404. var modulesHTML = info.model.map(function (module) {
  405. return '<label><span>热点模型: </span><input type="text" value="' + module + '"></label>'
  406. })
  407. var imagesHTML = info.images.map(function (image) {
  408. return '<div><a class="hasHover result success"><span></span><img src="//' + image + '"></a></div>'
  409. })
  410. var videosHTML = info.video.map(function (ly) {
  411. return '<div><a class="hasHover result success"><span></span><img class="play-video" videoURL="//' + ly.url + '" src="//' + ly.img + '"></a><span class="upload-thum success result" attr-thum="' + ly.img + '">上传封面<i><input type="file"></i></span></div>'
  412. })
  413. imagesHTML.push('<div><a><input type="file"></a></div>')
  414. videosHTML.push('<div><a><input type="file"></a></div>')
  415. $('#edit-iframes').html(iframesHTML.join(''))
  416. $('#edit-modules').html(modulesHTML.join(''))
  417. $('.edit-fun-images[type="image"]').html(imagesHTML.join(''))
  418. $('.edit-fun-images[type="video"]').html(videosHTML.join(''))
  419. $('#edit-title').val(info.title)
  420. $('#edit-content').val(info.content)
  421. if (info.backgroundMusic) {
  422. $('#edit-miusc input').attr('src', info.backgroundMusic)
  423. $('#edit-miusc a').show().attr('href', '//'+info.backgroundMusic)
  424. } else {
  425. $('#edit-miusc a').hide()
  426. }
  427. }
  428. // 保存热点信息
  429. (function () {
  430. var $layout = $(".edit-function-wrap")
  431. $('#edit-submit').on('click', function () {
  432. $layout.addClass('loadding')
  433. var args = {}
  434. var $title = $('#edit-title')
  435. var $content = $('#edit-content')
  436. var $images = $('.edit-fun-images[type="image"] a.result')
  437. var $videos = $('.edit-fun-images[type="video"] a.result')
  438. var $thums = $('.edit-fun-images[type="video"] .upload-thum')
  439. var $iframes = $('#edit-iframes input')
  440. var $modules = $('#edit-modules input')
  441. new Promise(function (resolve, reject) {
  442. upload($images, 'images', resolve)
  443. }).then(function (imgUrls) {
  444. args.images = imgUrls
  445. return new Promise(function (resolve, reject) {
  446. upload($videos, 'images', resolve)
  447. })
  448. }).then(function (videoUrls) {
  449. args.video = videoUrls
  450. return new Promise(function (resolve, reject) {
  451. upload($thums, 'images', resolve)
  452. })
  453. }).then(function (thums) {
  454. args.video = args.video.map(function (video, index) {
  455. return {
  456. url: video,
  457. img: thums[index]
  458. }
  459. })
  460. }).then(function () {
  461. var $miusc = $('#edit-miusc input')
  462. console.log($miusc)
  463. if ($miusc[0].files.length > 0) {
  464. return new Promise(function (resolve) {
  465. upload($('#edit-miusc'), 'miusc', function(res) {
  466. resolve(res[0])
  467. })
  468. })
  469. } else {
  470. return $miusc.attr('src')
  471. }
  472. }).then(function (src) {
  473. args.backgroundMusic = src
  474. })
  475. .then(function () {
  476. args.title = $title.val()
  477. args.content = $content.val()
  478. var iframes = []
  479. for (var i = 0; i < $iframes.length; i++) {
  480. var iframe = $iframes.eq(i).val()
  481. iframe && iframes.push(iframe)
  482. }
  483. args.iframe = iframes
  484. var modules = []
  485. for (var i = 0; i < $modules.length; i++) {
  486. var module = $modules.eq(i).val()
  487. module && modules.push(module)
  488. }
  489. args.model = modules
  490. return args
  491. }).then(function (args) {
  492. $layout[0].targetDOM.infoAttribute = args
  493. $layout.removeClass('loadding')
  494. $layout.hide()
  495. })
  496. })
  497. function upload($files, type, cb) {
  498. var length = $files.length
  499. var rcount = 0
  500. var result = []
  501. Array.from($files).forEach(function (dFile) {
  502. console.log(dFile.files)
  503. var $file = $(dFile)
  504. var $image = $file.find('img')
  505. if ($file.hasClass('success')) {
  506. if ($file.attr('attr-thum')) {
  507. result.push($file.attr('attr-thum'))
  508. } else if ($image.attr('videoURL')) {
  509. result.push($image.attr('videoURL'))
  510. } else {
  511. result.push($image.attr('src'))
  512. }
  513. return success(++rcount);
  514. } else {
  515. dFile = $file.find('input')[0]
  516. }
  517. var file = dFile.files[0]
  518. if (!file) return success(++rcount);
  519. var formData = new FormData()
  520. formData.append('name', number)
  521. formData.append('dir', 'hot/' + type)
  522. formData.append('random', true)
  523. formData.append('file', file)
  524. $.ajax({
  525. url: '/uploadFile',
  526. data: formData,
  527. dataType: 'json',
  528. type: 'POST',
  529. cache: false,//上传文件无需缓存
  530. processData: false,//用于对data参数进行序列化处理 这里必须false
  531. contentType: false, //必须
  532. success: function (rs) {
  533. if (rs.code === 200) {
  534. result.push(rs.content)
  535. }
  536. success(++rcount)
  537. }
  538. })
  539. })
  540. function success() {
  541. if (rcount === length) {
  542. cb(result)
  543. }
  544. }
  545. success()
  546. }
  547. })();
  548. // 上传导览
  549. function uploadGuide(urlData, guide) {
  550. var bytes = window.atob(urlData.split(',')[1]); //去掉url的头,并转换为byte
  551. //处理异常,将ascii码小于0的转换为大于0
  552. var ab = new ArrayBuffer(bytes.length);
  553. var ia = new Uint8Array(ab);
  554. for (var i = 0; i < bytes.length; i++) {
  555. ia[i] = bytes.charCodeAt(i);
  556. }
  557. var blob = new Blob([ab], { type: 'image/jpeg' });
  558. var formData = new FormData()
  559. formData.append('name', number)
  560. formData.append('dir', 'hot/images')
  561. formData.append('random', true)
  562. formData.append('file', blob)
  563. $.ajax({
  564. url: '/uploadFile',
  565. data: formData,
  566. dataType: 'json',
  567. type: 'POST',
  568. cache: false,//上传文件无需缓存
  569. processData: false,//用于对data参数进行序列化处理 这里必须false
  570. contentType: false, //必须
  571. success: function (rs) {
  572. if (rs.code === 200) {
  573. var sid = rs.content.substring(rs.content.lastIndexOf('/') + 1, rs.content.lastIndexOf('.'))
  574. var thumbnail_signed_src = rs.content
  575. var args = JSON.parse("{" + guide + "}")
  576. args.sid = sid
  577. args.name = sid
  578. args.thumbnail_signed_src = thumbnail_signed_src
  579. args.metadata = JSON.stringify({
  580. camera_mode: 0,
  581. camera_position: {
  582. x: args.metadata.camera_position[0],
  583. y: args.metadata.camera_position[1],
  584. z: args.metadata.camera_position[2]
  585. },
  586. camera_quaternion: {
  587. x: args.metadata.camera_quaternion[3],
  588. y: args.metadata.camera_quaternion[0],
  589. z: args.metadata.camera_quaternion[1],
  590. w: args.metadata.camera_quaternion[2]
  591. },
  592. ortho_zoom: -1,
  593. scan_id: args.metadata.scan_id,
  594. final_angle: 110,
  595. is_ortho: false
  596. })
  597. console.log(args)
  598. var $li = $('<li><span><img src="//' + args.thumbnail_signed_src + '"></span><input type="text" data-oper="change-name" value="' + args.name + '"> <a data-oper="delete">删除</a></li>')
  599. $li[0].data = args
  600. $('#guide-list').append($li)
  601. }
  602. }
  603. })
  604. }
  605. // 热点 导览选项卡切换
  606. (function () {
  607. var $heads = $('#oper-tabs a')
  608. var $bodys = $(Array.from($heads).map(function ($item) {
  609. return get$dom($item.getAttribute('show-tab'))
  610. }).join(','))
  611. function get$dom(attr) {
  612. attr = '[data-tab="' + attr + '"]'
  613. return '.edit-bg' + attr + ',.edit-header' + attr
  614. }
  615. $heads.on('click', function () {
  616. var $active = $(get$dom($(this).attr('show-tab')))
  617. $bodys.removeClass('active')
  618. $heads.removeClass('active')
  619. $(this).addClass('active')
  620. $active.addClass('active')
  621. }).eq(0).trigger('click');
  622. })();
  623. // 导览列表,并注册事件
  624. (function () {
  625. var $list = $('#guide-list')
  626. $.ajax(g_Prefix + "data/" + window.number + "/someData.json" + "?" + Date.now(), { dataType: "json" })
  627. .done(function (data) {
  628. var $lis = []
  629. data.model.images.forEach(function (i) {
  630. if (i.thumbnail_signed_src) {
  631. var $li = $('<li><span><img src="//' + i.thumbnail_signed_src + '"></span><input type="text" data-oper="change-name" value="' + i.name + '"><a data-oper="delete">删除</a></li>')
  632. $li[0].data = i
  633. $lis.push($li)
  634. }
  635. })
  636. $list.append($lis)
  637. $.ajax(g_Prefix + "data/" + window.number + "/data2.js" + "?" + Date.now(), { dataType: "json" })
  638. .done(function (data2) {
  639. initInfo(data, data2)
  640. })
  641. })
  642. $list.on('click', function (ev) {
  643. var $seft = $(ev.target)
  644. if ($seft.attr('data-oper') === 'delete') {
  645. $seft.parent().remove();
  646. }
  647. }).on('change', function (ev) {
  648. var $seft = $(ev.target)
  649. if ($seft.attr('data-oper') === 'change-name') {
  650. $seft.parent()[0].data.name = $seft.val()
  651. }
  652. }).on('keydown', function (ev) {
  653. ev.stopPropagation()
  654. })
  655. })();
  656. $('.edit-save button').on('click', function () {
  657. var guides = Array.from($('#guide-list li')).map(function (dom) {
  658. return dom.data
  659. })
  660. var hots = {}
  661. Array.from($('.edit-hot-num > li')).forEach(function (dom) {
  662. hots[dom.hotAttribute.belongHot.sid] = {
  663. position: {
  664. x: dom.hotAttribute.position.x,
  665. y: dom.hotAttribute.position.y,
  666. z: dom.hotAttribute.position.z
  667. },
  668. rotation: {
  669. x: dom.hotAttribute.rotation.x,
  670. y: dom.hotAttribute.rotation.y,
  671. z: dom.hotAttribute.rotation.z
  672. },
  673. infoAttribute: dom.infoAttribute
  674. }
  675. })
  676. var info = {
  677. name: $('#info-name').val(),
  678. summary: $('#info-summary').val(),
  679. backgroundMusic: $('#query-bgm').attr('href'),
  680. hoticon: JSON.parse($('#hoticon').val()),
  681. camera_start: $('#camera-start')[0].data,
  682. loadlogo: $("#loadlogo").is(':checked'),
  683. special: $("#g_specialScene").is(':checked'),
  684. vision_version : $("#twoData").is(':checked') ? "1.1.562.17209" : false
  685. }
  686. info.weixinDesc = $('#share-summary').val();
  687. $.ajax({
  688. method: 'POST',
  689. url: '/savesetting',
  690. data: {
  691. hots: hots,
  692. name: number,
  693. guides: guides,
  694. info: info
  695. },
  696. success: function (data) {
  697. if (data.code === 200) {
  698. alert('修改成功')
  699. location.reload()
  700. }
  701. }
  702. })
  703. });
  704. // 其他信息初始化
  705. function initInfo(data, data2) {
  706. var $options = $('#hoticon option');
  707. var $loadlogo = $("#loadlogo");
  708. var $g_specialScene = $("#g_specialScene");
  709. var $twoData = $("#twoData");
  710. $('#info-name').val(data.model.name)
  711. $('#info-summary').val(data.model.summary)
  712. $('#share-summary').val(data2.weixinDesc)
  713. for (var i = 0; i < $options.length; i++) {
  714. if ($options.eq(i).val() === JSON.stringify(data.hoticon)) {
  715. $options.eq(i).attr("selected", true);
  716. }
  717. }
  718. if (data.backgroundMusic) {
  719. $('#query-bgm').attr('href', '//' + data.backgroundMusic)
  720. $('#upload-bgm + p').html('替换音乐')
  721. } else {
  722. $('#query-bgm').hide()
  723. $('#upload-bgm + p').html('上传音乐')
  724. }
  725. $('#camera-start')[0].data = data.model.camera_start;
  726. //隐藏公司logo
  727. if (data.loadlogo) {
  728. $loadlogo[0].checked = true
  729. showLogo();
  730. }
  731. //特殊大场景
  732. if (data.special === "true" || data.model.special) {
  733. $g_specialScene[0].checked = true
  734. }
  735. //启动二代的数据
  736. if (data.vision_version === "1.1.562.17209" || data.model.vision_version) {
  737. $twoData[0].checked = true
  738. }
  739. }
  740. // 音乐上传
  741. $('#upload-bgm').on('change', function () {
  742. var file = this.files[0];
  743. if (!/audio\/\w+/.test(file.type)) {
  744. alert("文件必须为音乐!");
  745. return false;
  746. }
  747. var formData = new FormData()
  748. formData.append('name', number)
  749. formData.append('dir', 'audio')
  750. formData.append('random', true)
  751. formData.append('file', file)
  752. $.ajax({
  753. url: '/uploadFile',
  754. data: formData,
  755. dataType: 'json',
  756. type: 'POST',
  757. cache: false,//上传文件无需缓存
  758. processData: false,//用于对data参数进行序列化处理 这里必须false
  759. contentType: false, //必须
  760. success: function (rs) {
  761. if (rs.code === 200) {
  762. $('#query-bgm').attr('href', rs.content)
  763. $('#upload-bgm + p').html('替换音乐')
  764. }
  765. }
  766. })
  767. })
  768. // 修改场景名称 添加初始位置 添加背景音乐 修改导览得名称
  769. function getSeft(seft) {
  770. $('#camera-start').on('click', function () {
  771. var snap = JSON.parse("{" + seft.getSnapAngleInfo() + "}")
  772. this.data.camera.quaternion = snap.metadata.camera_quaternion
  773. this.data.pano.uuid = snap.metadata.scan_id
  774. })
  775. }
  776. function editHotPanel() {//如果是编辑状态
  777. $('#addHot').css("display", "block");
  778. $('#addHot>div a:nth-child(1)').on("click", function () {//点击添加热点
  779. g_HotStatus = "add";
  780. $("#player").css("cursor", "cell");
  781. })
  782. $('#addHot>div a:nth-child(2)').on("click", function () {//点击输出新热点
  783. var str = ""
  784. for (var i = 0; i < g_newHot.length; i++) {
  785. str += ('"' + g_newHot[i].sid + '":{ "position":[' + g_newHot[i].position + '], "rotation":[' + g_newHot[i].rotation + ']},\r');
  786. }
  787. if (str == "") logData("没有添加新热点")
  788. else logData(str)
  789. })
  790. $('#addHot>div a:nth-child(3)').on("click", function () {//点击截取视图
  791. var ev = document.createEvent("MouseEvent");//"MouseEvent"
  792. ev.initMouseEvent("snapshotBegin", true, true, document.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  793. window.dispatchEvent(ev);
  794. })
  795. $('#addHot textarea').on("mousewheel", function (e) {
  796. e.stopPropagation();
  797. })
  798. window.logData = function (v) {
  799. $('#addHot textarea')[0].value += (v + "\r");
  800. $('#addHot textarea')[0].scrollTop = $('#addHot textarea')[0].scrollHeight;
  801. }
  802. }