Display.cshtml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. @using Abp.Configuration
  2. @using IwbZero.ToolCommon.StringModel
  3. @using WeApp.Configuration
  4. @using WeApp.TrainingCampGroup.Dto
  5. @using WeApp.Views.Exercise
  6. @using WeEngine.Enum
  7. @model ScreenModel
  8. @{
  9. Layout = "~/Views/Shared/Layout/_Layout.None.cshtml";
  10. ViewBag.Title = "演练展示";
  11. var dataCenterUrl = SettingManager.GetSettingValue(IwbSettingNames.WeDataCenterIp).Ew("/");
  12. CampGroupDto group = ViewBag.Group;
  13. var model = Model ?? new ScreenModel(1, group.Id, group.CampNo, true);
  14. }
  15. <style>
  16. body {
  17. width: 100%;
  18. height: 100vh;
  19. }
  20. .main-area {
  21. width: 100%;
  22. height: 100%;
  23. background: #f2f6fe;
  24. display: flex;
  25. --mc: #3168f5;
  26. justify-content: center;
  27. align-items: center;
  28. }
  29. .show-title {
  30. font-size: 35px;
  31. color: var(--mc);
  32. margin-top: -10%;
  33. letter-spacing: 5px;
  34. font-weight: bold;
  35. }
  36. .main-area {
  37. --padding: 5px;
  38. /*--mw: calc(100vw - var(--padding)*2);
  39. --mh: calc(100vh - var(--padding)*2); */
  40. --mw: calc(100% - var(--padding)*2);
  41. --mh: calc(100vh - var(--padding)*2);
  42. padding: var(--padding);
  43. }
  44. .area-h {
  45. width: 100%;
  46. height: 100%;
  47. display: flex;
  48. flex-direction: row;
  49. }
  50. .area-v {
  51. width: 100%;
  52. height: 100%;
  53. display: flex;
  54. flex-direction: column;
  55. }
  56. .area {
  57. padding: 8px;
  58. width: 100%;
  59. height: 100%;
  60. /*border: 1px solid red;*/
  61. }
  62. .card-vber {
  63. --borderRadius: 0.75rem;
  64. margin: 0;
  65. width: 100% !important;
  66. height: 100% !important;
  67. background: transparent;
  68. border-radius: var(--borderRadius);
  69. }
  70. .card-vber.maximized-card {
  71. --p: 10px;
  72. border-radius: var(--borderRadius);
  73. left: var(--p);
  74. right: var(--p);
  75. top: var(--p);
  76. bottom: var(--p);
  77. width: calc(100% - var(--p)*2) !important;
  78. height: calc(100% - var(--p)*2) !important;
  79. }
  80. .card-vber > .card-header {
  81. background: #fff;
  82. padding: 1rem;
  83. border-radius: var(--borderRadius) var(--borderRadius) 0 0;
  84. }
  85. .card-vber.maximized-card > .card-header {
  86. border-radius: var(--borderRadius) var(--borderRadius) 0 0 !important;
  87. }
  88. .card-vber > .card-header:before {
  89. content: "";
  90. position: absolute;
  91. left: -1px;
  92. top: calc(50% - 15px);
  93. width: 5px;
  94. height: 30px;
  95. background: #235ef4;
  96. border-radius: 0 5px 5px 0;
  97. }
  98. .card-vber > .card-header .card-title {
  99. color: #14161d;
  100. font-weight: bold;
  101. position: relative;
  102. }
  103. .card-vber > .card-body {
  104. background: #fbfdff;
  105. background-image: radial-gradient(#f2f3fe,#f5f3fe,#f8f6fe,#faf6fe,#fff);
  106. padding: 10px 1px;
  107. border-radius: 0 0 var(--borderRadius) var(--borderRadius);
  108. }
  109. .card-vber > .card-body .scroll-box {
  110. width: 100%;
  111. height: 100%;
  112. padding: 0 10px;
  113. }
  114. .card-vber > .card-body .scroll-box .box-body {
  115. width: 100%;
  116. height: 100%;
  117. }
  118. </style>
  119. <div class="main-area">
  120. <div class="area-v" style="width: calc(var(--mw) * 0.4);">
  121. <div class="area-h" style="height: calc(var(--mh) * 0.65)">
  122. <div class="area">@Html.Partial("_Run/_SceneInfo", model)</div>
  123. </div>
  124. <div class="area-h" style="height: calc(var(--mh) * 0.35)">
  125. <div class="area">@Html.Partial("_Run/_ScenePlay", model)</div>
  126. </div>
  127. </div>
  128. <div class="area-v" style="width: calc(var(--mw) * 0.35);">
  129. <div class="area-h" style="height: calc(var(--mh) * 0.65)">
  130. <div class="area">@Html.Partial("_Run/_CmdLog", model)</div>
  131. </div>
  132. <div class="area-h" style="height: calc(var(--mh) * 0.35)">
  133. <div class="area">@Html.Partial("_Run/_ScenePath", model)</div>
  134. </div>
  135. </div>
  136. <div class="area-v" style="width: calc(var(--mw) * 0.25);">
  137. <div class="area-h" style="height: calc(var(--mh) * 0.4)">
  138. <div class="area">@Html.Partial("_Run/_CmdRole", model)</div>
  139. </div>
  140. <div class="area-h" style="height: calc(var(--mh) * 0.6)">
  141. <div class="area">@Html.Partial("_Run/_ScoreEval", model)</div>
  142. </div>
  143. </div>
  144. </div>
  145. <div id="media-box-common" style="display: none"></div>
  146. @section scripts {
  147. @if (model.WithScript)
  148. {
  149. <script>
  150. $(function() {
  151. abp.signalr.connect(['@(model.CampNo)']);
  152. });
  153. function ShowGroupRole(no) {
  154. $.iwbAjax4({
  155. url: abp.appUrl + 'Query/GetGroupRolePlans?no=' + no,
  156. success: function(res) {
  157. if (res && res.plans && res.plans.length > 0) {
  158. var str = '';
  159. res.plans.forEach(function(v) {
  160. str += FormatterRolePlan(v);
  161. });
  162. if (str) {
  163. $(document).iwbModal('create',
  164. {
  165. modal: 'modal-role-plan',
  166. modaltitle: '角色预案详情',
  167. modalBody: str,
  168. save: function() {
  169. $('#modal-role-plan').modal('hide');
  170. }
  171. });
  172. }
  173. } else {
  174. abp.message.warn("还未创建指挥部!");
  175. }
  176. }
  177. });
  178. }
  179. function FormatterRolePlan(data) {
  180. var str = '';
  181. if (data) {
  182. str += '<div class="plan-box box">';
  183. str += '<div class="plan-name">{0}</div>'.format(data.name);
  184. str += '<div class="plan-role">';
  185. if (data.roleName) {
  186. data.roleName.forEach(function(v) {
  187. str += '<div class="role-box"><div class="name">{0}</div><div class="image"><img src="../../Content/Image/Stu/zhb/user.png" /></div></div>'
  188. .format(v);
  189. });
  190. }
  191. str += '</div>';
  192. str += '</div>';
  193. }
  194. return str;
  195. }
  196. iwbHub.client.getReloadAll = function(msg) {
  197. console.log('getReloadAll: ', msg);
  198. if (msg) {
  199. try {
  200. var data = JSON.parse(msg);
  201. if (data) {
  202. if (data.no == '@(model.GroupNo)' || data.no == '@(model.CampNo)') {
  203. window.location.reload();
  204. }
  205. }
  206. } catch (e) {
  207. console.log('getReloadAll: ', e);
  208. }
  209. }
  210. };
  211. </script>
  212. }
  213. <script>
  214. var startFlag = true;
  215. $(function() {
  216. @*abp.signalr.connect(function() {
  217. window.iwbHub.server.registerGroup('@(model.Play.InvitationCode)').done(function() {
  218. abp.log.debug('@(model.Play.InvitationCode) Group Registered to the SignalR server!');
  219. });
  220. abp.signalr.connect(['@(model.GroupNo)']);
  221. window.GetScenes('@(model.GroupNo)');
  222. window.ScenePath();
  223. window.GetScore();
  224. });*@
  225. window.PreLoad('@(model.GroupNo)');
  226. if (@(model.Type) == 1) {
  227. abp.signalr.connect(['@(model.GroupNo)'],
  228. function () {
  229. window.GetScenes('@(model.GroupNo)');
  230. @*setTimeout(function() {
  231. $.iwbAjax5({
  232. url: abp.appUrl + "/Eval/StartFeedback?no=@(model.GroupNo)",
  233. success: function(res) {
  234. if (res) {
  235. window.GetScenes('@(model.GroupNo)');
  236. }
  237. }
  238. },
  239. 500);
  240. });*@
  241. });
  242. } else {
  243. window.GetScenes('@(model.GroupNo)');
  244. }
  245. GetLogs('@(model.GroupNo)');
  246. GetRoles('@(model.GroupNo)');
  247. GetScore('@(model.GroupNo)');
  248. GetScenePath('@(model.GroupNo)');
  249. });
  250. function Scroll2Bottom(that) {
  251. var instance = window.OverlayScrollbars($(that)[0]);
  252. if (!instance) {
  253. OverlayScrollbar($(that), { className: "os-theme-round-dark" });
  254. instance = window.OverlayScrollbars($(that)[0]);
  255. }
  256. if (instance) {
  257. try {
  258. instance.scroll({ y: "100%" });
  259. } catch (e) {
  260. }
  261. }
  262. }
  263. function Scroll2Top(that) {
  264. var instance = window.OverlayScrollbars($(that)[0]);
  265. if (!instance) {
  266. OverlayScrollbar($(that), { className: "os-theme-round-dark" });
  267. instance = window.OverlayScrollbars($(that)[0]);
  268. }
  269. if (instance) {
  270. try {
  271. instance.scroll({ y: "0%" });
  272. } catch (e) {
  273. }
  274. }
  275. }
  276. </script>
  277. <script>
  278. iwbHub.client.getUserExit = function (msg) {
  279. console.log('getUserExit: ', msg);
  280. if (msg) {
  281. try {
  282. var data = JSON.parse(msg);
  283. if (data) {
  284. }
  285. } catch (e) {
  286. console.log('getUserExit: ', e);
  287. }
  288. }
  289. };
  290. iwbHub.client.getReloadPage = function (msg) {
  291. console.log('getReloadPage: ', msg);
  292. if (msg) {
  293. try {
  294. //var data = JSON.parse(msg);
  295. //window.location.reload();
  296. } catch (e) {
  297. console.log('getReloadPage: ', e);
  298. }
  299. }
  300. };
  301. iwbHub.client.getGuide = function (msg) {
  302. console.log('getGuide: ', msg);
  303. if (msg) {
  304. try {
  305. var data = JSON.parse(msg);
  306. if (!data) {
  307. return;
  308. }
  309. } catch (e) {
  310. console.log('getGuide: ', e);
  311. }
  312. }
  313. };
  314. iwbHub.client.getEnvironment = function (msg) {
  315. console.log('getEnvironment: ', msg);
  316. if (msg) {
  317. try {
  318. var data = JSON.parse(msg);
  319. if (!data) {
  320. return;
  321. }
  322. Environment(data);
  323. } catch (e) {
  324. console.log('getEnvironment: ', e);
  325. }
  326. }
  327. };
  328. </script>
  329. <script>
  330. var et, evList = [];
  331. function Environment(data) {
  332. evList.push(data);
  333. ShowEnvironment();
  334. }
  335. function ShowEnvironment() {
  336. var data = evList[0] ? $.extend({}, evList[0]) : undefined;
  337. console.log(data);
  338. if (!data) {
  339. return;
  340. }
  341. if ($('.environment').length > 0 && $('#ev-' + data.nodePath).length <= 0) {
  342. return;
  343. }
  344. evList.splice(0, 1);
  345. var str1;
  346. var path = data.resourcePath.indexOf('http') > -1
  347. ? data.resourcePath
  348. : '@(dataCenterUrl)' + data.resourcePath;
  349. switch (data.resourceType) {
  350. case @((int) ResourceType.Image):
  351. str1 = '<img src="{0}" style="" />'.format(path);
  352. break;
  353. case @((int) ResourceType.Audio):
  354. str1 =
  355. '<audio id="audio" style="display:none" controls autoplay><source src="{0}" type="audio/mp3">您的浏览器不支持 HTML5 audio 标签。</audio>'
  356. .format(path);
  357. break;
  358. case @((int) ResourceType.Video):
  359. str1 =
  360. '<video id="video" style="" controls autoplay><source src="{0}" type="video/mp4">您的浏览器不支持 HTML5 video 标签。</video>'
  361. .format(path);
  362. break;
  363. default:
  364. str1 = '';
  365. }
  366. clearTimeout(et);
  367. if ($('#ev-' + data.nodePath).length > 0) {
  368. $('#ev-' + data.nodePath).find('.play-box').append('<div style="width:100% ;height:15px"></div>');
  369. $('#ev-' + data.nodePath).find('.play-box').append(str1);
  370. Scroll2Bottom($('#environment-score'));
  371. } else {
  372. var str =
  373. '<div class="environment" id="ev-{0}" style="display:none;"><div class="close" onclick="CloseEnvironment(false)">关闭</div><div id="environment-score"><div class="play-box">{1}</div></div></div>'
  374. .format(data.nodePath, str1);
  375. $('body').append(str);
  376. OverlayScrollbar($('#environment-score'), { className: "os-theme-thin-light" });
  377. $(".environment").fadeIn(600);
  378. }
  379. et = setTimeout(CloseEnvironment, 1000 * 15);
  380. }
  381. function CloseEnvironment(isAuto) {
  382. isAuto = isAuto == undefined ? true : isAuto;
  383. clearTimeout(et);
  384. $(".environment").fadeOut(300).remove();
  385. if (isAuto) {
  386. ShowEnvironment();
  387. }
  388. }
  389. function PlayAudio(url, type) {
  390. if (!$('#audio-hidden-' + type).length) {
  391. var audio =
  392. '<audio id="audio-hidden-{1}" style="" controls autoplay><source src="{0}" type="audio/mpeg">您的浏览器不支持 HTML5 audio 标签。</audio>'
  393. .format(url, type);
  394. $('#media-box-common').append(audio);
  395. setTimeout(function() {$('#audio-hidden-' + type).remove();},15000);
  396. }
  397. }
  398. </script>
  399. }