Display.cshtml 15 KB

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