From 4f5dfccaaa95c8fc5bf88fb02cf8b689814de0a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Sat, 14 Dec 2019 01:46:27 +0800 Subject: [PATCH 01/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index 1d713acc3..62e9156ff 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -301,7 +301,7 @@ class Challengesjupyter extends Component { } { - is_teacher===true||admin===true||business===true? + is_teacher===true||admin===true||business===true||this.props.identity < 8?
{ From 8421c0caf92432c0a6c4bb179b018fe2679ffc41 Mon Sep 17 00:00:00 2001 From: huang xiaoguang Date: Wed, 18 Dec 2019 14:22:52 +0800 Subject: [PATCH 02/40] add jupyter js --- public/javascripts/jupyter.js | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 public/javascripts/jupyter.js diff --git a/public/javascripts/jupyter.js b/public/javascripts/jupyter.js new file mode 100644 index 000000000..e24e06473 --- /dev/null +++ b/public/javascripts/jupyter.js @@ -0,0 +1,7 @@ +//用于嵌入到jupyter pod中的js +//guange 2019.12.18 + + +$(function(){ + console.log("educoder jupyter js init"); +}) From 9d3c89419dea5c96fb2ed05f82bfab4c618e986a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 19 Dec 2019 16:33:48 +0800 Subject: [PATCH 03/40] =?UTF-8?q?=E6=96=B0=E7=89=88=E5=AD=A6=E9=99=A2?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/css/iconfont.css | 20 +++++++++++++------ .../Challenges/Challengesjupyter.js | 4 +++- .../shixunchild/shixunchildCss/Challenges.css | 8 ++++++-- .../educoder/iconfont/iconfont.css | 20 +++++++++++++------ 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/public/react/public/css/iconfont.css b/public/react/public/css/iconfont.css index 1fc157cbd..61eb91d0a 100644 --- a/public/react/public/css/iconfont.css +++ b/public/react/public/css/iconfont.css @@ -1,10 +1,10 @@ @font-face {font-family: "iconfont"; - src: url('iconfont.eot?t=1576634145829'); /* IE9 */ - src: url('iconfont.eot?t=1576634145829#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), - url('iconfont.woff?t=1576634145829') format('woff'), - url('iconfont.ttf?t=1576634145829') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ - url('iconfont.svg?t=1576634145829#iconfont') format('svg'); /* iOS 4.1- */ + src: url('iconfont.eot?t=1576743390769'); /* IE9 */ + src: url('iconfont.eot?t=1576743390769#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), + url('iconfont.woff?t=1576743390769') format('woff'), + url('iconfont.ttf?t=1576743390769') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('iconfont.svg?t=1576743390769#iconfont') format('svg'); /* iOS 4.1- */ } .iconfont { @@ -1167,3 +1167,11 @@ content: "\e6d9"; } +.icon-suoxiao2:before { + content: "\e701"; +} + +.icon-fangda:before { + content: "\e707"; +} + diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index fcdbed408..6ba8b8f7f 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -306,8 +306,10 @@ class Challengesjupyter extends Component {

(请将实训题目写在下方并保存)

+
this.modifyjupyter(this.state)}>

应用到实训

+ className="challenbaocuntest">导入

+
: diff --git a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css index 90524719c..9ff7f0564 100644 --- a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css +++ b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css @@ -27,14 +27,14 @@ line-height: 25px; } .challenbaocun{ - width:103px; + width:60px; height:30px; background:#29BD8B; border-radius:3px; cursor:pointer } .challenbaocuntest{ - width:103px; + width:60px; height:30px; font-size:16px; color:#FFFFFF; @@ -185,4 +185,8 @@ .icon-shanchu_Hover:hover{ color:rgb(255, 85, 85) !important; } +.ysliconfont{ + text-align: center; + line-height: 30px; +} diff --git a/public/stylesheets/educoder/iconfont/iconfont.css b/public/stylesheets/educoder/iconfont/iconfont.css index 1fc157cbd..61eb91d0a 100644 --- a/public/stylesheets/educoder/iconfont/iconfont.css +++ b/public/stylesheets/educoder/iconfont/iconfont.css @@ -1,10 +1,10 @@ @font-face {font-family: "iconfont"; - src: url('iconfont.eot?t=1576634145829'); /* IE9 */ - src: url('iconfont.eot?t=1576634145829#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), - url('iconfont.woff?t=1576634145829') format('woff'), - url('iconfont.ttf?t=1576634145829') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ - url('iconfont.svg?t=1576634145829#iconfont') format('svg'); /* iOS 4.1- */ + src: url('iconfont.eot?t=1576743390769'); /* IE9 */ + src: url('iconfont.eot?t=1576743390769#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAKjgAAsAAAABOjgAAKiNAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCjbgqEn1yDpUsBNgIkA4hwC4Q6AAQgBYRtB5p7GyL6h4aQC7ITQlWitPfGSlQvPexup7Z53NtWUVkrGCsy+/8/JzkZMjYvDP19VlWBEMtlQyCqVIwlYQjTY0T7tKN9eekaMGcgwbN0hVo3ViIFJmxgOvKRV4O7f0SzcbOR8bnTfcxOOdVGkgeRYuNS3XxlwrsSYToRzU4++cY5v784+vum5IxcYIdSsvBP71xgJyuMWx4Sx5eMjvD9u9/j78wkufdBiVEhu2qy1cAKLaAuy7KRKLsqzAc8w/Nz6/2/bGCMWFAxGBUbG9FjMCJHjRRHtMoAJVR0WIQFmICBinGCipHAHeqdccZhFaKnZ54YQNu8/0dsrMLKWoOutVcsy1+2Lrp0841m1YI2LkRdtHwAEADjyHuaS1ZayVsoIrPgkPb/u/lFWpiZNQgRJObfYvJd7rsv+aJGA92esNNt0WxRrXciRhL+wW63e//ayj3UjEKNpCAQEA40nQweYAbInvYzo+9Ot+yRFAC83S2CMGUVcCxswbNwyPNmAvzTq19T+6r+agkaPRAgiQGNxtndPWN8amzmTOiyy7JLgyMi1rb3JpgnDZnQGo1h3lfVf0C0knsAUrJTjc41QMIjQ9Nq6o6dpPohfsF3/zA07ChxRMqSk7rDI9kdGbdjc5z3/u4bejf7yJ0ndz5C210v1J6JVJ6JJL/kdyRSWcGSIKsVCLBiXW87cir/l9Oq6jTvVb251f9fEJjdFQR2ObBIJ7YkJ2lykmbURbpaVzIEGmzHkHT3QIAXAPZt+lUGbEPqlnbLbU+/OLP93Wu9zhMgbCVGJmB9ikMnCmF3IclGAuasbXneCBjYbuwdibF1JefDU5uAh2PW8FTunanBjP/TWbbSoX3oPQ47CF3qdMBd90daGNkHkn27T/IeaUOyNyCdA1IAsctLmSolz9gHI19gtA7IeymkI7QDWAFXWAIXVYqiAe5CkDvhFz+RllrYMgw4owjyiFJPLAAqGVFkkKAhGaEhkv9f1XpbUJqg/VHrmOWfUtFsKl25cu0qnp73vgeK7z2AFB5IWQCpkUBqdhbkaJYApV2RlLySZteHkrXnSPP3xzzrHAmQOxY4GluQNij8pPk/Vw6xDbEKuUxVEWLp0l1pdy6K0kXp0v73+7X6dSVa2/TmJ/AaCXHFDw+zMxezi8t0SvRSTSK5wEPbHu8pLJ/nQBYW5LNgsIS9VebopXbTrphBxCwissy2e7xSh7GptWhdpE6ZAgYpWO80GU1zobSbc7E3mB6xzaEuWwcGJaJg8cDX8Q3zZ2z5PDAWxUdlfMBC1KtaG6eLfGYkQBcT2YHiEiLiABYZuaQESNMm52UC7Fce+eGsCS0S6uYJOdOSDiW05HWJAdxY7376jHMAFoRCkc9q38LAHCD+DD6IooMe44LWs+6cAbxoYMB8gFzTE7aqo8gfZf7Kdne1vh8kNRzAYlxIDP6ClXVlY18Yv7B8IXohlkXIomXZslzZ2hfrXtx/8U2m6MHL3h+Pvl71hvp20YDYBfjJz9H54l5mcFzOJCwOFI8IIGVJ0McDYB0xXxGmkbiELXeGAl0kSYwXTJKJIUs2CzlyqeUplK/YIiUW0yhQpFSZSuUq0FWpVqNWnXpLLLVMA60V1lhrpXXWM9dsNXvtNtpkDJ3NdtqiOGC3xFLLrbfSamustcFGm2y2xVbbbLdDoxP22ueg3XYpd84Bhxx21DHHnXTKaWeUUfVWngcSGND0TIDRMk2SzR/poCmmmiaZJyN1iLbTPPO18xVrrHHGuIY5wk3kwk0kW8lqiDFoj27BKhDvvl5xJniEq7iLes9wHw/wEB/xBE/R4B2e4wVe4hXCfMRFr/EGn/AO7/EB40Ua5BfeothHfMcP/ESrFFkaUauXcFlmRY4/+OuJp75EVA4ZskDl7JvkvVR2/nnuhZdeee2Nt955PxdvfPDRcf/DsuTpRcpUqdPYFpUufYaMmTKbnCkhMb2xGbP0msiqMKrCY8T6iWbVSGXNRrkFpjtnrhPOCraWkuozrnDy8fSxALH/unAHMaEkSEA5JKE0SEEt5MDnoBKURy5cAZUhJ6gCRUFVSAGqQWVUh8ugBjRHTaiPPLgFasFNUBvaow4kBHWhA+pBR9SHLKABdEJD6IxG0AWNoSuaQA80hW5oBr2QD73RHPqgBfRFS+iHVtAdraEn2kB/tIUBaAeD0R4GogMMQkdIADrBEHSGoegCw9AVhqMbjEB3GIkeMAo9YTR6wRj0hrHoA+PQF8ajH0xGf5iCATABA2EqBsE0DIbUYAhMxFCYhGGQGQyH6RgBMzASZmIUtMBomIcxMAtjYQHGwWyMh0WYAHMwEeZiEszHZFiOKbAQU2ExpsESTIelOARW4FBYicNgFQ6H1TgC1uBIWIujYB0KYD0KYQNmQAEwEzbiaNiKY2AbjoWdOA4243jYhBMgGzgRtmMW7MBs2IU5sBtzYS/mwT7Mh/1YAAexEA7hJDiMk+EIToGs4FSIDqfBKRRBWnA6nMYZEB+cCYnBWRAbzoY9OAcCnAvJwHnQDOdDA1wAqcCFUBhcBBHgYmiIS6ARLoXGuAya4HJIBBZBXpCGpOAKuAquhFhwFdTE1dAG10BbXAvFwHVQEFwPFXED1MaNUAc3QVXcDNfBLdAKt0I0uA3SgNshB7gDcoE7oSy4CzKCxVAdSyA3uBs+A/dABdwLW3AflAL3Q3HwAJwHD0I88BCcwMNQBjwClfAo1MNj8D14HK6BJ+Ar8CTkA0/B1+Bp+AY8A9+CZ+E78Bz8B56HH8EL8BN4EfKDl+Bn8DL8Al6BX8Gr8Bt4DX4Hr0NUeAPOgTfhJN6CP8Db8Cd4B/4H78Lf4D34B7wP/4KlUBfLIAZ8AHHhQ7gNlsNfIAOZwAq4A1bCXbAK7oHVcB+sgSJgLdTAOkgJ1sMNsAHygI3wAGwiLKCYsISPCCvwMTwEn8Aj8Ck8hs/gCXwOT+GLiqa9BDHhK8IBfE3YgW8IR/AtRITvCGfwPTyDH2LDadYtJLqXVLToRq0ieA7b8AK24yXswCvYidewC29gN95CGd7BHryHH6F2PonPOuGLHPgAe/ERynEc+/CJ/QJwAMvwqxD4TSjgd6GEP4QK/hRq+Eto4G9Uwz9CC/8KHfwn9PC/MMBBYYQKYYKsMOMWkA5uEcIFbpHCGm5RwgZucYQt3FIqOC3hOuxRdriiYn5AzeGEqbmIuamCo8mOr/mCKBOHNCNDTSFyzSXyTRK2mfTsMBnYac7ywbSj2TTljznGoGmNQjjAbczRRQRAJNy5hRJwdxMi4542ouC+CBfgyZN9DY7DGSDcACJ8IPJPkzd6fTMT7W9UISINltTYVqtuRAlXreEDyzPWDETHwlnVhuHsRPJas6TICuRsNgQ3SzEgLiG9zWTSSogNG1CsamsoDqyouIWsKZhC3ZtZDy9RKFj0+qLAFqyaOMUNa0y9a4tiiZYSvdqik2m2i4t4lFqReKccoYkByiXGuEXWWiJDoUflIwrQrRpDzURf78uUUkJle7oWRlDmWIhL3NCYe0ewo0wL9peOYcqDLi3aEEg9UanADUJ366uSxYy0lhxAF+lTNVI8tKgclvGicxEYJ2zGy4rVH/ARMsWvmtVjAzNCmJ/LPtaVq0CRYYCNZI8TKoP3NW00jDl8/Erp8cerM+RPpQwUyT/D0Mq7pJT9Hw7jf6XwZhjIWirZzmSdq6q3Z4Hn5rqumKsjsQrlwCfvj2bVV1XpG+qV2qH1B29ExHUuiF3I2cvYGJu03kxzZZgCZzLwBWjiWZkbKhec6pdEN1ocsQyHFx8eWDdGlzeAXROaqRrtNKcMa7mDVUuRY/RWc8YN/E4PxrkdljCGELfb92u2xFqpnhXXTmr7qQh9F3YieHu5thZPLOB5sxExBosgs+OwMGF1zXSjD52DDN3zt4Xsa+baHfvUtxPVcN7pPi8MsyGKy5Y7c4q+edqaNes5d7b4sPcRElZjb/jWsJztMxIMyawTlc04dp37t4eD0HYgwEkia7vuaBO9jJaV4hWiOnCi7rG55NjDw8KjiFAYnw5hJeQFqUDjIL6yeofYtcD1xqBjLq4nr1qYAKaaaYh0kMlcmDnFKrKPyJ6SN5sdUvIcniX4FYZjdscTDaUX33reumAacVyHIOdhozbew4q2ZTvPwDQM1i5yYRiWkPIsKSWFoEyFcomxRzMsC/pD1tu5CXjvE4ezdBVtJb/6tW4a3wMyjikdIbQ0e8rxZpD/sfqOm8Yau0RGGfoFEl5/WoTK7ZBo8hGCePc8K+w5P98bI73AT11nTdAaBu9kiqwNRTud6DlpziTAwvoNvW/izUtyAPr2C8qjeVFroxW2r6ipL7sZ0ncdlIUirrXSGkfSyEpTuwLs0IjQxpQmBt9jMdpgluXQG1tgwmBtW4BEMMG5RWr0J/uE0qpaNaRtjbRiftU8vFbrequpHm9sWzXKho1Re/O2+stFtkeBoJV7dvoa09nF50vm99LQR6fWAy9eZ0NwPNQYGtwtbOk9+arqvUN0835jNVpDeqIFNA557tBKa3ysnc+2ukV7pJfhcNVJGxb3YvQJ1t4EEFdOZhy1aa7ihvD6IjLkWYHgOjeXeythaO9GifRB1mcCwd93q3q5yEP8fEh9x1JBAGyMYw2Bpw57wnI7TXvrY8It5zzYd97DquwcO2kRuxTGIRiyLka3nY73qWL6uca0Skg8seIY37VyGLOlPEsrynOE3cGRchAnxZq2nQnrzWbdP0IvxsRENHIS4rkx2IP/rypmnWqnX1XEUYVuBDYRXi8hakt3EGMTpiPiMYcsSXoM+F0bdcO/2UQO6T5kihmxNnCrI4B623gg8ShYmAjSc/IvqlGIyIBMe0uITsOzX45ggBBldERG3nOqXbBlZg46KZGlgwYRvW3Cia2lCsXErtIMzc7d7aLmlEWI4yDbxpDOmM7sxO7HD80u4thoaho7hKJt0whixyKYTDbmsjqJ+5gR1ah3cyMgNFXO8BN/5vAkYvX9+3bbIW9S5y2bvkHsmbhqYTFEtZSUblnABKub/smsKqia8AGnXCqzHucG9kKfe4zMGCwQqFFvhhOI/pHkP41nLxluCW/H3IvjHNuBG1MzeBJN7zF5VUvtL3f+fNqElpeY0IS9tZzVHA+68ak7UepER/Mn8WQjrNDhQ4Wck6MKKSY4YcA3jt2UCbp88/WW5nEuzE0ij8xuRjdAlwiOOJRweKO6I4oG7kap84xxiGyASPat6N/YVzHXScwOsjP3ZF33wB+sU6ZNh1XIDrFllKgBIIDL8SxyAzwVwglWF4FVp52erC0+6ci4EJZJRclWlDdgIXzItyJ/LiqXRCGZdQZNq0qBVTbajSQZ7dd1suOyVwJ5Jjg4J+pKRFDANvZnNOGxQyuZSvfzVJfbo+dsb1Wg1fOS60N72kIEiWIH1dlQ/zS/NMgZIgcFs6YOae9qFvHYUDviV9RNJN5YU1UgOnMuplh/PS8SX4lyaEujNEV1+lW40Yav5cCJGyUlOsrdvWZCrQWYL8yu9jkDwEm82//+pUJOp7kNUWhXRSm2oGHCHiHn+1pjnxg+S98BPXbGkafPj3//deEkpKH/isH2/O03lj9y/JKgYH1z09815VCCgp+TnLo9d00mBQAiQ0OuJuOpEL7tZkBaA6zbs95ENC1xXB8DEzJO2OOkUNBylAwM4AJZSjgsyxyUaADnJOUSZRrVpL9+LUkXhclNhbTlTa2t6L/SSDu4ouspUzFuzJXRxVhWTMV8R84w66KlI621D9H5yAWy+t2zz+Y6jBcZE4hoeiNBbUC95/uMCaIE5EQmU3qWKBuODhxV1Gyx+0trp0SdmDLRDix0fV8B13eprBDVh6UZFjLCt22vQoZWpzlFWDGFHEEFFpJWvGVX2H5HB9HliOLzsS5pLXD+FDmMUsZKORN6jxUKUAuJMWnjj8qR4e7o7VhtSf3Xjje0U18fPzguKydkrbGsDcbistVCJyekqdrFOBDOcZJyhp/hTGkoxxVxh7OCPMh5keWLhwNxo8DQpcGhkLwwstZgP4iNzmwjx8Jso4GtMxzUyhtNGswoQakfvxPkOZ4OrqHKKfYanU3N9etFIThEMHh+jRUTlSMEpO2CP3QfVy34OqRKDF5dLDqKRtCQV9mg6zjPAMDtCpC01fl0B4gMXeuugBCS2G47NNqgsAa52qUS5qmsRr9ryXqdnbmIrBNkvIDhVLK6SzWxTlDQ2q13vCJtddvblzTLWYnlAWF5E8qNwoIDRASS+4zlQmRUgS6mLA2bpBmhHSgVOWZucVV2JbXU1VfUMkscCSGmO+KYhO/rtnb+l31WlXNUe0kHsuijj4uDkC8M9/MBEH30LaDKrdVtKeuTuPz53EHSXGtgvOzksEAKs3BAl4XhG0oWLk4u6tLAGiwHh1LaNxGdOCS97elaqs4nVYcTlLTLoLiiL4zP138fP9aeHSSNzs7rdWrnG5ll4CJx0V0JY5wHGM4sG0yxXIB9QJt+ivv8h1/KtjLAvbnBV/5YzjCDXTkw1V5KDs3Gj7JlcXbWBCnKzPRJZWNvV7uifO1rJCyJFA5gXnxQgQ0XEMrXS5g85gZLErBZofl66tYg4uuzlUP0UQNpeREzyeEeRnoB2gRuHikx0+d+r3AubDKtP5KkY7QRpgDBrgAaq0JakJlzUveqUdjE6gsL/lIhhPp5BHuzDjqJ5wEXGJjeNgzQmBZAVFsaXBEX5yGN7Dy1aPYZrKsryoSduCTyz2Y4Uv3KeGXhKp/1TBYPIKL+sZtwMwevGC/HxgdAAKQMyCzsTQDXvxVB7XkPIpSFWzayvCgNGKLdCMpf0//r2RB94WYECFJwMXwA7CLgbahLekp6CuGZk5pWoZuFev+wFiBEwOQnXYbWVM/NagmOjOBrIZ3v0fwNX0OaQwjA/L4ZFDS4kYgWoX4Fp9AHospwiKapzoVf4kES9x1MiiQ0YbmQxedN/MxSTJVZXM6MsahWqw529P4kZPkRW9JpCdTbmKz7IQbp26HWNq11Yjh7YNY7p850Z+8YrEKvLo/vT7bWXWgku1a02hvQ4+bA2oWHRKJVt7FXD6WvajlRxFkVDjag3tClMNPYka1R4BgGlpomEm8aoZJELuIpxMi9k6oDY0aA6XaoL4YZqHMxvlozLtv1uG6XYT7cUG/clBSi7VKyDLNuSc7LqqKN7Yeo4RDlk2ryLNhqA+JVBgviz2Ow+JYKqdu2j8jkab5cWSsdk4klEVj9OgFl2Iw/++79CoCirvCp0NjkfguvReBRph75jK/p5hhElqhSTh4LrKyImNa3Oaqoct4M2LJCRT4bZviqYvTWuKy3Iqfmzy9neFWlZDTfLSFDxcvLnaN/RNrZtgXmFFQdpePDlaikSTH+LhTnGKxif95xFGIYasuD9lDHqcYSygwNSP9E03pwbXFFm8scZijpUlZLG+wvTAoiOFKMZvQK5uUJxwmerKDYWFN6IT65HOghS5cjSw1XW1XkFlYIPb/bTvb1yT4k3THkYr6QOw/dF/L4L+f49VhJigKCcE32hBHE8VtNAFo+GUMHdG14ZWhRWB0+qXwYg9DiANZVbxJgFL4SCPGNN+F9ojy6ajMNcWPshPQ6fQhi/HSVGzmx/D/nB0Nf3/jzlVOX+7nv7tk1h0B7l/PYsjtuD+2x3RNg3MEANT/7z4VDiEYkyWg8rsdUDhCat5YPimXMJzVEHhlacgDqp03hj6JjZwe9UWNv99YBncNr0gtMMURvnAV49ZAlIzaHkDY90tMGqw938Ko1/8g/Af/iw395/Xp5bC5Uu5E3Ozt/Nqj6iA8ThERUZfbnobyeme50ryAD15FjUNyszVqGldqFIGvxDD+zPV4ftjnEniSSU9zWwG0TSbQfE2IyE+xZ0KKQFXFC8LWY7KTCg5ZzStulVBeVlt4yRZrGoGnu7c7woqp0us5qOlRSZfET0e7YqX6qLXSmvQqVr2IOemZVluRGb5Q1Sg6kMpcSxfmZqxMq1xYcG0yDm+CqjC7YgChkaDy1oiKqqlKOsQUs1RBovYJlTc5CXZbylY1/jubUWm2WKaXGE5pCxKwOkJE0QgJQygM+Z1+n8bH2IuKghHhlFdqdab58G8Sr8SiAYG9zFmtMWR1rvCckfChLC+uE7+jED5CBP6lWSnXvlJuWQBT4JKCr78nceYv0c7Ay9TOLdhmuv3zxiXW18NAx/V099lAMKXQSqa+rzkyO1ABkOEkaRp+Ncr99UwWP5nGpb0IM8gWzPxha6AsSTqG8D4Rf3ylhNE3foXQ1MfcgBlSQAp+ryTIQIPi4yP9qYTx7sEiP3Jnu5jFEJfxti4QljmgrvfwhEiZnqPEn2pIUxAseJN1ecPSu09nURxT6feto7MjsZuqPlIQzB5r1WvOMSmOHRZPjpSwrnz6mO63qI4/5ZtF4N1y3+nRVwP+PaZLteHKErCvBgodzns6VsUejVCBAzAwOtxsVFxJDxpMMZrG0VeggODnlEIa6Ak3ImBAAIE5YCcRAugSxdnC35oSlXxPZDbbnGjf6WgqpAIbyS2IjSwTIylwQD9xOe2V+kPSF4Nv0NCj348FAipf5CW+FcYVPMImc8MCxk0bZPPfiyiPNDyKMsW5ApNKX3jDGQ3TQreubXXDD6PVmMWTRM7u2wqTm0ykE3Oz2lS17aRYSd77Gg4QbLHYy/aoGyDwfb5SA4ZkZwgTG3/yUFfmP8/ns6/CNzFsAwSwgGJoAl7/fiwp+3XgDvZVCBk41+YkIzC1lCTkfH1xX30Eq4T6O11ZkQXun9VWlNwYpTeZS2G27K2b5WRc5hFV7bdpPOR1UMEcn2fZunxOsYa7l0u3hABKnaRooZQJrDKetJjopXQF7lGEcMi6zHXBPpp8yjovnKJ6pnHGJyghXkxOp9wV0XMesYJ+sP3XB8sLabwra5fU+M+uLJFHtD+dF2VxRRHKuFXQb+kgtGZf4olhrw4Y8IwEyoa46DOlbTNzHvfsF7lXWP61W53+sX3hU8yVVrfsNkVNQpnOsV+SogJt+0eEmQWJ/9Mf3q/56QcEGbhO/joer2oDP6LCBz8KXiv7J9Etw43oC7cMPgdPGKcBz+0Cuci2hZQIkJ5qqwPdKhi0xvUiYxKnaNW4ijipLmWNnZqGfjZbE6yW7mkdFTqoKKxvXO6DqHL6HFOFpg4oV8twhWJoyCKP9WDiA0gqxZxKJmikhQNiyqa5aF5BI0LyRC/X3VFTwD4jHAUVqGWhJYvL8ahfpVSA82CZLMnJBWh7W9GmqK7RDRhLrZ+J2fM7JzhDj6UQjeGuzcwMosC+Ni+EsOsrkwyK1gi6OTM7JWHkKkSgU8aomtkX6BX4kkc1yPQFtIvITeelukO65/hlhuCUf1XNGgUl7GK7xV18U7nh5QThYwXOYjdq1GRCcwEyeEkivggAaQFJQI7xxq+dXAq7mc4PV43J8NntKSPGEgP2y8u1rRUnTiF+bZiSFSsyO70CIeqH3YnlJ3BEmL1bMoBq1XcuvcCAuYXDTphl+1rW5e47Leh1GulT6BS2LZThjInMCrwwVWxC2IaZKDe0sorOQqN1e8uOeL0tOVe1gRYGSsKFaLlX2SPuKFRYRZBnwmqDn6hclrl57rVy3gS9W6XYGPoeKnmoragfiC/PnnkdQOCtm2VvdqEI4OcPrPYQZzDuEHlU+5nENNTEv8ndM9vcJ4WnF+dgH2A87xL7dIeXLK8QCZtkEyQ0YTDuP2Q10AqgcNPw0LgwSE8ImiUZcHuH64A7GQU5IU5WtXCowsmT/wfuoqOx0Bzhd/JayeA79su2U7usWVGZL8yKS4uYupdq0PpVLQuS5jfZkKzsZk0UAR+51xTj8D9iYPqanoMYwlLvCawiXZHRRYTM8zI0ydYgl5Pxqf8O5Auu3avK7iCCioAKi8dErwa/l7ztlL3EtCSM3RTX2oPSfFv6/7YbUJvVlZ2p/PP/HLeqQQqCwQJ1dal5yyGGwftb4aX7Xvy0jJAuRyaglYP1nulL7io/cOJ4aloTGCp3kb+mj8IIRCvMjMJe79trc28tT+N+OKwRey6/7nEBo1AL6FSkNQdojyZOEx4FrIOmzI8UZHe2q3m90Hz0okl/LiWsiuU8wQh0rGP07qx4QvUPe7xyKFYC3TV8YuXufmcmF4QIQOY0yuqa7invlD1QQwBB+wSe3f7k5yuKZoOHoGc17isDg22f1ZcD5p8Ctg+bV1C9nM6jgKf0dNmzYsnXjxoGBsSHpgrGFLYhgoXg1MBRw9dV3ktz5fRDmoloG+hHKD76bzzmp1vr1m81hxWx2ONd56BcAg/y2cPxcV5jP3ntvnmxnwoAXQd2oxNYtDby9AQO/vfEf/nVEsNd+1Q/4ebZb+3dABM1g76DUqnm0y4KQ6rvrDJFqq6Yidcz6hMISFKiigrhJVQ3L0o9qpcUv4ixxvceoagt6EaO9J4EBHxqvGg/ybx5TySi3+gxDVDWB9TFL5ETyCsZhIyMm6TWZM0roG/AEEGQNh5OIJfoAomwDBjkMu+dy53ybp+w3CG704pMz2EBNiBO5+UWUpFlw94n8QJi8/35/SXo9zgJUoyMWF9LruykuC54yOvqST6PgpMlPfJSjJecN3WA9uWKw8RvRE5ns/MgAPjlG14XqrKfnAPR2Z+K6jTVCVb1eE9MGj0i0W/N7+c13WgJiuuBPbmqqErk+OWFDmgkRMHmVcdwILEDuoNi+y4GWTniaxWfGjQnyRM0hT1K7OS5OsE1dCNDgeniMaZ3oC4yIcSZwwFwxpu52L6HHMjLaHpjwEc2P+3FPxUYUsOsBaf9KxjuHDGtuxqmqIC5L81CVkj/U0B0pNVbMYdIPx4uiTRTALEM+u4gK40xLPj1+TNnYDbdKnTK22MKE6hNPms32d87mbo2zOCOtTF/WUdVEvqPqHpGmSq/tRgWbsZ++OE5OX51QrZyAMM4HNYrZgNu/j2Ick3RMm16IQhjxTwrktoYImhB7a+pZx+petLDCYWAC5FPJDoQjZ7naMj8Fc71dgqZgHDIuG/xXs8I2i53huLyPObzcaBL9p3Dy7/JxIubXSKgPzhsRr3BVjQuJ6pO7syJ/5k/8VTlF9f5VRY6LlXXIXE58zrSD+eLmc50cvYuLfyzmgJd419ut7Vv7MiZs2FnWNqZidDh1vpBHD1ge7Yk/PP2z+flLqbfn6A/NL1t+qGEF12W3aa7LVD41Z63xjfMxw6tais77+fspN7ItZZ5k/LBQH6WmNrHkwMP6VTbDjIlMx0VI18v9KG7i+cmZENenvAIkWNpVSGbFuEwVFUrYehplgYInOTo+cGPgrW8WHaAJoBzlfJHAG6EomLHqCo3GMnuH+Xe5fAaSlG0iXqBKHXfoSjtTW8XLqCAtrThGcVgMqi9J8ToB66VRSBcZkdYz4On6r6SxsCaKe4+VzUtoj0YSKuiVJWMGgObDQgYb/fIqVRZmMLgqpDG3Pn7kSuzxOF8iBDuqnEagyio7efUSlJFo8sztHg/f7vH2Et47ecy4m70kBKSOFDOW2WV+OoXS+qQogjzenADZgP206uRUgjAqzdZ/bauC8CzZcd+BInhjaCe5LDxQA90oNG40p4OCNbm0exqnlHI+A2/snaieRtE4rax2Z6LZuydbl3Za5moxLqWkFqKi/YlnLuYNnkb8uyMODZGlr4XVEWMmrmBjJKZqbZxTjS6qm9on9nmVJBqsnu+D2fUxm0jj5Z0fTIyuWBWRwxfkUOO6kcquDy/tejEuoQaTGKzsdkeKSuhFE1TMP7dYeqovAijR5g78PdkiKFBwq2nKsFKIs9s102dYb5nQgqZQFD5cXNtgbC51epPQb4BUDNODqmXKv62nLXbaWpCjkNkH5Iy5Ab7D/OSW6AIpDMK9vBgCIAFJZH4REUVh8TKmIbzV2veibCLeg1qjnleYM7AKFw/fEFK2Kgpi81v8WQW4bHIJGZxgo8e9hvJ8Wj0ZgT1SNjm8C3HwHMiQIEFBWp4SLb/MsZ2yQDGnBXatSbDYdklWp8LE7MiZbCzfzBcX97j9tfpQb7HzZOOU8/XZUcsjCgWLmsj8guo5OG9I6LdNjSgR1YX0by+nGyDFDbA48R5XY8jQkOm2DgtZVjgIJFWsilGP/+K8mOIxZwO0azAmcsUpTFoZ+mkhT7BWVVM0zmtjVQ0eLyE3a6L5H23D5A1zprswbg/3Tz61vF+32zUhG/QRUeYGayAPsJXNkcJUsQVJHD5J5n6WurIiAaEaduhzu0iO+trVrjcz2tFkj90F4WtCJOZl1NeChAs3ysWx1o7eWxuWLklJk9cLOi2+3DS1DOudH//mkP0A6pTxPEQKou3AEG21DPMNDNBbfoe5lGVMIohTSEopDDFHoL8f54HvIYC3LTDy6QHNlFsVFJuwQs2ilCr9JJAEizjDspBiMBpmOlOeqRhOBYAg17uHWqF1G5C/NZqZmoGNdCy7ASWd/iYiarMaf5bhjBv1RspFRdMM1FOQnTznfC0nPdneeXPMSu9CkzadRo5Fqtzkq77/O3dgbSx75rf3f0/vOz/8Tmw8ZaTbUe+wHo04dHfKnBqOnNgsSSvni9f9Dsi5pNOgAzfrodEes2cs8EaPiCrr/k7/Dec6+75c57XjYs4/HSRUt3CqTKYqpRmnukdZbzGaaTkmVVXyRlm2J3dKAvFSwDetMK2o+CBQsiWYpPprR51ORK1EXWlW2BUI7tnzappxsvAMG9uK2E6enw5WO+iUrhJYgXhyLdPI4JDhWYpGF5WhdoUCbIMLZQmH9lgJLPEUf3KBsEGuaHCpWtQOqnT8mcTzZ0nzLEtXW5rnQQvkdOqNjUcNtk1m3G7IzLqikNlVbDA2CWNu9cSYhsyQX5VcgBsNkkIsQrWITCBRIIQwneCH83hFrRbX879YdugTUQO8m1X0ZfDIinBCMsmvjjnoOIrXlGboUwHr+kuHxXROFO+G4V7dswT5M16Qx/3pxSN3p0Pbg6nJM4nvBug0EKZQUoe28S5VFqg78O3GAxeNTgb4La1d2leCRXjMGrTNmXTVPZn17oj6kQ0UyY93r/lj8mTy0Kb5SwTA3lJvVZtspY9gD7eljfZMt4F4gvL7/NHOSbaQ3qpQpTbJGMcloe0Zu38CIGtfrqjuN6p6Ydje+Ge9yVQKcEgVv5Mqr82zeeB5Fk33tumY5iSsIOPeyzvgIckgm5YOCzYlXcNGR0enj9FQNuwQ7Mrkwzd2rl0z8JpcKefpmp7r74SnJTwExqSJ5v4QeVmalfMwBGDFI7bglRjTf8JqDZv4FqtqDa5zT41JP+HXZUkYQESJ3RnBUoBzCSEQgVzswXqa5LSX2CjE902lNGH/Gylbmf210YJ9Wm22M7+3oteH7mSjO7vEzWB0trPz9LfRqcby0S8fjdX65i70XL6Z2y6vqSvBUONaB9w+CXdq2405XUnbw0VFXJAj4O1WwXhHISg6BLZPliiiiKNYmoItIdSYahZ2DYZZdPtW3dHqFqQpFYsJQDcrBm6lAb+7pHc4pzl2DFrSANysoLB2UOFLCqGPGX6VNHtSajMTzRLpqrXWGSaw7zLqLa3kEQjYvrS3t11H4qaCgpzd0jOZ/YGpbHxJcNSFRVXnvit7JzUqNNnpnMSnCmJcCY9Ib0L/NDMKBTMn6CmZeKtNWhy+8V2N8RMEwZCOkqgRpEQrjnv7Y+m4JjSKNPXROLaDpXr+GqzKk5WAVWFhtbrznhgTMkyefqQwkLFl7s2JXeJO4Kfi1xx9rpxBAp+lr17m805FLHGqGzrTTenD9l1R6u+b5/tUSRBGMv2+61YHBpuk5xGuqiNlgxhEJ05IyszB/1MpBDRwCl3hRdASgUC5dLKETgMxhIHXCU9/07+bP40fB0juexgf7HnI/VW5gvnLHCnkIPFHywpMF9MmEV+ZD5tt7FGwqbYeDKOjxSBCsUm6Rk3XNFj3WeiQ4ZSFyVMNecsnwu5tEAWNS4FMPCBu3IQ/NKCzZoif6qDfUiS20NTO3yYVP16K+4gmMyfElMQkV7YA8MSgkQHXZxz95mbsaxZBwZEvHo/Xa0vbjn/LAY693f9nurX9+PfnPfXh0a+fvm5RZZoRdsgteuLGxp9GHEH12wNvSPtma/+RGxUFUhJXNWfGS6wbUTkxqFBd6tXYzCkkVDZ9GmcXTvEZyDipS7kiMvKMq14hP9cl1Zy/9uLMU90vB/lj2t+K17qZe0iMveXgkQ4cokWfxZmqjrraXPksgeZ+AXSBQ5QBGcbyS0FEhjNMa2BgQ2q3i6slhbFpoidLZrkssqS/l/Dl/Zte8Wc00trnvHr8HtCqWnaFHvjz1pf781W+pzn3tcWtrwazJu0u2K+cuh92E9dVsQJ+2vLagJ+1p392K6WbGaksFA0NBqEIZSzKzRWw5+1hKshvoYqFocyAFWys9oaOU8SB2+L1nBGqw2V+tt35v9P6VnZrR3u+1OAwq8fbh2846z4+kaEvEA8s1RgQZAPdqeJyiE/w4VZWKHi6mAduPmV5T0h7D46HeRwF/Y5KpO1LIWYnbeq8q6JJZC3OY+k1AVARjdb9LQ/rQDS46NWntOFtWYCgfHL9quc58ahDGCBAg/xD15RyLwWTAUfm5hAJDoXdnov9jg5aqW8WzLYdS17NTjku1WDQSeldcT5EQdZv3vFDyPv2/NUsyt4Kb4v4RCZ262oaLY5PPFdEhA+m+r1UlSk8GMpNpuM6QA6OCwHID3WII3UQ7n7vOvrTOtjDP15bg+qTkfsDDQ2NHMjBd6O3HpCWXeXXIGWJNDY6XUebSau9fQer4zfaG2Et7SKmtyxEFyiQsB1lS6Oe2TZlFZBUEbeo3SpzaI63fTEBMl75OPc3cpm8b8ZJYhA2GGCscqlieC3hDdhFh1b3ICoQlROSHJOD+49F0AU0oy/MqwVRFx+RsTylAc6f8luE15DruIUlZSay1OrS1CoXWddIa8xuO10TFzIE5TrPBWY413mlDizwQo4fsmTGQNKkDUXHwg/ks/bmUDPhvQQMAkKyrfnAzbaJrrWYgO1IgDYiFSiABynjVlh85LybUFvII+Dgy2xYAOroSzwcLc/ftMAn7EeAebFMt+46vXHeik+Tfb2VhvHQVl3JvlcdnERAuOmPTpbbtJ83ksup4HRblkNUbyvjhXDORxKMni+PiRaLXIr3Nu9Xc1QVRX4zBrtQ922rJszK8vjT6PkSQmJD0UDs6Maoqnb84GedG4yIvihXMAYKpLodP4/O8o8LG57IzQ/nJhVRt4Mjewt3MqZIQaFOf+F27eCTxd5Y8U7J6S68cGf+DkqJ5mWfhPcydHexZVxaHrzYW3TuPea1F/q2djOFfHL3VZb0S/ZffVnYtu8JB24NZuk2Nu7CkP/6QBSetudsGX6bCE+3HX4ogHYDdOggoZlAWpjb98CWM6rTZe74eSwvQUfxwA0taTNf2xISVAfa7eoyjJ3YpHp1nzmXaky7+8PlPTPIYOzIdQeg1V3jU77rzjT5jsRYBqljB9LI6dbvtnRCaSXFddWYjEJ/GE0hAU4P2y9ekpEVFdy0l/1BexCt1BSveXps26yyeSE0LiQVJF0smItK4WN2/FLJXNpsg9ew9suxc/ItKhA8K97m7KYSHNI2E49GbVO7E8IsePtztgQx+ESuwamhgWfM8ZsgF4AAlCOo3eVxcO8s/5ma5O9UKcQVSzDKvCvtz/jucuuXx7KEUsJO4LkyiSGamkfGC1i3ZjGvkCrbIfCyVrt7J5c1WZOFYT1jgmiRnP7k48BNHcTwiha7ClVjgmobZyG7ZJpZtknQrA3+RJsnbIhYhjDWVdvuonFr7+LlNmmqZG4yDFx6IPERdwhLu4TapYkwVdCptmpLSDkSeyuEihDnYTY10OQ+eFhvM8udfvUG1IPX8f5tXwkzl+Dk2ylXux7cHSWR5kXSc0ELHUjMWhIedRy8UCzatOaBF5Bx+12waVV402c0lpe5kFTAZ7QR/DwIxzuHDvBaD/4gysWR9KfCIQanwgOM1wX5b7YvBFnT9Nzm+wAB4Xgu0VbC4b5V1Dhx0M9JueN9DsQcSvQYZX3yNITVyJcfRickExcyuiQaF5bj1a5jVJoysMULB4NgchoODtdHmPdkgAungAxaRdPSoSycgUQYWzztJoYQ42rri8WBzHk978zl5SYnNiDDT/8nNcxE78aLClGkroI4ierHM9/xXV9czeNOoFlDlleZnljocW1a2a1a450famBry8yyIA9V90e/x5jSRpq1gH52SZKFGXZwYq+DK8MSDZqjt0gPygr+cFTXj+HfUVs1FYIfKT/V6MsG9SYV+uGN3V8WhiNyKAldu/c5OnIN4jX4/oRcWMfRKB4kjw5B6UORzxlqPszYJE9iQO+zl4ez+lSF6R4ZIgwp0fyQ0bGJ4dFwbywmZbfv1eKGFM5V9midkVL6KxcBhnUGSaE2hT38sOxR1n/h9OnydznESh4aeQRCX/LXbJ3DGt/Em59Z8WzunkQrX21lTGOJeN8TLz1HdW/T7OV6upijWxWK42iH2Z19feCsd43OrMk2QqDwQfvNutHZOZmkwXLUKHvAtrl8KhiF4XatNbO1b6919PaMPr+ulVr9xc2VKXDb2JJI90/GOi3BldjG4jMWWRMRNhwSY5s0J+piL7uwXlK5JqUhIeBwOSN5a24wPSkpJcdOfVpraM7jdFlosA2KiTYsu7TljEcRdVBYVeVBO/yj7m6NZgdyqeFSgizNrkbVnDOlfhAUYSZXmJd1jE5Zk9LTXkZBRpRxFW7bQSdW6KIuscvm90GWpKg5VF0vJ+FolWhZ++WVgFF478WRC8MELRg+dK0+lYd+qTQYAqvgUmfKrWlIN01dKvcMmQP9YgAH2O1TT5uknihHnNQzT8cO6lchgr1doZ6DmNUqtofLWRUKVH/KGwm0d+NVgeD7EW34Gqjt3J3W1zOJ94lImd4fcb8UfAdHivSnAbPZIBPCcVC5e1p0/eYTJW5iwY37gUuq+HWIE7/OQdrruakVNIwlIrWepO3CCFgnOKjsncRt7U+6g8E87m26gwikrfpl5B6ceZwsIiXAD5oXSpYyt7qyMa8j3490BWRtan3PaGfv7Bmv5xoAog0cxoQzv+UNCsVseM/E0MZUPJLMJ0Q1MMNPsoHCVRNKEhl/QBVuxLt3dTPrUfYihCy9wvjdjLLGzXMZxu/pnaouhazWNrmihNy62sp5E78+6Jpxj4Uyk2JijvbCislqu9elNCUq1cRK0H9I928NAreAs8qIzOds9fjHqwirbvwuAtGZ8cPPj/DwRACT8VSfnDGyTzKsOo5T5Pe50blOcTiyXpJZjuLo94mCBGoCe7ZAwC2cC+7cXO2yhVguD9K3tChNrtA0C1Eu4sKWIMwIp5V0fqTmvDYLeOgWTwRSSeYRVCwcVwKXLJtacpZzne4dDL++NxULCiRHN9f6iqZFBavUr65sBXL6sRm11BWcinLu2pyIogUzjGd1mHf8xWXy9dbO03He+iA251zy7Z1tG7fs4e2W3evZE5VkEOM7nbjaPYsCIS6kxDhyowGvsh8hxP9C75wHttiO5dbE8IN8P4aKhh2eZ2ItNzzfX2865n6pLme6ZdXTy0LFEAmiAM5zY69yegoRBbkOAq+XA3KexDCmpqpceLbKDEv57G7iZhm5PURDPYOWbWX9tC3LZr1CExDcPC4M0HThsd5YfgjfeCO4aaJA85M8ySNR+DdTtnQDfN4+geHz6IHn7DgIWwot4OAU+ljbEn+TJe1UlUsvuBhnlqZaKZtV6/mx4zXv5owvbwPdVYuBU5LKGdBTgOMjYJZgV9nAAOusX931+qUlcY1zjFfQdEkBgVRWU5UjzNK+Qj/Hl9AFSAWOBAIhFTqSpikypBjpfllEZk4JufMzLvWAIHilVfMsM0WZWD++yqRg5M68Q5zlBeGIyXTYt9jIeIXJ6LV1g8urT/gxv+Gg/akTljcm+yQljTr9xabz6ZP3eCv6EjAaVQSGI0smV8bylal1RsQALZy/esfTnMCUDmpm5upJ18YqDppmmG5YG9qt4XAls3bnM8XXn7zi2bNruZ3E4ivwh7LSqLISy+Nc/ZJArhKP7uC9XbESlxgT/FLJO0rQL8mwU5NP4Xm6yszqpD+YqwV5vQ7Sun4Ka2X4bLLUM0GGh4C8XBUi0Hz05656W/XWB/7xcpuhJj6kYSTA32s1p+BFHbSqZeJUwIyIU+RggKoR9Jbe4460PFvg38S7Op5/0N5GGuOlJeYyuAUOvAod9OITF7bMeMf0+PdFQIPjP345/2sx3j/y01cLVAXaS9u77jGd6rScs1dr6X6C/FGlfqtH/M7WC02QPKcDMd+f8MzLgpyqZRuce7mLi089UA5Z0lYVwYhqqqjiMCWLWOH0ppgLvaF7SDtEIJPGECllidT8UuXRxisze7h+ZXqYsC5JKjIN7T5pZDhJoS7dp4W4jbDoutKUB2ETvgBRz8drUBiziTUUdI0qmnalOZKaXFq8sFdlnaPX3csaxrVhYmqHdKXZpK4ztg91tMgCd+mY946eRf40SNtTbRmVJbJlSb/a2dG5e/EaYg0U6grGone+9MLtttXr38QwZ+pZuxYDmhZT3C1HfsmbuifnJya/fO6SAca7qp2dZO//n865snBWCQJUO0hyZE7zQ3fgFoV8zq+D5La/vf5CCUr+916L1vxpHoi6F30X2pJpqnwwWHKUeS3Uljkfa9wYzIXnuXtJxrnNsVtsdapPdHA0qn+RH+3I1cK40f0Kezn/jHOhl8//RiydyCKAZrC/QMsD3X6FgkFUhhSnkJFTDLw2trzjxOGDS1nUbZ4eysEmgWFWhod97e35bsdbE6M9Bm53XL9Cy870H8FEu/XWqcba6OYm+fAzOMTxoOfV3AsIBqbr6DLHb7GlrikFAnEJzvNMIQdvlQU0rSTylpoUqx6NKXFmLn1QPg4BGihC94Yw/OHdg1vEud6mlV4ihmYK/YVRSxgNUazNr3VMudLDb4yP0dAaa1HdmunuubDld/Sx4NiFuXpNWvSBoMmmGYiouN9e8t/wEuqHPX1ufGBizvm1FWbM5RlQZsQaBdI38RBs87y+U6cF3rDNYA3vI0FU7kdu6YYtj/f4MYsvI15UYNOrrJCBWFxNcfYHyg/l04yzlWodAs5X4toyhC21ZhzgU24IJwPf52U9GqU+lEe//bZmZRUty7KRsYDMq6p7IO1hMxWlZ0yuyDl5M5z59Bkn+0mcOGZ52tmN4lJ2JfSFPPsqHDlBo+NuD3bt85oepPTrdcvsfiSVK4mvBEmrwwgpeX5SoQfWj818aRNQB2OCLCmNkeoekNpHCvi5mb5QRpOPJbJT1i1tyV922rriC6n59FIn4KcVxVq9195o8k5cXkEvR/L61vr+S3scr/c9YTuZcXeyaYrftQfWZxv5uOvtPpnBSddEdcaHDrRsnRi07rZmdFk6mrxCEiGbqirCHmbFFqK1hXQd9KD11XYn/kBONK7nTG8d2w+5VsjRhsxsU6MuF9ZD1imkIp3ncs2zTPmVPB/ScMbQZHTZ+0ldUhKI68FhnfkvRbNUqUwxU66BdfIceBDGUJZNxdTfbb67iZ62MDLls5QRvEnSV4G6zJcXC0Xx5W3CLcc+s+M499joI89h3wVeZJ8ePYM0h5M72XAJawpXdojLScZsGTCMbZAbN8/gNHPxsp79SWbFiTE1e5JSuz6WP+3hc2mWfiUhgQfKCn6ybfZPqudOBzwmIK8Xdh5EuXACpEuEw5z6mawwYrJ3dlk3c8PdYxONY+2rTd90w+j77k2owh2l86PQ44oX/NXP1IOz80/XlbPtK5Z1Qq1Sjq5H4zbVJRW2yG8X9zmXZCW04uHZc4uGUROOi/Frzy+qJZ3L8GmFqUYhUrbpAvaJ2wOGVgf3j172eNwowvq3l7R7O+JO1ZsVevo42VLmy4dxDd+rR5vV1/EbrxfkKOC58m2PG0qpvbUrKt0rKfwrm1sYgcwCJ6XEZuM8lxQIpAHkW+Qp9h5uWgkbOjy4btCWPiNDwIUetTFZQIQeIDyGyMkXTgtr279HL2OCpomdc+h7GHoZ0jUhNwz2fntJYuJyos7tzPgPkzZo13AjlnOK1s8qiIgyUWSnrE3YJY/D+4/6uNsy5DFFC+LUMl/WlTzcytJ1Q3JEWla7rTpLV/A8GQY8nU6BHlXKw4DCEZmwu6c4D75anU4rJn/pgV/tsgyFCz9f2VjxjIUBakSLy3DCeqnOMX+Io5M27uYYoqVeb9kZ7bA89grKQtG81BVROL8XCLKetOpjbjqVgVmvybc7wI3kp2xskFJxTkdsh3QRuiXwmzOuADDMwFjWB/Cu463ZurMIf1G7XVRMQOgGkEKUsbylDg/CKgMxvTCYd0o5cxJpBMpNpnJKlkfTaSqWuGWeTiuczLUeIHTAxSKx1VQxGjpugJwhKiVpH9Kd7FZROUUdjvO4fkhEcuOHVaxwEcPFp6muXPEXDgfmjuT/jHbaOi8zc+uHOn+3vrX+oCn+AXZTZZ2WqjmkF4uK/AYHfNQZ7fj1z1GbLuuvvxaoP/967c2hSwdLWytabelIzCFi8R2MvQzXNRE3NrNfBtiLiTz6nnbNIjq5eF90mjd53iH9+YM188BWGkc1u55PNF1pg3+hbftLentahWZ/h/a/FiZ5XJTxzvmrsNtNf81hXGr4yks6UvPrnpBAfKHQjVcxRjdtYByuGeM0Y/wbKFF3Zwngrzcd0EDR4bwGZEcauJTWu8BhohihAT5KPCPWVs/rv82/xp8N1E/1/4CRNrY7LHa7N3mgGj2Gz4nWDq2Wl9je8rcfzJv8StwrrHT5HyBB/QPLUTHNdLrC3RpbUyQyyiZv9dfMb7d8eVHcocRvTtSCcPisrxGyT69edmLOtTtt4fVXkDtb2W9UkqUz9SnOafI67nF0CO0kEQd1EmpMUFpUN4dcv50Aka3VLlA2zwhWbEJINaZUY6a3Jep1J57vqWQmiCgW6dFiW9DDXz+KWrfVQSfl5iWuVGBqsryjLrkxU2n36pfWWKeWVNsbMCIHu4ZqIuVKYmx/D9FEmDMNvbDdY2hHtuXVD8OuCdN1g3QZSrMjJ5T3KXatKHNYiDGGIZZDIOP1BfuZequ6xJCPVhg0impA4JJKTKwEZ+Aer54fjejUmhLiaO50d/zMmHge/DqcVk+CWS/0I31Tq2pleLdv7Osk7k5efSCD3HAS8GIUaycXnmEufR8cnSwkjqYOzpA5RgbgN4vdPF5bJ4oYVElaHpTh4ZauNiBZ+jh80IXDVT3zE54fnEfV+/SjXz6WVrPSTIYM0gJrn+GBBpNGddmaWEHN2WTM3AcaJByxpr2kMe+FjuhmwOMv6EukmhhOkyNcCqH9+9WhPXb9f2b+p//Ba9/0/yumSbYT2mP3UuHk5WRz2a2Y8tisx3qwlss0B4kXusXDTZ8qVwgxaEviDV1RhKF0LuFf9TQGqBT3/HdfcTrdeWzA2LW4qpDIVEQmjTmi6hK5O+oppSvOjERpfg4GIbZBuAF/TeTE9Ylw81yJvnfizB5/6DaVnMG8auKD6xM8n5BobmfvV5I0OD6Y9YfB4Ejg9P7D2Wy4NeNfeOhukr0ekQOGJm1Ho9dDK433hq2WqMYVQ2nuRTsmk/YhkT+sUs6XenOwf3/LUqzT5p51mj5nUW/7X4JWNbJPjAat12smjmHbjNIhB0WRblp0RW8lObx4UtdOuV8riRE1Suqly6daX/pHO0w2rrkXCPEvg1rWrkAidiGgF1yQDPaz+a2ZzqIaq90znrzMJmLNVTL/oyHuMpdJZhR+el0tfkmgczHDCpAR5G++lSIK4mBxCMI78bHZSBf8G1LweNAyIMMzOpEznlAWI2edcRmMn0b3ZMdI9/RY84DybnaQxxQC4/8q6fOuTbSqkFXz/4dhAL8N1iFiPHurJurt/Mwol1JDt4A1LHbyCvEn5XF7SvIkmbCPBLcUX8ChwbN0sfjNV8z94K31/QF+3h40X08SWFYwGwcQYiWPZZ4+MCkKOP2vQUkjzapoIl6S/BOTAYth29xgvZpsNBv73+bSRnSutvTrxbPa/trvNHyCdaC927LcdzYFWnBfDll3kXc1XARLpVygi2noZQDmdhlP8TJGsk2tdH3IsiVoo+oylz9faSPutB6pKxiHxDAzRyU961nAtPuN4WU/qH+rMpW1QPD7LH2RIkpkkd0xPwtrn+2iU9RrjpxZ2QutS0JBTsQuN79F/49IpXLZ5TjSA2Dz2htpUb0xq/0LcTUQ6pzmJh3oznWzVUteOQwmZP8+MyKSgmgc+42r0uqp3R1BszXElQcOakvGiLvPQct8UQ7aoUZCkAwxFPkC1JtWZhEoqwBENzAHghrrT8OE3qYhy22CWJgJ8ki+zCFswqpZebpo1GoLh/ZAI5EbNxYEudViTnd51J3tThiul5rvWTai7Z0F14L/A+TPn8hThoOQKOiSLsIT7+OIO3co4IGGoIvQ5i1pb+0x5Bt2t7fdwI7ZM8DW2o4VsXu60b6qO/0BtAMuQlxnDZPvZ0h80gKZZkQj/7M9cgHRjbGFgYBRSy9bJu0fBVxMO34zZ2LC8lJxCOAkZmRhlso0YFe4nGMYHrMTlkHx5WXxENdpWRkcT8AbdEZEsA3CIjrTZHlwDLqwFFKA8KTiYAo1e11jPqSC1mj0k5LhmlooGYrJKqccaG8f5AyGfy9HyumJjkaS+MZ8EjIqelCPEOBeuI/r+nata02X5eQQJXY+hZliMXGYO3iEVXwEfLTBZX83FKYTmxYba7SY6Bzi1t89SWjKg++qweYhCGbI9W6hKcEp4K/NKe3p7fLBqdzm9N7T6SsrGt/CjZ10yVv5j/6LlPbJ5PYbDw0LVwavBNEB6bNeTh6zWfRw8ipeOEva+VB87LzIsnSKp8AfUfxtPV2dB5hDVoNk/hAjVYwItIDmr7LygTYI8pXyMKMWVk5jZYmzpUoqnTuBD2im7Hztwu2c7cLsXOwaCbPn5zPUQSidmh+4R3hASMI7+d4m6qmrTPUZ/N9W7/GpL+lvI9rSdu1dJJeLvAtoKJDlCkHdNbVa/R154tOnE8hMEGux7VuKV/HpQ75RINCg999o75QjoNBggb4li9q4EhvW/DjV8cN7wkpLbxzZGjCK79GlWlNYU8hNAbvx3f0pwAcSa/tEbqK+8KaGVcpdPQ+XulEDj3XT3WPBkuO7f66I24AlPCQ8f753obt3/iRP3TPd90BPQnjRoBccLB8VveiZJsgvEDQP4uW82bQ7N62F+R6pdj5LLzgCjqiBS8G3YmfBYqemuAbRCV/OCeGYod+Nb4J4y0MUK4o1+ayV1bcbPKdOMtWx0SptWWW9SPCbdUt8JVho2BDyxXXwujvYT9W1wqOjcODWjqBLssD3mMwEszhBU5NAaZYwYecWxDU1xwkSzM5mHLdZEMdGI6riIkxDTUtLTUK54Xu5EXXQ0tJQkwju3nAuAKWXIvaahpsCHATTlq5pYECiTgDqJLgbi/SFBAwh8JMvhZJTIBkgbyKF5Aa5gCO25Q2baRv5QwVtREyfAi7xg4ldmaCdSp6e5VASA+lq/1bINZ+CnJ3mUdtB5kZifsWmvrraYddODXIaMVJhdLHPmFoKRcao8qlimtdQYLQNpRbK+pUoE8PrgGvnLzQrGGoWp3pLYyJDevYG+y/VOSm+j6e1bWkv/idm8ZOgHL6QLxFXrLGLucUPwSksg81kZeFRcArUkWsU/9oeDBMzKlTXeazKKJP1W7B3rH/ydMuyJWhR9v6BTMlaaaW0qslB/xL4HfwBNOJjEo1/2ddK5Lh2cw47PLyz0Ytsg/AIHX8jL8cZK3FqXZBHPAj6qEcYmjDZ68RfTbnCjw1xm+7y7Jp2S5L2Jcq+6teXCoIyb+st/zS/zluBC8FDEJIYxghkROR7JgfDoY5u0Gbu1b0k7im4+2xgorDQM0LX6Yx2al+7mPCuT4fpQRM2rKws4CI9JgaJw9gerGPplKjHJ4YIpUJMD2YttbTIfyWXVWvGF69tr9K9W195jqWCpTtrSaw7m1T8CJ6qKplTjPNWvPlrk0vfO0IpWCS77mXQwaSGmBNu6mffsiPWcEiGzrOuwt4QKqsISYcxDQpVtzkIAR6zngQIhizlYhhJic9kRGdA/zJKoOx8O0aWCZECXEAZklYVC+KgqXLqyUSQBMdXbB+Njz0dCQjGbvDtgJg70FX4In0jgcomd4BCbSPUvJiObAE7xGsYUIipztVSRSRvbnkCbTIFA2Iez74J/JqB1uGqaqEUYxZRYzCtb1Ckn8qm7oLN/J3y+Qvno5eizyx0mne9iSfehPSWYd0nAo/SFVRaRWVIwBgIlsmCwZg0ZO+gY4tj3irp6uqhoeOBQAkCV1VVq1lzzAW1tTQ6B5mf170IOjq8b46bnmjh5iT+BwL89w7GJICniviefOuSXMtNdXVVzH+Y88H4P/f8BnSYGInuz4NbY24Fw5OfqUxrszpxN8saAaDuKbV3/oYYAgKHRxjUJm/z+lvglUqXxMtpbUFJ8f39Bc6icr+Z80EnY2MbqRq7qZnoz2nJ3UdKGSzupnsXVlzABWOBrPQGA66zAFIJaVyXjEZux/TN4PcgEJfXHNtd7RBTMRXyeaTvGy7Lipmg4KGCMncEb26/+GQ4su2tBhfvsQJXPlqKRABaxZcvZ+c2l51FQkgygqDefs5uohiHF/mO0QQUf0MuXdZj/tu18YwIWRtbDwrR1HO2xpsJ4mmCXXFbZNhwTPuFy6qkYxGOI4ZECUxYBZ1eyUTGXEz+3WBCIwqG0QaGaPh9CVOqzab3AmpNQ6c8Wd2ATsqGNM7UMhM4wLQF4jsHtOks9JkCM0hGi3OWQPhS6ffdvxO97189yaYkJy10r0/e8E+EJ03rJIHZa51+B2l8t97OlisW47hobHIcUlZFW4G7ybh3nfOcl1i9B2ERSjdC4Sy4LjtCSS43GoMnmmuMNxxNkhXtL1gXZ8Qm0HoMvV5u+T1+yC9m6WJIAxsF3kkxnx2J+mKZbGHOkDLE9R+cqzThHpsO1T6pm+WqfZLVMNzDLiRsX3McHxz3hZ/JEWy7uzMmPdwGUwUt0T7clA3+80+J5Ufz6ut5cr7iGKDgfAjRvFj+MQVfngEzh4KPOpIVByJNw0zLyk1DuZFDBgUnNFBtKCJjUnm5CUAphxUcYdqxODw5vAOyE/iWxKUnFUXhwqIxewJE6mBPC1az3HtBtmHSUi8CPVCX0u775Mk/iHj8hBqWWNRkzyeezbLLOgsS4ixrJIjhV95zCE4mdVHQAGZAtrDYWFDohdh0+UoJgpAsapOXoNAYg2+KhvMLoGgAUDALkiQ48my03MgoOmZiwhEPIj9rjK9mWOWp8RjFoEkgBVAE8EmNMulVxIyfUlKUYrHy1LPY1SiWaD7tS++gTE1QtwkJx8V8EmjO1cFnziB0iLVq6eCwQ5V0hxXCHR1wAVwItRCGuqYjPPQ2izYIoZvIJwPw68gTejeByZ8h/Nw46O14yyeEZwx8jIXyC6EYSJGEWCgOyiuEFFCMuOMg4DwvllDIvpd54C8xMcVgrAj30rf6R53EkMm8MxUhVnHY8xPICeqMZtzyEpNzeX8ANaCrr3jsBhX1dADTRJs5Cnsb4OFSiID1b6NpR4gyKO8RfnYA4SGccTIyfnfpafQBUnYrlUglOQCDA2djOEKlaGZPrskqU5siJLKqxjq2zsDvjhjmKoQIMRKpQCxBiBFCbxgyzYXFCES5bgkIYIaDBfD1JRHnJ0oB0osmMoBGvryZZl0hEMD7znyFYXAKIoJ1pdDhlhbUAoBNAdS9+qeBar4E1MDsMahKeADw3lpYG+xzv4A0keV4M2sdTuhaG3CLMe1Nv6XFO93xVuyAPOTU8n+U4kHmDI3a3MCFKON30SU7oqkfR8T6DVKBsgMONUVy15gX7IgB18rn42gmJPrszac2vJtk93JAHE8JOI8eaIEfzr5olfNMaHGLpq5AIgFXIIkYukKLCn5vgFiC96IpaVeoAnCFopy/ApRU4H7oxr+j7FNvfZWC+wgh+E/nSK4Of9xZQeGGiWmoaCRNrG9+oDnEK+Hg7NJoEmXEb6UfEeyLCvUUbqBtWxNGiuRSQp2FQd6hAZpjPBY212v5CtUtg2rgDafvJ7b2ye6OX2xty2zzKbjUlivp8u06AVzAhNa/AZzxd8M8a6hB68OEHX3W3EWkUE6IiVIENZbS4kQhJhrVIpLQCmwn7tCHq9Gh/8sJDa9ujkQr0K9vqjXIH6cy8m0irdPSoqw3zhTGR9HbgxvTNRl/fn6GdwFeTe+VibOWP3UqcsWkfYxJPb2qmPh0g2dKGlC60qfns/5q6AOKbn6afruhYeHWu2LnTM+Q6GYxPjOJYpwcN3s1OdaWd677FlPAGhr6K/6vWI0s5bnI4UVLLsXe6xSLG1sbMPqdcxtmPBO4jEjCzFmkdI4+YOxjkpk9DBIZfXXhkSK5BwAMkHtuvol9xTAc6do0f04NMSAo0mO0tM1RBhDxphZaBp14s+bS3zd7r8kaitbeunardyxW+75wtPfvS1uLtLFj67O4dmtbUYMMOPcVxllC6Do0ZIkXY/E1jhJPriPHU9CL7h6Kr6w+JpNtwm2SCQR4tuiSmp8raN7kIm3EN3azcWxZ9MnLPPqe/dn6vSR8EKgj43IOLmkKgG6tq4rTjdQE4glV65cso4KFZEAWGA89mKTiKHETAimB2wwZK8l3O6DBqNdEsfMDXMHS2ygTY+Qt5G0Ti9sR3BQktIqJucNqNUO5vrWK1bpOW0mdpuc3ljZWq6E1iX5d2Gs4iKrbhvPtYr/mX378emdrLv0hpG6s0paqoVPUynXaVgTwHLDnRj/aJ7gxYKBwWtxofswxvdQMUsp7o7iCAplRkPEWQMFpGcmMg7bopWbUm4gzk83gkKgJUz89DDLC1hjpGS0es6FcgItwSO8LOQO2YN3WDLivxa6Ezsz29GOIjx8RxwDJvY2YCEfq6QUj4s8d2/8yPGp/IKNh8IAc7qH2R0Q7/LniHELJCo7U62ops7ZQEz7aGUTBHXAaGrD7gLdQWw+cW54ER7JYQafSD7yMiD4QSNcOldxVxtgWETU0ntFaZmOZx7lubxwNr4EzJDqjxxzHPJviT0t7Vnq+XWbktXlwKRAGru5ZFfZ/g7Hnyp4l82Dk961bz5xxXfj7tlC5XASd43nzgoLoTnTnxzogBv5nxBNi0fxEuB7BwrpOJH8In48P5x/uxHRi+SfxAdhgg0tb763Gvtjc1zC3rg29Cvdk5/eeN+trC2VQeiIkA7KU9BC3LT0FYqUnAtH1FxEVUMqiWgVUbUrJS8RFnPXrP4M4hTgzX8fp8FnIRzJRPeEdDZ2NWKt2t+OIT/8hf+O0T5+PIyFlSfqPO07hkzVkPoXn+oxmBkSw0CCySBNNTXnN1RoUUkgNzpGeq+Kn3scOjKr+fkoIvyMGuT1sEduZzWfXRsa3Hc+QqOn5S92dPJ+ILWDXqpXtPvVZPsOQOj6yk0wjixneeXJRDRkcEWE5QeRFU1FVpmcZ4jNIszOAByRoUDEJ7n1vaER0u2XIaDRpt8/uCPzoUr5OVLIj1Tn54AcSeuiJPnwgLfLUj5+nW4kYucC3ODEAsb64UAKL4cWFcJub21oPT2GAO50SslFcPNnditTgscuRowZpla3UxnxJKPX0cN05aqWexcaqXAAV8MphzHEcck5MPbnXrKfo/AxeiNmb9r2lR80hyT7H+Md8yDm+9Lf72JuEt7lPz0/l93RfoyC74Z5KeIX4CjgXpPx+Q17lSun+rJz/sovxHeFHhzLOCR4M399LC/aodEFMkq5YLvttfSgEarvtkC01q9CF7lEV3IwpInVoSnKOwDOlRIwHviMd2Gdn+Bc7bN3qL2X/pfDeo3BrkNsyYebi3mGj4V51IeTRBALRrUNH6SC3MLdEbZfhAeVpW1VQKCiJMwpgB5TGhQIVpG2F8jzssoHr4bCa8vwj+HklBUGJpzLKpPwUfSo1XvsXSIheLst1UNc65D55pkLoCtvYLRiG/ExPAkuqmutynd+/oJJDWKM+TaqmXCzjNsX8qr7758WOyJOu6y6TEPNqKnwaUuItUT4sYNUguGR7xXbgb77nIS39L5Mq/ihaZGR4AvXF9wd5pt+niVqNm5TRsoIjuvHWpU3j9D+m1GT+vWXmpCdvY+ht9EabDXZ7Wt/WSwTml5OQ1WZ3ydJL23Y773H8RFm8lCsFppZ7CDtvg3QUQz5xLSQrM9U0hSsXPzHcONDAFIdzq2JC8SXo7OJtKqOccolVQNxOO7OdlFCLhsC2VkurQWXgiEUdWg9VCKj1UMM4YJ2FkqpqkuAkKFU4mX1VtYmQJN3MPe9bdSmi9mJ4jfLA80MDgEhc9e8PCxKl3x7JSOEaP+VUKsiTFnEDQHwCJKH7tyddvWZYpGZvi8BkJnknN3rQ+09AzmjsEAZfMXBChNbcxpK2hLguS+K7a4nDMpUESkgAEqa0I+3Eb6i1aNQf7woTpLiZwMl6wyirrQFTYLHrJgRwlKLnU+l5qPwU46XBtDBhGr0BKjSv0a+NIA0gjR7mGKhvLq0h0UgbSFRDqrvOacCjTxixkVwE3BDe32gXTLt6P+uDvFWUpQbTq7sYEQPQ80r6euKKI02jAZsoU+CSkyWmhlSDMeWi2khtaO6CIgQcmFZyNXpdJ0vH0LFYWC0yFwlDy9BeOLi4LGiKFfNosSwWKh6Jze3FMXDecsj6Zdgh7fjIkVHiOHayEjuM+4Ebo5/U/tAoZgFumB6ysZNZ2j6+q8BN4Mq3H6CSSTZQiAPiz1BNTOgkGoea/EEI/iDxiBM0i/wBelq5IU3MpFcLqIKcROgh+kn62Net+4KTCOlu7+OjiKGJq6lIaiw2VnmtXS3FHhYSx/0VrMJc4MbxY4g5oQFLsMCto4J/HH7PNWAa9Jcv1qoawwFsEzSMcx1wm1WyQBX9OK0aXKYWQKw2PoDjjtFbaZfohRD3LvA7jMGN4eKwVcJi43BjYB/jKfgEPYU+OX16+omWb+A87mywqtDAadypDlEUTaD5F2oL9QtocWr50gKcAk6bv64GkN9v4SW7n90kXAhQiCojNDYclJkBQkihSfsPokZ6DDndIyN7CZAV5BQsSfaMroupAY+atSM9BHzPiMD1gI1YE2xhHwJUKii4aoCrfwUk9FSs65yjEblXBEmQKqM2QrBKFQImkmRdkKTwhB7+QQJ+UEkDBesWrQNi6NizawGNzwK6gBvwYO5ljyiEMeZYHwU3iS/UK8SN45U6fXXiE/pyjN04gRNv+aOIbsQ4VAVuXPdW8zdhi96WQ9/cdSdZY3h3/BjrWi84EQilky3VXHxJKXRPAuy4GSSLhQw8AwRdsrX+KNp2gI7PeZUj7jCMDWkK5R7xfNmsL2fmKhkrqNp1Rt4hmrTSWmwaMz8RfkRCVSGbQ8gBGEr8s1IfvKPKfLUNodLX8c8bHJ83+o+0D0AXqJdsTVNnK0kiIOjNkVkk0u1J4VLzJJpJKBW9ir6KyF6MErtZibHE1MnYCXhLahzC6iAA1Ysnh+kI4MSHp97mcRHwbLBGN84Y1xEiQ/BTTLHOzgHW54ZbVqOdzHaw0EgEiNoVgPJ3mvirloli7/Wxa86dVewC7a9jKUbe0ezsQZ+MICQSIwRP/ljxFFT8F7xFsYpQFzLAdMqi+69xYG3Ozy8Ub5MkNspi7qcqAdSaltEuqYlu6smBIRjN4vXnss3PBusAIX8tzA3iwndSg19IajLanRqc1me6JDZKxNvqbJ+szo5mX2BPPuWdI+auetqYHogEQhQP+nfCRyv++y2HyDVmaJh6JT//Cj1pgFCnWBViboK5QhWvwNGVfNyVpotULywS+CnmeE/71jIzuLmu24xitMPQSVz/SbNyaVL4IW9N6RanK1oxOj9hNZobnSduvCo8pNGOeCdFlMnGBP24k2BYG7PNKNc1w3Qts2+Ge+0xwXkfgUI8Q7qdZ7kCj8ly4i/c3BgljFAIzsPER4e4Un2jk+JmvEMpIWbGeov0AKoZd1JsvLhDtmy+4QSHMuAF3RQJKciRIQLJx7t0w/ci7/UkNnXlfGnjhx7IkLCjxOf7hlJvHxJhaARJiRfB2R6ePoWnkWugzMGBXE/qeoP8mlPzmY2MzZAhcX2Jz+v1mRHeFMLgIb+Gtwcuu//Zh9g4E9O42Eccm/hlOFYvyXgM+zCYQU7P2rVtVoWbHw+pMno4g3funHu0pdAK/KKVkB/Mtkp47UKzVTqt4DL5qE1K9k5LKfHbcStDREMJp2HCjeW0o0cIR4RZXnDRxs4yqBTqXAsvwjllrW93HnoGbUBYWrciwLZrL94SUqjNBj04KmavU8O5JWBVYZUKsQiRUQ2CIWnpYkAmB1gI1oDFwdB20HkIIe47sRjRH7ToA67zl/BT+DETN349z41kSHLh1fPdTIIIk6wmQhDkJxbXc6N8+YZm0b7UevFMgsZwU2sRanrV7XOhPIxI5+MZLR2V+EmWGN9KU6wP2HnLoF1h3AcGbX8/VzCZ7188F3w5SBcu3H3xgv/yxYM15+i39pwHb+lRo6Mv55zwkp53YFOEdzV7HNs+maTmGclC20RyjdFFq/L1nsLq7GTMAIoXrZrXK8I486q0DeKwieBQiDaOeM+EipG21LMPeXDYL4f7MeyBk8w6YScLkJcwmEsh/UgrivIYrIwfGxgZD2kKITknr48gV8cqrPVDfncaDuCMlrJsKAk0p9FC+6ZOYu2DvAhiAdOCbjmATCgMCtVkxQMFKM8CXEbDnYNAvGNZ3kHdRSU6IIQ71qvvtw7bWNoh9P/K0rRBOM1zd1hksL6Hfsvir7MeZ9r2uM9SZ+3+5+zpWfBLq0WFBMfEeAKFTsjlTP9gkJMtjTmXUIo+RXtNxETLnSK+PoXZR3nyVGuPGEFZfe60jjiAfn6V148euPL8ODkLNRjpGVK8CHiL6kWd5NbUWs5Wl0TjREQwLNXfKLaW0SsUHopfxTcNxm/JMosvUXx20CulEL0F6ZbGuO1rIQ4qf26duCoyKRWzlRTn3u95tDNsr8+idsc1jrFGdfQ9qDfczFbifzKjE7wSfYn+VfjfTFtjsecxsHvAKEsTvOp+9jRObVKlIoLo2GATmfFv3EX/QJwlyCy/uYDnOmNL8RnIWWtTvl6CAosdqsvFdIN69uFOOe4e27jmjqMvjllrcB8n7j/EZi6VsrrMCyyv4JDi9c2eNjU+nomBK2KxM/WeyWfynhvUOq+fwcauCARCOerPfVv/Pt/DP1Cx/bo82TBka0tjcdjpwb/f35pe37ZOkdBQmic7FvJgr2AxJzhqUQdALJEHBaFQnpCLUZfPE+RyQ0wJo4TCHIsWaBgpEJkS5u5VcFtPDO27qRdc4E4JM0WMLP2XwopMIFC+YcdDZCGo2rG9GoYq4d7tcBUia9sTIF4uyYJfuEwOdepLyr++rba7h/s/0WiltDAxoXtdZ4DgCz1BkffLr93Updo93yp7GYfg8+sdreWP52n5Zr88K68zPEPAoEXECfSzVa151byW1oy+23MO65s7v+jvvxHjGnnSt4RjZhEcuvq6/HNwtqEdvuHLMdQ1dJZ/jDyMX9VGLyxRmxaxZdSBHecvbRTPu3Sbh4Hpbaqf9g+ceu3/rzeJFuy4uu/jRQM/H0cbs/2mmEjTkE6EMGpbWBoYBfTtQbsexZgkL7m8XYy8HW+Td1NsysvPe8tzy7ZpGW2QbFQPgfHC2Zefl98Mb0hgIapJeL3a/t2BtAg6+qmhsPng1N+yrhfXA35dXxHCuX9gbbqfvaA5Q3v4zxef+trfPlyRyhCk7pz+Ahsbop5e1yFTBd+qyCYRRUNXv1gqK49ch4QxD5O28rjb7iAYd7ZxeVvvMCjTQ4f+fPFZcfPOw+WpDGZRxYMjjHHof6/rVOnJrxZnuQGZxVzMm5eDop5yhE0Hp+/2TJlz/Zsnyp7RnITM3Fqv/S6dvLvVSbjxIRjAZsrKQGMmsD6VcHjiLsntQpYS8iZ3YRlrjhflFM+ZFOwtIpWKnq4VUbfY6lW5PNTzNO71EpG8SMEuTjGV+kuxKhH1nZUgGurVU42fKBP4DWBbt4Fnn1u2HTnPrhytMJ+ftW7beYP9Aj/SshX897x1686bRFouwOVUd3NpZVhAU9OI552v5sSSILcw2rLVLo7R80RqNfCUF3pRW2i+On9qpTM3Zth6eDh2n/U+SEdrpXs1TY2luqWddwIAK1teVQfWyMgGBectgZWxlhBpj96su2jePK97LQ+HpuvBUBep3gWC4B0W8zORMZ++caXuAbMAOLuL0rj1mnrgfX0mWGNoJMGRMDTxkjlPuB7oJBJ7R14fTsCYUElg/jQ7YaFvKuWQd4/LyjeuIuzF0v57jfiHasrVp0b7OB6gfNNBjqbpf3I9xTJnk6XWzjETdt5uKR7OmRcphtEbzXi9vptNDYpW2NzPs/I9Y5N+gK+NJ1LYFCJYLOzaZS/U2ntHeCUBTQSGEAkqIVa4MtOqy00kaC4SIkKGIMnDStXu5+/cRdot2QptgXb741LXrs7xA/y1Qae2OpG47PbbCm+B9/i57PEHXvArbYA4QEumkwhk2oxW1J38ba2S0SL71pMs0s7QeAQS3R4HroICcZ8Pc8eqypz+/hUDq4D/ee0BMA70ISdulpfTg8lXKEHUDKo0Gxxlw5uqKBjmDS9aNGxabTI29IkcxJVBn+bGTKpNx0p7ZkiyuqEQIoESiaAuzJv9tTyc9pvVcxyl3NT9CXVV0/Ux07GdO9vbeTzqkoYVzQsq0UBhXofuRP/JC+c3kYHnedidIqN4UKSz7q1STpTJQoBL/qmaUlAG8hwu+ampLgWnqhsRshbIsd5dV2XgZ1ClWyIGJGsObcafwR+BDMRL+mpwHswn41GUzTVlKDXbyF21Sew0s9rDhTZRnB0hVIValm2UbfSPm5nBwShUcIhK7ogHCXY9NSJCObs6o0SGR8ugU9UuBbNHCzOxDJROB2q3b0kd2YgJTg4Xtp/H0TbaNurHNdWEZmfGTNjpenpE5CZyZ0GAzAkq2ZuRkGPBR/2O4slNVDzu5FvmJ2TvVcuyP1A8lYkcziRflL4sPRdQksD6g2X9PgTdhv7De+WmcmKgM9cFyu94hgnWqjWG4SZSChPcwBMIzaLq3l6z1eaKVQpd8KBg04PUw4LOmxUcdj44/HL1nEp0SjTjBz1A/dtXDhrJjHpXtpuvMlesDli5smith+3t/ESzhGQCvtxFvXNnYlXu2DEInuRPDBkZDU1weqb9zg52XxVbBhrnGgVZQDHFxTGQ52RJ9l6zBy/NCtQl2JmXVmcgMbMwDKjt6xzg9bKmbCjtxC+BxF2Sx/Bg5PFgaqYHs6lDOGy9TyjeYr1ZDETaQ9tbhgu2E3pHIA7RBzFIvQd6R/SmUdtRU8i8r/fqj3Cp8u3yKZQh4Z2ehGBoN21oxLDvTSklGMrv6+GH4kssVFICKSyNAocxUHhOTjhktLdM4yYpgLpbyHmhPulekKKkRPDPIXk0kYBVtmzhQdKkJCn4EgCSk4DU2S36xno8Pn15bTo8kuviuPJ87wkVQriTeBbbQx3EbhTEkU9S4hQKmQbCRGWUIYpMtDE70FnCTq4QuG3BVf0z29Iyn/GAUXD65hx5jAet+AeMQplRp6zv2X9aWwvsw5HCZq3VYTdPrEUD+4hbBviH2T0ih7naMm4MdVcAXxQXz4dcaEHuMGAirAxQCFQUDoGGsVb6i41hEURzgWQyZ5pzy3oJxCst5cJyOYakVWVKuJL1Lc6AqlRCQJDvyYSZemgYjcDkEh6wJPhsHjFnzYVD5DlNRZ1QjA3i+POIh96kD6pwXJWbnGYWIqkUzjELQ8VqYfXYeTVzjskqg0yFvqC+0sp5BW14yMxDnGvWJbPNpqBg3K8mCapaCqXXQcmL6pUYPRkqSQ11TG2RqrwQqMagwkORdVBYklqGsojDLKqHkuug9KqlQsqC88KY1sHOVuYjqUu7qCUm/x6mJsaEtblyDxDTwmhih9+sVXjS5qQQiIdshsTAsZxblE8hqjLXrvWmoBAKC9r023LVrfolX2zKbMuCAoOCNXZldhAEnAMIXxEOQpNviMHfGteNUPiUNWRnykhn6W+DoP4xbpomxOOV9Cm69uPUMFatqLR8sONp0x2wvMtnqmZZeE3DspoIA+DwRp7q8kEhaCEtrrlFpVaaKi2ykoV/bosr+Gb6ry4yEmeHi4zozFw/0cjxmeJ5hB1yQfyvkILcip9jSXFbDSMi7Jpx7xiF4SvynEjIhCLUAOcs/HekidAkpAUUD4tr2w53Njaju3NW9K7KzDeLJj6cfzKM/afHSDo91uNpNPvf848Y0ZvMyl3xxPeEo8Q5olkU0Y3D57gRowTEOcJR/PutzaKZ6MKqyGiT43WssBq3iYgVReln81BHtHphFV8VxmlJ0hapd0MUJusLps4fi1uJ/pqJOSdrkQHXgMWEOcJ9/eTQ0rZSLerfJ8zp6XYoMi8vEmozJW83omSv776gVDnUzxtu7FX0pfiV+If68kE7YuCD8Ljv14kLfUVcvXZZi+YxYFFTeq/D9H7XPNtnBIDXSvCyLqg4OTitotA3Y7ro8+9FGHBhRVpwYWDxq7p2CNraAXPP3uQbtRr5rkc1OCSCB4FkyGk1Or88wg69Jc4Nw+SgJKO7woVt4UltG72d2qy+42/rqb3y9G/1bmlLDHdtC994NAYFjI7DhyLDgHfg5/Myhzve7iSIGiaxzwkPAAqopBxShFo6Qrf4ZaAFGqPeApP8tWD8FA2MSccA7FQDb3GW0VBsSUks9BhDi422pI5BK8E4/04FYSUPScWbkk4GTEqnEjM/RSNkMqHQiYhoAP4FVXx+PqUmclVSkRTnLzAwGKGV7pLloiZtxHFCtpllmbEnNraJbcqbdvQmG+AWh5R37txDuiDZAJQ3bhhOMsBmie1u/1vjFDYYNpTkfOaaYzfydf2wsWJrADvEdflVVfl1Dfptqqru8h3c5Ftd7btp0LerumqTHyrWILzFvbDQvaXLvbWwoMW9y00VuLemWgoLo5P7CZBo5U/FJbfxPvq/MUlxToP5ROx9woTfIjor9P9ADDKt4L2d1Fbqy4H/BVyPmIxOqImjJLXxqLGaNEpU3x0WglAaTf7jc+an6hOYK831dBf0+vWusASDovaVy40Bl2FyEPn6FXUQMZLKFRdJPAJAAGLkTduuYhKNVLz7Tesx9jGQd0/kyrdx6vM1y/NAbv//z1OI04iffyK3Y/l//nUakZXIv+W04+4+xLNTyDUiQYZ1orVN+0lbeUwsL31/ChCykBTHfTOphNVJ0omaEIAm5fCmSDz4wyPz9o/g9i2HQBLbOYD9CoQo8gXBzmyPl1Z6ZtgfQkkYrIIDLBFMDUITG2cXABeSCu6caIW2+BZILUOTNv16z2FwPK8sFgw1bNlTiWhcW/bCyzCPVeAfE7pBu2x8WcOyhV+ivL/U/XyWjZS/7wJWwDrT4L8gNvOM+IdfhjLnWQuaf4MWDh+xVrysYdTboQVO54z/bATFl4k1fifmRcZ88mhfG74K39bnyOlfyDQOjRSfeq3vHYF4HzWu4efgxAeHJlpjK6+V8BBPxD/A46WyalZ1TTWzOiCwilXVlsfKA24fb/yjLYGR8ANqCxcsi2ExdVQ2JlE9cGvBvyPMtnFaObOEBwRwRzwi7GEImD3MEeYVMHre2DFUUxqkqU//HWljgiTPS1XL7t7rbdhw6HLGuVYLCf5H7tzp9j8KoIFR+ilfJ/+JAhiglf6XB13aDtC61vHWn60TtPW6PNwHQt6ER1dKjLM7C7+4cT/BeXFeqT0xAEfY2qkhRL26py4S26XaYRXwW1MiboeRrDROP94jjgAXX8UN0YZxV7FjtJNo90nsEG0IO4kL6ZjeaWwvtRc7rRmkDu1nJNMWqp3t3Zu+bqQOBYUDljBAKOciuT+X/2wuf4UTGkxdEkq0hlZLF4LpwQF7qEZx/OQlT2NcjjN2N5L3stYORivHjiPMSt3KX3OB2yyEWVsPcRg7+GUtD7grKvrGlVi0PoT+hZk30BrMYwrQIRv2YRHWDfgp/C/clO7BhEoPZq8ULSufdgbTQ+lWnVF1U3owxx2MyU6YQ+7BwCnA9F/x+MCgffzn/+OIUwjkkOODhJRipJJfLaumKqkQmA9+ejBfV1xTiCAhkCmWnHlt/rHiUJZMY4sClt75gX+Kz204S9Wu0a8G4ZrKZVRq7/EWvAg04fD3M5PxveLa13UNrgNHbZO9JNVTucyqhr8lNsm2Rwdc1q7/uuTOD8YScyqgelKoHBYwUdv57d0AgPG68trXTo3LDn+061oP4CL8TiF//liOrrfHynID/Bj/yOE6c12FzkLlcyd9wBa6crFCJkBxia8/PHrN5yIhUFUCcKW4Q9GxFEp03KEBj9raSDivGIpBOsb3JHCLN0PqlHBYSLN6QwGMG3ur5u/Y6XB8lbQABMDpS5emwxlwriQ4HYj981IXC1Ydh+pxY4wxHNxy+PByGIHs04ayppZz6SmWBd61sIHUof76vemPx6AItToCCoegQRFSyw2PQCnA/cNgH5lPJpD7m7UZHl+j/EbOssaIvQJZBDedLmE8tsxK50ZKBW1N8o57VGsfHnXF3kJZV3NJq2dKiOu2Ce+SFYakeLYuXfA7ArD/G2byiOuIeTMNuxCbT1Hnj+0XhdYq/S+OeBU+y92cahvMgyGTu9rIhPhOh5LNwKnPooU7B7fCc9xSjbnYtTf3+UExMAnQj81fGiZKX3ydiaXNznErio/sIOlPo1rRU6oW+tGAuJaQ/9ivsB3uv7VxA7Mdv0sMhPQLip7FwjA5laJqxVDRI2hvGAqmFXjMcMje1ewLpu9tZqJSern/yfEDgq+M3nWgJn3sjGMbcOeVenML3sF1tTT3wGi+04ULKwcOm527roV2L+DNvBkRxfrmKWfbjoxotJ2NjU0xAxuof28Af3HHiEIrDpcf5k6Gxhjq7NNqG3dlr2ty2rkREoyD1gLRqGmSs7GpQr25hW/pmfmBm4dpLle5tRdzdh45sm7AZQeV617An3k9MooF3MTVOdQgr5DdganYLvqxh/gedHDAkjVW1dZicCCXelqHjSuKq2JWRbSV0AFq7v5g0OLQ8SRsFWXAvitv6aowOcaJlbojyiskngrsD5LmCanEeUNA6iTwoGQCEAtIFMMFqZMwv+HFCCAakgAbkAyJ4EIVCRDHaeK4Dqskm1IFgGu5PfgHTAkeu26dPYX4/3/kaQKUU26n9CH8Gz2IfPyIGkIMPn58DqApFPA+fgSPdev8Pv3r2ubS9u+nZRn/Zl80DzaPWJ8MBc3JCLifCdw+O3eaMf5CXOt14gfznX9cNjUB4Ogp+OcBZDOy6efBU7BkHUQ2IZt/HjgVeBB6uRlZQUj1IIwukh+WDP2CavHxAYa6LF0JEhpXKqXTfTaPx6MEjjfFPzSh4RgVU2FcaEsfcLVzHbCjJ9sHIFT6oeHmTyi+EMbNln5BeDPWhZs+HElRYYI0P1RBmPMbs5+4Lr689HLQjTvuAR2zCTqgS1g56xYBnB6FCJiHELX9/bUwITkQtYeYgmn3ZEAcHjOhWRvsm2P6Ws3EFJ4I3ENDI0yfLtm35OlN0fO+ajzqs7LxADuUfRhSt7ep4QaNG1If4oSwDzQqP6Pw1cDxiPgjTxoAd8Ixl/eRJgYI3cRAU+AjdQrqhKaoX8EUtLKqXvOckazHFhLGbSMDa4tzCg3jo0pOM2pygz9SNsKXLlMbqV26FGBEl6X7cknbMsTePfCypu3dSyx4z17EMjD27KFnIwhtF28sQFHk1TXYQj0KcLl+QSu/a0UBLAYat9Iu4zAoJwcKRw8bBVq2QucooP9aqysQ55O+wv2LFCQlASlvc1UulsCJlk8Y7T+/0lTt0pcOLa/Dp+E33HAdCpznFQDN+QAESFBiqUIRRxmixAk2tk7PNUSRgcnuI0cOQDlKNuuE+0jDOhiSP08/vwz9IfwUxof+JPwg3Azdi3w0S+2l9uhRgBFdluxZuJ4tvG/W/F4+n9Ft0c2o2uG9ofNm034Rt/nHXvpHTJvhlym3m/mE/Kx3Y7ePz3SO8/77vvnMbm4GrjpkS/itoe6Nvc/ITxl7wXpDxrj5w7vvJA6lFg/uvpfU6faGssJ+J7UvA88+6h1Fp9auwlIw7RWKkAqHpy5JzCUT9qXUMo+TA/QqnqfWHt4ISQNGu/5G8SYsSyRU9acGu8BIGZBV2HS95w6xneW2gkiZbLHFvu2ohtZpoNQEF5y/a3kzVLybq+L+ZPaTYMMQkciJMKkfLGRNwN+2Iepofts+Acuh2/22TSzshh40IjIRqgdNuyAUpAmhQmQ+aNwVHwLSxVRaun8IELo/jfrOEbJfeNP+Zf6f9i+A+6QFx0Vma3t9w7JnyWS2+O3eS5VxKVfF/wjueR+7lZkaGfYZJlDzUKPEbGSlZvOGjVX4bCpziPnMoxGWY09YmlQ0LFPjdgkHkc8QQ8KHwAOmmpD4pDMcad+vPhF+O8ginWQzl6ByW6S9znCcVxhHRaKTge/bIU5s3+CrV0eoNFMRZZ4sI3+g8kydZ7dBuyYofMoHil+FTpJStr1+fR4vK0ag8KnAM+BJLydOhZcGmW5SSaOICmLeYc5u+/U0NzNfSpunZSL4ibCfIx3pefXyMJUPprSm5S+WZZgbKiS7w3dHiGMNzeUvlpUDUUzjGW3h6Kz78uefFf3mTO89uBvp2heLWvZ81b7OQYP5yRBkU8ZzQcOxAQEVZUFB5eU1VVKClC8iAmBqo7wuiKD7CrIqXDVeqyMMBxC371D9iIHbt9/tBokA939bpPMCnwsS5EqkxOe8aHq5Vy+LZ19B9lXZiF699E+g/9dNQlzvXblnlW1mf2/56i8P946YE0CgBmD3aoAkEIn0AQJND6UH+0GZBEmJlkGsEHZSI4jDJhcDpVbUx0PYnkpQ9CgzmWxuOP2bcCr3hbsQA0fm5UdBhKwKRbq5KC+nGpd3gVzLeuCS9esXwVwqjnWultdKf8LLEGZ5PCxyE4+mjm0eEXZ++BAXR6bEcbiKQPREXNdaEz+LdcJnl9pWB5BRkUKGkUI6hGRLLDqbQlgg1hEXCP8RFkYqJyBlpliYcvSE69UFwudVyVuww7QhbKKX3gXM8S0PjlkN/rkE3ErvHd6z57Dh7gHnxM6V7MM7ne2QU2I1axpp57zzMHtlp3PiwG7D/ADrNlVtDnHdEGh1OsiqxoMwR3BmqkfbhA+YfblryObQgI27fltxO1RYGwNCrb6iy4OeK9DqsuJy4K9RaSDD6pVJEjksL4wcYrwNY2gvuskWG2RyltCu9G80MJ0CSwouBbpdWJUuTjEixhDt3jxI8JsOM7IctxFlXPdyF89yx/J14H1ciP2l/x3JDr8c3zpJHisJXUWsRodgahNS8vmP4vohdjc1R6nKJ7OOziupr6ieKHjejRYlpj2mBU/2FXfvbBM2ML+cCOhr9SZtS+3GbCfPsMTZ3w7QkXkA8WqS6gHy4PYPbn87ifwQrdePboW3wZnELhBt10e3ISa6OGJmyEHEy0lOD5P6iTlxIxT/pmelPNDy6lXHeE7OCjFxzu0zHiDdUkyqySmk6pmUmWpSCrm65ipQghRISUuhqdm7lAvMrxrvzMbJpaXQwaHFgxRLUz6fmSIKiV+pvgXEz+Ch4Duz0XMNKr7jFyQzBUm/HKxmvByomRS2iacBgNUWS2hUiQSC/GBUmljiNAGGJSclQ5Lh/eEOZtE/e1oeqWIVtuklFhQTh5lt6f1hFr3Vnrzgj96WGWxczHMrYjXXW3p+Hu57ADSxoa7foX61w5K+ug0TEFb9zGXDFpe25/EZ1ujT+xyWPBfACf9zaQtq/xyEB5eN+uNor/ceVkiirhGD21zQ18g9s4WzPaav96JDJGGU+c2EW0OrdfdZzfjVhGlmM0GPOGcg14cyAdq6+kkfs55fQtAnvDfoKxMrhw/Yfg0HCFMscWF8p44E8b0xCLPJiVPw7Cuc8iurDsR0OT/a0wiN6KbqJpliPBU/xWzCOUWCoSRzM84BFoBPsmy4uRmOdLYCLJPf075YuGQRFNtbBvAJXhQL67W3Yk+OEzuwm2l7sYSGnXtrMFQIN7j65Bmrd508Lg9mIOmEzvLR66gL0mm+Ev9BDQXnPJrTj2PCN/9zwfA633pesS6v/MZlIBgjiaz422MUdIw5D0ZS6bDc2hAnxN1Bwow4HCoGPdEdwHjhru0+wkA4Q5zcisAYCIJX0nDHJaG+KDqCNwpzoQeiWsozFwmMhA6zmAh/9xoBj0o/yCS0xRs7uhzi857DCBhVBkTHouV8rpAX43BruUorxzEhIXiOKQpieKMRkEFgF4EOYJxBxXBh5zgenb4F5QSheepDZ2A69U/M8E+6kBJGEQoXmGR8CpviDDlRrLBU4Pz4eEtDCljR0LAizQ7UWhqBb6irbcBFlrYkKMbGiRCHRho/SYYMIfLioz96pFs29nrCWiA6fKqtKVeHm9pzUiLOj9mRkdiPOw8fzmPOMecvX5FBeNc7n87YWZX+YIp33lXNrF6+PAP/gNVLyNCDVTPfMwsOHaoYyTw+mscE7oGs2QOiN1YfrXre+C6Xe5REoh0p3voq5RILUj+jRPRvIQtFJ2LNp7NrkHbPIbbKCeG5Bj43KYQ7b8FTkgoBkNolx+jgRJXKdTTvDJIXJ9dyKfDxBTVJEI2ahUG8xNlViUjoqm68QazFGrTYW8bqY9PCBvRYNoR0WAcwoWyZ1F+bwiqPHUH0wH6PS1vVEpzmpeUMrY1hX5TlV00AXv2gYUDpcSieplzncfmA+rvma3CJ9ruNLtXye6MEo54udfNoDK39K8at/M6nT9+zlYpjNcm7bk64MDdTi8Kq/otxzbmLQv3IVgYcu956aAb/x83kQzuok4GTMqfMcQ/itlq0Ue5WLlh4sTe1+Aj0mHti++R2rvmjq1OeC7oDdp17ZPJrBI+5xI6GHJi6veRR8eMvAsH26cMHhkxs/jOhkzBZDyoUFIUWszAkmAyxDB0+OLVd8EXwuLjk0XbA22FY9nLRh4WAbf/0b6NDDjYL/GrMs59wi7Nzof4o3XbB5PyJ0el+wYJZ+5LSlzoucBb+O3iirHOE7DyzZpbPG+lsOjE4CKI6OrSPB9yyY2bGSInE8ZmNONLYzJRSnUqlTc3LKIkUGXWKyg0htyfMzGd86riPM+NE3EaqbFnHjLOFiGxAFpk4z+gfJ8NODh2rAvKq8wlDIyNDBHw3T43dZa9Q0DfsBoGhdhNIKiMBLjPPPePctxb09ST09LmIQXw8EANJvFIMFfRFeOTg/INyDQrOmX35jUDxSiAB4vh4MSg4HOXuaukbJhAFSUTXeBcet90nJWNgwZ8G2lDQYD5Rixf1cQ90xF8MxAvVWPPPOPq6ODAalai7T1hPuK/DDXDMsVhfDAXth1aJAUbZF03B+GE0XAyGJxbiYe1iVOhkyRej02BsYHLoVGgehmzqD1irBU50WfrZ1GpBtVmeII8aOaH2RnUY16oe2EsdpPaSVt8WFfoRWhX+Ni8nV12vsvp6R4UOw/ZgzXU8tk34xQ3PItjef1i5pOdbvh9fmWQrBZIQnkP3KAOGaoGaC83/3KTB3CZfKYLpOo9of3OwE5KY90lzZebr5mOt8oevsqbaZYYVWH1NvPSQlCH2cs0pfMpDb0A/42wkgfZJG/rnLx3pWEvNLpbCi5d4h1NjWfnLmlLJKuPQ78MYimpYRTmOcEfPOcjR5DvbjNe8PJAlUlEwIgyF9dBsJlnDKOBpUps+Tb+2pwsG0Iaz7qnRhwxae9r1aQYtH70n+km0UBL0/AcUYT5/RZlEIFDsRps18KZNcODSjgDJaVAppKGXPk+Dly6B0qG0pUvTIv4lS+E0OH3JEvC9JTzScsoyzyZ7f3kRKAZtoNbZVjlWU+GRRWr2Jp/kxHnHSocKp7bJP3EMgAMW+7xjcmL1slD7T1C173RCxdu3n/cZ9bSseFOZcFpTfv8uavPEly6eToR/fv3avtPjtSSqS0K69HwJHE+FVJbnHQkXyds3IkljSozxJ6pqeyrnV1sRVZi0TW3YjE4xLS6Qwlr8wvaQdD1f2+VR86pHS2xDSRUroBDU6K0v/z3/3i9IZG6SmSRjo8ZaIs1KKnMhkUtZrp7VlmPe1NIP1znb1tQvzghesTRMElmB8g851EQ6v3wjTmRJ4ebkMGtYIJGE2AFWD/Susuw8SBGQ1+w+wsFOq1W9iK+PHduDDBwRRvNzFETeT85lQCfnZx6CMjefWCT6hI2Asuox34bTikJEVCuH/5i/iSKwOYGWfv/piCEr6ImSiskTDC8S2FcqXGYEJBIa5JWB0TJhriSD7MUOj+j8DA6aFzkgY5mbBjgDJ8Dn6SAusPuJ57esRSG0nR+Z0uzI+Ql2MeGvnDHGK+GNAb4Y0h6qEuChpIag3hPdldXEyl/LBVDtU4fmgatirn1947lVM0f5IklzgiH/3HUdi7jgjDvbCERniWkxPcK5N0d4vQzVWm9vIHYJGxst6Ko6mhnFkdlXFiVaSWfwcABeGp5kXnbFbKn/lmcYFMFIjhRlh3qLVa9X1Ewxii1rjzdfsFoQfjSA+7dvLhN5+itryn3XeG99CdXkEJa7tehzEe3Eok/71gO3f90fnh0eY/SbUYxiAlr/ad3LmR1pvoqYP0Znu/16/Nr92pBgto0g0YMCSRNwES4f70F9LX+E0Iadj5Y7/ivGRmWinaK4nytrL7kMSzkf2Nydz0gvA5HhX6dJAW4TIVaBxg3G3TKBzo0knsaGg8iMsnwGzZdTivbUtTrufgRtRJ7+8QO0bEY/3Hdm929Cn4MXxaMgC1K5Lf9e2rKrNfEoHIkc1HP0S7y2vO1m/6hVEyoYEeK8mfg70akOJEAZPoMNM7HXhpHEe2Az6CLuA3BG1E8pAOcU/VDtx6RssdCiElhBSGesO5AGQBDbhhYQQNsgVF38/LNwE4lTzrXxcrzULQDeE5VTiLROSL/yOFtfar3h93vFEqdwk6vrQs4qmPpZZw12Xi2azL2aEAXtpSud6Y3Apk88zrIQHXR8MutViGXGlf4XQwBLX3F2Vy60vgJBPnuUTqDrIaKtZAG2y9E5SCcqQIxAVqBWBNhYBSMiWckbj50hxqyga4LMFUF8FX+FJIBtH4g7bQsMsEmjhFSa2dRK1PKJuycIhlkMcH+dV4jB/LWPtxKQctK1wNkXSaNAQPmbdlC/TcXCLpDKjUIz6KXgaIHiNdpAxMAAjFf9JjSqy5h1EB3GeS9U1YdZWMfna8nMEaNtmareYnrRgx3LuVyicfImhIFzFHLUqPXQyaHlSfRFxnuox0Etsw46Cm1CJ7OTallRSxDEN5e0CHvOeSK7GmHR6InswlHjl1J9+83qSvRnuAI8bHz0kS2REIazO3RUYNx2Bl4GDeqfBPkbcA11ctLd1Lbzt05bQ0wuI4FqfLn46FIT7DbdDt02rMmy0eLLxtrMhPit1nRz6ATzCmRBZiNOBcGSKAvtYJgA9lBtJW5VebIMfcAV+DfI28k9w+P5q9WXbPJQH+2Dq94IMlrNFJaPnK/Cfog+p9ATSBWl7GgrQZawk96KsSICooQtIEgLpC2C+ZSoVen4SUYpbjVuTDcfRahgHHBqTjawmJj4jVfjxhlTWoZpoG5FFXUVYqtfc05K/Oeo2/kXF0nzNCmxYemRqYSdTyLMWTko43MkvX/9OyLiMXnYKkVcHgI3GeURlLrPRcHgphhNwYXp2dx4MQv/gNVM45EMBqabOlWv2p1UtFzT9zuKeO0Gl5wBTAXoSCg/H4p6gqpGJTH9CRQ1O6KCwHvT+YvJc1Q3ia+iLNzfTcIMYZ5A8qLC6MBQB5CeYIaODIZD6lwo4jQ0SRoDGv3JkaRvr1CqHgBVGs8pUBVxTv3/9SnNqmdo5Sg4qkj3HS+j6il2YwcxqFjAbkwvcQKlG8N148bwKNwkvhs/STo5D95udJUYJa5Cd8sq8KVsztbXrp+2uoXOrIa+tvi2BMZpe1GrxuHUsXlYbN5fAwa5xF410YAtdffmEvs8UTDxl/4cAWY54mhYcSiXROPQ7T7Mi0y1uZFunaqvQMU1VXRsD2WQMkTpNV77EmzXjK4m+PH/J2Ev3dJ+famW203uJrG9FSLjsfE4r8t8ExldRagiFjn+T0wbGecLUYaVhYnvCkEg7nc6uQvPzcOxlxF0Y3EAw8mNG8Q0DYT5tD0NZCQOSQ5KJBQORRJeF1UvXYhF0hm+k0FHYoV0Opgefb1043R6gGIyUMHCsu1AUzx+XnPvfKQBTT/gqNdXPa/tOapujAI7nwSsAtNd74vpwVxxjdwe0tofazFtmDFMO7kHze0ukViJkq0f33bmHLW+biAocOLFnzBxpoegqK/IX+k5GfWEdytjQHCBLS/dD58Rf+hx+KvHwBHrfXe1x+qwYSMb2syITf8S+IKDHINvrz6Mc+m4jvNmhZobATFulVNrN+/UgktGlxZfp0etRShfyhq9dxeg5gwFF9YsCu3m3z3rdqvr4stX7ndfdp2/A9rd16aIqL3ntWYmjwZKrUeOZmu7XinzoQ/PoTj0PIVG4bJySimX/vEj/XOzXEYIrRZoz/hjIQC4CNXkDoDAkx1Bl3RII3vYPY9vpA/Clnq+fe0xINxs4JtZTrm2o7DboG1n4SR/Cu1eX75jsqMEvEdb+uJW+qM5Xh1+ri+ybw5fR557NFKnttPaBDWgnTBHiCVkOClzs+mzc1oWGiESywZ/Wjt5Dmhe4hhaFi0P7ARqtpcqGgvLwO5lGLcTN4xdj0Pa/7eh24htaF9MDbEG48P0nZWayCi+FJmJ9PReZg3zPF+ay194EJKu2/HPzmbrBxkZc/8hdQwdhK6LNbd7HNeGhWEwmKGF7IrugSh2KcWQBFIqocLiW1GSqf/AgXrspTmz3f49/k/crBP+TCtm1wDTkpnK1k0xITTThvb16evjUerec4w23uAsqi1qOvZT6EY0Y5oRfXstWWDE5/AJgiVNOn3mV4VnHtbndZD2N5EhY4hjERh8VrAAVU2bZj7CDOMWcExAV9M1TM0acOKWs07Q1JDi4vB0a4L1puwolNHiZlr9Wn2r/apNPscnNtmVpn3bfGt8100HjoGDDOhqdz0DKLhxw43cqSCgvh/epCqHmhaX6zC4RkjLy2nCuWuhMoE9HxOkcQKgQgiUN91VgyHIo2J9PCIIm42AkEHIMjdETqnoEKLiNuiTwbgQAIKXO2MUzdsrIag83qoFWY51E0LiHEzwf/K5AHrErGEkwAGGTLsgV0FPtRW7JMoX0GDJyakoz4AuyFXpIn6A1PWy+Fz9Wd/L9tmZQwKNc6DFuQnf7zWf2BsdM/K3QZ5K9X21a1ijmdBVnLv9xpGdw3fmqdzcUy5jvvMjMh5B+N3D5mwAwTkUj/8Rqo0hedRjGzfiDlfg8PuxGil83bw4XPpEGrDq7fmn0QPrm9CBqMeddnjmuGFFmCpgU2G6iI1DKpFsLisFKoOBD4cOmyIDOrZIcEJA83ZcEAOTWNGH024u3/5t+6rl27/rVjULcTPu+24dxG2X5M4VPap6c3TfdL2V23EHAzUkr/cd/LZtML0mvzEkV/fdPQ+BZTB0QiUxGouMH0XAHVpJlLxVS0vuoxHPZDCBSxNTcxJXjzuJ1WG5o1nL0N3rEvVMx2brQR71eKaus8qvZYJOg/LpIDyT6ju5sWbBYdDtw7HGjyTic+ottpqEr66DKi5Ix3ehn7uB+yDoFxvYy2/WVqypSjv3soYv8t+qTjv7zR2XcLT45/Pwk+z0jgtplXjiRqGbfo5Qjc/nx53BZXtsvXz4THURorzUDTFSfzG10i5OeGOPUbDeN6edB+W5MruxQxH3VFDx0L3iKyeMOQTutmt6lF+E7uNI9D9r8k4uttQxdEz2QWwzTvgWMvA5/pu7odrjW8JBRAguuIEkDAxEIAJlTk4yGQPPwHHk8kNnZYhjdIOzWgbwgMzET7XaX+JfPRAJbdf7h7/unceC+47aUzL6ygAQ2/N21Ebpgkz2Yq7kH4xngH+/lfcKdogUGKXTPtixGsWz8bi/w6Gp0/dOrD//2/rJ09DU3dTxOL3zuM3QoRP8/oi+iN/40KHN4Z6HfM/Yf1H/uUKP+I5ruhZ1nLqyVNdDd30Wvui3yX3pL6L848w0NwONIuX8Rs3Y3yWq8ywflb/54kTLiTw237BsqbkhhJYRDa0S4bkTqIAnlSyJv9NiZhHvLxwWFyHkMgFGmGrqLFMt+3tM1RnNjww0emJEqMwucmVjv9IeuHSPIGAV8BP6LmvcX9F546KmxL1jCZNzUnxDY0MYXV7PSmJDZ5Yf2tdIfy3fXghGxt08/a2XsxwSILIet5cSGeR/wShH38+06fJOxMcqGpvXtF7ziX+8imJhz2kGLiSGnZ33Yx8rR7PFEkIUsf30E0wcSjSz94+AUlPMq8KK92e18I/W9E7ziFtZMgci2RZgc7UkDkIp5HziCJUIDkkbHo79hI3/D03RiD+jy9BHnGWdpDtQnF+fXnPlmlaLsT8wO2E8+tVq6oOFsdQ8/y513qXICHIZ1XjcnYLe0PB1zcxitWdkiCjkR9iByf4ftb4ONrQikNAzo+8hTgnnLM79lzORPRjn0/vr7DnFlOnkyRZTw1luTJ9tSGtmH3RvqDqwNodrOhc3wavk4n9b0g2JBPNAUyNFvEkIMbfGfGQmpyeO6Px8YOpcsuDDPKt/ViKRn4hJs0XUEkeNz2PiXdKTcMfSRdUOiUbSzuAmXdXytnbbOFv9E9hM7BX9UTa27cvb87QFuws+lvrGhRO8P4NxryyzbNO6raDABi7dvKkCBk9iFSRKfOyTfDJPjGJmWhlyaSIn4752ydP7ZhPm3xFJ7+Zn32kS3wFvUZ0H5xOV94QT2NhEiN1MU9PqmvYgXPjO0MYRVEyzVOqC3NNU/6zNmpsPHaT/V7TpbW70yHzT9ospkIDiR2AzGi8PV+H1Fy29RxvOiaGhzdQvSsDsr3sgk5NJ+5sGFyj/36NBqe7KfRQZuH8kcEMhllqYmEvFtXI+ygTNlz+yy+KjIpBScQ2PRvFVj4yjREgHFF9eK5aaO1y/10mjtX0/DVEmhH/6xbWE/w2RJiRqqn0NgWSIiiD80S8XJSKUanzxbKTDLh2IVCCalVQCfzEQ5GWBqCQWqF7Uz8PsemoADDrZFM087YKJl8F84Rz3IS2wF0g+/dA+fj9zBRFeEfwezyYuGCwQtxAWkdseq99yiLz64C2xpNqKFyJxctLre/cCfN+KxR2kDU8vJKhFk++nPAnXWCDe77Ej70esemDJYTYsPx8xaJEQCU1ZIAZRZDIGieNZxwIVfpSLbyaGLNevYlCeOhtejVEoPuecPPlGFdIcfy4p+qoiJsb7F2WHk8o5sCNTXP8mw1y6qpCUJoZwy/EMwbDn4JJFthML0ReWFdIkLJBLFyBzYSUVEqaAnIrvSJjTlxOQRtjLfMxn611TCt/P+/W9QJ8mZmKirsyjVL+ZRc/th+iBSWgvmBLwdTVx1XGtcW3WnTMlQ2Gio5v/IyN6Oop11Upq2OgYn+V6ZstBTM9fiL6kZa1j9lpqachycNfysoayOs5mKBc8Mtzsq2nBVUtMXi8Jqqq/7aleExBSjaSI86Qh+x7KbeffbvGNqXYyEuTXCbUgbbAta0LRRUUBhjoCqY1rk/VHRLANPdHfmTBk8xCO8N7MuP8lmv7vlLxLnQX8MkGFck5+Z6rx3d5JEgs6EmwitUjdmjOzb/oPrtEhtXOFjgQFuNEXBmVljbpUzcoOA7hjE+YafZD42a/eQOHInJ788xNMlq2zoQwlM3VLP15YDNZe1OlgW6pjzKifMb+a8FCPBzx09yor2thtFRXjjQZjGRnpGZMGK4DHh3p0q3yGBGdIYg06CLWpvwYFM1sP5R9IGTlKgFMOPf5ktuOIFwuWAOe9N9UtLQZUl35FzxnpoTaCi2yNEWn7a+lIDUEG4NgJwWYLxSHzoj0QpOh3TVHF7AjzUsCSI15e7+UbbZLlkHynYRJW3mpbkwnJuzi1qjJMDakVDaOhOVE5MfmcTXIoswZlVzRKSpmBLhTLFV5hO2KgGC+fI3uPF7sMxALoTLHryGIZUdC9G4JqC7sOyjitEwKC6kJoPXvF3nXXgAgCrjbS50wDrx1HmLAst+TCHlRy/y4mjEqKORKMyj/bogcTH8tbURaYVmI1GlphIZ58rgAFsTbJbxwLfzxqLxv4xkU7+4FRWzOYeWSXV7v5yHG8KwSbH4prPe1CbCOKIKqIKG1/FTBSQJBCQDpSSFgVcLjISwqgEQOuvhpfzFoh3kk/5bs4oTGwfKNtUkydvEWP9BiacVBqk3+Bkcn9O1E0cdAj6vy/kXceXeGq3QiKPAK8Cg8HhGk43tfQVGpHElKdQlIiQSTHewVnWzhmfxjMvK74461JruiQ35hw2XO0QqPBnQcnpScDhqRD3Dpmj3W3Vbd1jx9wlYC0/pTvWiCiu7ITiIDdPa2LO99na6kiqjMrshNHKIbp/YaU33WQfyL0Q3/E9k3zu5YmojlDIgh4OQR4ee2IGU/u1HrkpQ/UlaQkbnaPbalCB3+UEmuIojXLK4i99VJCW59UV5FKkF1yNRVdrMnoIEQuXrk4K6Q6ZoeXjSIwRZaS10DyOk8SjTi3F87M+R7tIpqFwbINTC2uLK4QEWtIIug9Y8zPZVljUe073+ZPodvhhyMtsPsXZi+UU1rgBN2HEzA3ipfTnKiuNjP7Zi5F1Wr67E/eOC4dKSAGoH6j97ML/eiuX18a9DvtyoohLuhvN6yac5zrMM1AzKVnkDZAaZwNOdEwpdVxxogHkY1mvLkID/dqBITyJdVM/Qf6Qk48dQpCQFNUTd5DoM8J+CuFW1NvTu+Vr+49BByBPdaE6UAQrx+eE2bH+Hq6/oiEwHQcbYrEesFwIGZHFbpxjjAxcMtumPy23c4Zwhy6cWdVIMalOdZKv0ptr676jWWFVt+OU5+wwBTH8TfT9Za3MDXVuf6lsItNBiReBYkEyJoVZFBkf/meuSc+Gr3rSkEQv68Ki6Rwr/HXeOPMyVPXvTelBBxORGEjLeT1A9Gvuy9tMyE1iiNemz39+du0rx6gEUjGP0KhzAwo+KJB3T0UMsIDjKG1Y7jrK81vUZsDHwROB05ZZ71z6G2xm2Zm3Knr4oPA++wsT3FIu2WBmUVzAmFMXHhtHCdKII8wVZiYhV9tzP+h0/fUHPmFVHhIFbggF3KMMFROzykZ8SHGbTgSR07yosRW1uV8xRuRD0cusaHK7cPlzEhrdpRZdITJ2SHBXDCFh+fE5eor4+3ilfqxgvJvIUGYcjVimFJtp1bqCc2ux4zpFtYD1hx3iw9FilPROOMnp4nsYPe2J6g/jNhf/FPSRzku+A711w/4rUt/wjjPeNDDXmCf1x/izfGuUqlLee8AX5/PnjegNr18WccTkVeXWaSfDDKJqQcRIFBafu5Fm+4kVJV4iVyNyqc/+nJYVh4UqagPMjmZbgEHSLlUqVSOzis132hLmK299DG1Adnms6g64MJGErocqzmkwkBlaNIudkCdWxERF90UzPi99jpi3bE+Vt8xHSvnJXevZY9lu2WbbbqDKDpCh27aKycnq+z7WHFd810rBFRwGz5AbaWP0NvoBxBsztYzv6gy6sgwtHhAGZFBzNTqGZrmGxKdrCbzyW/IvHLzJ2XHG/xcn3qEeIlzxMMDzDHrk3QvY8xkarWZ0NpKYL4MXOBrhdxasbCJH0wpCdnshkFWXxHdsKI1fzbPZSyT7qrSz8vcn2OcazCUbaTeXdVtGVgv0doY0QIvBDLsaEE3QdSkowYgLmAteBh/gMVMsGgvKO/avbSrvKBhtLZpkzb/9cIyW468s2z5oubb62LEzce8JNid6ys3HEBIF/cnYQwUvxuu3FAf/TFiRcLF9WtKm0YPUkGDb72vX5JvWOab5OfsV6ck6/zIGdxK0xUnEkhPfDNrW++pjd35vy0+k3rB3So9q99Vv2fUHtJ/pldYT0hSJiqSp3P+8lx1z2LB1c1nb905WHnlrsMc6/KYnOmYlLhEw2m97u++1JvcEWgJwm1VU3Gdjd0OW+O9OCiIWocqvTM6ekGonp2tWB3Gcp8N4NINIVW4q1UOqivr7qORKhcsXBFnG2M0ZTEMARYSy+CeXrjiD2L8xBQSNgO4enq3+HKVcFk5lLDSWD3hwOQZrQS8X5GWl+2TbPrv/k0rFZRFEpdMJNk5Nrg7aMlaB/f918ouCXxoqOHKAuiVDKlUWHax4Jhe+Q2FVwFeFmrGe/InJTi14vQ2dT4qXjxipePhKtlUwxqzmoG8PElWiZPwC3IGaWQOHHabjhwspGcvuq00/ejzDiw0pDGF2zYKiOl77P23R/s3L24pDKHq0joyF7s57hLtwJ7H3zy7HNxY5lPiqSF8khVshoJJcqObhzLBGeSvX8gzgCwbOe2Do4nAYWvgY0hzIeBZu/8pSARdxqX9kqWfWliw9uM1NDBESmcnheLGDW8fpWjt2EQMORLkaGMAF5Hn2mywgDFuFoQhTX/Bk/LqmcmBV+iMgk1cxlYac/3N2Va/rB4TTRcGadKDli7vzYkZykey+nqZiXJo3bpSnN/vyif1LCSSnt27+YWF3T09cyyw5gp3T48kf/fuHonEhPWgom3Dbtavikq2g9IjHlTFP9YS68Hk/R5OG9dNX55Z8aG1RPvLU/R6LaWF6f+lfWAt9cJa7d2/fxJNsqVvxy5olAbzGA/MvIFSs4DdTrcloSf/IEMOQCAqxsRSz7TotUREu4uIfgPhtA3GS5NDl6MjjfMsp1fsPR1XhIrEjaGevMpSUCdW6K+QubuLSDZiysQIY7WgFCLQvIbbAL3b7tnmvtLdIK/Q0VFA/hAZbX3DqsBWfahqMSBko7ZqK7X1jchoiOI8yy0sdDNwW+nZ9m47LvYXm88uZB80CJbFB+4CrWYBswazoHmqD34u5dBTA9aJNQAT8QRodmtWA5X0OwDl8DeT79soIDsIaPTAxPX66Qxvjou7C37716+8Awsz6im290ndpRxXZ0Pm06d5D/Rr8LZT+GVLzE9PKqdN0o8zABw79aIQ3njZPhmTDUGE+DjY51xOVCXE+Pa1r+gvA+BFg6OtdxHhHOLuCIdYC+MoPT1DpV2bLKTtcAIzMyucl+1qHZ08kQOTCu0jXLOijTMzlYaHu0NkbbbMBD0LfrhFdlTVyTWBoWP5WW3EQgchSiyd1BUS+FnwItz+ShwLcrWPwicOc1K3JKfpaXzA/oh7WuEKVzfXhPRFsalFK8zdzPMOe8y9VKi+Hgqc2gGz0mTF8i+BXkGi896jvIaxPITAC6xnkKZmnoo1DyyAg/IdmWZhx+KPeWWZPa9BkJeh/9Beqr9Wf85ero8wl2WXIlAhR32OGq/1XAKZHAq/zr2xFFwKR4UmK80cDr/xLtXX35ecYLdt6KjP6LJhj6Th3y67vVAjR31HEecc82pRUaGp/bxsoaJC4Fo6vwRa62Vs5MYSaKlIEEl95PPnlpu8o74kpGOsfgI47fM09hktZaz+kHKWXwpdVU6ZbTMJglUglb3vpXnkkDGD/TFHz3fjNqw/PDPhKCrkaqmT8UuNtBg0VuLEiBvDL82tb3C50iIQ5/ZKeKH4Czt5y4am9jbCl76fGbXhy2o1ska0ZETgKte+GHh2/IlViFXAftU/TonuK8HG4aDBvMDBTcOExHlK+TY85GAXGe2QLI9wqgG05GjBAtVlBnfS2cP1f3Ww08deCve+uj87DNKPri//tqQ72PpjyIET7c3u0R4D3VvuLv8d17zy+MG0RgaiPdyb208cCLH5uE7ucXDPpMGEjro/96WzX471Puv1fw23UE5OKdtdfAQ16IOLF5sDlas0S5Ge9mBDnfMPtb5Bxf9wQ1pazayE+o4abVK9eDH6oKDGxQd4qUpvXtCgES/cVOLLU+R8VAqKP+7VNQIIYzMkpnW1QXfSaHanuVt7/XpGSrGawE2gVZUGEXqvMU474abtZFAXDCZuwnmVetO69T+6hYw9Tjico/KjVlyIh8Xyjx1f+J5sh3tz3k2HJgQRmZu1/6NxVnsOqM7Rl2hIaAjnvvvg4nOM/KdGS47F1o34A7EPqd9dk+DB7d+WyfhIkvgA4P2vtg/x5w1qKzct16BhK1QILxva2wBTP8DbE1T6eJQ6tAc5SPn9PV+RottWovFWvmvcTODJG/nNfSHYHsyFc9XKPdiQvub85zSm9xVPF54et0soQTnPI3Ocl/coHcXr9JQgbZ4jmwqNEw01CNr373ync/ES/m2m7X9UupxW9p4fADA3EmjVtHNscCt6gZqfRwO0an4VUGimppFLi4dmaAUCNXVaGZMA4NeMDuznD6DKy9dToZmbmYeW76yD98R/J0AeOJKos449jDQbAa5k1xFghlQWW5fDW52Ww7Zvs8KdxlmVZl1xGXgzK+1GmogKw3hD+DOSDuIaDDcLO+mLbgh1Ur50z+BQu6w9Ct0iTlqqZFHJQiCALusackH92oBb5zYdDbsbS9PdYNtwi8/O36hFpualhcOwhs3HJT9V2I7CDYODDYrhDpAzLSgiNzcCGGoA/6NsPvDsf24sJD4kKidcGCWvFm/cMzihNm4zVnth7V9u3szpn14ChTCmifHpuWn4i/4xgpAMWDdtXACYiZRC1zPcWwY1SyLCOX1AU/4VPjHpEH5btZc4NmwwPPaH8byZKhNHk6qZrbqa5EhSGymXHljKrgw+vrdwMGEB8x5fqqQVI8F9v+JpeMu7FG034Oe4uePmJxudzKwM3BXtgF5t9mxxbXFj5ubl5TLdPA7Pza+gTuQVAoG43mot4vRpxFpCoqBLElmCSiPRmjVmbtVuARVkrvqzHkCNVAIBDQawjgAIINdFnOzdv79FWtXQe6wRJKStJ+fJtBEWbcIFxFUEFWTGAs5HtCDFQmq6OnSVh49Hw6vPMovoIeFCCPWCNFf7H1VJDSCuer1AmVz539AWY3y8Xj9ViThv92QmVt5hpNqDQRp1oFxm/kgJlE3EFi9yIcpkTU24csySX0VJZi2hyngyyvgScVyc+KIGcmXg/baSawUbJ86OoCuEEWWM31IYAnbB2YmSgh8XkcBMuSMqEImAKEQ7mX/AH3VWquFjEGFYf8N3Lr2Gt/F4qh3fDqqX88kxw4cuUvfrfANYu8mQmXB+HiT3f+wQ2uneucgNI7q7GKH8DOdcpLjbCPPW5T/WTOkzKoo50PB74abnf/88ZFlF/Gvfxzb+7Nfm7cuFpwMEg3EUuZVuhGlSry3RSX/t7u36BZxLbgVxxHMdW08tIxeiLVhEdUqqorX64CBwaXeFueyVc8wbZXZdO6bbea6mtM2stQCfEGP2uOPJXG5U0yhfd6MNbadpt6HoJVqFRSxlo25SpsYEVkrJKI+iPXabz/GBFqNEk2IqW6ZWeYK57Z9D1s977fFRc0vm0anV2vPSU1ftBYg1FF0uRKWHGT155oo9s0tAUsUsstJrRuzG64OeMAVRgRZbeFRvNEHFsxnaHCx7NCWfKPrPh60G3KtfmUinZ6K7SN/Pj3bIHHczlaJta4bYa+n8GBaDqftq0xN+egk3dU2d0mcDXgmiz3nrFNJzule97LlHZAJ23ZQGZ+otNZ7YlyA5vYdxAjaVLUqeiqj/3GqNrJzo4ldu7AvlM+y3aBiQCtfnomIrpTn6fckVavTkrjADPm0181yFPfgK0zKkSwVTGeGtvO6xV1NvCOWz2eaoraxQhql7uq/tVtgy62DHgrfbmUtFUSaNVk2R2GKVJA8x69ppm8014YxUpYTagbGZ1g9nh0MSeee0hT1GZUsz6LMmKLHGutEmLUKjvGZjvOL5+lkVbwKEdHZjicOglLdtpcUdDWstbqlqi+fhXnSWY7SNX2jV+gSvPbxXYUdAvFVt57HgD7BUMoshEQXXX2PsBIiyVpYTOu7BnoqOO1aWHmNYQyw3x4O02eFZynV7Lily0mpyxpgcYbrL4WiVMXae0WEQUo+g0c9BW2oPa8oUPRRsmRewAK7qoppxFaXNEWsyqvFoV0XhasMTVmekv73VKnOEHLJhViiOIssov3XUesX8vuYHhzMPKyu0BC5rNQhbVLucsGFL4JYXPlPJsVWkRWWM7YMMWXnlE30ac71RY2PJq/Wsj9Y6APGiy8MegFiko8ajKm/N37MoI0D89QtzIfb7NiYbjbDfDxBHZ/NcsnnaXxe1aLlVRe7hK2uZERgL9pozF/6FRYQBxFGtzmJ/xZZIbyt8pCbkEgrMJfQzGTiLnKYsrbYKxznEzMqZ8Wuw7KWt1RtArCzIdcUnWO5an/KBW2O6XqHSt6/VqBcQj9XbAVmi0Ron7FwMhJbCrXMGflpMFi0yt/g36pel3WD9+qCRzvEt6kL71j5nN+WLIE55eGZFDEZb6j6L1bBmaYkGQ4avGboNxO7gKfscllpUw485ao12wbSW2hCtROdA7Ft3XLgP8Ot08W7rFVLUS2yRt0xRiokNDK3F/9BmVdLY3R4gxf3t/pga7zxva/qdfRSt6a6kf/CirbNW0s//S8onx9xb65sz3vD5TRMyAF/SKx6sIB6r9bV4PaCFgJj+A0ojwqaiPB+9VG+KiZ/P/x7c/6eYxf6yeU01GdpvSBIyJxZ+Ekd/3QJyvO089wAygetzLZkCJ/9kFNyV86dT/r0cyv2fX+4fYqt76tdY4KrhMzaDUXg4wdbBoYCMGMg/KZr42oi/3Yo/XX99ogByMvv/qytkEdjg6rtjOQDKbfhu6nnQcVk3CqDdUKMPh6/kfPx/JNHbRTwWASDxRUcIAAJ0bzfBvx+dGurhHDU5AnizEtpjCiNCgwkjRovpiXx6/khBD8tHKlpsGulinuAb9zBMGQQSpwPMtaKMJAx2cEQYiA8jxmDTiXz6wUjBSO9GKgYHIEa6OBLA2GUPMwNezmXsgJCwOVXnRHfktsZT+Xzfv9FJgOF9ir7ofxxGuvtkHYSbl35AxsEiYvy5c9rtqZ2xO31fnhiGEE/9jBes05Pfqf/u2VHNHeKpTndXxg4ICZtTtTy+ItWR29efyq3f+L/RSYChsurFK/6Pw0jf+5N9ehEkfhAsWtVL4/jqzgmt9nTvDrF70b9fWRhuq/HU890uWKcnr3D7755xvVYqnqYUr3dXkUL7LudualjzfyldpU//sym1buELdvEvV1kuN8ZNkxXV4/X5A8FQOBKNxRPJVFf36x3g6ay9ZrK5fKFYKleqtRfjNQdIZYFB3/tSCQ37XDU7MuqVSfjlkNzxKeMTvtColJzyaPsnNT1DlZmVnZOrzssvKCwqXlSyWFNaVl5RWVVdU1tX//h35LIGLQBCMPI5+v+94QRJ0QzL8YIoyYqq6YZp2Y7r+UEYxUma5UVZ1U3b9cM4zcu67cd53c/7/QAiTJAUzbAcL4iSrKiabvyazp+bpmU7rucHYRQnaZYXZVU3bdcP4zQv67Yf53U/7/enFZIylpVVVNWoVUdd9dTX+82DNEiDFRTV6+VJHyIlLZRVNGmpWSuCBjMj3NQhjmjIHbYUwjZsQ9P4YnxStwI+jwJ2tRfgBQzbvplc49vc7S58+fCwBce5F0K7Pd8NhC/pjmy/zVF4ExXM3gt6WGuzSRVBTGTPb9rTvteAZ1lFrT6ysxpFFwJWWAB/BHMMK5D9JkuexDT1V6AWlGmC/nkyy6w22UPU3Jhti9L/HrgpsmpePVmVLCFhZJcoRhl4Bba56YVM4ZfWpFaTony7RzD8keJM7B7lPZrBTSbeDfLqkd3otWbactP68mVm3SZ1IONmGRSMTNcPOI5bBeqgR5o916DIo+/wpjBl+qGkGcChbm+wUSu2IGEwG2eymvmSlsJx6aEPU9S+bgS8Uxi9XKQWrr1oK8BOkiVUoPJKWIVjMuWAmBS9CLC55hrYWUOTdqWAeacnIJOr4Q+XsEuthSCO+G6SlIPynAr4zf/6/U1kw+aaPbDLW9qc7daYxbDTkelrWmGmLQLcAbsjuCHgMrhCFlfFiFyREE8mMKLOAKJ+tvPus6G+/vGKQxvipDjfWbvGJhWV6mwpbPZY6kh3DBWG4LAolfqKg2onTdgbPQHi3ooTleQ2mmS+YkOcQo4vYvEWn8+vIw5FenYsCjTjLZFt71X2vkl6ArbHhuyC/NRjIceLP6A9do/Bwmm9AAfSKc0JVEbd6mm3wYJ1xTDUVEmKXBPskizl6oWCmKpfxURKYBrlmQmXO99sutReGoKojykWByAfc/T3QLPoYEGxKpy+FVNzRQuwiqAq5dgC7/5AjQBXyFfJ/RoFjxz2UpI9sTvQS5WPJcvLbt/HCoco4JVmYa3nhNRBIVis0UJqVTouEaJTteO+e1SUC/lRtuMLjoGBS8gt8ozrPMHUtzv+mE59zo0Llk0loJY4iWIvAiKhbKHTS7UNOwdR12V9uyMpeN5vwV76yKUguWeMboliyvy6oFBc2djINIpf7QwgZS5JtKILaViAdTC7nbYXDwv9iw2w26F/kRPg22MrjIwSM4NKdk1QtgCFKAa79fRCTdR2VDQ94wq7vqKd8IJ04QrIFZjjEuVKrVitv37NAr5CyZOizpfcSPRQedWj2KatzrRjBfM1QBUSG7YSoapsNlicvNRcIXJ3Nq1pTk5qwxbnfBXxK0IMwnpeqoA12SIRISjm/hLUAB9KSK0dqhjaSgGs2TL/h6At2TUS88ER03tzEQ8P3DQ6c6ZuhtNON0oynerM89Ygl+xeJsOMNEZaEb/4g1XEqRpsJ5pzN3idkgqVOUhALfN5WcArGDEGusxkuJpsdv2gOc9nvIUysgAuJfM4rZOXyuSwi01lt/C9CbDQwjRNGRNhuRtxcSbgo74sKwdSB54rCBc2ZEY07byDuBea00D05pqPlckfwX1rH9nlLFlwf8tTapQ/vk9pfKFOKnNo5RAMp7lbFFZI8iVN0nDdfO7qo9xIa4ppN6D68Ioeompzxu2x2abI0D9rzmTY4iF24IR8c9UTDh/t9mlvs3p12RFwe9eyyu4UZ6qT7kysaBdyoW0my7vXSLI5bHz1+IqcRuOUO+iL/UwDCS+19Bj7gJ/X1ag1sktSEcQ2QMwNtBprL481asebPJaOEJLvYoO7Qi7p9j8Cc6mYsE4UeS5luk6Y0jIXLmMidvPZ3GXpMb9XgV1D7DTrbg+xuGbubrPgIG9QoqnlIHZdLFHX264e9wG87UHKOGNvnUAOVA8WWaVKLspNhtx5Wxr2ux/j9ZXaYJYHjNpLpRoH5E3NokBxbDFgUhw9XfO4DKppXR1ER6h9XpYbxHR9820eGxuo75m3txnyZ3ObJGe1yrgtoJ5HTx11twwQAk+0IRbOh1OJKJdvDz1+FPzuKqQWubwK8hgyxHWcKZpgwW57KyigdHI7e/VBA2HqRryACsZuFlYFuwtXsEtGTxWQNSQWrE63McbdQTVqvbl2JnwhzaKG2HGeO6tOWt4BAAA=') format('woff2'), + url('iconfont.woff?t=1576743390769') format('woff'), + url('iconfont.ttf?t=1576743390769') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('iconfont.svg?t=1576743390769#iconfont') format('svg'); /* iOS 4.1- */ } .iconfont { @@ -1167,3 +1167,11 @@ content: "\e6d9"; } +.icon-suoxiao2:before { + content: "\e701"; +} + +.icon-fangda:before { + content: "\e707"; +} + From f8b9f369ec0dee0f7a7910f024f4541283a650b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 19 Dec 2019 16:44:21 +0800 Subject: [PATCH 04/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/js/jupyter.js | 11 +++ public/react/src/modules/page/VNC.css | 25 ++++++ .../src/modules/page/component/FloatButton.js | 2 +- public/react/src/modules/tpm/TPMBanner.js | 4 +- public/react/src/modules/tpm/jupyter/index.js | 90 +++++++++++++++---- .../react/src/modules/tpm/jupyter/index.scss | 3 +- public/react/src/redux/actions/actionTypes.js | 3 +- public/react/src/redux/actions/index.js | 6 +- public/react/src/redux/actions/jupyter.js | 8 ++ .../react/src/redux/reducers/commonReducer.js | 8 +- 10 files changed, 134 insertions(+), 26 deletions(-) create mode 100644 public/react/public/js/jupyter.js diff --git a/public/react/public/js/jupyter.js b/public/react/public/js/jupyter.js new file mode 100644 index 000000000..8d76a9a7f --- /dev/null +++ b/public/react/public/js/jupyter.js @@ -0,0 +1,11 @@ +//用于嵌入到jupyter pod中的js +//guange 2019.12.18 + +window.onload=function(){ + require(["base/js/namespace"],function(Jupyter) { + Jupyter.notebook.save_checkpoint(); + }); +} + + + \ No newline at end of file diff --git a/public/react/src/modules/page/VNC.css b/public/react/src/modules/page/VNC.css index cf47d7207..e29335242 100644 --- a/public/react/src/modules/page/VNC.css +++ b/public/react/src/modules/page/VNC.css @@ -14,4 +14,29 @@ color: #fff; left: 13px; user-select: none; +} + +.jupyter_float_button { + background-image: url(./images/float_switch.jpg); + height: 112px; + width: 38px; + position: absolute; + right: 0px; + top: 32%; + cursor: pointer; + left:auto; + z-index: 99999999; +} + +.jupyter_float_button .text { + position: relative; + writing-mode: vertical-rl; + top: 36px; + color: #fff; + left: 13px; + user-select: none; +} + +.newjupyter_float_button{ + right: 257px; } \ No newline at end of file diff --git a/public/react/src/modules/page/component/FloatButton.js b/public/react/src/modules/page/component/FloatButton.js index 4e7f794c6..7cc8288a7 100644 --- a/public/react/src/modules/page/component/FloatButton.js +++ b/public/react/src/modules/page/component/FloatButton.js @@ -1,5 +1,5 @@ import React, { Component } from 'react'; - +import '../VNC.css' const $ = window.$; class FloatButton extends Component { componentDidMount() { diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index a31ca5952..b498c4d22 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -851,8 +851,6 @@ class TPMBanner extends Component { - { - this.props.is_jupyter===true?"": @@ -917,7 +915,7 @@ class TPMBanner extends Component { - } + { diff --git a/public/react/src/modules/tpm/jupyter/index.js b/public/react/src/modules/tpm/jupyter/index.js index cd947df85..7425a4732 100644 --- a/public/react/src/modules/tpm/jupyter/index.js +++ b/public/react/src/modules/tpm/jupyter/index.js @@ -9,10 +9,11 @@ import './index.scss'; import React, { useEffect, useState } from 'react'; import SplitPane from 'react-split-pane'; -import { Button, Modal } from 'antd'; +import { Button, Modal,Drawer } from 'antd'; import { connect } from 'react-redux'; +import FloatButton from '../../page/component/FloatButton'; import UserInfo from '../../developer/components/userInfo'; import actions from '../../../redux/actions'; import LeftPane from './leftPane'; @@ -39,7 +40,9 @@ function JupyterTPI (props) { changeLoadingState, changeGetJupyterUrlState, jupyter_identifier, - changeCurrentPage + changeCurrentPage, + changeshowDrawer, + drawervisible, } = props; const {identifier} = params; @@ -107,6 +110,28 @@ function JupyterTPI (props) { }) } + + // 重置环境 + const handleEnvironmentTpi = () => { + Modal.confirm({ + title: '重置环境', + content: ( +

+ 你在本文件中修改的内容将丢失,
+ 是否确定重置环境? +

+ ), + okText: '确定', + cancelText: '取消', + onOk () { + // console.log('调用重置代码....', myIdentifier); + // if (myIdentifier) { + // syncJupyterCode(myIdentifier, '重置成功'); + // } + } + }) + } + // 退出实训 const handleClickQuitTpi = () => { // console.log(jupyterInfo); @@ -138,6 +163,13 @@ function JupyterTPI (props) { getJupyterTpiDataSet(jupyter_identifier); } + const swtichFirstDrawer = () => { + changeshowDrawer(!drawervisible) + } + + const firstDrawerWidth = ()=>{ + return 260 + }; return (
@@ -151,9 +183,17 @@ function JupyterTPI (props) { + >重置实训 + + +

+
- -
- -
+ + {/*
*/} + {/* */} + {/*
*/} -
+ {"数据集"} + + +

Some contents...

+

Some contents...

+

Some contents...

+
); @@ -199,7 +252,7 @@ const mapStateToProps = (state) => { jupyter_pagination, jupyter_identifier } = state.jupyterReducer; - const { loading } = state.commonReducer; + const { loading ,drawervisible} = state.commonReducer; return { loading, jupyter_info, @@ -208,7 +261,8 @@ const mapStateToProps = (state) => { jupyter_tpi_url_state, total: jupyter_data_set_count, pagination: jupyter_pagination, - jupyter_identifier + jupyter_identifier, + drawervisible, }; } @@ -221,7 +275,9 @@ const mapDispatchToProps = (dispatch) => ({ getJupyterTpiUrl: (identifier) => dispatch(actions.getJupyterTpiUrl(identifier)), saveJupyterTpi: () => dispatch(actions.saveJupyterTpi()), changeLoadingState: (flag) => dispatch(actions.changeLoadingState(flag)), - changeCurrentPage: (current) => dispatch(actions.changeCurrentPage(current)) + changeCurrentPage: (current) => dispatch(actions.changeCurrentPage(current)), + //展开Drawer + changeshowDrawer: (type) => dispatch(actions.changeshowDrawer(type)) }); export default connect( diff --git a/public/react/src/modules/tpm/jupyter/index.scss b/public/react/src/modules/tpm/jupyter/index.scss index 430bb1c6e..5fdfcb02c 100644 --- a/public/react/src/modules/tpm/jupyter/index.scss +++ b/public/react/src/modules/tpm/jupyter/index.scss @@ -9,7 +9,7 @@ -webkit-background-clip: padding; background-clip: padding-box; } - + .Resizer:hover { -webkit-transition: all 2s ease; transition: all 2s ease; @@ -56,6 +56,7 @@ line-height: 60px; background-color: #070F1A; padding-left: 30px; + z-index:999999; .jupyter_title{ display: flex; flex-direction: column; diff --git a/public/react/src/redux/actions/actionTypes.js b/public/react/src/redux/actions/actionTypes.js index 55aa42799..999fb7339 100644 --- a/public/react/src/redux/actions/actionTypes.js +++ b/public/react/src/redux/actions/actionTypes.js @@ -57,7 +57,8 @@ const types = { SAVE_JUPYTER_INFO: 'SAVE_JUPYTER_INFO', // 保存 jupyter 信息 CHANGE_JUPYTER_URL_STATE: 'CHANGE_JUPYTER_URL_STATE', // 获取url返回的状态值 SAVE_JUPYTER_TPI: 'SAVE_JUPYTER_TPI', // 保存 jupyter tpi - CHANGE_JUPYTER_CURRENT_PAGE: 'CHANGE_JUPYTER_CURRENT_PAGE' + CHANGE_JUPYTER_CURRENT_PAGE: 'CHANGE_JUPYTER_CURRENT_PAGE', + CHANGE_SHOW_DRAWER: 'CHANGE_SHOW_DRAWER', } export default types; diff --git a/public/react/src/redux/actions/index.js b/public/react/src/redux/actions/index.js index ad33061ba..40aec251a 100644 --- a/public/react/src/redux/actions/index.js +++ b/public/react/src/redux/actions/index.js @@ -70,7 +70,8 @@ import { syncJupyterCode, changeGetJupyterUrlState, saveJupyterTpi, - changeCurrentPage + changeCurrentPage, + changeshowDrawer, } from './jupyter'; export default { @@ -123,6 +124,7 @@ export default { syncJupyterCode, changeGetJupyterUrlState, saveJupyterTpi, - changeCurrentPage + changeCurrentPage, + changeshowDrawer // isUpdateCodeCtx } \ No newline at end of file diff --git a/public/react/src/redux/actions/jupyter.js b/public/react/src/redux/actions/jupyter.js index 57c12e6d3..73bc30a42 100644 --- a/public/react/src/redux/actions/jupyter.js +++ b/public/react/src/redux/actions/jupyter.js @@ -154,4 +154,12 @@ export const changeCurrentPage = (current) => { type: types.CHANGE_JUPYTER_CURRENT_PAGE, payload: current } +} + +// 改变当前页数 +export const changeshowDrawer = (type) => { + return { + type: types.CHANGE_SHOW_DRAWER, + payload: type + } } \ No newline at end of file diff --git a/public/react/src/redux/reducers/commonReducer.js b/public/react/src/redux/reducers/commonReducer.js index 8a2e927cc..4d38b75ad 100644 --- a/public/react/src/redux/reducers/commonReducer.js +++ b/public/react/src/redux/reducers/commonReducer.js @@ -14,7 +14,8 @@ const initialState = { excuteState: '', // 代码执行状态 submitLoading: false, // 提交按钮状态 publishLoading: false, // 发布 - isMySource: false + isMySource: false, + drawervisible:false } const commonReducer = (state = initialState, action) => { @@ -50,6 +51,11 @@ const commonReducer = (state = initialState, action) => { ...state, isMySource: action.payload } + case types.CHANGE_SHOW_DRAWER: + return { + ...state, + drawervisible: action.payload + } default: return state; } From 1550430fe1b8790abb82bc65fbdb57425320e062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 19 Dec 2019 17:50:49 +0800 Subject: [PATCH 05/40] =?UTF-8?q?=E6=96=B0=E7=89=88=E5=AD=A6=E9=99=A2?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Challenges/Challengesjupyter.js | 33 +++++++++++++++---- .../shixunchild/shixunchildCss/Challenges.css | 25 ++++++++++++++ 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index 6ba8b8f7f..e34aaa169 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -23,7 +23,8 @@ class Challengesjupyter extends Component { booljupyterurls:false, loading:false, boxoffsetHeigh:0, - opentitletype:true + opentitletype:true, + enlarge:false, } } @@ -194,9 +195,15 @@ class Challengesjupyter extends Component { }) } + onclki=(bool)=>{ + this.setState({ + enlarge:bool + }) + } + render() { - let{ChallengesDataList,booljupyterurls}=this.state; + let{ChallengesDataList,booljupyterurls,enlarge}=this.state; let id = this.props.match.params.shixunId; //老师 const is_teacher = this.props&&this.props.current_user&&this.props.current_user.is_teacher?this.props.current_user.is_teacher:false; @@ -289,8 +296,9 @@ class Challengesjupyter extends Component { display: flex; flex-direction:row-reverse; } + ; - } + } ` } @@ -300,18 +308,31 @@ class Challengesjupyter extends Component { : ( admin===true||business===true||mysidentity===true? -
+
+ +

任务详情

(请将实训题目写在下方并保存)

- + { + enlarge===true? + this.onclki(false)}> + : + this.onclki(true)}> + }
this.modifyjupyter(this.state)}>

导入

+
+ : "" ) @@ -346,7 +367,7 @@ class Challengesjupyter extends Component { { admin===true||business===true||mysidentity===true?
-
+
{ this.state.jupyter_url===null || this.state.jupyter_url===undefined? ( diff --git a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css index 9ff7f0564..d18370a51 100644 --- a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css +++ b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css @@ -190,3 +190,28 @@ line-height: 30px; } +.fangdaone{ + height: 63px; + width: 100%; + position: fixed; + top: 0px; + left: 0px; + z-index: 999999; + right: 0px; +} + +.fangdatwo{ + height: 100%; + width: 100%; + position: fixed; + top:0px; + margin-top: 63px; + bottom: 0px; + left: 0px; + z-index: 999999; + right: 0px; +} + +.jupyterswidth{ + width: 1140px; +} From 6bbce2ca8eaa6e9079ccf30f112ffed866c6b3f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 19 Dec 2019 20:15:06 +0800 Subject: [PATCH 06/40] =?UTF-8?q?jupyter=20=E5=8E=BB=E6=8E=89=E5=BA=94?= =?UTF-8?q?=E7=94=A8=20=E5=8A=A0=E4=B8=8A=20=E6=94=BE=E5=A4=A7=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tpm/shixunchild/Challenges/Challengesjupyter.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index e34aaa169..7d459ce5f 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -308,9 +308,11 @@ class Challengesjupyter extends Component { : ( admin===true||business===true||mysidentity===true? -
+
-
+

任务详情

(请将实训题目写在下方并保存)

@@ -367,7 +369,7 @@ class Challengesjupyter extends Component { { admin===true||business===true||mysidentity===true?
-
+
{ this.state.jupyter_url===null || this.state.jupyter_url===undefined? ( @@ -376,7 +378,7 @@ class Challengesjupyter extends Component { :"" ) : - From 97a432fa6a82c6da66391c0bc36ac1d414ceecb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 20 Dec 2019 09:11:39 +0800 Subject: [PATCH 07/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/colleges_controller.rb | 12 +- app/controllers/hacks_controller.rb | 4 +- .../homework_commons_controller.rb | 14 +- app/controllers/myshixuns_controller.rb | 2 +- app/models/curriculum.rb | 4 - app/models/curriculum_direction.rb | 4 - app/models/hack_user_lastest_code.rb | 2 +- app/models/item_bank.rb | 2 - app/models/knowledge_point.rb | 5 - app/models/knowledge_point_container.rb | 3 - .../colleges/student_shixun.json.jbuilder | 2 +- app/views/colleges/teachers.json.jbuilder | 2 +- ...1218070922_create_curriculum_directions.rb | 9 - .../20191218071017_create_curriculums.rb | 10 - .../20191218071111_create_knowledge_points.rb | 11 - ...71343_create_knowledge_point_containers.rb | 12 - ...1219120819_modify_description_for_hacks.rb | 10 + public/react/package.json | 1 + public/react/public/js/jupyter.js | 32 +- public/react/src/App.js | 13 +- public/react/src/college/College.js | 1259 +++++++++++++++++ .../college/colleagechart/Colleagechart.js | 84 ++ .../college/colleagechart/Colleagechartzu.js | 149 ++ .../src/college/colleagecss/colleage.css | 213 +++ .../common/components/comment/CommentForm.js | 116 ++ .../common/components/comment/CommentIcon.js | 32 + .../common/components/comment/CommentItem.js | 165 +++ .../common/components/comment/CommentList.js | 20 + .../src/common/components/comment/index.js | 22 + .../src/common/components/comment/index.scss | 111 ++ .../src/common/quillForEditor/ImageBlot.js | 54 + .../src/common/quillForEditor/deepEqual.js | 47 + .../react/src/common/quillForEditor/index.js | 166 +++ .../react/src/common/reactQuill/ImageBlot.js | 54 + .../react/src/common/reactQuill/ReactQuill.js | 45 + .../react/src/common/reactQuill/deepEqual.js | 47 + public/react/src/common/reactQuill/flatten.js | 26 + public/react/src/common/reactQuill/index.js | 108 ++ public/react/src/common/reactQuill/index.scss | 32 + public/react/src/common/reactQuill/lib.js | 13 + .../src/common/reactQuill/useDeepEqualMemo.js | 27 + .../src/common/reactQuill/useMountQuill.js | 148 ++ .../react/src/common/reactQuill/useQuill.js | 60 + .../src/common/reactQuill/useQuillOnChange.js | 33 + .../common/reactQuill/useQuillPlaceholder.js | 22 + .../common/reactQuill/useQuillValueSync.js | 31 + .../src/modules/developer/DeveloperHome.js | 21 +- .../components/controlSetting/index.js | 24 +- .../components/controlSetting/index.scss | 7 +- .../developer/components/execResult/index.js | 14 +- .../developer/components/initTabCtx/index.js | 7 +- .../components/initTabCtx/index.scss | 3 +- .../components/monacoSetting/index.js | 3 +- .../components/myMonacoEditor/index.js | 59 +- .../components/myMonacoEditor/index.scss | 33 +- .../modules/developer/newOrEditTask/index.js | 102 +- .../developer/newOrEditTask/index.scss | 16 +- .../leftpane/editorTab/AddTestDemo.js | 24 +- .../newOrEditTask/leftpane/editorTab/index.js | 53 +- .../leftpane/editorTab/index.scss | 5 + .../developer/newOrEditTask/leftpane/index.js | 22 - .../newOrEditTask/leftpane/prevTab/index.js | 77 +- .../newOrEditTask/rightpane/index.scss | 5 +- .../modules/developer/split_pane_resizer.scss | 6 +- .../modules/developer/studentStudy/index.js | 63 +- .../modules/developer/studentStudy/index.scss | 2 +- .../studentStudy/leftpane/comment/index.js | 13 +- .../studentStudy/leftpane/comment/index.scss | 8 + .../developer/studentStudy/leftpane/index.js | 63 +- .../studentStudy/leftpane/index.scss | 7 + .../leftpane/taskDescription/index.js | 18 +- .../developer/studentStudy/rightpane/index.js | 32 +- public/react/src/modules/tpm/TPMBanner.js | 71 +- public/react/src/modules/tpm/TPMIndex.js | 11 +- .../tpm/TPMsettings/LearningSettings.js | 6 +- .../tpm/TPMsettings/Shixuninformation.js | 13 + .../modules/tpm/challengesnew/TPManswer.js | 4 +- .../modules/tpm/challengesnew/TPManswer2.js | 4 +- .../tpm/challengesnew/TPMchallengesnew.js | 4 +- .../tpm/challengesnew/TPMevaluation.js | 4 +- .../modules/tpm/challengesnew/TPMquestion.js | 4 +- .../modules/tpm/component/TPMRightSection.js | 6 +- .../src/modules/tpm/component/TPMright.css | 5 + .../tpm/shixunchild/Challenges/Challenges.js | 42 +- .../Challenges/Challengesjupyter.js | 45 +- .../Collaborators/Collaborators.css | 9 + .../Collaborators/Collaborators.js | 11 +- .../src/modules/tpm/shixuns/ShixunCardList.js | 2 +- public/react/src/redux/actions/actionTypes.js | 5 +- public/react/src/redux/actions/common.js | 4 +- public/react/src/redux/actions/index.js | 4 +- public/react/src/redux/actions/ojForUser.js | 45 +- public/react/src/redux/actions/ojForm.js | 20 +- .../src/redux/reducers/ojForUserReducer.js | 29 +- .../react/src/redux/reducers/ojFormReducer.js | 4 +- public/react/src/services/ojService.js | 15 +- spec/models/curriculum_direction_spec.rb | 5 - spec/models/curriculum_spec.rb | 5 - spec/models/knowledge_point_container_spec.rb | 5 - spec/models/knowledge_point_spec.rb | 5 - 100 files changed, 3821 insertions(+), 491 deletions(-) delete mode 100644 app/models/curriculum.rb delete mode 100644 app/models/curriculum_direction.rb delete mode 100644 app/models/knowledge_point.rb delete mode 100644 app/models/knowledge_point_container.rb delete mode 100644 db/migrate/20191218070922_create_curriculum_directions.rb delete mode 100644 db/migrate/20191218071017_create_curriculums.rb delete mode 100644 db/migrate/20191218071111_create_knowledge_points.rb delete mode 100644 db/migrate/20191218071343_create_knowledge_point_containers.rb create mode 100644 db/migrate/20191219120819_modify_description_for_hacks.rb create mode 100644 public/react/src/college/College.js create mode 100644 public/react/src/college/colleagechart/Colleagechart.js create mode 100644 public/react/src/college/colleagechart/Colleagechartzu.js create mode 100644 public/react/src/college/colleagecss/colleage.css create mode 100644 public/react/src/common/components/comment/CommentForm.js create mode 100644 public/react/src/common/components/comment/CommentIcon.js create mode 100644 public/react/src/common/components/comment/CommentItem.js create mode 100644 public/react/src/common/components/comment/CommentList.js create mode 100644 public/react/src/common/components/comment/index.js create mode 100644 public/react/src/common/components/comment/index.scss create mode 100644 public/react/src/common/quillForEditor/ImageBlot.js create mode 100644 public/react/src/common/quillForEditor/deepEqual.js create mode 100644 public/react/src/common/quillForEditor/index.js create mode 100644 public/react/src/common/reactQuill/ImageBlot.js create mode 100644 public/react/src/common/reactQuill/ReactQuill.js create mode 100644 public/react/src/common/reactQuill/deepEqual.js create mode 100644 public/react/src/common/reactQuill/flatten.js create mode 100644 public/react/src/common/reactQuill/index.js create mode 100644 public/react/src/common/reactQuill/index.scss create mode 100644 public/react/src/common/reactQuill/lib.js create mode 100644 public/react/src/common/reactQuill/useDeepEqualMemo.js create mode 100644 public/react/src/common/reactQuill/useMountQuill.js create mode 100644 public/react/src/common/reactQuill/useQuill.js create mode 100644 public/react/src/common/reactQuill/useQuillOnChange.js create mode 100644 public/react/src/common/reactQuill/useQuillPlaceholder.js create mode 100644 public/react/src/common/reactQuill/useQuillValueSync.js create mode 100644 public/react/src/modules/developer/studentStudy/leftpane/comment/index.scss delete mode 100644 spec/models/curriculum_direction_spec.rb delete mode 100644 spec/models/curriculum_spec.rb delete mode 100644 spec/models/knowledge_point_container_spec.rb delete mode 100644 spec/models/knowledge_point_spec.rb diff --git a/app/controllers/colleges_controller.rb b/app/controllers/colleges_controller.rb index 71009d2dd..707255866 100644 --- a/app/controllers/colleges_controller.rb +++ b/app/controllers/colleges_controller.rb @@ -21,7 +21,7 @@ class CollegesController < ApplicationController # 实训总数 @shixuns_count = Shixun.visible.joins('left join user_extensions on user_extensions.user_id = shixuns.user_id') .where(user_extensions: { school_id: current_school.id }).count - render json: { teachers_count: @teachers_count, students_count: @students_count, courses_count: @courses_count, shixuns_count: @shixuns_count } + render json: { teachers_count: @teachers_count, students_count: @students_count, courses_count: @courses_count, shixuns_count: @shixuns_count, school: current_school.name } end def shixun_time @@ -44,8 +44,8 @@ class CollegesController < ApplicationController (SELECT count(c.id) FROM courses c, course_members m WHERE c.id != 1309 and m.course_id = c.id AND m.user_id=users.id AND m.role in (1,2,3) and c.school_id = #{current_school.id} AND c.is_delete = 0) as course_count FROM `users`, user_extensions ue where ue.school_id=#{current_school.id} and users.id=ue.user_id and ue.identity=0 ORDER BY publish_shixun_count desc, course_count desc, id desc LIMIT 10") # ).order("publish_shixun_count desc, experience desc").limit(10) - @teacher_count = UserExtension.where(school_id: current_school.id) - .select('SUM(IF(identity=0, 1, 0)) AS teachers_count').first.teachers_count + # @teacher_count = UserExtension.where(school_id: current_school.id) + # .select('SUM(IF(identity=0, 1, 0)) AS teachers_count').first.teachers_count @teachers = @teachers.map do |teacher| course_ids = Course.find_by_sql("SELECT c.id FROM courses c, course_members m WHERE c.id != 1309 and m.course_id = c.id AND m.role in (1,2,3) AND m.user_id=#{teacher.id} AND c.is_delete = 0 and c.school_id = #{current_school.id}") @@ -99,7 +99,7 @@ class CollegesController < ApplicationController @course_count = courses.size courses = courses.left_joins(practice_homeworks: { student_works: { myshixun: :games } }) - .select('courses.id, courses.name, courses.is_end, sum(games.evaluate_count) evaluating_count') + .select('courses.id, courses.name, courses.is_end, IFNULL(sum(games.evaluate_count), 0) evaluating_count') .group('courses.id').order('is_end asc, evaluating_count desc') @courses = paginate courses @@ -117,7 +117,7 @@ class CollegesController < ApplicationController # 学生实训 def student_shixun - @student_count = User.joins(:user_extension).where(user_extensions: { school_id: current_school.id, identity: 1 }).count + # @student_count = User.joins(:user_extension).where(user_extensions: { school_id: current_school.id, identity: 1 }).count @students = User.joins(:user_extension).where(user_extensions: { school_id: current_school.id, identity: 1 }).includes(:user_extension).order('experience desc').limit(10) student_ids = @students.map(&:id) @@ -158,7 +158,7 @@ class CollegesController < ApplicationController return true if current_user.admin_or_business? # 超级管理员|运营 return true if current_college.is_a?(Department) && current_college.member?(current_user) # 部门管理员 return true if current_user.is_teacher? && current_user.school_id == current_school.id # 学校老师 - return true if current_school.customers.exists? && current_user.partner&.partner_customers&.exists?(customer_id: current_school.customer_id) + # return true if current_school.customers.exists? && current_user.partner&.partner_customers&.exists?(customer_id: current_school.customer_id) false end diff --git a/app/controllers/hacks_controller.rb b/app/controllers/hacks_controller.rb index cab952a04..b7f6a30a2 100644 --- a/app/controllers/hacks_controller.rb +++ b/app/controllers/hacks_controller.rb @@ -9,9 +9,11 @@ class HacksController < ApplicationController def start # 未发布的编程题,只能作者、或管理员访问 start_hack_auth - user_hack = @hack.hack_user_lastest_codes.mine(current_user.id) + user_hack = @hack.hack_user_lastest_codes.where(user_id: current_user.id).first + logger.info("#user_hack: #{user_hack}") identifier = if user_hack.present? + logger.info("#####user_hack_id:#{user_hack.id}") user_hack.identifier else user_identifier = generate_identifier HackUserLastestCode, 12 diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index 8a1c07ddf..3a60dcde5 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -167,7 +167,11 @@ class HomeworkCommonsController < ApplicationController if params[:work_status].present? params_work_status = params[:work_status] work_status = params_work_status.map{|status| status.to_i} - @student_works = @student_works.where(compelete_status: work_status) + if @homework.homework_type == "practice" + @student_works = @student_works.where(compelete_status: work_status) + else + @student_works = @student_works.where(work_status: work_status) + end end # 分班情况 @@ -1497,8 +1501,12 @@ class HomeworkCommonsController < ApplicationController @user = @student_work.user tip_exception("当前用户无作品可以显示") if @student_work.nil? # 查询最新一次的查重标识query_id - group_id = @course.course_members.where(user_id: params[:user_id]).pluck(:course_group_id).first - query_id = @homework.homework_group_reviews.where(:course_group_id => group_id).last.try(:query_id) + group_id = @course.students.where(user_id: params[:user_id]).pluck(:course_group_id).first + homework_group_review = @homework.homework_group_reviews.where(:course_group_id => group_id).last || @homework.homework_group_reviews.last + query_id = homework_group_review.try(:query_id) + Rails.logger.info("##################------query_id: #{query_id}") + tip_exception(-1, "query_id有误") unless query_id.present? + results = ReviewService.query_result({user_id: params[:user_id], query_id: query_id}) @shixun = @homework.shixuns.take if results.status == 0 diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index 987f4873a..0e9ba477a 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -247,7 +247,7 @@ class MyshixunsController < ApplicationController def update_file begin @hide_code = Shixun.where(id: @myshixun.shixun_id).pluck(:hide_code).first - tip_exception("技术平台为空!") if @myshixun.mirror_name.blank? + tip_exception("实验环境不能为空,请查看实训模板的环境配置项是否正确!") if (@myshixun.mirror_name.blank? || @myshixun.mirror_name.first.to_s == "-1") path = params[:path].strip unless params[:path].blank? game_id = params[:game_id] game = Game.find(game_id) diff --git a/app/models/curriculum.rb b/app/models/curriculum.rb deleted file mode 100644 index 0b78814bc..000000000 --- a/app/models/curriculum.rb +++ /dev/null @@ -1,4 +0,0 @@ -class Curriculum < ApplicationRecord - belongs_to :curriculum_direction - has_many :knowledge_points, dependent: :destroy -end diff --git a/app/models/curriculum_direction.rb b/app/models/curriculum_direction.rb deleted file mode 100644 index 1c9211559..000000000 --- a/app/models/curriculum_direction.rb +++ /dev/null @@ -1,4 +0,0 @@ -class CurriculumDirection < ApplicationRecord - has_many :curriculums - has_many :knowledge_points -end diff --git a/app/models/hack_user_lastest_code.rb b/app/models/hack_user_lastest_code.rb index b4a707603..830f16dde 100644 --- a/app/models/hack_user_lastest_code.rb +++ b/app/models/hack_user_lastest_code.rb @@ -8,7 +8,7 @@ class HackUserLastestCode < ApplicationRecord belongs_to :user has_many :hack_user_codes, dependent: :destroy has_one :hack_user_debug - scope :mine, ->(author_id){ find_by(user_id: author_id) } + scope :mine, ->(author_id){ where(user_id: author_id).first } scope :mine_hack, ->(author_id){ where(user_id: author_id) } scope :passed, -> {where(status: 1)} diff --git a/app/models/item_bank.rb b/app/models/item_bank.rb index 32c349e34..8078a55e0 100644 --- a/app/models/item_bank.rb +++ b/app/models/item_bank.rb @@ -3,8 +3,6 @@ class ItemBank < ApplicationRecord # item_type: 0 单选 1 多选 2 判断 3 填空 4 简答 5 实训 6 编程 enum item_type: { SINGLE: 0, MULTIPLE: 1, JUDGMENT: 2, COMPLETION: 3, SUBJECTIVE: 4, PRACTICAL: 5, PROGRAM: 6 } - belongs_to :curriculum - belongs_to :curriculum_direction belongs_to :user has_one :item_analysis, dependent: :destroy diff --git a/app/models/knowledge_point.rb b/app/models/knowledge_point.rb deleted file mode 100644 index 3d75b66a1..000000000 --- a/app/models/knowledge_point.rb +++ /dev/null @@ -1,5 +0,0 @@ -class KnowledgePoint < ApplicationRecord - belongs_to :curriculum_direction - belongs_to :curriculum - has_many :knowledge_point_containers, dependent: :destroy -end diff --git a/app/models/knowledge_point_container.rb b/app/models/knowledge_point_container.rb deleted file mode 100644 index ea73d00e7..000000000 --- a/app/models/knowledge_point_container.rb +++ /dev/null @@ -1,3 +0,0 @@ -class KnowledgePointContainer < ApplicationRecord - belongs_to :knowledge_point -end diff --git a/app/views/colleges/student_shixun.json.jbuilder b/app/views/colleges/student_shixun.json.jbuilder index 431603afa..97e418148 100644 --- a/app/views/colleges/student_shixun.json.jbuilder +++ b/app/views/colleges/student_shixun.json.jbuilder @@ -7,4 +7,4 @@ json.teachers @students do |student| json.grade student.grade json.experience student.experience end -json.student_count @student_count \ No newline at end of file +# json.student_count @student_count \ No newline at end of file diff --git a/app/views/colleges/teachers.json.jbuilder b/app/views/colleges/teachers.json.jbuilder index 29b383fa4..1308f0cf4 100644 --- a/app/views/colleges/teachers.json.jbuilder +++ b/app/views/colleges/teachers.json.jbuilder @@ -8,4 +8,4 @@ json.teachers @teachers do |teacher| json.complete_rate teacher['complete_rate'] json.publish_shixun_count teacher['publish_shixun_count'] end -json.teacher_count @teacher_count \ No newline at end of file +# json.teacher_count @teacher_count \ No newline at end of file diff --git a/db/migrate/20191218070922_create_curriculum_directions.rb b/db/migrate/20191218070922_create_curriculum_directions.rb deleted file mode 100644 index 9203aa435..000000000 --- a/db/migrate/20191218070922_create_curriculum_directions.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CreateCurriculumDirections < ActiveRecord::Migration[5.2] - def change - create_table :curriculum_directions do |t| - t.string :name - - t.timestamps - end - end -end diff --git a/db/migrate/20191218071017_create_curriculums.rb b/db/migrate/20191218071017_create_curriculums.rb deleted file mode 100644 index 885f2a676..000000000 --- a/db/migrate/20191218071017_create_curriculums.rb +++ /dev/null @@ -1,10 +0,0 @@ -class CreateCurriculums < ActiveRecord::Migration[5.2] - def change - create_table :curriculums do |t| - t.string :name - t.references :curriculum_direction, index: true - - t.timestamps - end - end -end diff --git a/db/migrate/20191218071111_create_knowledge_points.rb b/db/migrate/20191218071111_create_knowledge_points.rb deleted file mode 100644 index 2f748d266..000000000 --- a/db/migrate/20191218071111_create_knowledge_points.rb +++ /dev/null @@ -1,11 +0,0 @@ -class CreateKnowledgePoints < ActiveRecord::Migration[5.2] - def change - create_table :knowledge_points do |t| - t.string :name - t.references :curriculum_direction, index: true - t.references :curriculum, index: true - - t.timestamps - end - end -end diff --git a/db/migrate/20191218071343_create_knowledge_point_containers.rb b/db/migrate/20191218071343_create_knowledge_point_containers.rb deleted file mode 100644 index 0b6944ea7..000000000 --- a/db/migrate/20191218071343_create_knowledge_point_containers.rb +++ /dev/null @@ -1,12 +0,0 @@ -class CreateKnowledgePointContainers < ActiveRecord::Migration[5.2] - def change - create_table :knowledge_point_containers do |t| - t.references :knowledge_point - t.integer :container_id - t.string :container_type - - t.timestamps - end - add_index :knowledge_point_containers, [:knowledge_point_id, :container_id, :container_type], name: "container_index", unique: true - end -end diff --git a/db/migrate/20191219120819_modify_description_for_hacks.rb b/db/migrate/20191219120819_modify_description_for_hacks.rb new file mode 100644 index 000000000..3cc45fd5d --- /dev/null +++ b/db/migrate/20191219120819_modify_description_for_hacks.rb @@ -0,0 +1,10 @@ +class ModifyDescriptionForHacks < ActiveRecord::Migration[5.2] + def change + change_column :hacks, :description, :longtext + change_column :hack_codes, :code, :longtext + change_column :hack_user_lastest_codes, :code, :longtext + change_column :hack_user_codes, :code, :longtext + change_column :hack_user_debugs, :code, :longtext + + end +end diff --git a/public/react/package.json b/public/react/package.json index 66db5e6f8..144292feb 100644 --- a/public/react/package.json +++ b/public/react/package.json @@ -61,6 +61,7 @@ "prop-types": "^15.6.1", "qs": "^6.6.0", "quill": "^1.3.7", + "quill-delta-to-html": "^0.11.0", "raf": "3.4.0", "rc-form": "^2.1.7", "rc-pagination": "^1.16.2", diff --git a/public/react/public/js/jupyter.js b/public/react/public/js/jupyter.js index 8d76a9a7f..6e52088c3 100644 --- a/public/react/public/js/jupyter.js +++ b/public/react/public/js/jupyter.js @@ -1,11 +1,29 @@ -//用于嵌入到jupyter pod中的js -//guange 2019.12.18 - -window.onload=function(){ - require(["base/js/namespace"],function(Jupyter) { - Jupyter.notebook.save_checkpoint(); - }); + window.onload=function(){ + // require(["base/js/namespace"],function(Jupyter) { + // Jupyter.notebook.save_checkpoint(); + // }); + $('.navbar-nav').children().eq(7).css({'display':'none'}) + console.log($('.navbar-nav').children().eq(7)) } + +// //子目标父窗口接收子窗口发送的消息 +// let message = {type: 'open', link:'需要发送的消息'}; +// //子窗口向父窗口发送消息,消息中包含我们想跳转的链接 +// window.parent.postMessage(message,'需要发送的消息'); + + + + // //目标父窗口接收子窗口发送的消息 + // window.addEventListener('message', (e)=>{ + // let origin = event.origin || event.originalEvent.origin; + // if (origin !== '需要发送的消息') { + // return; + // }else { + // //更换iframe的src,实现iframe页面跳转 + // 执行方法 + // } + // },false); + \ No newline at end of file diff --git a/public/react/src/App.js b/public/react/src/App.js index 93b293e36..07fd13e49 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -72,6 +72,7 @@ const Otherlogin=Loadable({ loading: Loading, }) + const Otherloginstart=Loadable({ loader: () => import('./modules/login/Otherloginstart'), loading: Loading, @@ -300,6 +301,11 @@ const Developer = Loadable({ loader: () => import('./modules/developer'), loading: Loading }) +// 学院统计 +const College = Loadable({ + loader: () => import('./college/College'), + loading: Loading +}) // 开发者编辑模块 const NewOrEditTask = Loadable({ @@ -614,7 +620,10 @@ class App extends Component { {/*/>*/} - + () + }/> {/* jupyter */} + () } /> + () diff --git a/public/react/src/college/College.js b/public/react/src/college/College.js new file mode 100644 index 000000000..bc43252b7 --- /dev/null +++ b/public/react/src/college/College.js @@ -0,0 +1,1259 @@ +import React, {Component} from "react"; +import {Link, NavLink} from 'react-router-dom'; +import {WordsBtn, ActionBtn,SnackbarHOC,getImageUrl} from 'educoder'; +import axios from 'axios'; +import { + notification, + Spin, + Table, + Pagination, +} from "antd"; +import Colleagechart from './colleagechart/Colleagechart' +import Colleagechartzu from './colleagechart/Colleagechartzu' +import {TPMIndexHOC} from "../modules/tpm/TPMIndexHOC"; +import NoneData from './../modules/courses/coursesPublic/NoneData'; + +import './colleagecss/colleage.css'; +import Shixunechart from "../modules/courses/shixunHomework/shixunreport/Shixunechart"; +class College extends Component { + constructor(props) { + super(props); + // this.answerMdRef = React.createRef(); + this.state = { + coursesloading:false, + columns: [ + { + title: '名称', + dataIndex: 'name', + key: 'name', + align: 'center', + className: "edu-txt-center font-14 maxnamewidth247", + render: (text, record) => ( + { + record.name + } + ) + }, + { + title: '管理教师', + dataIndex: 'teachers', + key: 'teachers', + align: 'center', + className: "edu-txt-center font-14 maxnamewidth340", + render: (text, record) => ( + + { + record.teachers + } + + ) + }, + { + title: '评测次数', + dataIndex: 'times', + key: 'times', + align: 'center', + className: "edu-txt-center font-14 maxnamewidth175", + render: (text, record) => ( + + { + record.evaluating_count + } + + ), + }, + { + title: '学生', + key: 'student', + dataIndex: 'student', + align: 'center', + className: "edu-txt-center font-14 maxnamewidth255", + render: (text, record) => ( + + { + record.student_count + } + + ) + }, + { + title: '实训作业', + dataIndex: 'training', + key: 'training', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.shixun_work_count + } + + ) + + }, + { + title: '资源', + dataIndex: 'resources', + key: 'resources', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.attachment_count + } + + ), + }, + { + title: '帖子', + dataIndex: 'posts', + key: 'posts', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + { + record.message_count + } + ) + }, + { + title: '其它任务', + dataIndex: 'othertasks', + key: 'othertasks', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.other_work_count + } + + ) + }, + { + title: '状态', + dataIndex: 'states', + key: 'states', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.is_end? + "已结束" + : + "正在进行" + } + + ) + }, + { + title: '时间', + dataIndex: 'timemy', + key: 'timemy', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.activity_time + } + + ) + }, + ], + page:1, + limit:10, + total_users:50, + teachersloading:false, + teacherranking:[ + { + title: '排名', + dataIndex: 'ranking', + key: 'ranking', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.id + } + + ) + }, + { + title: '姓名', + dataIndex: 'name', + key: 'name', + align: 'center', + className: "edu-txt-center font-14 maxnamewidth105", + render: (text, record) => ( + { + record.name + } + + ) + }, + { + title: '管理课堂', + dataIndex: 'classroom', + key: 'classroom', + align: 'center', + className: "edu-txt-center font-14 maxnamewidth175", + render: (text, record) => ( + + { + record.course_count + } + + ), + }, + { + title: '已发布实训作业', + key: 'assignment', + dataIndex: 'assignment', + align: 'center', + className: "edu-txt-center font-14 maxnamewidth255", + render: (text, record) => ( + + { + record.shixun_work_count + } + + ) + }, + { + title: '未发布实训作业', + dataIndex: 'released', + key: 'released', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.un_shixun_work_count + } + + ) + + }, + { + title: '学生数', + dataIndex: 'studentnumber', + key: 'studentnumber', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.student_count + } + + ), + }, + { + title: '完成率', + dataIndex: 'completionrate', + key: 'completionrate', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.complete_rate+"%" + } + + ) + }, + { + title: '发布实训', + dataIndex: 'releasetraining', + key: 'releasetraining', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.publish_shixun_count + } + + ) + } + ], + studentranking:[ + { + title: '排名', + dataIndex: 'ranking', + key: 'ranking', + align: 'center', + className: "edu-txt-center font-14", + width:'100px', + render: (text, record) => ( + + { + record.id===1? + :record.id===2? + + :record.id===3? + + :record.id + } + + ) + }, + { + title: '姓名', + dataIndex: 'name', + key: 'name', + align: 'center', + className: "edu-txt-center font-14 maxnamewidth105", + width:'100px', + render: (text, record) => ( + { + record.name + } + + ) + }, + { + title: '学号', + dataIndex: 'studentid', + key: 'studentid', + align: 'center', + className: "edu-txt-center font-14 maxnamewidth175", + render: (text, record) => ( + + { + record.student_id + } + + ), + }, + { + title: '完成实训', + key: 'training', + dataIndex: 'training', + align: 'center', + className: "edu-txt-center font-14 maxnamewidth255", + render: (text, record) => ( + + { + record.shixun_count + } + + ) + }, + { + title: '在学实训', + dataIndex: 'learning', + key: 'learning', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.study_shixun_count + } + + ) + + }, + { + title: '金币', + dataIndex: 'goldcoin', + key: 'goldcoin', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.grade + } + + ), + }, + { + title: '经验值', + dataIndex: 'empirical', + key: 'empirical', + align: 'center', + className: "edu-txt-center font-14", + render: (text, record) => ( + + { + record.experience + } + + ) + }, + ], + school:"", + teachers_count:null, + students_count:null, + courses_count:null, + shixuns_count:null, + shixun_report_count:null, + shixun_time:null, + courses:null, + course_count:0, + pages:1, + limits:10, + teachers:null, + teacher_count:0, + students:null, + student_count:0, + shixun_chart_data:null, + shixun_chart_datanames:null, + studentionsnames:null, + studentionsvalues:null + } + + } + + + componentDidMount(){ + console.log("College"); + console.log(this.props.match.params.id); + this.gettop(); + this.Numberofinternshipreports(); + this.Actualcombattimeoftrainees(); + this.Classnumber(1,10); + this.Teacherranking(1,10); + this.Studentranking(1,10); + this.Onlinetraining(); + this.Hottest(); + } + //头部 + gettop=()=>{ + const id =this.props.match.params.id; + const url=`/colleges/${id}/statistics.json`; + axios.get(url).then((response) => { + if(response===null||response===undefined){ + this.setState({ + teachers_count:0, + students_count:0, + courses_count:0, + shixuns_count:0, + school:"", + }) + return + } + if (response.data.status === 403||response.data.status === 401||response.data.status === 500) { + this.setState({ + teachers_count:0, + students_count:0, + courses_count:0, + shixuns_count:0, + school:"", + }) + }else{ + this.setState({ + teachers_count:response.data.teachers_count, + students_count:response.data.students_count, + courses_count:response.data.courses_count, + shixuns_count:response.data.shixuns_count, + school:response.data.school, + }) + } + }).catch((error) => { + console.log(error) + this.setState({ + teachers_count:0, + students_count:0, + courses_count:0, + shixuns_count:0, + school:"", + }) + }); + } + + //获取实训报告数 + Numberofinternshipreports=()=>{ + const id =this.props.match.params.id; + const url=`/colleges/${id}/shixun_report_count.json`; + axios.get(url).then((response) => { + if(response===null||response===undefined){ + this.setState({ + shixun_report_count:0, + }) + return + } + if (response.data.status === 403||response.data.status === 401||response.data.status === 500) { + this.setState({ + shixun_report_count:0, + }) + }else{ + if (response.data.status === -1){ + this.setState({ + shixun_report_count:0, + }) + return + } + this.setState({ + shixun_report_count:response.data.shixun_report_count, + }) + } + }).catch((error) => { + console.log(error) + this.setState({ + shixun_report_count:0, + }) + }); + } + + //学员实战时间 + Actualcombattimeoftrainees=()=>{ + const id =this.props.match.params.id; + const url=`/colleges/${id}/shixun_time.json`; + axios.get(url).then((response) => { + if(response===null||response===undefined){ + this.setState({ + shixun_time:0, + }) + return + } + if (response.data.status === 403||response.data.status === 401||response.data.status === 500) { + this.setState({ + shixun_time:0, + }) + }else{ + if (response.data.status === -1){ + this.setState({ + shixun_time:0, + }) + return + } + this.setState({ + shixun_time:response.data.shixun_time, + }) + } + }).catch((error) => { + console.log(error) + this.setState({ + shixun_time:0, + }) + }); + } + + //课堂信息 + Classnumber=(page,per_page)=>{ + const id =this.props.match.params.id; + const url=`/colleges/${id}/course_statistics.json`; + this.setState({ + coursesloading:true + }) + axios.get(url,{params:{ + page:page, + per_page:per_page, + } + }).then((response) => { + if(response===null||response===undefined){ + this.setState({ + courses:[], + course_count:0 + }) + return + } + if (response.data.status === 403||response.data.status === 401||response.data.status === 500) { + this.setState({ + courses:[], + course_count:0 + }) + }else{ + if (response.data.status === -1){ + this.setState({ + courses:[], + course_count:0 + }) + return + } + this.setState({ + courses:response.data.courses, + course_count:response.data.course_count, + page:page, + limit:per_page + }) + } + this.setState({ + coursesloading:false + }) + }).catch((error) => { + this.setState({ + courses:[], + course_count:0, + coursesloading:false + }) + }); + } + + //教师排名 + Teacherranking=(page,per_page)=>{ + const id =this.props.match.params.id; + const url=`/colleges/${id}/teachers.json`; + this.setState({ + teachersloading:true + }) + axios.get(url,{params:{ + page:page, + per_page:per_page, + } + }).then((response) => { + if(response===null||response===undefined){ + this.setState({ + teachers:[], + teacher_count:0 + }) + return + } + if (response.data.status === 403||response.data.status === 401||response.data.status === 500) { + this.setState({ + teachers:[], + teacher_count:0 + }) + }else{ + if (response.data.status === -1){ + this.setState({ + teachers:[], + teacher_count:0 + }) + return + } + let teachers=[]; + if(response.data.teachers){ + for(let i=0;i { + this.setState({ + teachers:[], + teacher_count:0, + teachersloading:false + }) + }); + } + //学生排名 + + Studentranking=(page,per_page)=>{ + const id =this.props.match.params.id; + const url=`/colleges/${id}/student_shixun.json`; + this.setState({ + studentsloading:true + }) + axios.get(url,{params:{ + page:page, + per_page:per_page, + } + }).then((response) => { + if(response===null||response===undefined){ + this.setState({ + students:[], + student_count:0, + }) + return + } + if (response.data.status === 403||response.data.status === 401||response.data.status === 500) { + this.setState({ + students:[], + student_count:0, + }) + }else{ + if (response.data.status === -1){ + this.setState({ + students:[], + student_count:0, + }) + return + } + let students=[]; + if(response.data.teachers){ + for(let i=0;i { + this.setState({ + students:[], + student_count:0, + studentsloading:false + }) + }); + } + + //在线实训情况 + Onlinetraining=()=>{ + const id =this.props.match.params.id; + const url=`/colleges/${id}/shixun_chart_data.json`; + axios.get(url).then((response) => { + if (response.data.status === 403||response.data.status === 401||response.data.status === 500) { + this.setState({ + shixun_chart_data:[], + shixun_chart_datanames:[] + }) + }else{ + if (response.data.status === -1){ + this.setState({ + shixun_chart_data:[], + shixun_chart_datanames:[] + }) + return + } + + this.setState({ + shixun_chart_data:response.data.data, + shixun_chart_datanames:response.data.names + }) + } + }).catch((error) => { + this.setState({ + shixun_chart_data:[], + shixun_chart_datanames:[] + }) + }); + } + //最热测评 + Hottest=()=>{ + const id =this.props.match.params.id; + const url=`/colleges/${id}/student_hot_evaluations.json`; + axios.get(url).then((response) => { + if (response.data.status === 403||response.data.status === 401||response.data.status === 500) { + this.setState({ + studentionsnames: [], + studentionsvalues: [] + }) + }else { + if (response.data.status === -1) { + this.setState({ + studentionsnames: [], + studentionsvalues: [] + }) + return + } + this.setState({ + studentionsnames: response.data.names, + studentionsvalues: response.data.values + }) + } + }).catch((error) => { + this.setState({ + studentionsnames: [], + studentionsvalues: [] + }) + }); + } + + table1handleChange(){ + + } + + //塞选 + paginationonChange=(pageNumber)=>{ + this.Classnumber(pageNumber,10); + } + + paginationonChanges=(pageNumber)=>{ + this.Teacherranking(pageNumber,10); + } + paginationonChangess=(pageNumber)=>{ + this.Studentranking(pageNumber,10); + } + render() { + let {columns,page,limit,total_users,teacherranking,studentranking, + teachers_count,students_count, courses_count, shixuns_count,shixun_report_count,shixun_time,courses,course_count,school,teachers, + pages,limits, teacher_count,teachersloading,coursesloading,pagess,limitss,studentsloading,students,student_count,shixun_chart_data, + shixun_chart_datanames, studentionsnames,studentionsvalues + } = this.state; + + return ( +
+
+
+
{school}
+
+
+ {/*//教师1*/} +
+ 教师 +
+
+ {teachers_count?teachers_count:0} +
+
+ +
+
+ 学生 +
+
+ {students_count?students_count:0} +
+
+ +
+
+ 课堂 +
+
+ {courses_count?courses_count:0} +
+
+ +
+
+ 共建实训 +
+
+ {shixuns_count?shixuns_count:0} +
+
+ {/*//教师2*/} + + + + +
+
+
+
+

+ 基本使用情况 +

+ {/*基本使用情况1*/} +
+

+ 教师 +

+

+ 学生 +

+

+ 课堂 +

+

+ 共建实训 +

+

+ 实习报告 +

+

+ 学员实战时间 +

+
+ + + {/*基本使用情况2*/} +
+
+ { + teachers_count? +
{teachers_count}
+ : + + } +
+
+ { + students_count? +
{students_count}
+ : + + } +
+
+ { + courses_count? +
{courses_count}
+ : + + } +
+
+ { + shixuns_count? +
{shixuns_count}
+ : + + } +
+
+ { + shixun_report_count? +
{shixun_report_count}
+ : + + } +
+
+ { + shixun_time? +
{shixun_time}
+ : + + } +
+
+ {/*基本使用情况3结束*/} +
+ + +
+

+ 课堂 +

+ { + courses===null? +
+ +
+ + : + JSON.stringify(courses) === "[]" ? + + + + : +
+
+ +
+ {courses === undefined ? "" : } + + + { + course_count>=11? +
+
+ +
+ +
+ :"" + } + + + } + + + + + +
+
+

+ 教师排名 +

+ { + teachers===null? +
+ +
+ + : + JSON.stringify(teachers) === "[]" ? + + + + : +
+ +
+ {teachers === undefined ? "" :
} + + + } + + + + {/*
*/} + {/*
*/} + {/* */} + {/*
*/} + + {/*
*/} + + +
+

+ 在线实训情况 +

+ { + shixun_chart_data===null? +
+ +
+ + : + JSON.stringify(shixun_chart_data) === "[]" ? + + + + : + + + + } + +
+
+ + + +
+
+

+ 学生排名 +

+ { + students === null ? +
+ +
+ + : + JSON.stringify(students) === "[]" ? + + + + : +
+ +
+ {students === undefined ? "" :
} + + + } + {/*
*/} + {/*
*/} + {/* */} + {/*
*/} + + {/*
*/} + + + + +
+ +
+

+ 最热评测 +

+ { + studentionsnames===null? +
+ +
+ + : + JSON.stringify(studentionsnames) === "[]" ? + + + + : + + + + } + + +
+
+ + + ) + } +} +export default SnackbarHOC() (TPMIndexHOC ( College )); + + diff --git a/public/react/src/college/colleagechart/Colleagechart.js b/public/react/src/college/colleagechart/Colleagechart.js new file mode 100644 index 000000000..fca01280a --- /dev/null +++ b/public/react/src/college/colleagechart/Colleagechart.js @@ -0,0 +1,84 @@ +import React, {Component} from "react"; +import {WordsBtn} from 'educoder'; +import {Table} from "antd"; +import {Link,Switch,Route,Redirect} from 'react-router-dom'; +const echarts = require('echarts'); + + + +function startechart(data,datanane){ + var effChart = echarts.init(document.getElementById('shixun_skill_chart')); + + var option = { + + tooltip : { + trigger: 'item', + formatter: "{d}%
" + }, + legend: { + // orient: 'vertical', + // top: 'middle', + bottom: 50, + left: 'center', + data: datanane + }, + series : [ + { + type: 'pie', + radius : '65%', + center: ['50%', '35%'], + selectedMode: 'single', + data:data, + itemStyle: { + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + } + } + ] + }; + effChart.setOption(option); +} +class Colleagechart extends Component { + + constructor(props) { + super(props); + this.state = { + } + } + + componentDidMount() { + startechart(this.props.data,this.props.datanane) + } + + + componentDidUpdate = (prevProps) => { + if (prevProps.data!= this.props.data) { + startechart(this.props.data,this.props.datanane) + } + } + + + render() { + let {data}=this.props; + + return ( +
+ +
+
+ + + + +
+ + ) + } +} + +export default Colleagechart; diff --git a/public/react/src/college/colleagechart/Colleagechartzu.js b/public/react/src/college/colleagechart/Colleagechartzu.js new file mode 100644 index 000000000..5c0269700 --- /dev/null +++ b/public/react/src/college/colleagechart/Colleagechartzu.js @@ -0,0 +1,149 @@ +import React, {Component} from "react"; +import {WordsBtn} from 'educoder'; +import {Table} from "antd"; +import {Link,Switch,Route,Redirect} from 'react-router-dom'; +const echarts = require('echarts'); + + + +function startechart(names, values){ + var effChart = echarts.init(document.getElementById('shixun_skill_charts')); + + var Color = ['#962e66', '#623363', '#CCCCCC', '#9A9A9A', '#FF8080', '#FF80C2', '#B980FF', '#80B9FF', '#6FE9FF', '#4DE8B4', '#F8EF63', '#FFB967']; + + var option = { + backgroundColor: '#fff', + grid: { + left: '3%', + right: '8%', + bottom: '15%', + containLabel: true + }, + + tooltip: { + show: "true", + trigger: 'item', + formatter: '{c0}', + backgroundColor: 'rgba(0,0,0,0.7)', // 背景 + padding: [8, 10], //内边距 + extraCssText: 'box-shadow: 0 0 3px rgba(255, 255, 255, 0.4);', //添加阴影 + axisPointer: { // 坐标轴指示器,坐标轴触发有效 + type: 'shadow' // 默认为直线,可选为:'line' | 'shadow' + } + }, + xAxis: { + type: 'value', + axisTick: { + show: false + }, + axisLine: { + show: true, + lineStyle: { + color: '#CCCCCC' + } + }, + splitLine: { + show: false, + lineStyle: { + color: '#CCCCCC' + } + }, + axisLabel: { + textStyle: { + color: '#656565', + fontWeight: 'normal', + fontSize: '12' + }, + formatter: '{value}' + } + }, + yAxis: { + type: 'category', + axisLine: { + lineStyle: { + color: '#cccccc' + } + }, + splitLine: { + show: false + }, + axisTick: { + show: false + }, + splitArea: { + show: false + }, + axisLabel: { + inside: false, + textStyle: { + color: '#656565', + fontWeight: 'normal', + fontSize: '12' + } + }, + data: names + }, + series: [{ + name: '', + type: 'bar', + itemStyle: { + normal: { + show: true, + color: function(params) { + return Color[params.dataIndex] + }, + barBorderRadius: 50, + borderWidth: 0, + borderColor: '#333' + } + }, + barGap: '0%', + barCategoryGap: '50%', + data: values + } + + ] + }; + effChart.setOption(option); +} +class Colleagechartzu extends Component { + + constructor(props) { + super(props); + this.state = { + } + } + + componentDidMount() { + startechart(this.props.data,this.props.datavule) + } + + + componentDidUpdate = (prevProps) => { + if (prevProps.data!= this.props.data) { + startechart(this.props.data,this.props.datavule) + } + } + + + render() { + let {data}=this.props; + + return ( +
+ +
+
+ + + + +
+ + ) + } +} + +export default Colleagechartzu; diff --git a/public/react/src/college/colleagecss/colleage.css b/public/react/src/college/colleagecss/colleage.css new file mode 100644 index 000000000..801b86603 --- /dev/null +++ b/public/react/src/college/colleagecss/colleage.css @@ -0,0 +1,213 @@ +.yslstatistic-header { + width: 100%; + height: 240px; + background-image: url('/images/educoder/statistics.jpg'); + background-size: 100% 100%; +} +.yslborder{ + border: 1px solid; +} +.yslstatistic-header-title{ + flex: 1; + display: flex; + align-items: center; + color: #4CACFF; + font-size: 32px; +} +.yslstatistic-header-content{ + width: 100%; + display: flex; + justify-content: space-around; +} +.yslstatistic-header-item{ + margin-bottom: 22px; + display: flex; + flex-direction: column; + align-items: center; + color: #fff; +} +.yslstatistic-header-item-label{ + color: #989898; +} + +.yslstatistic-base-item-label{ + width: 217px; + text-align: center; + font-size: 16px; + height: 48px; + line-height: 48px; + color: #686868; + background: #F5F5F5; + border-top: 1px solid #EBEBEB; +} +.yslstatistic-base-item-labels{ + width: 217px; + text-align: center; + height: 100px; + line-height: 100px; + background: #ffffff; + border-top: 1px solid #EBEBEB; + border-bottom: 1px solid #EBEBEB; +} +.yslstatistic-base-item-labelsp{ + color: #000000; + font-size: 24px; +} +.yslstatistic-base-item-labelsspan{ + color: #000000; + margin-left: 5px; + font-size: 16px; +} +.jibenshiyong100{ + width: 100%; +} + +.yslstatistic-header-item-content{ + font-size: 24px; +} +/* 中间居中 */ +.intermediatecenter{ + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} +/* 简单居中 */ +.intermediatecenterysls{ + display: flex; + align-items: center; +} +.spacearound{ + display: flex; + justify-content: space-around; + +} +.spacebetween{ + display: flex; + justify-content: space-between; +} +/* 头顶部居中 */ +.topcenter{ + display: -webkit-flex; + flex-direction: column; + align-items: center; + +} + + +/* x轴正方向排序 */ +/* 一 二 三 四 五 六 七 八 */ +.sortinxdirection{ + display: flex; + flex-direction:row; +} +/* x轴反方向排序 */ +/* 八 七 六 五 四 三 二 一 */ +.xaxisreverseorder{ + display: flex; + flex-direction:row-reverse; +} +/* 垂直布局 正方向*/ +/* 一 + 二 + 三 + 四 + 五 + 六 + 七 + 八 */ +.verticallayout{ + display: flex; + flex-direction:column; +} +/* 垂直布局 反方向*/ +.reversedirection{ + display: flex; + flex-direction:column-reverse; +} + +.h4{ + font-size: 1.5rem; + font-weight: 500 !important; +} +.ysllinjibenshiyong{ + font-weight: 500; + line-height: 1.2; + padding: 2rem 1.25rem; + border-bottom: unset; + background:#fff; +} +.linjibenshiyong{ + font-weight: 500; + line-height: 1.2; + padding: 2rem 1.25rem; + border-bottom: unset; + background:#fff; + box-shadow:0px 6px 12px 0px rgba(0,0,0,0.1); + border-radius:2px; +} +.yslslinjibenshiyong{ + font-weight: 500; + line-height: 1.2; + border-bottom: unset; + box-shadow:0px 6px 12px 0px rgba(0,0,0,0.1); + border-radius:2px; +} +.yinyin{ + background: #fff; + box-shadow:0px 6px 12px 0px rgba(0,0,0,0.1); + border-radius:2px; +} +.edu-back-eeee{ + background:#EEEEEE !important; +} +.mt-4{ + margin-top: 1.5rem !important; +} + +.statistic-label{ + padding: 2rem 1.25rem; + font-size: 1.5rem; + font-weight: 400 !important; +} +.mb50{ + padding-bottom: 50px !important; +} +.mt40{ + margin-top: 40px; +} +.mb80{ + margin-bottom: 80px; +} +.task-hide{overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +a:hover{ + color:#0056b3; +} +.color-blue{ + color: #4CACFF; +} + +.color-huang{ + color:#ffc107 !important +} +.maxnamewidth105{ + max-width: 105px; + overflow:hidden; + text-overflow:ellipsis; + white-space:nowrap; + cursor: default; +} +.maxnamewidth247{ + max-width: 247px; + overflow:hidden; + text-overflow:ellipsis; + white-space:nowrap; + cursor: default; +} +.maxnamewidth340{ + max-width: 340px; + overflow:hidden; + text-overflow:ellipsis; + white-space:nowrap; + cursor: default; +} diff --git a/public/react/src/common/components/comment/CommentForm.js b/public/react/src/common/components/comment/CommentForm.js new file mode 100644 index 000000000..73e36cff9 --- /dev/null +++ b/public/react/src/common/components/comment/CommentForm.js @@ -0,0 +1,116 @@ +/* + * @Description: 评论表单 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-17 17:32:55 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-18 17:51:44 + */ +import React, { useState } from 'react'; +import { Form, Button, Input } from 'antd'; +import QuillForEditor from '../../quillForEditor'; +import { QuillDeltaToHtmlConverter } from 'quill-delta-to-html' +const FormItem = Form.Item; + +function CommentForm (props) { + + const { + commentCtxChagne, + onCancel, + onSubmit, + form + } = props; + + const { getFieldDecorator } = form; + const [ctx, setCtx] = useState(''); + + const options = [ + ['bold', 'italic', 'underline'], + [{header: [1,2,3,false]}], + ['blockquote', 'code-block'], + ['link', 'image'], + ['formula'] + ]; + // const { form: { getFieldDecorator } } = props; + const [showQuill, setShowQuill] = useState(false); + // 点击输入框 + const handleInputClick = () => { + setShowQuill(true); + } + // 取消 + const handleCancle = () => { + setShowQuill(false); + onCancel && onCancel(); + } + + // 编辑器内容变化时 + const handleContentChange = (content) => { + setCtx(content); + try { + const _html = new QuillDeltaToHtmlConverter(content.ops, {}).convert(); + // props.form.setFieldsValue({'comment': _html.replace(/<\/?[^>]*>/g, '')}); + props.form.setFieldsValue({'comment': _html}); + } catch (error) { + console.log(error); + } + } + // 发送 + const handleSubmit = (e) => { + e.preventDefault(); + props.form.validateFields((err, values) => { + if (!err) { + setShowQuill(false); + const content = ctx; + props.form.setFieldsValue({'comment': ''}); + setCtx(''); + console.log(content); + onSubmit && onSubmit(content); + } + }); + } + return ( + + + { + getFieldDecorator('comment', { + rules: [ + { required: true, message: '评论内容不能为空'} + ], + })( + + ) + } + + + + + + + + + ); +} + +export default Form.create()(CommentForm); diff --git a/public/react/src/common/components/comment/CommentIcon.js b/public/react/src/common/components/comment/CommentIcon.js new file mode 100644 index 000000000..5440e2579 --- /dev/null +++ b/public/react/src/common/components/comment/CommentIcon.js @@ -0,0 +1,32 @@ +/* + * @Description: + * @Author: tangjiang + * @Github: + * @Date: 2019-12-18 10:49:46 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-18 11:39:23 + */ +import './index.scss'; +import React from 'react'; +import { Icon } from 'antd'; +function CommentIcon ({ + type, // 图标类型 + count, // 评论数 + iconClick, + ...props +}) { + + // 点击图标 + const handleSpanClick = () => { + iconClick && iconClick(); + } + + return ( + + + { count } + + ) +} + +export default CommentIcon; diff --git a/public/react/src/common/components/comment/CommentItem.js b/public/react/src/common/components/comment/CommentItem.js new file mode 100644 index 000000000..19da645f5 --- /dev/null +++ b/public/react/src/common/components/comment/CommentItem.js @@ -0,0 +1,165 @@ +/* + * @Description: 评论单列 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-17 17:35:17 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-19 18:02:28 + */ +import './index.scss'; +import React, { useState } from 'react'; +import CommentIcon from './CommentIcon'; +import { getImageUrl, CNotificationHOC } from 'educoder' +import { Icon } from 'antd'; +import moment from 'moment'; +// import QuillForEditor from '../../quillForEditor'; +import CommentForm from './CommentForm'; + +// import {ModalConfirm} from '../ModalConfirm'; +function CommentItem ({ + options, + confirm +}) { + // 显示评论输入框 + const [showQuill, setShowQuill] = useState(false); + // 加载更多评论内容 + const [showMore, setShowMore] = useState(false); + // 箭头方向 + const [arrow, setArrow] = useState(false); + // 删除评论 + const deleteComment = () => { + console.log('删除评论...'); + confirm({ + title: '提示', + content: (

确定要删除该条回复吗?

), + onOk () { + console.log('点击了删除'); + } + }); + // ModalConfirm('提示', (

确定要删除该条回复吗?

), () => { + // console.log('点击了删除'); + // }); + } + + // 评论头像 + const commentAvatar = (url) => ( + + ); + + // 评论信息 + const commentInfo = () => ( +

+ 用户名 + {moment(new Date(), 'YYYYMMDD HHmmss').fromNow()} + +

+ ); + + // 评论内容 + const commentCtx = (ctx) => ( +

+ 这是评论内容这是评论内容这是评论内容这是评论内容这是评论内容这是评论内容这是评论内容这是评论内容这是评论内容这是评论内容 +

+ ); + + // 加载更多 + const handleOnLoadMore = () => { + if (!arrow) { + // 展开所有 + } else { + // 收起 + } + setArrow(!arrow); + }; + + // 评论追加内容 + const commentAppend = () => { + + return ( +
    +
  • + {commentAvatar()} +
    + {commentInfo()} + {commentCtx()} +
    +
  • +
  • + {commentAvatar()} +
    + {commentInfo()} + {commentCtx()} +
    +
  • +
  • + {commentAvatar()} +
    + {commentInfo()} + {commentCtx()} +
    +
  • + +
  • +

    展开其余23条评论

    +

    + +

    +
  • +
+ ); + }; + // 点击图标 + const handleIconClick = () => {} + + // 点击评论icon + const handleClickMessage = () => { + setShowQuill(true); + } + + // 点击取消 + const handleClickCancel = () => { + setShowQuill(false); + } + + // 点击保存 + const handleClickSubmit = (content) => { + // 保存并关闭 + setShowQuill(false); + console.log('获取保存内容', content); + } + + return ( +
  • + {commentAvatar()} +
    + {commentInfo()} + {commentCtx()} + + {commentAppend()} + +
    + + {/* 回复 */} + + {/* 点赞 */} + +
    + +
    + +
    +
    +
  • + ); +} + +export default CNotificationHOC() (CommentItem); diff --git a/public/react/src/common/components/comment/CommentList.js b/public/react/src/common/components/comment/CommentList.js new file mode 100644 index 000000000..9d8cde87b --- /dev/null +++ b/public/react/src/common/components/comment/CommentList.js @@ -0,0 +1,20 @@ +/* + * @Description: 评论列表页 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-17 17:34:00 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-18 11:48:09 + */ +import './index.scss'; +import React from 'react'; +import CommentItem from './CommentItem'; +function CommentList ({}) { + return ( +
      + +
    + ); +} + +export default CommentList; diff --git a/public/react/src/common/components/comment/index.js b/public/react/src/common/components/comment/index.js new file mode 100644 index 000000000..f0ecf3309 --- /dev/null +++ b/public/react/src/common/components/comment/index.js @@ -0,0 +1,22 @@ +/* + * @Description: 评论组件 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-17 17:31:33 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-18 11:47:39 + */ +import React from 'react'; +import CommentForm from './CommentForm'; +import CommentList from './CommentList'; +function Comment (props) { + + return ( + + + + + ); +} + +export default Comment; diff --git a/public/react/src/common/components/comment/index.scss b/public/react/src/common/components/comment/index.scss new file mode 100644 index 000000000..816e6da6c --- /dev/null +++ b/public/react/src/common/components/comment/index.scss @@ -0,0 +1,111 @@ +$bdColor: rgba(244,244,244,1); +$bgColor: rgba(250,250,250,1); +$lh14: 14px; +$lh22: 22px; +$fz14: 14px; +$fz12: 12px; +$ml: 20px; + +.comment_list_wrapper{ + box-sizing: border-box; + border-top: 1px solid $bdColor; + + .comment_item_area{ + display: flex; + padding: 20px 0; + box-sizing: border-box; + border-bottom: 1px solid $bdColor; + .flex-image{ + width: 48px; + height: 48px; + border-radius: 50%; + } + .item-desc{ + flex: 1; + margin-left: $ml; + } + .item-header{ + font-size: $fz14; + line-height: $lh14; + color: #333; + .item-time{ + font-size: $fz12; + line-height: $lh14; + margin-left: $ml; + } + .item-close{ + float: right; + cursor: pointer; + } + } + .item-ctx{ + line-height: $lh22; + font-size: $fz12; + color: #333; + margin-top: 10px; + } + .comment_icon_area{ + display: flex; + justify-content: flex-end; + margin-top: 10px; + + .comment-icon-margin{ + margin-left: 30px; + } + } + + .comment_item_quill{ + margin-top: 20px; + } + } + .comment_icon_count{ + cursor: pointer; + font-size: 12px; + line-height: 1.5; + + .comment_icon{ + color: #333; + } + .comment_count{ + color: #999999; + margin-left: 10px; + transition: color .3s; + } + + &:hover{ + .comment_icon, + .comment_count{ + color: #5091FF; + } + } + } + .comment_item_append_list{ + position: relative; + background-color: $bgColor; + border-radius: 5px; + padding: 0 15px 10px; + margin: 15px 0; + &::before { + position: absolute; + left: 15px; + bottom: 100%; + height: 0; + width: 0; + content: ''; + // border: 5px solid transparent; + border: 10px solid transparent; + border-bottom-color: $bgColor; + } + + .comment_item_loadmore{ + padding-top: 10px; + cursor: pointer; + .loadmore-txt, + .loadmore-icon{ + color: #999; + text-align: center; + font-size: $fz12; + } + } + } +} \ No newline at end of file diff --git a/public/react/src/common/quillForEditor/ImageBlot.js b/public/react/src/common/quillForEditor/ImageBlot.js new file mode 100644 index 000000000..091bd2c1f --- /dev/null +++ b/public/react/src/common/quillForEditor/ImageBlot.js @@ -0,0 +1,54 @@ +/* + * @Description: 重写图片 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-16 15:50:45 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-17 16:44:48 + */ +import Quill from "quill"; + +const BlockEmbed = Quill.import('blots/block/embed'); + +export default class ImageBlot extends BlockEmbed { + + static create(value) { + + const node = super.create(); + + node.setAttribute('alt', value.alt); + node.setAttribute('src', value.url); + + if (value.width) { + node.setAttribute('width', value.width); + } + if (value.height) { + node.setAttribute('height', value.height); + } + // 宽度和高度都不存在时, + if (!value.width && !value.height) { + node.setAttribute('display', 'block'); + node.setAttribute('width', '100%'); + } + // 给图片添加点击事件 + node.onclick = () => { + value.onClick && value.onClick(value.url); + } + return node; + } + + static value (node) { + + return { + alt: node.getAttribute('alt'), + url: node.getAttribute('src'), + onclick: node.onclick, + // width: node.width, + // height: node.height, + display: node.getAttribute('display') + }; + } +} + +ImageBlot.blotName = 'image'; +ImageBlot.tagName = 'img'; \ No newline at end of file diff --git a/public/react/src/common/quillForEditor/deepEqual.js b/public/react/src/common/quillForEditor/deepEqual.js new file mode 100644 index 000000000..6f2b276bf --- /dev/null +++ b/public/react/src/common/quillForEditor/deepEqual.js @@ -0,0 +1,47 @@ +function deepEqual (prev, current) { + if (prev === current) { // 基本类型比较,值,类型都相同 或者同为 null or undefined + return true; + } + + if ((!prev && current) + || (prev && !current) + || (!prev && !current) + ) { + return false; + } + + if (Array.isArray(prev)) { + if (!Array.isArray(current)) return false; + if (prev.length !== current.length) return false; + + for (let i = 0; i < prev.length; i++) { + if (!deepEqual(current[i], prev[i])) { + return false; + } + } + return true; + } + + if (typeof current === 'object') { + if (typeof prev !== 'object') return false; + const prevKeys = Object.keys(prev); + const curKeys = Object.keys(current); + + if (prevKeys.length !== curKeys.length) return false; + + prevKeys.sort(); + curKeys.sort(); + + for (let i = 0; i < prevKeys.length; i++) { + if (prevKeys[i] !== curKeys[i]) return false; + const key = prevKeys[i]; + if (!deepEqual(prev[key], current[key])) return false; + } + + return true; + } + + return false; +} + +export default deepEqual; diff --git a/public/react/src/common/quillForEditor/index.js b/public/react/src/common/quillForEditor/index.js new file mode 100644 index 000000000..6e6c01886 --- /dev/null +++ b/public/react/src/common/quillForEditor/index.js @@ -0,0 +1,166 @@ +/* + * @Description: quill 编辑器 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-18 08:49:30 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-19 16:58:50 + */ +import 'quill/dist/quill.core.css'; // 核心样式 +import 'quill/dist/quill.snow.css'; // 有工具栏 +import 'quill/dist/quill.bubble.css'; // 无工具栏 +import 'katex/dist/katex.min.css'; // katex 表达式样式 +import React, { useState, useRef, useEffect } from 'react'; +import Quill from 'quill'; +import katex from 'katex'; +import deepEqual from './deepEqual.js' +import { fetchUploadImage } from '../../services/ojService.js'; +import { getImageUrl } from 'educoder' +import ImageBlot from './ImageBlot'; + +window.Quill = Quill; +window.katex = katex; +Quill.register(ImageBlot); + +function QuillForEditor ({ + placeholder, + readOnly, + options, + value, + imgAttrs = {}, // 指定图片的宽高 + style = {}, + wrapStyle = {}, + showUploadImage, + onContentChange +}) { + // toolbar 默认值 + const defaultConfig = [ + ['bold', 'italic', 'underline'], + [{align: []}, {list: 'ordered'}, {list: 'bullet'}], // 列表 + [{script: 'sub'}, {script: 'super'}], + [{ 'color': [] }, { 'background': [] }], + [{header: [1,2,3,4,5,false]}], + ['blockquote', 'code-block'], + ['link', 'image', 'video'], + ['formula'], + ['clean'] + ]; + + const editorRef = useRef(null); + // quill 实例 + const [quill, setQuill] = useState(null); + const [selection, setSelection] = useState(null); + + // 文本内容变化时 + const handleOnChange = content => { + // console.log('编辑器内容====》》》》', content); + onContentChange && onContentChange(content); + }; + + const renderOptions = options || defaultConfig; + // quill 配置信息 + const quillOption = { + modules: { + toolbar: renderOptions + }, + readOnly, + placeholder, + theme: readOnly ? 'bubble' : 'snow' + }; + + + useEffect(() => { + const _quill = new Quill(editorRef.current, quillOption); + setQuill(_quill); + + // 处理图片上传功能 + _quill.getModule('toolbar').addHandler('image', (e) => { + const input = document.createElement('input'); + input.setAttribute('type', 'file'); + input.setAttribute('accept', 'image/*'); + input.click(); + + input.onchange = async (e) => { + const file = input.files[0]; // 获取文件信息 + const formData = new FormData(); + formData.append('file', file); + + const range = _quill.getSelection(true); + let fileUrl = ''; // 保存上传成功后图片的url + // 上传文件 + const result = await fetchUploadImage(formData); + // 获取上传图片的url + if (result.data && result.data.id) { + fileUrl = getImageUrl(`api/attachments/${result.data.id}`); + } + // 根据id获取文件路径 + const { width, height } = imgAttrs; + // console.log('上传图片的url:', fileUrl); + if (fileUrl) { + _quill.insertEmbed(range.index, 'image', { + url: fileUrl, + alt: '图片信息', + onClick: showUploadImage, + width, + height + }); + } + } + }); + }, []); + + // 设置值 + useEffect(() => { + if (!quill) return + const previous = quill.getContents() + const current = value + + if (!deepEqual(previous, current)) { + setSelection(quill.getSelection()) + if (typeof value === 'string') { + quill.clipboard.dangerouslyPasteHTML(value, 'api') + } else { + quill.setContents(value) + } + } + }, [quill, value, setQuill]); + + // 清除选择区域 + useEffect(() => { + if (quill && selection) { + quill.setSelection(selection) + setSelection(null) + } + }, [quill, selection, setSelection]); + + // 设置placeholder值 + useEffect(() => { + if (!quill || !quill.root) return; + quill.root.dataset.placeholder = placeholder; + }, [quill, placeholder]); + + // 处理内容变化 + useEffect(() => { + if (!quill) return; + if (typeof handleOnChange !== 'function') return; + let handler; + quill.on( + 'text-change', + (handler = () => { + handleOnChange(quill.getContents()); // getContents: 检索编辑器内容 + }) + ); + return () => { + quill.off('text-change', handler); + } + }, [quill, handleOnChange]); + + // 返回结果 + return ( +
    +
    +
    + ); +} + +export default QuillForEditor; diff --git a/public/react/src/common/reactQuill/ImageBlot.js b/public/react/src/common/reactQuill/ImageBlot.js new file mode 100644 index 000000000..091bd2c1f --- /dev/null +++ b/public/react/src/common/reactQuill/ImageBlot.js @@ -0,0 +1,54 @@ +/* + * @Description: 重写图片 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-16 15:50:45 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-17 16:44:48 + */ +import Quill from "quill"; + +const BlockEmbed = Quill.import('blots/block/embed'); + +export default class ImageBlot extends BlockEmbed { + + static create(value) { + + const node = super.create(); + + node.setAttribute('alt', value.alt); + node.setAttribute('src', value.url); + + if (value.width) { + node.setAttribute('width', value.width); + } + if (value.height) { + node.setAttribute('height', value.height); + } + // 宽度和高度都不存在时, + if (!value.width && !value.height) { + node.setAttribute('display', 'block'); + node.setAttribute('width', '100%'); + } + // 给图片添加点击事件 + node.onclick = () => { + value.onClick && value.onClick(value.url); + } + return node; + } + + static value (node) { + + return { + alt: node.getAttribute('alt'), + url: node.getAttribute('src'), + onclick: node.onclick, + // width: node.width, + // height: node.height, + display: node.getAttribute('display') + }; + } +} + +ImageBlot.blotName = 'image'; +ImageBlot.tagName = 'img'; \ No newline at end of file diff --git a/public/react/src/common/reactQuill/ReactQuill.js b/public/react/src/common/reactQuill/ReactQuill.js new file mode 100644 index 000000000..1b4209409 --- /dev/null +++ b/public/react/src/common/reactQuill/ReactQuill.js @@ -0,0 +1,45 @@ +/* + * @Description: + * @Author: tangjiang + * @Github: + * @Date: 2019-12-09 09:09:42 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-18 08:46:20 + */ +import 'quill/dist/quill.core.css'; // 核心样式 +import 'quill/dist/quill.snow.css'; // 有工具栏 +import 'quill/dist/quill.bubble.css'; // 无工具栏 +import 'katex/dist/katex.min.css'; // katex 表达式样式 +import React, { useState, useReducer, useEffect } from 'react'; +import useQuill from './useQuill'; + +function ReactQuill ({ + disallowColors, // 不可见时颜色 + placeholder, // 提示信息 + uploadImage, // 图片上传 + onChange, // 内容变化时 + options, // 配置信息 + value, // 显示的内容 + style, + showUploadImage // 显示上传图片 +}) { + + const [element, setElement] = useState(); // quill 渲染节点 + + useQuill({ + disallowColors, + placeholder, + uploadImage, + onChange, + options, + value, + showUploadImage, + element + }); + + return ( +
    + ); +} + +export default ReactQuill; diff --git a/public/react/src/common/reactQuill/deepEqual.js b/public/react/src/common/reactQuill/deepEqual.js new file mode 100644 index 000000000..6f2b276bf --- /dev/null +++ b/public/react/src/common/reactQuill/deepEqual.js @@ -0,0 +1,47 @@ +function deepEqual (prev, current) { + if (prev === current) { // 基本类型比较,值,类型都相同 或者同为 null or undefined + return true; + } + + if ((!prev && current) + || (prev && !current) + || (!prev && !current) + ) { + return false; + } + + if (Array.isArray(prev)) { + if (!Array.isArray(current)) return false; + if (prev.length !== current.length) return false; + + for (let i = 0; i < prev.length; i++) { + if (!deepEqual(current[i], prev[i])) { + return false; + } + } + return true; + } + + if (typeof current === 'object') { + if (typeof prev !== 'object') return false; + const prevKeys = Object.keys(prev); + const curKeys = Object.keys(current); + + if (prevKeys.length !== curKeys.length) return false; + + prevKeys.sort(); + curKeys.sort(); + + for (let i = 0; i < prevKeys.length; i++) { + if (prevKeys[i] !== curKeys[i]) return false; + const key = prevKeys[i]; + if (!deepEqual(prev[key], current[key])) return false; + } + + return true; + } + + return false; +} + +export default deepEqual; diff --git a/public/react/src/common/reactQuill/flatten.js b/public/react/src/common/reactQuill/flatten.js new file mode 100644 index 000000000..237cb543f --- /dev/null +++ b/public/react/src/common/reactQuill/flatten.js @@ -0,0 +1,26 @@ +/* + * @Description: 将多维数组转变成一维数组 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-09 09:35:01 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-16 11:36:22 + */ +function flatten (array) { + return flatten.rec(array, []); +} + +flatten.rec = function flatten (array, result) { + + for (let item of array) { + if (Array.isArray(item)) { + flatten(item, result); + } else { + result.push(item); + } + } + + return result; +} + +export default flatten; diff --git a/public/react/src/common/reactQuill/index.js b/public/react/src/common/reactQuill/index.js new file mode 100644 index 000000000..56a1a8d1f --- /dev/null +++ b/public/react/src/common/reactQuill/index.js @@ -0,0 +1,108 @@ +/* + * @Description: 入口文件 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-17 10:41:48 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-17 20:34:40 + */ +import React, { useState, useCallback, useEffect } from 'react'; +import ReactQuill from './lib'; + +function Wrapper (props) { + // 默认工具栏配置项 + const toolbarConfig = [ + ['bold', 'italic', 'underline'], + [{align: []}, {list: 'ordered'}, {list: 'bullet'}], // 列表 + [{script: 'sub'}, {script: 'super'}], + [{header: [1,2,3,4,5,false]}], + ['blockquote', 'code-block'], + ['link', 'image', 'video'], + ['formula'], + ['clean'] + ]; + + const [placeholder] = useState(props.placeholder || 'placeholder'); + const [disableBold] = useState(false); + const [value, setValue] = useState(props.value || ''); + const [toolbar, setToolbar] = useState(toolbarConfig); + const [theme, setTheme] = useState(props.theme || 'snow'); + const [readOnly] = useState(props.readOnly || false); + + const { + onContentChagne, // 当编辑器内容变化时调用该函数 + showUploadImage, // 显示上传图片, 返回url,主要用于点击图片放大 + } = props; + + // 配置信息 + const options = { + modules: { + toolbar: toolbar, + clipboard: { + matchVisual: false + } + }, + readOnly: readOnly, + theme: theme + } + // 配置信息 + useEffect (() => { + if (props.options) { + setToolbar(props.options); + } + setTheme(props.theme || 'snow'); + setValue(props.value); + }, [props]); + + // 当内容变化时 + const handleOnChange = useCallback( + contents => { + if (disableBold) { + setValue({ + ops: contents.ops.map(x => { + x = {...x}; + if (x && x.attributes && x.attributes.bold) { + x.attributes = { ...x.attributes }; + delete x.attributes.bold; + if (!Object.keys(x.attributes).length) { + delete x.attributes; + } + } + return x; + }) + }); + } else { + setValue(contents); + } + onContentChagne && onContentChagne(contents); + }, [disableBold] + ); + + // 图片上传 + const handleUploadImage = (files) => { + console.log('选择的图片信息', files); + } + + // 显示图片 + const handleShowUploadImage = (url) => { + // console.log('上传的图片url:', url); + showUploadImage && showUploadImage(url); + } + + return ( + + handleShowUploadImage(url)} + /> + + ); +} + +export default Wrapper; +// ReactDOM.render(, document.querySelector('#root')); diff --git a/public/react/src/common/reactQuill/index.scss b/public/react/src/common/reactQuill/index.scss new file mode 100644 index 000000000..b6da52bf5 --- /dev/null +++ b/public/react/src/common/reactQuill/index.scss @@ -0,0 +1,32 @@ +#quill-toolbar{ + .quill-btn{ + vertical-align: middle; + } + .quill_image{ + display: inline-block; + position: relative; + vertical-align: middle; + width: 28px; + height: 24px; + overflow: hidden; + .image_input{ + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + opacity: 0; + } + .ql-image{ + position: relative; + left: 0; + top: 0; + } + } +} + +.react_quill_area{ + .ql-toolbar:not(:last-child) { + display: none; + } +} \ No newline at end of file diff --git a/public/react/src/common/reactQuill/lib.js b/public/react/src/common/reactQuill/lib.js new file mode 100644 index 000000000..430a95bb7 --- /dev/null +++ b/public/react/src/common/reactQuill/lib.js @@ -0,0 +1,13 @@ +/* + * @Description: 导出 ReactQuill + * @Author: tangjiang + * @Github: + * @Date: 2019-12-09 09:08:24 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-16 11:37:13 + */ +import ReactQuill from './ReactQuill'; +import useQuill from './useQuill'; + +export default ReactQuill; +export { useQuill }; diff --git a/public/react/src/common/reactQuill/useDeepEqualMemo.js b/public/react/src/common/reactQuill/useDeepEqualMemo.js new file mode 100644 index 000000000..948e21781 --- /dev/null +++ b/public/react/src/common/reactQuill/useDeepEqualMemo.js @@ -0,0 +1,27 @@ +/* + * @Description: + * @Author: tangjiang + * @Github: + * @Date: 2019-12-12 19:48:55 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-16 11:38:16 + */ +import { useState, useEffect } from 'react'; +import deepEqual from './deepEqual'; + +function useDeepEqual (input) { + + const [value, setValue] = useState(input); + + useEffect(() => { + + if (!deepEqual(input, value)) { + setValue(input) + } + + }, [input, value]); + + return value; +} + +export default useDeepEqual; diff --git a/public/react/src/common/reactQuill/useMountQuill.js b/public/react/src/common/reactQuill/useMountQuill.js new file mode 100644 index 000000000..c2313c480 --- /dev/null +++ b/public/react/src/common/reactQuill/useMountQuill.js @@ -0,0 +1,148 @@ +/* + * @Description: 创建 reactQuill实例 + * @Author: tangjiang + * @Github: + * @Date: 2019-12-09 09:31:42 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-17 20:42:05 + */ +import Quill from 'quill'; // 导入quill +import { useState, useEffect, useMemo } from 'react'; +import flatten from './flatten.js'; +import useDeepEqualMemo from './useDeepEqualMemo'; +import Katex from 'katex'; +import ImageBlot from './ImageBlot'; +import { fetchUploadImage } from '../../services/ojService.js'; +import { getImageUrl } from 'educoder' +window.katex = Katex; + +Quill.register(ImageBlot); + +function useMountQuill ({ + element, + options: passedOptions, + uploadImage, + showUploadImage, + imgAttrs = {} // 指定图片的宽高属性 +}) { + + // 是否引入 katex + const [katexLoaded, setKatexLoaded] = useState(Boolean(window.katex)) + const [quill, setQuill] = useState(null); + + const options = useDeepEqualMemo(passedOptions); + console.log('use mount quill: ', passedOptions); + + // 判断options中是否包含公式 + const requireKatex = useMemo(() => { + return flatten(options.modules.toolbar).includes('formula'); + }, [options]); + + // 加载katex + useEffect(() => { + if (!requireKatex) return; + if (katexLoaded) return; + + const interval = setInterval(() => { + if (window.katex) { + setKatexLoaded(true); + clearInterval(interval); + } + }); + + return () => { // 定义回调清除定时器 + clearInterval(interval); + } + + }, [ + setKatexLoaded, + katexLoaded, + requireKatex + ]); + + // 加载 quill + useEffect(() => { + if (!element) return; + if (requireKatex && !katexLoaded) { + element.innerHTML = ` +
    + Loading Katex... +
    + ` + } + // 清空内容 + element.innerHTML = ''; + console.log(element); + // 创建 quill 节点 + const quillNode = document.createElement('div'); + element.appendChild(quillNode); // 将quill节点追回到 element 元素中 + + const quill = new Quill(element, options); + setQuill(quill); + // 加载上传图片功能 + if (typeof uploadImage === 'function') { + quill.getModule('toolbar').addHandler('image', (e) => { + // 创建type类型输入框加载本地图片 + const input = document.createElement('input'); + input.setAttribute('type', 'file'); + input.setAttribute('accept', 'image/*'); + input.click(); + + input.onchange = async (e) => { + const file = input.files[0]; // 获取文件信息 + const formData = new FormData(); + formData.append('file', file); + + // const reader = new FileReader(); + // reader.readAsDataURL(file); + // console.log('文件信息===>>', reader); + // reader.onload = function (e) { + // debugger; + // console.log('文件信息===>>', e.target.result); + // const image = new Image(); + // image.src = e.target.result; + + // image.onload = function () { + // // file.width = + // console.log(image.width, image.height); + // } + // } + + const range = quill.getSelection(true); + let fileUrl = ''; // 保存上传成功后图片的url + // 上传文件 + const result = await fetchUploadImage(formData); + // 获取上传图片的url + if (result.data && result.data.id) { + fileUrl = getImageUrl(`api/attachments/${result.data.id}`); + } + // 根据id获取文件路径 + const { width, height } = imgAttrs; + // console.log('上传图片的url:', fileUrl); + if (fileUrl) { + quill.insertEmbed(range.index, 'image', { + url: fileUrl, + alt: '', + onClick: showUploadImage, + width, + height + }); + } + } + }); + } + + return () => { + element.innerHTML = ''; + } + }, [ + element, + options, + requireKatex, + katexLoaded, + ]); + + return quill; +} + +export default useMountQuill; diff --git a/public/react/src/common/reactQuill/useQuill.js b/public/react/src/common/reactQuill/useQuill.js new file mode 100644 index 000000000..b959dbc52 --- /dev/null +++ b/public/react/src/common/reactQuill/useQuill.js @@ -0,0 +1,60 @@ +/* + * @Description: + * @Author: tangjiang + * @Github: + * @Date: 2019-12-09 09:09:50 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-17 15:46:50 + */ +import useQuillPlaceholder from './useQuillPlaceholder'; +import useQuillValueSync from './useQuillValueSync'; +import useQuillOnChange from './useQuillOnChange'; +import useMountQuill from './useMountQuill'; +import { useEffect } from 'react'; + +function useQuill ({ + disallowColors, + placeholder, + uploadImage, + onChange, + options, + value, + element, + showUploadImage +}) { + + // 获取 quill 实例 + const quill = useMountQuill({ + element, + options, + uploadImage, + showUploadImage + }); + + useEffect(() => { + if (disallowColors && quill) { + quill.clipboard.addMatcher(Node.ELEMENT_NODE, (node, delta) => { + delta.ops = delta.ops.map(op => { + if (op.attributes && op.attributes.color) { + const { color, ...attributes } = op.attributes; + return { + ...op, + attributes + } + } + return op; + }); + return delta; + }); + } + }, [ + disallowColors, + quill + ]); + + useQuillPlaceholder(quill, placeholder); + useQuillValueSync(quill, value); + useQuillOnChange(quill, onChange); +} + +export default useQuill; diff --git a/public/react/src/common/reactQuill/useQuillOnChange.js b/public/react/src/common/reactQuill/useQuillOnChange.js new file mode 100644 index 000000000..45333a4e1 --- /dev/null +++ b/public/react/src/common/reactQuill/useQuillOnChange.js @@ -0,0 +1,33 @@ +/* + * @Description: + * @Author: tangjiang + * @Github: + * @Date: 2019-12-12 19:49:11 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-16 11:39:27 + */ +import { useEffect } from 'react'; + +function useQuillOnChange (quill, onChange) { + + useEffect(() => { + + if (!quill) return; + if (typeof onChange !== 'function') return; + + let handler; + + quill.on( + 'text-change', + (handler = () => { + onChange(quill.getContents()); // getContents: 检索编辑器内容 + }) + ); + + return () => { + quill.off('text-change', handler); + } + }, [quill, onChange]); +} + +export default useQuillOnChange; diff --git a/public/react/src/common/reactQuill/useQuillPlaceholder.js b/public/react/src/common/reactQuill/useQuillPlaceholder.js new file mode 100644 index 000000000..ccc341568 --- /dev/null +++ b/public/react/src/common/reactQuill/useQuillPlaceholder.js @@ -0,0 +1,22 @@ +/* + * @Description: + * @Author: tangjiang + * @Github: + * @Date: 2019-12-09 09:28:34 + * @LastEditors: tangjiang + * @LastEditTime: 2019-12-16 11:39:48 + */ +import { useEffect } from 'react' + +function useQuillPlaceholder ( + quill, + placeholder +) { + + useEffect(() => { + if (!quill || !quill.root) return; + quill.root.dataset.placeholder = placeholder; + }, [quill, placeholder]); +} + +export default useQuillPlaceholder; diff --git a/public/react/src/common/reactQuill/useQuillValueSync.js b/public/react/src/common/reactQuill/useQuillValueSync.js new file mode 100644 index 000000000..696d88949 --- /dev/null +++ b/public/react/src/common/reactQuill/useQuillValueSync.js @@ -0,0 +1,31 @@ +import { useEffect, useState } from 'react' +import deepEqual from './deepEqual.js' + +function useQuillValueSync(quill, value) { + const [selection, setSelection] = useState(null) + + useEffect(() => { + if (!quill) return + + const previous = quill.getContents() + const current = value + + if (!deepEqual(previous, current)) { + setSelection(quill.getSelection()) + if (typeof value === 'string') { + quill.clipboard.dangerouslyPasteHTML(value, 'api') + } else { + quill.setContents(value) + } + } + }, [quill, value, setSelection]) + + useEffect(() => { + if (quill && selection) { + quill.setSelection(selection) + setSelection(null) + } + }, [quill, selection, setSelection]) +} + +export default useQuillValueSync diff --git a/public/react/src/modules/developer/DeveloperHome.js b/public/react/src/modules/developer/DeveloperHome.js index 5f787659e..73a5c37a1 100644 --- a/public/react/src/modules/developer/DeveloperHome.js +++ b/public/react/src/modules/developer/DeveloperHome.js @@ -16,7 +16,7 @@ import MultipTags from './components/multiptags'; // import { Link } from 'react-router-dom'; import CONST from '../../constants'; import { withRouter } from 'react-router'; -import { toStore } from 'educoder'; +import { toStore, CNotificationHOC } from 'educoder'; // import MyIcon from '../../common/components/MyIcon'; const {tagBackground, diffText} = CONST; @@ -249,17 +249,26 @@ class DeveloperHome extends React.PureComponent { // 删除 handleClickDelete = (record) => { const { deleteItem } = this.props; - Modal.confirm({ - title: '删除', + this.props.confirm({ + title: '提示', content: `确定要删除${record.name}吗?`, - okText: '确定', - cancelText: '取消', onOk () { // 调用删除接口 console.log(record.identifier); deleteItem(record.identifier); } }); + // Modal.confirm({ + // title: '删除', + // content: `确定要删除${record.name}吗?`, + // okText: '确定', + // cancelText: '取消', + // onOk () { + // // 调用删除接口 + // console.log(record.identifier); + // deleteItem(record.identifier); + // } + // }); } // table条件变化时 handleTableChange = (pagination, filters, sorter) => { @@ -562,5 +571,5 @@ const mapDispatchToProps = (dispatch) => ({ export default withRouter(connect( mapStateToProps, mapDispatchToProps -)(DeveloperHome)); +)(CNotificationHOC() (DeveloperHome))); // export default DeveloperHome; diff --git a/public/react/src/modules/developer/components/controlSetting/index.js b/public/react/src/modules/developer/components/controlSetting/index.js index 587e1bee9..1d4d7834c 100644 --- a/public/react/src/modules/developer/components/controlSetting/index.js +++ b/public/react/src/modules/developer/components/controlSetting/index.js @@ -4,10 +4,10 @@ * @Github: * @Date: 2019-11-27 16:02:36 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-13 17:32:33 + * @LastEditTime: 2019-12-19 19:47:32 */ import './index.scss'; -import React, { useState, useRef } from 'react'; +import React, { useState, useRef, useEffect } from 'react'; import { Tabs, Button, Icon } from 'antd'; import { connect } from 'react-redux'; import InitTabCtx from '../initTabCtx'; @@ -23,14 +23,15 @@ const ControlSetting = (props) => { submitLoading, identifier, excuteState, + showOrHideControl, commitRecordDetail, changeLoadingState, changeSubmitLoadingStatus, - showOrHideControl, + changeShowOrHideControl, // debuggerCode, // startDebuggerCode, // 外部存入 onDebuggerCode, - updateCode, + // updateCode, onSubmitForm } = props; const [defaultActiveKey, setDefaultActiveKey] = useState('1'); // 当前选中的tab @@ -44,10 +45,14 @@ const ControlSetting = (props) => { setDefaultActiveKey(key); } + useEffect(() => { + setShowTextResult(props.showOrHideControl); + }, [props]); + // 显示/隐藏tab const handleShowControl = () => { setShowTextResult(!showTextResult); - showOrHideControl(!showTextResult); + changeShowOrHideControl(!showTextResult); } // 调试代码 @@ -55,7 +60,7 @@ const ControlSetting = (props) => { // console.log(formRef.current.handleTestCodeFormSubmit); // 调出控制台界面 setShowTextResult(true); - showOrHideControl(true); + changeShowOrHideControl(true); formRef.current.handleTestCodeFormSubmit(() => { setDefaultActiveKey('2'); }); @@ -84,7 +89,7 @@ const ControlSetting = (props) => { @@ -131,19 +136,20 @@ const ControlSetting = (props) => { const mapStateToProps = (state) => { const {commonReducer, ojForUserReducer} = state; - const {loading, excuteState, submitLoading } = commonReducer; + const {loading, excuteState, submitLoading, showOrHideControl } = commonReducer; const { commitRecordDetail } = ojForUserReducer; return { loading, submitLoading, excuteState, + showOrHideControl, // identifier: user_program_identifier, commitRecordDetail // 提交详情 }; }; // changeSubmitLoadingStatus const mapDispatchToProps = (dispatch) => ({ - showOrHideControl: (flag) => dispatch(actions.showOrHideControl(flag)), + changeShowOrHideControl: (flag) => dispatch(actions.changeShowOrHideControl(flag)), changeLoadingState: (flag) => dispatch(actions.changeLoadingState(flag)), changeSubmitLoadingStatus: (flag) => dispatch(actions.changeSubmitLoadingStatus(flag)), debuggerCode: (identifier, values) => dispatch(actions.debuggerCode(identifier, values)), diff --git a/public/react/src/modules/developer/components/controlSetting/index.scss b/public/react/src/modules/developer/components/controlSetting/index.scss index 97838ce5c..31beda8a5 100644 --- a/public/react/src/modules/developer/components/controlSetting/index.scss +++ b/public/react/src/modules/developer/components/controlSetting/index.scss @@ -2,7 +2,8 @@ position: absolute; bottom: 0; width: 100%; - background:rgba(30,30,30,1); + // background: red; + // background:rgba(30,30,30,1); // height: 56px; .control_tab{ position: absolute; @@ -52,8 +53,8 @@ height: 56px; padding-right: 30px; padding-left: 10px; - // background: #000; - background:rgba(48,48,48,1); + background: rgba(18,28,36,1); + // background:rgba(48,48,48,1); } .setting_drawer{ diff --git a/public/react/src/modules/developer/components/execResult/index.js b/public/react/src/modules/developer/components/execResult/index.js index 32bbbee91..6f9341b9a 100644 --- a/public/react/src/modules/developer/components/execResult/index.js +++ b/public/react/src/modules/developer/components/execResult/index.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-11-28 08:44:54 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-10 09:24:02 + * @LastEditTime: 2019-12-19 10:44:16 */ import './index.scss'; import React, { useState, useEffect } from 'react'; @@ -38,6 +38,15 @@ function ExecResult (props) {
    ); + + const renderError = () => ( +
    + + 未知异常 + +
    + ) + const renderFinish = () => { const { error_line, @@ -60,6 +69,7 @@ function ExecResult (props) { ) } + // console.log('执行结果====》》》》', status); const excuteCtx = (state) => { if (state === 0) { return ( @@ -118,6 +128,8 @@ function ExecResult (props) { setRenderCtx(() => (readerLoaded)); } else if ('finish' === excuteState) { setRenderCtx(() => (renderFinish)); + } else if ('error' === excuteState) { + setRenderCtx(() => (renderError)) } }, [excuteState]); diff --git a/public/react/src/modules/developer/components/initTabCtx/index.js b/public/react/src/modules/developer/components/initTabCtx/index.js index 3834a3e11..3e707daa1 100644 --- a/public/react/src/modules/developer/components/initTabCtx/index.js +++ b/public/react/src/modules/developer/components/initTabCtx/index.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-11-27 19:46:14 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-13 17:38:42 + * @LastEditTime: 2019-12-19 10:47:05 */ import './index.scss'; import React, { useState, useEffect, useRef, useImperativeHandle, forwardRef } from 'react'; @@ -26,6 +26,7 @@ function InitTabCtx (props, ref) { const { inputValue, onDebuggerCode } = props; + console.log('default value', inputValue); useImperativeHandle(ref, () => ({ handleTestCodeFormSubmit: (cb) => { // console.log('父组件调用我啦~~~~~~~~~'); @@ -33,6 +34,10 @@ function InitTabCtx (props, ref) { } })); + useEffect(() => { + console.log('初始值: ========', props); + }, [props]); + // 渲染文本提示信息 const renderText = () => (请在这里添加测试用例,点击“调试代码”时将从这里读取输入来测试你的代码...); // 渲染表单信息 diff --git a/public/react/src/modules/developer/components/initTabCtx/index.scss b/public/react/src/modules/developer/components/initTabCtx/index.scss index 449db1d2a..5427aa374 100644 --- a/public/react/src/modules/developer/components/initTabCtx/index.scss +++ b/public/react/src/modules/developer/components/initTabCtx/index.scss @@ -49,7 +49,8 @@ } .input_textarea_style{ - background:rgba(30,30,30,1) !important; + // background:rgba(30,30,30,1) !important; + background:rgba(7,15,25,1) !important; color: #fff; border-color: transparent; outline: none; diff --git a/public/react/src/modules/developer/components/monacoSetting/index.js b/public/react/src/modules/developer/components/monacoSetting/index.js index a101819e0..669439577 100644 --- a/public/react/src/modules/developer/components/monacoSetting/index.js +++ b/public/react/src/modules/developer/components/monacoSetting/index.js @@ -4,10 +4,11 @@ * @Github: * @Date: 2019-11-25 17:50:33 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-06 16:51:48 + * @LastEditTime: 2019-12-19 19:32:08 */ import React, { useState } from 'react'; import { fromStore, toStore } from 'educoder'; +// import { Icon } from 'antd'; // import { Select } from 'antd'; // const { Option } = Select; const SettingDrawer = (props) => { diff --git a/public/react/src/modules/developer/components/myMonacoEditor/index.js b/public/react/src/modules/developer/components/myMonacoEditor/index.js index 60f54ee0a..948d5a4f5 100644 --- a/public/react/src/modules/developer/components/myMonacoEditor/index.js +++ b/public/react/src/modules/developer/components/myMonacoEditor/index.js @@ -4,12 +4,12 @@ * @Github: * @Date: 2019-11-27 15:02:52 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-13 16:16:56 + * @LastEditTime: 2019-12-19 19:36:24 */ import './index.scss'; import React, { useState, useRef, useEffect } from 'react'; -import { Drawer, Modal } from 'antd'; -import { fromStore } from 'educoder'; +import { Drawer, Modal, Icon, Badge } from 'antd'; +import { fromStore, CNotificationHOC } from 'educoder'; import { connect } from 'react-redux'; import MonacoEditor from '@monaco-editor/react'; import SettingDrawer from '../../components/monacoSetting'; @@ -19,16 +19,25 @@ import MyIcon from '../../../../common/components/MyIcon'; // import actions from '../../../../redux/actions'; const { fontSetting, opacitySetting } = CONST; +const maps = { + 'c': 'main.c', + 'c++': 'main.cc', + 'java': 'main.java', + 'pythone': 'main.py' +}; function MyMonacoEditor (props, ref) { const { + notice, language, identifier, + hadCodeUpdate, showOrHideControl, // saveUserInputCode, onCodeChange, - onRestoreInitialCode + onRestoreInitialCode, + onUpdateNotice } = props; const [showDrawer, setShowDrawer] = useState(false); // 控制配置滑框 @@ -50,7 +59,7 @@ function MyMonacoEditor (props, ref) { }, [props]); useEffect(() => { - setHeight(showOrHideControl ? 'calc(100% - 382px)' : 'calc(100% - 56px)'); + setHeight(showOrHideControl ? 'calc(100% - 378px)' : 'calc(100% - 56px)'); }, [showOrHideControl]); // 控制侧边栏设置的显示 @@ -93,28 +102,51 @@ function MyMonacoEditor (props, ref) { // 恢复初始代码 const handleRestoreCode = () => { - Modal.confirm({ + props.confirm({ + title: '提示', content: '确定要恢复代码吗?', - okText: '确定', - cancelText: '取消', onOk () { onRestoreInitialCode && onRestoreInitialCode(); } }) + // Modal.confirm({ + // content: '确定要恢复代码吗?', + // okText: '确定', + // cancelText: '取消', + // onOk () { + // onRestoreInitialCode && onRestoreInitialCode(); + // } + // }) + } + + const handleUpdateNotice = () => { + if (props.notice) { + onUpdateNotice && onUpdateNotice(); + } } const renderRestore = identifier ? ( ) : ''; + + // lex_has_save ${hadCodeUpdate} ? : '' + const _classnames = hadCodeUpdate ? `flex_strict flex_has_save` : 'flex_strict'; return (
    {/* 未保存时 ? '学员初始代码文件' : main.x */} - {identifier ? '' : '学员初始代码文件'} - {identifier ? '已保存' : ''} - {renderRestore} - {/* */} + {identifier ? language ? maps[language.toLowerCase()] : '' : '学员初始代码文件'} + {identifier ? '已保存' : ''} + + + + {renderRestore}
    @@ -161,4 +192,4 @@ const mapDispatchToProps = (dispatch) => ({ export default connect( mapStateToProps, mapDispatchToProps -)(MyMonacoEditor); +)(CNotificationHOC() (MyMonacoEditor)); diff --git a/public/react/src/modules/developer/components/myMonacoEditor/index.scss b/public/react/src/modules/developer/components/myMonacoEditor/index.scss index 7a7c4f030..61689b51e 100644 --- a/public/react/src/modules/developer/components/myMonacoEditor/index.scss +++ b/public/react/src/modules/developer/components/myMonacoEditor/index.scss @@ -1,19 +1,17 @@ .monaco_editor_area{ height: 100%; - background-color: rgba(30,30,30,1); + background-color: rgba(7,15,25,1); .code_title{ display: flex; align-items: center; - // justify-content: space-between; - // background: #000; - // background: #333333; - background-color: rgba(48,48,48,1); + background-color: rgba(18,28,36,1); color: #fff; height: 56px; padding: 0 30px; .flex_strict{ flex: 1; } + .flex_normal{ color: #E51C24; cursor: pointer; @@ -25,21 +23,21 @@ .flex_strict, .flex_normal, .code-icon{ - color: #888; + color: #666; } } } .setting_drawer{ - // .ant-drawer-body{ - // // height: calc(100vh - 120px); - // // overflow-y: auto; - // } + .ant-drawer-close{ + color: #ffffff; + } .ant-drawer-content{ top: 120px; bottom: 56px; height: calc(100vh - 176px); - background: #333333; + // background: #333333; + background: rgba(7,15,25,1); color: #fff; .setting_h2{ color: #fff; @@ -57,4 +55,17 @@ color: #fff; } } +} + +.flex_has_save{ + // animation: blink 3s line 3; + animation-name: blink; + animation-duration: .4s; + animation-iteration-count: 3; +} + +@keyframes blink{ + 50% { + color: #fff; + } } \ No newline at end of file diff --git a/public/react/src/modules/developer/newOrEditTask/index.js b/public/react/src/modules/developer/newOrEditTask/index.js index bc905fdf7..1c451c669 100644 --- a/public/react/src/modules/developer/newOrEditTask/index.js +++ b/public/react/src/modules/developer/newOrEditTask/index.js @@ -13,11 +13,11 @@ import { Button, Modal } from 'antd'; import LeftPane from './leftpane'; import RightPane from './rightpane'; import { withRouter } from 'react-router'; -import { toStore } from 'educoder'; +import { toStore, CNotificationHOC } from 'educoder'; import UserInfo from '../components/userInfo'; // import RightPane from './rightpane/index'; import actions from '../../../redux/actions'; -import {ModalConfirm} from '../../../common/components/ModalConfirm'; +// import {ModalConfirm} from '../../../common/components/ModalConfirm'; const NewOrEditTask = (props) => { const { @@ -69,10 +69,13 @@ const NewOrEditTask = (props) => { // 模拟挑战 const imitationChallenge = () => { + // 调用 start 接口, 成功后跳转到模拟页面 + startProgramQuestion(identifier, props); } // 开始挑战 const startChallenge = () => { - // 调用 start 接口, 成功后跳转到模拟页面 + // 调用 start 接口, 成功后跳转到开启实战 + // TODO startProgramQuestion(identifier, props); } @@ -82,27 +85,38 @@ const NewOrEditTask = (props) => { props.clearOJFormStore(); // 清空描述信息 toStore('oj_description', ''); - setInterval(function () { - props.history.push('/problems'); - }, 500); + props.history.push('/problems'); } // 发布 const handleClickPublish = () => { - ModalConfirm('提示', (

    发布后即可应用到自己管理的课堂
    是否确认发布?

    ), () => { - changePublishLoadingStatus(true); - handlePublish(props, 'publish'); + // ModalConfirm('提示', (

    发布后即可应用到自己管理的课堂
    是否确认发布?

    ), () => { + // changePublishLoadingStatus(true); + // handlePublish(props, 'publish'); + // }); + props.confirm({ + title: '提示', + content: (

    发布后即可应用到自己管理的课堂
    是否确认发布?

    ), + onOk () { + changePublishLoadingStatus(true); + handlePublish(props, 'publish'); + } }); - - } // 撤销发布 const handleClickCancelPublish = () => { - ModalConfirm('提示', (

    是否确认撤销发布?

    ), () => { - changePublishLoadingStatus(true); - handleCancelPublish(props, identifier); + // ModalConfirm('提示', (

    是否确认撤销发布?

    ), () => { + // changePublishLoadingStatus(true); + // handleCancelPublish(props, identifier); + // }); + props.confirm({ + title: '提示', + content: ((

    是否确认撤销发布?

    )), + onOk () { + changePublishLoadingStatus(true); + handleCancelPublish(props, identifier); + } }); - } // 取消保存/取消按钮 @@ -125,6 +139,7 @@ const NewOrEditTask = (props) => { const renderPubOrFight = () => { const pubButton = isPublish ? ( ); - // 更新 - // const updateBtn = isPublish - // ? '' - // : ( - // - // ); - return ( - - - {pubButton} - {challengeBtn} - - ) + if (isPublish) { + return ( + + {pubButton} + + {challengeBtn} + + ); + } else { + return ( + + + {pubButton} + {challengeBtn} + + ); + } + } // 渲染退出 const renderQuit = () => { return identifier ? ( ) : '' @@ -255,4 +271,4 @@ const mapDispatchToProps = (dispatch) => ({ export default withRouter(connect( mapStateToProps, mapDispatchToProps -)(NewOrEditTask)); +)(CNotificationHOC() (NewOrEditTask))); diff --git a/public/react/src/modules/developer/newOrEditTask/index.scss b/public/react/src/modules/developer/newOrEditTask/index.scss index ba0ed8503..ad668fcc8 100644 --- a/public/react/src/modules/developer/newOrEditTask/index.scss +++ b/public/react/src/modules/developer/newOrEditTask/index.scss @@ -10,9 +10,23 @@ align-items: center; justify-content: center; height: 56px; - background: #333333; + // background: #333333; + background: rgba(18,28,36,1); > button{ margin-right: 20px; } } +.quite_btn{ + position: absolute; + right: 10px; + top: 15px; + margin-left: 30px; + color: #888888; + transition: all .3s; + cursor: pointer; + &:hover{ + color: #5091FF; + } +} + diff --git a/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/AddTestDemo.js b/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/AddTestDemo.js index 4c4131fa9..8e7aa70fc 100644 --- a/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/AddTestDemo.js +++ b/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/AddTestDemo.js @@ -4,13 +4,14 @@ * @Github: * @Date: 2019-11-21 09:19:38 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-13 11:58:46 + * @LastEditTime: 2019-12-19 17:54:28 */ import './index.scss'; import React, { useState } from 'react'; -import { Collapse, Icon, Input, Form, Button, Modal } from 'antd'; +import { Collapse, Icon, Input, Form, Button } from 'antd'; import { connect } from 'react-redux'; import actions from '../../../../../redux/actions'; +import { CNotificationHOC} from 'educoder'; const { Panel } = Collapse; const { TextArea } = Input; const FormItem = Form.Item; @@ -31,15 +32,22 @@ const AddTestDemo = (props) => { // console.log('点击的删除按钮') e.preventDefault(); e.stopPropagation(); - Modal.confirm({ - title: '删除', + props.confirm({ + title: '提示', content: '确定要删除当前测试用例吗?', - okText: '确定', - cancelText: '取消', onOk() { onDeleteTest(testCase); } - }) + }); + // Modal.confirm({ + // title: '删除', + // content: '确定要删除当前测试用例吗?', + // okText: '确定', + // cancelText: '取消', + // onOk() { + // onDeleteTest(testCase); + // } + // }) } // 输入框值改变时 @@ -189,4 +197,4 @@ const mapDispatchToProps = (dispatch) => ({ export default connect( mapStateToProps, mapDispatchToProps -)(Form.create()(AddTestDemo)); +)(Form.create()(CNotificationHOC()(AddTestDemo))); diff --git a/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.js b/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.js index 762d1d3ba..da31754bd 100644 --- a/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.js +++ b/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.js @@ -4,21 +4,20 @@ * @Github: * @Date: 2019-11-20 10:35:40 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-13 11:39:52 + * @LastEditTime: 2019-12-19 17:23:10 */ -import 'quill/dist/quill.core.css'; -import 'quill/dist/quill.bubble.css'; -import 'quill/dist/quill.snow.css'; import './index.scss'; // import 'katex/dist/katex.css'; import React from 'react'; import { Form, Input, Select, InputNumber, Button } from 'antd'; import { connect } from 'react-redux'; import AddTestDemo from './AddTestDemo'; -import QuillEditor from '../../../quillEditor'; +// import QuillEditor from '../../../quillEditor'; import actions from '../../../../../redux/actions'; import CONST from '../../../../../constants'; -import { fromStore, toStore } from 'educoder'; // 保存和读取store值 +import { toStore } from 'educoder'; // 保存和读取store值 +// import Wrapper from '../../../../../common/reactQuill'; +import QuillForEditor from '../../../../../common/quillForEditor'; const scrollIntoView = require('scroll-into-view'); const {jcLabel} = CONST; const FormItem = Form.Item; @@ -26,9 +25,9 @@ const { Option } = Select; const maps = { language: [ { title: 'C', key: 'C' }, - // { title: 'C++', key: 'C++' }, - // { title: 'Python', key: 'Python' }, - // { title: 'Java', key: 'Java' } + { title: 'C++', key: 'C++' }, + { title: 'Python', key: 'Python' }, + { title: 'Java', key: 'Java' } ], difficult: [ { title: '简单', key: '1' }, @@ -146,9 +145,6 @@ class EditTab extends React.Component { testCasesValidate, openTestCodeIndex = [] } = this.props; - // console.log('当前位置: ', position); - // console.log('OJForm: ', ojForm); - // console.log('当前位置: ', testCases); // 表单label const myLabel = (name, subTitle) => { if (subTitle) { @@ -185,7 +181,6 @@ class EditTab extends React.Component { }; const renderTestCase = () => { return this.props.testCases.map((item, i) => { - console.log(111); return { + console.log('描述信息为: ', content); + // 保存获取的描述信息至redux中 + this.handleChangeDescription(content); + } // 编辑器配置信息 const quillConfig = [ [{ header: [1, 2, 3, 4, 5, 6, false] }], ['bold', 'italic', 'underline', 'strike'], // 切换按钮 ['blockquote', 'code-block'], // 代码块 - [{ 'list': 'ordered' }, { 'list': 'bullet' }], // 列表 + [{align: []}, { 'list': 'ordered' }, { 'list': 'bullet' }], // 列表 [{ 'script': 'sub'}, { 'script': 'super' }], [{ 'color': [] }, { 'background': [] }], // 字体颜色与背景色 - ['formula', 'image', 'video'], // 数学公式、图片、视频 + ['image', 'formula'], // 数学公式、图片、视频 ['clean'], // 清除格式 ]; + return (
    @@ -267,7 +270,7 @@ class EditTab extends React.Component { help={ojFormValidate.timeLimit.errMsg} colon={ false } > - + - +
    + +
    +
    {/* */} + {/* 添加测试用例 */} diff --git a/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.scss b/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.scss index f8fa3bd71..17f3eae34 100644 --- a/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.scss +++ b/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.scss @@ -49,6 +49,11 @@ .test_demo_ctx, .editor_form{ margin: 0 30px; + + .ant-form-explain{ + margin-top: 5px; + margin-left: -10px; + } } .test_demo_title{ display: flex; diff --git a/public/react/src/modules/developer/newOrEditTask/leftpane/index.js b/public/react/src/modules/developer/newOrEditTask/leftpane/index.js index 8b10413a9..781b82699 100644 --- a/public/react/src/modules/developer/newOrEditTask/leftpane/index.js +++ b/public/react/src/modules/developer/newOrEditTask/leftpane/index.js @@ -34,28 +34,6 @@ function LeftPane (props) { const [defaultActiveKey, setDefaultActiveKey] = useState('editor'); - // const tabArrs = [ - // { title: '编辑', key: 'editor', content: () }, - // { title: '预览', key: 'prev', content: () }, - // // { title: '提交记录', key: 'commit', content: () }, - // ]; - - // const tabs = tabArrs.map((tab) => { - // const Comp = tab.content; - // return ( - // - // { Comp } - // - // ) - // }); - - // tab切换时 - // const handleTabChange = (key) => { - // setDefaultActiveKey(key); - // } - - // 执行表单提交函数 - const renderComp = useMemo(() => { return Comp[defaultActiveKey]; }, [defaultActiveKey]); diff --git a/public/react/src/modules/developer/newOrEditTask/leftpane/prevTab/index.js b/public/react/src/modules/developer/newOrEditTask/leftpane/prevTab/index.js index c45628973..6b41d3489 100644 --- a/public/react/src/modules/developer/newOrEditTask/leftpane/prevTab/index.js +++ b/public/react/src/modules/developer/newOrEditTask/leftpane/prevTab/index.js @@ -4,74 +4,47 @@ * @Github: * @Date: 2019-11-24 10:09:55 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-04 23:38:37 + * @LastEditTime: 2019-12-18 10:02:24 */ import './index.scss'; import React, { useEffect, useState, useRef } from 'react'; import { connect } from 'react-redux'; import {Empty} from 'antd'; -// import QuillEditor from '../../../quillEditor'; -const Quill = window.Quill; +// import Wrapper from '../../../../../common/reactQuill'; +import QuillForEditor from '../../../../../common/quillForEditor'; const PrevTab = (props) => { - const { - description - } = props; const prevRef = useRef(null); - const [desc, setDesc] = useState(''); - const [renderCtx, setRenderCtx] = useState(() => { - return function () { - return ''; - } - }); - - // 空内容 - const renderTxt = () => ( -
    - -
    - ); + // const [desc, setDesc] = useState(''); + const [renderCtx, setRenderCtx] = useState(() => ''); + // 渲染内容 - const renderQuill = () => ( -
    -
    - ); - useEffect(() => { - setDesc(description); - }, [description]); - - useEffect(() => { - if (description) { - setRenderCtx(() => renderQuill); - let count = 0; - let timer = setInterval(() => { - count++; - if (count >= 10 || prevRef.current) { - clearInterval(timer); - timer = null; - if (prevRef.current) { - const quillEditor = new Quill(prevRef.current, { - readOnly: true, - theme: 'bubble' - }); - quillEditor.container.firstChild.innerHTML = description; - } - } - }, 50); + if (props.description) { + setRenderCtx(() => ( +
    + +
    + )); } else { - setRenderCtx(() => renderTxt); + setRenderCtx(() => ( +
    + +
    + )); } - - }, [description]); + }, [props]); return (
    - {renderCtx()} + {renderCtx}
    ) diff --git a/public/react/src/modules/developer/newOrEditTask/rightpane/index.scss b/public/react/src/modules/developer/newOrEditTask/rightpane/index.scss index 48f5a7bb9..9c472b641 100644 --- a/public/react/src/modules/developer/newOrEditTask/rightpane/index.scss +++ b/public/react/src/modules/developer/newOrEditTask/rightpane/index.scss @@ -1,7 +1,7 @@ .right_pane_code_wrap{ position: relative; // justify-content: center; - background-color: #222; + // background-color: #222; height: 100%; // height: calc(100vh - 178px); .code-title, @@ -11,7 +11,8 @@ align-items: center; justify-content: space-between; // padding: 0 30px; - background: #000; + // background: #000; + background: rgba(18,28,36,1); color: #fff; } .code-title, diff --git a/public/react/src/modules/developer/split_pane_resizer.scss b/public/react/src/modules/developer/split_pane_resizer.scss index 498370dd6..2898d966c 100644 --- a/public/react/src/modules/developer/split_pane_resizer.scss +++ b/public/react/src/modules/developer/split_pane_resizer.scss @@ -8,7 +8,8 @@ .record_detail_header{ height: 65px; // background:rgba(34,34,34,1); - background: #1E1E1E; + // background: #1E1E1E; + background: rgba(7,15,25,1); padding:0 30px; } @@ -123,7 +124,8 @@ .split-pane-area, .split-pane-left{ .ant-tabs-nav-wrap{ - padding: 0 30px; + // padding: 0 30px; + padding: 0 20px; } .ant-tabs-bar{ margin: 0; diff --git a/public/react/src/modules/developer/studentStudy/index.js b/public/react/src/modules/developer/studentStudy/index.js index e4b296a20..15c87e64c 100644 --- a/public/react/src/modules/developer/studentStudy/index.js +++ b/public/react/src/modules/developer/studentStudy/index.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-11-23 10:53:19 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-13 17:19:15 + * @LastEditTime: 2019-12-19 19:48:20 */ import './index.scss'; import React, { useEffect, useState } from 'react'; @@ -15,10 +15,10 @@ import RightPane from './rightpane'; // import { Link } from 'react-router-dom'; // import { getImageUrl } from 'educoder' // import RightPane from '../newOrEditTask/rightpane'; -import { Icon, Modal } from 'antd'; +import { Icon } from 'antd'; import UserInfo from '../components/userInfo'; import actions from '../../../redux/actions'; -import { fromStore} from 'educoder'; +import { fromStore, CNotificationHOC} from 'educoder'; import { withRouter } from 'react-router'; function StudentStudy (props) { @@ -29,7 +29,8 @@ function StudentStudy (props) { userInfo, hack_identifier, // user_program_identifier, - restoreInitialCode + restoreInitialCode, + changeShowOrHideControl } = props; const { @@ -51,32 +52,51 @@ function StudentStudy (props) { const { hack = {} } = props; if (hack.modify_code && hasUpdate) { // 代码更改,提示是否需要更新代码 setHasUpdate(false); - Modal.confirm({ - title: '提示', - content: ( -

    - 代码文件有更新啦
    - 还未提交的代码,请自行保存 -

    - ), - okText: '立即更新', - cancelText: '稍后再说', - onOk () { - restoreInitialCode(id, '更新成功'); - } - }); + handleUpdateNotice(); } }, [props, hasUpdate, setHasUpdate]); + const handleUpdateNotice = () => { + console.log(props); + props.confirm({ + title: '提示', + content: ( +

    + 代码文件有更新啦
    + 还未提交的代码,请自行保存 +

    + ), + onOk () { + restoreInitialCode(id, '更新成功'); + } + }) + // Modal.confirm({ + // title: '提示', + // content: ( + //

    + // 代码文件有更新啦
    + // 还未提交的代码,请自行保存 + //

    + // ), + // okText: '立即更新', + // cancelText: '稍后再说', + // onOk () { + // restoreInitialCode(id, '更新成功'); + // } + // }); + } const _hack_id = hack_identifier || fromStore('hack_identifier'); // 处理编辑 const handleClickEditor = () => { + changeShowOrHideControl(false); props.saveEditorCodeForDetail(); props.history.push(`/problems/${_hack_id}/edit`); } // 处理退出 const handleClickQuit = () => { + // 将控制台关闭 + changeShowOrHideControl(false); props.saveEditorCodeForDetail(); props.history.push('/problems'); } @@ -117,7 +137,9 @@ function StudentStudy (props) {
    - +
    @@ -146,11 +168,12 @@ const mapDispatchToProps = (dispatch) => ({ saveEditorCodeForDetail: (code) => dispatch(actions.saveEditorCodeForDetail(code)), // 恢复初始代码 restoreInitialCode: (identifier, msg) => dispatch(actions.restoreInitialCode(identifier, msg)), + changeShowOrHideControl: (flag) => dispatch(actions.changeShowOrHideControl(flag)) }); export default withRouter(connect( mapStateToProps, mapDispatchToProps -)(StudentStudy)); +)(CNotificationHOC()(StudentStudy))); diff --git a/public/react/src/modules/developer/studentStudy/index.scss b/public/react/src/modules/developer/studentStudy/index.scss index bbf66aebb..68835f2ce 100644 --- a/public/react/src/modules/developer/studentStudy/index.scss +++ b/public/react/src/modules/developer/studentStudy/index.scss @@ -5,6 +5,6 @@ .right_pane_code_wrap{ position: relative; - background-color: #222; + // background-color: #222; height: 100%; } diff --git a/public/react/src/modules/developer/studentStudy/leftpane/comment/index.js b/public/react/src/modules/developer/studentStudy/leftpane/comment/index.js index 329e8fba1..ca7160117 100644 --- a/public/react/src/modules/developer/studentStudy/leftpane/comment/index.js +++ b/public/react/src/modules/developer/studentStudy/leftpane/comment/index.js @@ -4,15 +4,18 @@ * @Github: * @Date: 2019-11-27 09:49:35 * @LastEditors: tangjiang - * @LastEditTime: 2019-11-27 09:52:53 + * @LastEditTime: 2019-12-17 17:46:05 */ +import './index.scss'; import React from 'react'; - -const Comment = (props) => { +import Comment from '../../../../../common/components/comment'; +const CommentTask = (props) => { return ( -

    Comment

    +
    + +
    ) } -export default Comment; +export default CommentTask; diff --git a/public/react/src/modules/developer/studentStudy/leftpane/comment/index.scss b/public/react/src/modules/developer/studentStudy/leftpane/comment/index.scss new file mode 100644 index 000000000..ba9c132d9 --- /dev/null +++ b/public/react/src/modules/developer/studentStudy/leftpane/comment/index.scss @@ -0,0 +1,8 @@ +.task_comment_task{ + background: #fff; + padding: 20px 30px 0; + height: calc(100vh - 177px); + box-sizing: border-box; + overflow-y: auto; + border-bottom: 1px solid rgba(244,244,244,1); +} \ No newline at end of file diff --git a/public/react/src/modules/developer/studentStudy/leftpane/index.js b/public/react/src/modules/developer/studentStudy/leftpane/index.js index 69f49b9b1..347f4b4f8 100644 --- a/public/react/src/modules/developer/studentStudy/leftpane/index.js +++ b/public/react/src/modules/developer/studentStudy/leftpane/index.js @@ -4,11 +4,11 @@ * @Github: * @Date: 2019-11-23 11:33:41 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-09 19:57:21 + * @LastEditTime: 2019-12-19 18:03:22 // */ import './index.scss'; import React, { useState, useEffect, useMemo } from 'react'; -import { Tabs, Divider } from 'antd'; +import { Divider } from 'antd'; import { connect } from 'react-redux'; import Comment from './comment'; import CommitRecord from './commitRecord'; @@ -19,17 +19,10 @@ import actions from '../../../../redux/actions'; const LeftPane = (props) => { - const { hack, userCodeTab, changeUserCodeTab } = props; + const { hack, userCodeTab } = props; const { pass_count, submit_count } = hack; - const [defaultActiveKey, setDefaultActiveKey] = useState('task'); + const [defaultActiveKey, setDefaultActiveKey] = useState('comment'); - console.log(pass_count, submit_count); - const tabArrs = [ - { title: '任务描述', key: 'task', content: () }, - { title: '提交记录', key: 'record', content: () }, - // { title: '评论', key: 'comment', content: () }, - ]; - const navItem = [ { title: '任务描述', @@ -38,38 +31,30 @@ const LeftPane = (props) => { { title: '提交记录', key: 'record' - } + }, + // { + // title: '评论', + // key: 'comment' + // } ]; const Comp = { task: (), - record: () + record: (), + comment: () }; useEffect(() => { + console.log('====>>>>', userCodeTab); setDefaultActiveKey(userCodeTab); }, [userCodeTab]) - // const tabs = tabArrs.map((tab) => { - // const Comp = tab.content; - // return ( - // - // { Comp } - // - // ) - // }); - - // // tab切换时 - // const handleTabChange = (key) => { - // // setDefaultActiveKey(key); - // changeUserCodeTab(key); - // } - const renderComp = useMemo(() => { return Comp[defaultActiveKey]; - }, [defaultActiveKey]); + }, [defaultActiveKey, setDefaultActiveKey]); const renderNavItem = navItem.map((item) => { + const _classes = item.key === defaultActiveKey ? 'add_editor_item active' : 'add_editor_item'; return (
  • { return ( - {/* - { tabs } - -
    -
    - - - -
    -
    - - - -
    -
    */}
      { renderNavItem }
    @@ -126,11 +96,6 @@ const LeftPane = (props) => {
  • - {/*
    - - - -
    */}
    ); diff --git a/public/react/src/modules/developer/studentStudy/leftpane/index.scss b/public/react/src/modules/developer/studentStudy/leftpane/index.scss index 9e6f019f6..1582c033f 100644 --- a/public/react/src/modules/developer/studentStudy/leftpane/index.scss +++ b/public/react/src/modules/developer/studentStudy/leftpane/index.scss @@ -13,6 +13,8 @@ bottom: 0px; height: 56px; width: 100%; + box-sizing: border-box; + border-top: 1px solid rgba(244,244,244,1); // background: pink; padding: 0 30px; // background-color: rgba(250,250,250,1); @@ -79,4 +81,9 @@ margin-right: 5px; } } +} + +.add_editor_list_area{ + box-sizing: border-box; + border-bottom: 1px solid rgba(244,244,244,1); } \ No newline at end of file diff --git a/public/react/src/modules/developer/studentStudy/leftpane/taskDescription/index.js b/public/react/src/modules/developer/studentStudy/leftpane/taskDescription/index.js index 28fe51765..981770b8c 100644 --- a/public/react/src/modules/developer/studentStudy/leftpane/taskDescription/index.js +++ b/public/react/src/modules/developer/studentStudy/leftpane/taskDescription/index.js @@ -4,14 +4,15 @@ * @Github: * @Date: 2019-11-27 09:49:30 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-09 19:21:55 + * @LastEditTime: 2019-12-19 09:22:52 */ import '../index.scss'; import React from 'react'; import { Tag } from 'antd'; import { Link } from 'react-router-dom'; import { connect } from 'react-redux'; -import QuillEditor from '../../../quillEditor'; +import QuillForEditor from '../../../../../common/quillForEditor'; + import CONST from '../../../../../constants'; const {tagBackground, diffText} = CONST; @@ -36,22 +37,15 @@ const TaskDescription = (props) => {

    出题者: - {username} + {username}

    -
    - {/* */} - {/*
    */} ) } diff --git a/public/react/src/modules/developer/studentStudy/rightpane/index.js b/public/react/src/modules/developer/studentStudy/rightpane/index.js index 669a8a693..af46d0aef 100644 --- a/public/react/src/modules/developer/studentStudy/rightpane/index.js +++ b/public/react/src/modules/developer/studentStudy/rightpane/index.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-11-27 14:59:51 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-13 16:50:40 + * @LastEditTime: 2019-12-19 19:13:05 */ import React, { useState, useEffect } from 'react'; import {connect} from 'react-redux'; @@ -20,8 +20,11 @@ const RightPane = (props) => { submitUserCode, input, hack, + notice, updateCode, + hadCodeUpdate, editor_code, + updateNotice, saveUserInputCode, restoreInitialCode, saveUserCodeForInterval @@ -29,6 +32,7 @@ const RightPane = (props) => { const [editorCode, setEditorCode] = useState(''); + let initFlag = true; useEffect(() => { if (editor_code) { setEditorCode(editor_code); @@ -48,7 +52,12 @@ const RightPane = (props) => { // 代码块内容变化时 const handleCodeChange = (code) => { // 保存用户提交的代码块 - console.log(code); + setEditorCode(code); + // 第一次回填代码内容时不更新; + if (initFlag) { + initFlag = false; + return; + } if (!timer) { timer = setInterval(() => { clearInterval(timer); @@ -69,13 +78,21 @@ const RightPane = (props) => { restoreInitialCode(identifier, '恢复初始代码成功'); } + // 更新代码 + const handleUpdateNotice = () => { + updateNotice && updateNotice(); + }; + return (
    { const mapStateToProps = (state) => { - const {user_program_identifier, hack, userTestInput, editor_code} = state.ojForUserReducer; + const { + user_program_identifier, + hack, + userTestInput, + editor_code, + notice, + hadCodeUpdate + } = state.ojForUserReducer; // const { language, code } = hack; return { hack, + notice, + hadCodeUpdate, editor_code, input: userTestInput, submitInput: hack.input, diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index b498c4d22..672fff455 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -58,15 +58,6 @@ class TPMBanner extends Component { } } - // star_info:[0, 0, 0, 0, 0, 0], - // star_infos:[0, 0, 0, 0, 0, 0], - // shixunsDetails:{}, - // shixunId: undefined, - // componentWillReceiveProps(newProps, newContext){ - // this.setState({ - // shixunsDetails: newProps.shixunsDetails - // }); - // } IEVersion = () => { var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 @@ -118,31 +109,50 @@ class TPMBanner extends Component { if (prevProps != this.props) { let shixunopenprocess=window.localStorage.shixunopenprocess; let openopenpublictype=window.localStorage.openopenpublictype; - if(this.props.shixunsDetails&&this.props.shixunsDetails.shixun_status === 0 && this.props.identity < 5){ - if(shixunopenprocess===undefined||shixunopenprocess===false){ - this.setState({ - openknow:true - }) - }else{ - this.setState({ - openknow:false - }) + if(this.props.status===0&&this.props.openknows===false){ + + if(this.props.shixunsDetails&&this.props.shixunsDetails.shixun_status === 0 && this.props.identity < 5){ + if(shixunopenprocess===undefined||shixunopenprocess===false){ + this.setState({ + openknow:true + }) + }else{ + this.setState({ + openknow:false + }) + } } + }else{ + this.setState({ + openknow:false + }) } - if(this.props.shixunsDetails&&this.props.shixunsDetails.shixun_status === 2 && this.props.shixunsDetails&&this.props.shixunsDetails.public===0 && this.props.identity < 5){ - if(openopenpublictype===undefined||openopenpublictype===false){ - this.setState({ - openshowpublictype:true - }) - }else{ - this.setState({ - openshowpublictype:false - }) + + + if(this.props.public===0&&this.props.status>1&&this.props.openknows===false){ + if(this.props.shixunsDetails&&this.props.shixunsDetails.shixun_status === 2 && this.props.shixunsDetails&&this.props.shixunsDetails.public===0 && this.props.identity < 5){ + if(openopenpublictype===undefined||openopenpublictype===false){ + this.setState({ + openshowpublictype:true + }) + }else{ + this.setState({ + openshowpublictype:false + }) + } } + }else{ + this.setState({ + openshowpublictype:false + }) } + + } } + + componentDidMount() { let thiisie = this.IEVersion(); @@ -155,6 +165,7 @@ class TPMBanner extends Component { isIE: false }) } + } /* @@ -784,7 +795,8 @@ class TPMBanner extends Component { }; // // console.log(this.props.shixunsDetails&&this.props.shixunsDetails.is_jupyter) - + // console.log(this.props) + // console.log(this.state) return ( shixunsDetails === undefined ? "" : @@ -796,6 +808,9 @@ class TPMBanner extends Component { height: 180px !important; padding-top:35px !important; } + .ant-popover{ + z-index:1000 !important; + } ` } diff --git a/public/react/src/modules/tpm/TPMIndex.js b/public/react/src/modules/tpm/TPMIndex.js index d79bae95b..c44d8ce51 100644 --- a/public/react/src/modules/tpm/TPMIndex.js +++ b/public/react/src/modules/tpm/TPMIndex.js @@ -207,6 +207,7 @@ class TPMIndex extends Component { propaedeutics:response.data.propaedeutics, status: response.data.shixun_status, secret_repository: response.data.secret_repository, + public:response.data.public, is_jupyter:response.data.is_jupyter=== undefined||response.data.is_jupyter===null?false:response.data.is_jupyter, }); @@ -295,10 +296,6 @@ class TPMIndex extends Component { // this.getnavdatas() } - // componentDidUpdate=()=>{ - // this.getnavdatas() - // } - setLoadingContent = (isLoadingContent) => { this.setState({ loadingContent: isLoadingContent }) } @@ -307,9 +304,6 @@ class TPMIndex extends Component { getnavdatas=()=>{ let selectedKeys; const {location} = this.props; - - console.log(location.pathname) - if(location.pathname.indexOf('/challenges')!=-1){ selectedKeys="1" }else if(location.pathname.indexOf('/propaedeutics')!=-1){ @@ -385,6 +379,9 @@ class TPMIndex extends Component { margin:0 40px 0 0; padding:0px; } + .ant-popover{ + z-index:1000 !important; + } ` } diff --git a/public/react/src/modules/tpm/TPMsettings/LearningSettings.js b/public/react/src/modules/tpm/TPMsettings/LearningSettings.js index 681cbc956..a98f68223 100644 --- a/public/react/src/modules/tpm/TPMsettings/LearningSettings.js +++ b/public/react/src/modules/tpm/TPMsettings/LearningSettings.js @@ -215,9 +215,9 @@ export default class Shixuninformation extends Component { multi_webssh: false }) } else { - this.setState({ - multi_webssh: true - }) + // this.setState({ + // multi_webssh: true + // }) } this.setState({ opensshRadio: e.target.value diff --git a/public/react/src/modules/tpm/TPMsettings/Shixuninformation.js b/public/react/src/modules/tpm/TPMsettings/Shixuninformation.js index 200880019..66e1da8dd 100644 --- a/public/react/src/modules/tpm/TPMsettings/Shixuninformation.js +++ b/public/react/src/modules/tpm/TPMsettings/Shixuninformation.js @@ -50,6 +50,14 @@ class Shixuninformation extends Component { } componentDidMount() { + let query=this.props.location.search + const types = query.split('?edit=') + if(types[1]==="1"){ + let anchorElement = document.getElementById("newcourseContentMD"); + if(anchorElement){ + this.scrollToAnchor("newcourseContentMD"); + } + } } @@ -113,6 +121,7 @@ class Shixuninformation extends Component { selectright: this.props.data && this.props.data.shixun.choice_small_type, }) this.contentMdRef.current.setValue(this.props.data && this.props.data.shixun.description); + } } } @@ -807,16 +816,20 @@ class Shixuninformation extends Component { )} + + + diff --git a/public/react/src/modules/tpm/challengesnew/TPManswer.js b/public/react/src/modules/tpm/challengesnew/TPManswer.js index 9c9a23a12..9187e09b0 100644 --- a/public/react/src/modules/tpm/challengesnew/TPManswer.js +++ b/public/react/src/modules/tpm/challengesnew/TPManswer.js @@ -302,11 +302,11 @@ export default class TPManswer extends Component { className="color-grey-6 fr font-15 mt3">返回 {prev_challenge === undefined ? "" : - 上一关 + 上一关 } {next_challenge === undefined ? "" : - 下一关 + 下一关 } 返回 {prev_challenge === undefined ? "" : - 上一关 + 上一关 } {next_challenge === undefined ? "" : - 下一关 + 下一关 } 返回 { next_challenge===undefined?"": - 下一关 + 下一关 } { prev_challenge===undefined?"": - 上一关 + 上一关 } diff --git a/public/react/src/modules/tpm/challengesnew/TPMevaluation.js b/public/react/src/modules/tpm/challengesnew/TPMevaluation.js index d70f22a0a..34eb1a075 100644 --- a/public/react/src/modules/tpm/challengesnew/TPMevaluation.js +++ b/public/react/src/modules/tpm/challengesnew/TPMevaluation.js @@ -824,11 +824,11 @@ export default class TPMevaluation extends Component { className="color-grey-6 fr font-15 mt3">返回 {prev_challenge === undefined ? "" : - 上一关 + 上一关 } {next_challenge === undefined ? "" : - 下一关 + 下一关 } 返回 { prev_challenge===undefined?"": - 上一关 + 上一关 } { next_challenge===undefined?"": - 下一关 + 下一关 } { @@ -97,11 +99,11 @@ class TPMRightSection extends Component {
    - {TPMRightSectionData&&TPMRightSectionData.complete_count!=null?
    + {this.props&&this.props.status>1?
    学习统计 - 已完成 {TPMRightSectionData&&TPMRightSectionData.complete_count} 个 / 共 {TPMRightSectionData&&TPMRightSectionData.challenge_count} 关 + 已完成 {TPMRightSectionData&&TPMRightSectionData.complete_count===null?0:TPMRightSectionData&&TPMRightSectionData.complete_count} 个 / 共 {TPMRightSectionData&&TPMRightSectionData.challenge_count} 关
    diff --git a/public/react/src/modules/tpm/component/TPMright.css b/public/react/src/modules/tpm/component/TPMright.css index a75160bf5..0d6b306fd 100644 --- a/public/react/src/modules/tpm/component/TPMright.css +++ b/public/react/src/modules/tpm/component/TPMright.css @@ -119,9 +119,14 @@ .padd252020px{ padding: 25px 20px 15px; } + .rightjinengs{ height: 35px; margin-top: 20px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; } .borderbottomf4{ diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js index 307823ee8..548e7224a 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js @@ -34,7 +34,8 @@ class Challenges extends Component { operationstrue:false, isSpin:false, boxoffsetHeigh:0, - opentitletype:true + opentitletype:true, + isopentitletype:"Less", } } @@ -52,6 +53,13 @@ class Challenges extends Component { ChallengesDataList: response.data, sumidtype: false, }); + + if(response.data.description=== ""||response.data.description===null||response.data.description===undefined){ + this.setState({ + isopentitletype:"Less", + }) + } + } } }).catch((error) => { @@ -71,17 +79,19 @@ class Challenges extends Component { let box=document.getElementById("shixunchallengesid"); if(box){ boxoffsetHeigh=box.offsetHeight - if(boxoffsetHeigh<260){ + if(boxoffsetHeigh<300){ this.setState({ - opentitletype:false, + isopentitletype:"Less", boxoffsetHeigh:boxoffsetHeigh }) }else{ this.setState({ + opentitletype:true, + isopentitletype:"greater", boxoffsetHeigh:boxoffsetHeigh }) } - + console.log(boxoffsetHeigh) } } @@ -322,7 +332,8 @@ class Challenges extends Component { opentitle=()=>{ this.setState({ - opentitletype:!this.state.opentitletype + opentitletype:!this.state.opentitletype, + }) } @@ -334,6 +345,7 @@ class Challenges extends Component { } let id = this.props.match.params.shixunId; const antIcon = ; + return ( {AccountProfiletype===true?简介 {this.props.identity < 5 && ChallengesDataList&&ChallengesDataList.shixun_status < 3 ? - +
    {/**/} 编辑 - :""} + :""} {this.props.user && this.props.user.main_site === true ? this.props.identity < 5?实训制作指南 : "":""} @@ -407,7 +419,7 @@ class Challenges extends Component { { ` #shixunchallengesid{ - max-height: 260px; + max-height: 300px; overflow: hidden; } ` @@ -427,14 +439,22 @@ class Challenges extends Component {
    -

    + {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined? +

    + {this.props.identity < 5?:} +

    暂时还没有相关数据哦!

    +
    + :

    {ChallengesDataList === undefined ? "" :ChallengesDataList&&ChallengesDataList.description===null?"":

    } -

    +

    }
    - {this.state.opentitletype===true?this.opentitle()} className={"pointer Breadcrumbfont color-grey-9 "}> + + {this.state.isopentitletype==="Less"?"":this.state.opentitletype===true?this.opentitle()} className={"pointer Breadcrumbfont color-grey-9 "}> 阅读全文 :this.opentitle()} className={"pointer Breadcrumbfont color-grey-9 "}> 收起全文 diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index fcdbed408..e04ad17c9 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import { Link } from "react-router-dom"; -import { markdownToHTML, configShareForCustom} from 'educoder' +import { markdownToHTML, configShareForCustom,getImageUrl} from 'educoder' import { Divider, Tooltip } from 'antd'; import LoadingSpin from '../../../../common/LoadingSpin'; import 'antd/lib/pagination/style/index.css'; @@ -23,7 +23,8 @@ class Challengesjupyter extends Component { booljupyterurls:false, loading:false, boxoffsetHeigh:0, - opentitletype:true + opentitletype:true, + isopentitletype:"Less", } } @@ -41,6 +42,11 @@ class Challengesjupyter extends Component { ChallengesDataList: response.data, sumidtype: false, }); + if(response.data.description=== ""||response.data.description===null||response.data.description===undefined){ + this.setState({ + isopentitletype:"Less", + }) + } } } }).catch((error) => { @@ -55,13 +61,15 @@ class Challengesjupyter extends Component { let box=document.getElementById("shixunchallengesid"); if(box){ boxoffsetHeigh=box.offsetHeight - if(boxoffsetHeigh<260){ + if(boxoffsetHeigh<300){ this.setState({ - opentitletype:false, + isopentitletype:"Less", boxoffsetHeigh:boxoffsetHeigh }) }else{ this.setState({ + isopentitletype:"greater", + opentitletype:true, boxoffsetHeigh:boxoffsetHeigh }) } @@ -219,17 +227,17 @@ class Challengesjupyter extends Component {
    简介 - + 编辑 - +
    {this.state.opentitletype===true?:""} + :"":}
    :"":} +
    + + + {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined?:""} + + + {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined?"":this.state.isopentitletype==="greater"&&this.state.opentitletype===true? + :""} +
    @@ -471,7 +499,7 @@ class Challenges extends Component {
    - {this.state.isopentitletype==="Less"&&this.state.opentitletype===false?this.opentitle()} className={"pointer Breadcrumbfont color-grey-9 "}> + {this.state.isopentitletype==="Less"?"":this.state.opentitletype===true?this.opentitle()} className={"pointer Breadcrumbfont color-grey-9 "}> 阅读全文 :this.opentitle()} className={"pointer Breadcrumbfont color-grey-9 "}> 收起全文 diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index c68493163..d2376d616 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -48,33 +48,54 @@ class Challengesjupyter extends Component { isopentitletype:"Less", }) } + this.getjianjiesize() } } }).catch((error) => { //console.log(error) }); } + + + getjianjiesize=()=>{ + let {ChallengesDataList}=this.state; + let boxoffsetHeigh; + let box=document.getElementById("shixunchallengesid"); + + if(box){ + boxoffsetHeigh=box.offsetHeight + if(ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined){ + + }else{ + if(this.state.isopentitletype==="greater"){ + + }else{ + if(boxoffsetHeigh>=300){ + this.setState({ + opentitletype:true, + isopentitletype:"greater", + boxoffsetHeigh:boxoffsetHeigh + }) + }else{ + this.setState({ + isopentitletype:"Less", + boxoffsetHeigh:boxoffsetHeigh + }) + } + } + + } + + } + } componentDidUpdate = (prevProps,prevState) => { //防止陷入无限循环 if(prevState.ChallengesDataList!=this.state.ChallengesDataList){ - let boxoffsetHeigh; - let box=document.getElementById("shixunchallengesid"); - if(box){ - boxoffsetHeigh=box.offsetHeight - if(boxoffsetHeigh<300){ - this.setState({ - isopentitletype:"Less", - boxoffsetHeigh:boxoffsetHeigh - }) - }else{ - this.setState({ - isopentitletype:"greater", - opentitletype:true, - boxoffsetHeigh:boxoffsetHeigh - }) - } + if(this.state.isopentitletype==="greater"){ + }else{ + this.getjianjiesize() } } @@ -132,6 +153,8 @@ class Challengesjupyter extends Component { console.log("触发了jupytermessage"); that.modifyjupyter(); }); + setTimeout(this.getjianjiesize(), 1000); + } updatamakedowns = () => { @@ -220,6 +243,7 @@ class Challengesjupyter extends Component { } + render() { let{ChallengesDataList,booljupyterurls,enlarge}=this.state; let id = this.props.match.params.shixunId; @@ -252,17 +276,39 @@ class Challengesjupyter extends Component {
    - {this.state.opentitletype===true? + + {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined?:""} -
    + } + :""} + {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined?"":this.state.isopentitletype==="greater"&&this.state.opentitletype===true? + :""}

    @@ -341,11 +387,7 @@ class Challengesjupyter extends Component { : ( admin===true||business===true||mysidentity===true? -

    - -
    +

    任务详情

    (请将实训题目写在下方并保存)

    @@ -402,7 +444,7 @@ class Challengesjupyter extends Component { { admin===true||business===true||mysidentity===true?
    -
    +
    { this.state.jupyter_url===null || this.state.jupyter_url===undefined? ( diff --git a/public/react/src/redux/actions/ojForUser.js b/public/react/src/redux/actions/ojForUser.js index 9cb814d80..5484b6eec 100644 --- a/public/react/src/redux/actions/ojForUser.js +++ b/public/react/src/redux/actions/ojForUser.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-11-27 13:42:11 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-19 15:11:56 + * @LastEditTime: 2019-12-20 10:25:42 */ import types from "./actionTypes"; import { Base64 } from 'js-base64'; @@ -87,7 +87,7 @@ export const getUserProgramDetail = (identifier, type) => { type: types.SAVE_USE_TEST_CASE_VALUE, payload: data.test_case || {} }); - // 代码是否更新 + // 代码是否更新 let _modify_code = false; if (data.hack) { _modify_code = data.hack.modify_code; @@ -171,15 +171,103 @@ export const updateCode = (identifier, inputValue, type) => { } } +// 代码评测 +export const codeEvaluate = (dispatch, identifier, type, time_limit) => { + // 调试代码成功后,调用轮循接口, 注意: 代码执行的时间要小于设置的时间限制 + const intervalTime = 500; + let count = 1; + /** + * @param {*} excuteTime 执行时间 + * @param {*} finalTime 总时间 + * @param {*} count 执行次数 + * @param {*} timer 定时器 + */ + function getCodeSubmit (intervalTime, finalTime, count, timer){ + const excuteTime = (count++) * intervalTime; // 当前执行时间 + fetchCodeSubmit(identifier, { mode: type }).then(res => { + const { status } = res.data; // 评测返回结果 + // 清除定时器条件: 评测通过或者评测时间大于指定时间 + if (+status === 0 || (excuteTime / 1000) > (finalTime + 1)) { + clearInterval(timer); // 清除定时器 + timer = null; + let returnData = null; + if (status === 1) { // 结果没有返回 + returnData = { + error_line: -1, + error_msg: '', + execute_memory: '', + execute_time: finalTime, + input: '', + output: '', + status: 2, + expected_output: '' + }; + } else { // 成功返回结果 + returnData = res.data.data; + } + // 返回评测结果 + dispatch({ + type: types.COMMIT_RECORD_DETAIL, + payload: returnData + }); + if (!type || type === 'debug') { + dispatch({ // 改变 loading 值 + type: types.LOADING_STATUS, + payload: false + }); + // 保存执行状态 + dispatch({ + type: types.TEST_CODE_STATUS, + payload: 'finish' + }); + } else { + // 回滚提交按钮状态 + dispatch({ + type: types.SUBMIT_LOADING_STATUS, + payload: false + }); + // 改变tab值至提交记录(只在提交时才跳转,测评时,切换到代码执行结果就可以了) + dispatch({ + type: types.CHANGE_USER_CODE_TAB, + payload: 'record' + }); + // 重新调用一下提交记录接口 + dispatch(getUserCommitRecord(identifier)); + } + } + }).catch(err => { // 评测异常时 + // 清除定时器 + clearInterval(timer); + timer = null; + // 回滚按钮状态 + if (!type || type === 'debug') { + dispatch({ // 改变 loading 值 + type: types.LOADING_STATUS, + payload: false + }); + } else { // 回滚提交按钮状态 + dispatch({ + type: types.SUBMIT_LOADING_STATUS, + payload: false + }); + } + }); + } + // 开启定时器,调用监听接口 + let timer = setInterval(() => { + getCodeSubmit(intervalTime, time_limit, count++, timer); + }, intervalTime); +} + /** * @description 调试代码 - * @param {*} identifier + * @param {*} identifier * @param {*} inputValue 输入值: 自定义 | 系统返回的 * @param {*} type 测评类型 debug | submit */ export const debuggerCode = (identifier,value, type) => { return (dispatch, getState) => { - // 调用之前 先保存 code + // 调用之前 先保存 code // TODO // console.log(identifier, value); const {hack: {time_limit = 0}} = getState().ojForUserReducer; @@ -194,15 +282,6 @@ export const debuggerCode = (identifier,value, type) => { // console.log('调用调试代码成功并返回结果: ', res); const { status } = res; if (status === 200) { - // 调试代码成功后,调用轮循接口, 注意: 代码执行的时间要小于设置的时间限制 - const intervalTime = 500; - let count = 1; - /** - * @param {*} excuteTime 执行时间 - * @param {*} finalTime 总时间 - * @param {*} count 执行次数 - * @param {*} timer 定时器 - */ if (res.data.status === 401) { dispatch({ // 改变 loading 值 type: types.LOADING_STATUS, @@ -210,81 +289,8 @@ export const debuggerCode = (identifier,value, type) => { }); return; }; - function getCodeSubmit (intervalTime, finalTime, count, timer){ - const excuteTime = (count++) * intervalTime; // 当前执行时间 - fetchCodeSubmit(identifier, { mode: type }).then(res => { - const { status } = res.data; // 评测返回结果 - // 清除定时器条件: 评测通过或者评测时间大于指定时间 - if (+status === 0 || (excuteTime / 1000) > (finalTime + 1)) { - clearInterval(timer); // 清除定时器 - timer = null; - let returnData = null; - if (status === 1) { // 结果没有返回 - returnData = { - error_line: -1, - error_msg: '', - execute_memory: '', - execute_time: finalTime, - input: '', - output: '', - status: 2, - expected_output: '' - }; - } else { // 成功返回结果 - returnData = res.data.data; - } - // 返回评测结果 - dispatch({ - type: types.COMMIT_RECORD_DETAIL, - payload: returnData - }); - if (!type || type === 'debug') { - dispatch({ // 改变 loading 值 - type: types.LOADING_STATUS, - payload: false - }); - // 保存执行状态 - dispatch({ - type: types.TEST_CODE_STATUS, - payload: 'finish' - }); - } else { - // 回滚提交按钮状态 - dispatch({ - type: types.SUBMIT_LOADING_STATUS, - payload: false - }); - // 改变tab值至提交记录(只在提交时才跳转,测评时,切换到代码执行结果就可以了) - dispatch({ - type: types.CHANGE_USER_CODE_TAB, - payload: 'record' - }); - // 重新调用一下提交记录接口 - dispatch(getUserCommitRecord(identifier)); - } - } - }).catch(err => { // 评测异常时 - // 清除定时器 - clearInterval(timer); - timer = null; - // 回滚按钮状态 - if (!type || type === 'debug') { - dispatch({ // 改变 loading 值 - type: types.LOADING_STATUS, - payload: false - }); - } else { // 回滚提交按钮状态 - dispatch({ - type: types.SUBMIT_LOADING_STATUS, - payload: false - }); - } - }); - } - // 开启定时器,调用监听接口 - let timer = setInterval(() => { - getCodeSubmit(intervalTime, time_limit, count++, timer); - }, intervalTime); + // 测评 + codeEvaluate(dispatch, identifier, type, time_limit); } }).catch(() => { dispatch({ @@ -362,7 +368,8 @@ export const changeUserCodeTab = (key) => { */ export const submitUserCode = (identifier, inputValue, type) => { return (dispatch, getState) => { - const { userCode, isUpdateCode } = getState().ojForUserReducer; + const { userCode, isUpdateCode, hack: {time_limit = 0} } = getState().ojForUserReducer; + function userCodeSubmit () { fetchUserCodeSubmit(identifier).then(res => { // console.log('用户提交代码成功======》》》》》', res); @@ -374,12 +381,8 @@ export const submitUserCode = (identifier, inputValue, type) => { }); return; }; - // 将编辑代码清空 - dispatch({ - type: types.SAVE_EDITOR_CODE, - payload: '' - }); - dispatch(debuggerCode(identifier, inputValue, type || 'submit')); + // 测评 + codeEvaluate(dispatch, identifier, type, time_limit); } }).catch(() => { dispatch({ diff --git a/public/react/src/services/ojService.js b/public/react/src/services/ojService.js index 373805b73..e552c1211 100644 --- a/public/react/src/services/ojService.js +++ b/public/react/src/services/ojService.js @@ -4,11 +4,10 @@ * @Github: * @Date: 2019-11-20 10:55:38 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-17 14:10:37 + * @LastEditTime: 2019-12-20 10:10:53 */ import axios from 'axios'; -import { func } from 'prop-types'; export async function fetchOJList (params) { console.log('传递的参数: ', params); @@ -137,4 +136,4 @@ export async function fetchUploadImage (file) { export async function fetchUploadImageUrl (id) { const url = `/attachments/${id}`; return axios.get(url); -} +} From 16d8db7b5acf4bc19b09df4bb57752734cddd34d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 12:58:39 +0800 Subject: [PATCH 15/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shixunchild/Challenges/Challengesjupyter.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index b571b3101..9f28f2757 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -118,12 +118,17 @@ class Challengesjupyter extends Component { }); + let self = this; //为了避免作用域及缓存 + window.receiveMessageFromIndex = function ( event ) { + if(event!=undefined){ + console.log("触发了jupytermessage"); + console.log("触发了jupytermessage"); + // self.modifyjupyter(); - window.addEventListener('jupytermessage', (e) => { - console.log("触发了jupytermessage"); - console.log("触发了jupytermessage"); - that.modifyjupyter(); - }); + } + } + //监听message事件 + window.addEventListener("jupytermessage", receiveMessageFromIndex, false); } updatamakedowns = () => { From b7abe189bff2d22c6017d74d577aa7567b2331e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 13:02:54 +0800 Subject: [PATCH 16/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tpm/shixunchild/Challenges/Challengesjupyter.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index c68493163..8e03f75e9 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -125,13 +125,13 @@ class Challengesjupyter extends Component { }); - - - window.addEventListener('jupytermessage', (e) => { + let self = this; //为了避免作用域及缓存 + window.receiveMessageFromIndex = function ( event ) { console.log("触发了jupytermessage"); console.log("触发了jupytermessage"); - that.modifyjupyter(); - }); + } + //监听message事件 + window.addEventListener("message", receiveMessageFromIndex, false); } updatamakedowns = () => { From 5048423aee06de7ae14f6c14a0a6a1aff5731cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 13:05:29 +0800 Subject: [PATCH 17/40] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/javascripts/jupyter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/javascripts/jupyter.js b/public/javascripts/jupyter.js index 7b2313139..a2de37ce5 100644 --- a/public/javascripts/jupyter.js +++ b/public/javascripts/jupyter.js @@ -8,5 +8,5 @@ $(function(){ $(function(){ console.log("开始发送消息了"); - window.parent.postMessage('jupytermessage','*'); + window.parent.postMessage('message','*'); }) From baa5ec685d301249820dd75cf54bf25a928758ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 13:41:36 +0800 Subject: [PATCH 18/40] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/tpm/shixunchild/Challenges/Challengesjupyter.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index 0e243e6d8..ee3f9a0e9 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -152,8 +152,8 @@ class Challengesjupyter extends Component { window.addEventListener('message', (e) => { console.log("触发了jupytermessage"); - console.log("触发了jupytermessage"); - that.modifyjupyter(); + console.log(e); + // that.modifyjupyter(); }); setTimeout(this.getjianjiesize(), 1000); @@ -410,8 +410,6 @@ class Challengesjupyter extends Component {
    -
    - : "" ) From 7171b5cba36def4e50bc695921ca449c90143d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 13:42:44 +0800 Subject: [PATCH 19/40] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/javascripts/jupyter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/javascripts/jupyter.js b/public/javascripts/jupyter.js index a2de37ce5..7b2313139 100644 --- a/public/javascripts/jupyter.js +++ b/public/javascripts/jupyter.js @@ -8,5 +8,5 @@ $(function(){ $(function(){ console.log("开始发送消息了"); - window.parent.postMessage('message','*'); + window.parent.postMessage('jupytermessage','*'); }) From 8250d5fccb73a6fed9a2dffa5d13a488419501e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 13:48:39 +0800 Subject: [PATCH 20/40] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tpm/shixunchild/Challenges/Challengesjupyter.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index ee3f9a0e9..d03a0ea89 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -153,7 +153,15 @@ class Challengesjupyter extends Component { window.addEventListener('message', (e) => { console.log("触发了jupytermessage"); console.log(e); - // that.modifyjupyter(); + if(e){ + if(e.data){ + if(e.data==="jupytermessage"){ + that.modifyjupyter(); + } + } + + } + }); setTimeout(this.getjianjiesize(), 1000); From 1e078211b0ba325957c4a60042ec4f929ca8eebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 13:57:50 +0800 Subject: [PATCH 21/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/tpm/shixunchild/Challenges/Challengesjupyter.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index 861b93c88..e9674b2ac 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -413,9 +413,9 @@ class Challengesjupyter extends Component { marginLeft: '30px', }} onClick={()=>this.onclki(true)}> } -

    导入

    -
    + {/*
    导入

    */} + {/*
    */}
    : From a44e06b50671c91368329715440028b3595e79d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 14:12:00 +0800 Subject: [PATCH 22/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Challenges/Challengesjupyter.js | 234 +++++++----------- 1 file changed, 91 insertions(+), 143 deletions(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index e9674b2ac..d3aa910b8 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -8,7 +8,7 @@ import '../shixunchildCss/Challenges.css'; import axios from 'axios'; const $ = window.$; - +//12.20,14:11 class Challengesjupyter extends Component { constructor(props) { super(props) @@ -48,54 +48,33 @@ class Challengesjupyter extends Component { isopentitletype:"Less", }) } - this.getjianjiesize() } } }).catch((error) => { //console.log(error) }); } - - - getjianjiesize=()=>{ - let {ChallengesDataList}=this.state; - let boxoffsetHeigh; - let box=document.getElementById("shixunchallengesid"); - - if(box){ - boxoffsetHeigh=box.offsetHeight - if(ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined){ - - }else{ - if(this.state.isopentitletype==="greater"){ - - }else{ - if(boxoffsetHeigh>=300){ - this.setState({ - opentitletype:true, - isopentitletype:"greater", - boxoffsetHeigh:boxoffsetHeigh - }) - }else{ - this.setState({ - isopentitletype:"Less", - boxoffsetHeigh:boxoffsetHeigh - }) - } - } - - } - - } - } componentDidUpdate = (prevProps,prevState) => { //防止陷入无限循环 if(prevState.ChallengesDataList!=this.state.ChallengesDataList){ - if(this.state.isopentitletype==="greater"){ + let boxoffsetHeigh; + let box=document.getElementById("shixunchallengesid"); + if(box){ + boxoffsetHeigh=box.offsetHeight + if(boxoffsetHeigh<300){ + this.setState({ + isopentitletype:"Less", + boxoffsetHeigh:boxoffsetHeigh + }) + }else{ + this.setState({ + isopentitletype:"greater", + opentitletype:true, + boxoffsetHeigh:boxoffsetHeigh + }) + } - }else{ - this.getjianjiesize() } } @@ -105,9 +84,9 @@ class Challengesjupyter extends Component { setTimeout(this.ChallengesList(), 1000); let id = this.props.match.params.shixunId; let ChallengesURL = `/jupyters/get_info_with_tpm.json`; - let datas={ - identifier:id, - } + let datas={ + identifier:id, + } axios.get(ChallengesURL, {params: datas}).then((response) => { if (response.data.status === 403||response.data.status === 401||response.data.status === 500) { setTimeout(() => { @@ -115,26 +94,26 @@ class Challengesjupyter extends Component { booljupyterurls:true, }) }, 600) + }else{ + if(response.data.status===0){ + + setTimeout(() => { + this.setState({ + jupyter_url:response.data.url, + jupyter_port:response.data.port, + booljupyterurls:true, + }) + }, 800) + }else{ - if(response.data.status===0){ - - setTimeout(() => { - this.setState({ - jupyter_url:response.data.url, - jupyter_port:response.data.port, - booljupyterurls:true, - }) - }, 800) - - }else{ - setTimeout(() => { - this.setState({ - booljupyterurls:true, - }) - }, 600) + setTimeout(() => { + this.setState({ + booljupyterurls:true, + }) + }, 600) - } } + } }).catch((error) => { @@ -145,10 +124,6 @@ class Challengesjupyter extends Component { }, 600) }); - setTimeout(this.getjianjiesize(), 1000); - - - window.addEventListener('message', (e) => { console.log("触发了jupytermessage"); @@ -163,8 +138,6 @@ class Challengesjupyter extends Component { } }); - setTimeout(this.getjianjiesize(), 1000); - } updatamakedowns = () => { @@ -218,13 +191,13 @@ class Challengesjupyter extends Component { modifyjupyter=()=>{ let id=this.props.match.params.shixunId; - var jupyter_port=""; - try{ - jupyter_port= parseInt(this.state.jupyter_port); - }catch (e) { - jupyter_port=this.state.jupyter_port; + var jupyter_port=""; + try{ + jupyter_port= parseInt(this.state.jupyter_port); + }catch (e) { + jupyter_port=this.state.jupyter_port; - } + } const url=`/jupyters/save_with_tpm.json`; const data={ identifier:id, @@ -234,7 +207,6 @@ class Challengesjupyter extends Component { .then((result) => { if (result.data.status === 0) { this.props.showNotification(`应用成功`); - console.log("触发了jupytermessage调用了应用成功"); } }).catch((error) => { }) @@ -245,15 +217,12 @@ class Challengesjupyter extends Component { opentitletype:!this.state.opentitletype }) } - onclki=(bool)=>{ this.setState({ enlarge:bool }) } - - render() { let{ChallengesDataList,booljupyterurls,enlarge}=this.state; let id = this.props.match.params.shixunId; @@ -263,8 +232,6 @@ class Challengesjupyter extends Component { const business = this.props&&this.props.current_user&&this.props.current_user.business?this.props.current_user.business:false; //管理员 const admin = this.props&&this.props.current_user&&this.props.current_user.admin?this.props.current_user.admin:false; - //用户 - const login = this.props&&this.props.current_user&&this.props.current_user.login?this.props.current_user.login:""; let mysidentity =false; try { @@ -286,39 +253,17 @@ class Challengesjupyter extends Component {
    - -
    - - - {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined?:""} - {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined?"":this.state.isopentitletype==="greater"&&this.state.opentitletype===true? - :""} + } + :""} +

    @@ -385,9 +330,8 @@ class Challengesjupyter extends Component { display: flex; flex-direction:row-reverse; } - ; - } + } ` } @@ -396,29 +340,33 @@ class Challengesjupyter extends Component { "" : ( - admin===true||business===true||mysidentity===true? -

    -
    -

    任务详情

    -

    (请将实训题目写在下方并保存)

    -
    -
    - { - enlarge===true? - this.onclki(false)}> - : - this.onclki(true)}> - } - {/*
    导入

    */} - {/*
    */} + admin===true||business===true||mysidentity===true? +
    + +
    +
    +

    任务详情

    +

    (请将实训题目写在下方并保存)

    +
    +
    + { + enlarge===true? + this.onclki(false)}> + : + this.onclki(true)}> + } + {/*
    this.modifyjupyter(this.state)}>导入

    */} + {/*
    */} +
    - : + + : "" ) @@ -450,25 +398,25 @@ class Challengesjupyter extends Component { } { - admin===true||business===true||mysidentity===true? -
    -
    - { - this.state.jupyter_url===null || this.state.jupyter_url===undefined? - ( - booljupyterurls===false? - - :"" - ) - : + admin===true||business===true||mysidentity===true? +
    +
    + { + this.state.jupyter_url===null || this.state.jupyter_url===undefined? + ( + booljupyterurls===false? + + :"" + ) + : - } -
    + }
    - :"" +
    + :"" }
    From 9bcc7c810630902274b7afc2837950969caffbe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 14:15:45 +0800 Subject: [PATCH 23/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tpm/shixunchild/Challenges/Challengesjupyter.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index d3aa910b8..804c485b5 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -341,9 +341,11 @@ class Challengesjupyter extends Component { : ( admin===true||business===true||mysidentity===true? -
    +
    -
    +

    任务详情

    (请将实训题目写在下方并保存)

    @@ -359,7 +361,7 @@ class Challengesjupyter extends Component { marginLeft: '30px', }} onClick={()=>this.onclki(true)}> } - {/*
    this.modifyjupyter(this.state)}>导入

    */} {/*
    */}
    From 16d95d842b79831b67b057387d6f32c192860dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 14:25:04 +0800 Subject: [PATCH 24/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/javascripts/jupyter.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/public/javascripts/jupyter.js b/public/javascripts/jupyter.js index 7b2313139..50541f6e7 100644 --- a/public/javascripts/jupyter.js +++ b/public/javascripts/jupyter.js @@ -4,9 +4,18 @@ $(function(){ console.log("educoder jupyter js init"); + runEvery10Sec(); }) $(function(){ console.log("开始发送消息了"); window.parent.postMessage('jupytermessage','*'); + }) + +function runEvery10Sec() { + // 1000 * 10 = 10 秒钟 + console.log("每隔10秒中一次runEvery10Sec"); + setTimeout( runEvery10Sec, 1000 * 10 ); + +} From 4e803c511426cf1e1414dbb614039f176e1eb2a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 14:33:47 +0800 Subject: [PATCH 25/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/javascripts/jupyter.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/public/javascripts/jupyter.js b/public/javascripts/jupyter.js index 50541f6e7..021d46a2e 100644 --- a/public/javascripts/jupyter.js +++ b/public/javascripts/jupyter.js @@ -2,20 +2,15 @@ //guange 2019.12.18 -$(function(){ - console.log("educoder jupyter js init"); - runEvery10Sec(); -}) - $(function(){ console.log("开始发送消息了"); - window.parent.postMessage('jupytermessage','*'); - + runEvery10Sec(); }) function runEvery10Sec() { // 1000 * 10 = 10 秒钟 console.log("每隔10秒中一次runEvery10Sec"); + window.parent.postMessage('jupytermessage','*'); setTimeout( runEvery10Sec, 1000 * 10 ); } From 71551ec21d421b82b2c9001576d9ca4c9672791f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 14:43:25 +0800 Subject: [PATCH 26/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/tpm/shixunchild/Challenges/Challengesjupyter.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index 804c485b5..5e26ac86e 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -206,7 +206,8 @@ class Challengesjupyter extends Component { axios.get(url, {params: data}) .then((result) => { if (result.data.status === 0) { - this.props.showNotification(`应用成功`); + // this.props.showNotification(`应用成功`); + console.log("应用成功了"); } }).catch((error) => { }) From 8fcb7b9e259c2f9fbc6ec15624ceb9cf0d400470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 14:56:09 +0800 Subject: [PATCH 27/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/TPMBanner.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index c122289bb..bb07df5df 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -868,8 +868,8 @@ class TPMBanner extends Component { - { - this.props.is_jupyter===true?"": + {/*{*/} + {/* this.props.is_jupyter===true?"":*/} @@ -934,7 +934,7 @@ class TPMBanner extends Component {
    - } + // } { From 5cf64eb4c12e07235edf223ce0283a5c1fd8af5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 14:57:52 +0800 Subject: [PATCH 28/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/tpm/shixunchild/Challenges/Challengesjupyter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index 5e26ac86e..e137dc883 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -354,11 +354,11 @@ class Challengesjupyter extends Component {
    { enlarge===true? - this.onclki(false)}> : - this.onclki(true)}> } From de957b68d753287027e6b5e00e85bb7a936d5b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 14:59:49 +0800 Subject: [PATCH 29/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/tpm/shixunchild/shixunchildCss/Challenges.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css index d18370a51..1e1945f89 100644 --- a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css +++ b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css @@ -187,7 +187,7 @@ } .ysliconfont{ text-align: center; - line-height: 30px; + line-height: 29px; } .fangdaone{ From f33bc9e22dc2b95407de906068c31e34e25c3082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 15:07:03 +0800 Subject: [PATCH 30/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/TPMBanner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index bb07df5df..0a123e73a 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -934,7 +934,7 @@ class TPMBanner extends Component {
    - // } + {/*// }*/} { From 76a67e76711d7752ec3abce64ec0388715ec36f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 16:10:33 +0800 Subject: [PATCH 31/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/tpm/shixunchild/Challenges/Challengesjupyter.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index e137dc883..bf98054d7 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -98,8 +98,11 @@ class Challengesjupyter extends Component { if(response.data.status===0){ setTimeout(() => { + + var url=response.data.url; + var url2=url.replace("http://","https://"); this.setState({ - jupyter_url:response.data.url, + jupyter_url:url2, jupyter_port:response.data.port, booljupyterurls:true, }) From a0502bf4ed48385e21aacf89585877de855e860a Mon Sep 17 00:00:00 2001 From: guagne <8863824@gmail.com> Date: Fri, 20 Dec 2019 16:12:26 +0800 Subject: [PATCH 32/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BB=B6=E6=97=B6?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/jupyters_controller.rb | 13 ++++++++++++- app/services/jupyter_service.rb | 21 +++++++++++++++++++++ config/routes.rb | 2 ++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/controllers/jupyters_controller.rb b/app/controllers/jupyters_controller.rb index 96ebf3452..4c03e0dd3 100644 --- a/app/controllers/jupyters_controller.rb +++ b/app/controllers/jupyters_controller.rb @@ -42,5 +42,16 @@ class JupytersController < ApplicationController render json: {status: 0, url: info[:url], port: info[:port]} end + def active_with_tpm + shixun = Shixun.find_by(identifier: params[:identifier]) + jupyter_active_tpm(shixun) + render json: {status: 0} + end + + def active_with_tpi + myshixun = Myshixun.find_by(identifier: params[:identifier]) + jupyter_active_tpm(myshixun) + render json: {status: 0} + end -end \ No newline at end of file +end diff --git a/app/services/jupyter_service.rb b/app/services/jupyter_service.rb index 0f5af6cb8..bff9b5dc6 100644 --- a/app/services/jupyter_service.rb +++ b/app/services/jupyter_service.rb @@ -191,5 +191,26 @@ module JupyterService edu_setting('jupyter_service').gsub("PORT", jupyter_port) end + def _jupyter_active(tpiID) + shixun_tomcat = edu_setting('cloud_bridge') + uri = "#{shixun_tomcat}/bridge/jupyter/active" + params = {:tpiID => tpiID} + res = uri_post uri, params + if res && res['code'].to_i != 0 + raise("实训云平台繁忙(繁忙等级:120)") + end + end + + # tpm 延时 + def jupyter_active_tpm(shixun) + tpiID = "tpm#{shixun.id}" + _jupyter_active(tpiID) + end + + # tpi 延时 + def jupyter_active_tpi(myshixun) + tpiID = myshixun.id + _jupyter_active(tpiID) + end end diff --git a/config/routes.rb b/config/routes.rb index 0d2aba843..151cc0b32 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -33,6 +33,8 @@ Rails.application.routes.draw do get :get_info_with_tpm get :reset_with_tpi get :reset_with_tpm + get :active_with_tpm + get :active_with_tpi end end From a5077c3011fd657f1ade30cc8de7362275cf73dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 20 Dec 2019 16:23:43 +0800 Subject: [PATCH 33/40] =?UTF-8?q?jupytertpi=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/js/jupyter.js | 17 +++- public/react/src/modules/page/VNC.css | 2 +- public/react/src/modules/tpm/jupyter/index.js | 93 +++++++++++++++++-- .../react/src/modules/tpm/jupyter/index.scss | 57 +++++++++++- .../modules/tpm/jupyter/leftPane/index.scss | 11 ++- .../Challenges/Challengesjupyter.js | 2 - 6 files changed, 162 insertions(+), 20 deletions(-) diff --git a/public/react/public/js/jupyter.js b/public/react/public/js/jupyter.js index 97a0face2..361287317 100644 --- a/public/react/public/js/jupyter.js +++ b/public/react/public/js/jupyter.js @@ -1,9 +1,16 @@ +/* + * @Author: your name + * @Date: 2019-12-20 11:40:56 + * @LastEditTime : 2019-12-20 13:38:49 + * @LastEditors : Please set LastEditors + * @Description: In User Settings Edit + * @FilePath: /notebook/Users/yangshuming/Desktop/new__educode/educoder/public/react/public/js/jupyter.js + */ window.onload=function(){ - // require(["base/js/namespace"],function(Jupyter) { - // Jupyter.notebook.save_checkpoint(); - // }); - $('.navbar-nav').children().eq(7).css({'display':'none'}) - console.log($('.navbar-nav').children().eq(7)) + require(["base/js/namespace"],function(Jupyter) { + Jupyter.notebook.save_checkpoint(); + }); + } diff --git a/public/react/src/modules/page/VNC.css b/public/react/src/modules/page/VNC.css index e29335242..d59d91121 100644 --- a/public/react/src/modules/page/VNC.css +++ b/public/react/src/modules/page/VNC.css @@ -38,5 +38,5 @@ } .newjupyter_float_button{ - right: 257px; + right: 330px; } \ No newline at end of file diff --git a/public/react/src/modules/tpm/jupyter/index.js b/public/react/src/modules/tpm/jupyter/index.js index 7425a4732..617ef0936 100644 --- a/public/react/src/modules/tpm/jupyter/index.js +++ b/public/react/src/modules/tpm/jupyter/index.js @@ -9,7 +9,7 @@ import './index.scss'; import React, { useEffect, useState } from 'react'; import SplitPane from 'react-split-pane'; -import { Button, Modal,Drawer } from 'antd'; +import { Button, Modal,Drawer ,Pagination,Empty,Tooltip,Icon,message} from 'antd'; import { connect } from 'react-redux'; @@ -18,6 +18,25 @@ import UserInfo from '../../developer/components/userInfo'; import actions from '../../../redux/actions'; import LeftPane from './leftPane'; import RightPane from './rightPane'; +import MyIcon from "../../../common/components/MyIcon"; +function jsCopy(s) { + var copyEle = document.getElementById(s); + const range = document.createRange(); // 创造range + window.getSelection().removeAllRanges(); //清除页面中已有的selection + range.selectNode(copyEle); // 选中需要复制的节点 + window.getSelection().addRange(range); // 执行选中元素 + const copyStatus = document.execCommand("Copy"); // 执行copy操作 + // 对成功与否定进行提示 + copyStatuss(copyStatus) +} + +function copyStatuss(copyStatus){ + if (copyStatus) { + message.success('复制成功'); + } else { + message.error('复制失败'); + } +} function JupyterTPI (props) { // 获取 identifier 值 @@ -45,11 +64,17 @@ function JupyterTPI (props) { drawervisible, } = props; + const emptyCtx = ( +
    + +
    + ); const {identifier} = params; const [userInfo, setUserInfo] = useState({}); const [jupyterInfo, setJupyterInfo] = useState({}); const [updateTip, setUpdateTip] = useState(true); const [myIdentifier, setMyIdentifier] = useState(''); + const [renderCtx, setRenderCtx] = useState(() => (emptyCtx)); useEffect(() => { /* 先调用 jupyter的 TPI 接口, * 获取 用户信息, @@ -170,6 +195,45 @@ function JupyterTPI (props) { const firstDrawerWidth = ()=>{ return 260 }; + + // 分页处理 + const handleChangePage = (page) => { + // console.log(page, pageSize); + handlePageChange(page); + } + // const listCtx = ; + useEffect(() => { + if (dataSets.length > 0) { + console.log('数据集的个数: ', dataSets.length); + const oList = dataSets.map((item, i) => { + return ( +
  • + + + {item.title} + { + jsCopy("file_path"+i) + }}>复制地址 + + +
  • + ); + }); + + const oUl = ( +
      + { oList } +
    + ); + + setRenderCtx(oUl); + } + }, [props]); return (
    @@ -206,8 +270,8 @@ function JupyterTPI (props) {
    {/*
    */} - {/* -

    Some contents...

    -

    Some contents...

    -

    Some contents...

    +

    +
    +

    + {/**/} + 数据集 + {/* 数据集 */} +

    + { renderCtx } +
    + {total<20?"":} +
    + +
    diff --git a/public/react/src/modules/tpm/jupyter/index.scss b/public/react/src/modules/tpm/jupyter/index.scss index 5fdfcb02c..76c8bedd1 100644 --- a/public/react/src/modules/tpm/jupyter/index.scss +++ b/public/react/src/modules/tpm/jupyter/index.scss @@ -103,4 +103,59 @@ font-size: 14px; } } -} \ No newline at end of file +} + +.RightPaneDrawer{ + .RightPaneDrawertop{ + width:330px; + height:29px; + background:rgba(17,28,36,1); + } + + .ant-drawer-content-wrapper{ + width:330px !important; + box-shadow: -2px 0 8px #070F1A !important; + } + .ant-drawer-body{ + padding: 0px; + } + .ant-drawer-wrapper-body{ + padding-top: 60px; + background: #070F1A; + overflow: hidden !important; + } + + .ant-pagination{ + color:#fff !important; + } + +} + +.newjupyter_data_sets_area{ + background:#070F1A !important; + .jupyter_h2_title { + height:49px; + line-height: 49px; + background: #070F1A !important; + border-bottom: 1px solid #17212F !important; + color:#FFFFFF !important; + border-top: 1px solid #17212F !important; + } + .iconfont{ + color:#28b887!important; + font-size: 30px !important; + margin-right: 20px; + } + .jupyter_pagination{ + border-top: 1px solid #070F1A !important; + } + + .jupyter_name{ + color:#FFFFFF !important; + } + .file_path_input{ + position: absolute; + right: -50%; + } +} + diff --git a/public/react/src/modules/tpm/jupyter/leftPane/index.scss b/public/react/src/modules/tpm/jupyter/leftPane/index.scss index 352e1c9ab..495e21f20 100644 --- a/public/react/src/modules/tpm/jupyter/leftPane/index.scss +++ b/public/react/src/modules/tpm/jupyter/leftPane/index.scss @@ -2,15 +2,15 @@ height: 100%; background: #fff; .jupyter_h2_title{ - height: 44px; - line-height: 44px; + //height: 44px; + //line-height: 44px; // background-color: #EEEEEE; background: #fff; padding: 0 20px; font-size: 16px; // box-size: border-box; box-sizing: border-box; - border-bottom: 1px solid rgba(238,238,238,1); + //border-bottom: 1px solid rgba(238,238,238,1); .jupyter_data_icon{ // color: #7286ff; color: #1890ff; @@ -24,14 +24,15 @@ .jupyter_data_list, .jupyter_empty{ - height: calc(100vh - 160px); + //height: calc(100vh - 160px); + min-height: 350px; overflow-y: auto; } .jupyter_data_list{ .jupyter_item{ line-height:45px; - border-bottom: 1px solid rgba(238,238,238, 1); + //border-bottom: 1px solid rgba(238,238,238, 1); padding: 0 30px 0 60px; overflow: hidden; text-overflow:ellipsis; diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index f11f03b6b..995753dff 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -410,8 +410,6 @@ class Challengesjupyter extends Component {
    -
    - : "" ) From ca12b1e57403e359f941af2914bf5fefd637d32d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 16:31:22 +0800 Subject: [PATCH 34/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tpm/shixunchild/Challenges/Challengesjupyter.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index 9eb82c7d4..fd20d58f4 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -117,25 +117,19 @@ class Challengesjupyter extends Component { }, 600) }else{ if(response.data.status===0){ - setTimeout(() => { - - var url=response.data.url; - var url2=url.replace("http://","https://"); this.setState({ - jupyter_url:url2, + jupyter_url:response.data.url, jupyter_port:response.data.port, booljupyterurls:true, }) }, 800) - }else{ setTimeout(() => { this.setState({ booljupyterurls:true, }) }, 600) - } } From a4d2b5976406b1c178c66e9c1d944916dae358ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 20 Dec 2019 16:54:00 +0800 Subject: [PATCH 35/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/javascripts/jupyter.js | 10 +++++---- public/react/src/AppConfig.js | 2 +- public/react/src/modules/tpm/jupyter/index.js | 21 +++++++++++++++++++ .../modules/tpm/jupyter/rightPane/index.js | 14 ++++++------- .../Challenges/Challengesjupyter.js | 1 - 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/public/javascripts/jupyter.js b/public/javascripts/jupyter.js index 021d46a2e..aa738a644 100644 --- a/public/javascripts/jupyter.js +++ b/public/javascripts/jupyter.js @@ -2,15 +2,17 @@ //guange 2019.12.18 -$(function(){ +window.onload=function(){ console.log("开始发送消息了"); runEvery10Sec(); -}) +} function runEvery10Sec() { // 1000 * 10 = 10 秒钟 - console.log("每隔10秒中一次runEvery10Sec"); + console.log("每隔10秒中一次"); + require(["base/js/namespace"],function(Jupyter) { + Jupyter.notebook.save_checkpoint(); + }); window.parent.postMessage('jupytermessage','*'); setTimeout( runEvery10Sec, 1000 * 10 ); - } diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index ac39562a7..acd18e6c3 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -52,7 +52,7 @@ export function initAxiosInterceptors(props) { //proxy="http://47.96.87.25:48080" proxy="https://pre-newweb.educoder.net" proxy="https://test-newweb.educoder.net" - //proxy="https://test-jupyterweb.educoder.net" + proxy="https://test-jupyterweb.educoder.net" //proxy="http://192.168.2.63:3001" // 在这里使用requestMap控制,避免用户通过双击等操作发出重复的请求; diff --git a/public/react/src/modules/tpm/jupyter/index.js b/public/react/src/modules/tpm/jupyter/index.js index 617ef0936..9d3ec50ec 100644 --- a/public/react/src/modules/tpm/jupyter/index.js +++ b/public/react/src/modules/tpm/jupyter/index.js @@ -75,11 +75,30 @@ function JupyterTPI (props) { const [updateTip, setUpdateTip] = useState(true); const [myIdentifier, setMyIdentifier] = useState(''); const [renderCtx, setRenderCtx] = useState(() => (emptyCtx)); + + // 保存代码 + const addEventListeners = () => { + window.addEventListener('message', (e) => { + console.log("触发了jupytermessage"); + if(e){ + if(e.data){ + if(e.data==="jupytermessage"){ + saveJupyterTpi(); + } + } + + } + + }); + } + + useEffect(() => { /* 先调用 jupyter的 TPI 接口, * 获取 用户信息, * 实训的 identifier, 状态, 名称, 是否被修改等信息 */ + addEventListeners() getJupyterInfo(identifier); }, [identifier]); @@ -234,6 +253,8 @@ function JupyterTPI (props) { setRenderCtx(oUl); } }, [props]); + + return (
    diff --git a/public/react/src/modules/tpm/jupyter/rightPane/index.js b/public/react/src/modules/tpm/jupyter/rightPane/index.js index 020639abc..d23849369 100644 --- a/public/react/src/modules/tpm/jupyter/rightPane/index.js +++ b/public/react/src/modules/tpm/jupyter/rightPane/index.js @@ -65,13 +65,13 @@ function RightPane (props) { className='jupyter_iframe_style' >
    -
    - -
    + {/*
    */} + {/* 保存*/} + {/*
    */}
    )); diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index 9eb82c7d4..0ea8ebe6b 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -153,7 +153,6 @@ class Challengesjupyter extends Component { window.addEventListener('message', (e) => { console.log("触发了jupytermessage"); - console.log(e); if(e){ if(e.data){ if(e.data==="jupytermessage"){ From 6866af6e0c780692db098127c0d1f8bbd44b9b43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 16:56:21 +0800 Subject: [PATCH 36/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/tpm/shixunchild/shixunchildCss/Challenges.css | 1 + 1 file changed, 1 insertion(+) diff --git a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css index 1e1945f89..55d4cf58f 100644 --- a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css +++ b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css @@ -188,6 +188,7 @@ .ysliconfont{ text-align: center; line-height: 29px; + color: #EEEEEE; } .fangdaone{ From 923ee2bb018006875f538fb1392bfe9bff7c63db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 16:59:51 +0800 Subject: [PATCH 37/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/tpm/shixunchild/shixunchildCss/Challenges.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css index 55d4cf58f..06a06f7da 100644 --- a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css +++ b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css @@ -188,7 +188,7 @@ .ysliconfont{ text-align: center; line-height: 29px; - color: #EEEEEE; + color: #8a8a8a; } .fangdaone{ From e306a3ee494fe74bca1876cb0f4f780adf81689a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 17:07:09 +0800 Subject: [PATCH 38/40] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/tpm/shixunchild/shixunchildCss/Challenges.css | 1 - 1 file changed, 1 deletion(-) diff --git a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css index 06a06f7da..f8b499e1f 100644 --- a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css +++ b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css @@ -131,7 +131,6 @@ height: 76px; line-height: 35px; padding: 20px; - border-bottom: 1px solid #eeee; } .padding1020pxshixun{ From 288f0bcdad898204475392c6e44f7603a32e6b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 17:11:59 +0800 Subject: [PATCH 39/40] =?UTF-8?q?=E8=B0=83=E6=95=B4jupyter=20=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js | 1 - 1 file changed, 1 deletion(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index 787b59bb0..c175395eb 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -427,7 +427,6 @@ class Challengesjupyter extends Component { } iframe { border-left: 1px solid #eeeeee; - border-top: 1px solid #eeeeee; border-right: 1px solid #eeeeee; border-bottom: 1px solid #eeeeee; } From 0706d72a15cdee8452e78f06bbcb91e91c30f99e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 20 Dec 2019 17:17:14 +0800 Subject: [PATCH 40/40] =?UTF-8?q?=E8=B0=83=E6=95=B4jupyter=20tpi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index c175395eb..fcff7d1d4 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -147,6 +147,7 @@ class Challengesjupyter extends Component { window.addEventListener('message', (e) => { console.log("触发了jupytermessage"); + console.log(e); if(e){ if(e.data){ if(e.data==="jupytermessage"){