root 2 years ago
parent
commit
4f62e7cf90
3 changed files with 430 additions and 3 deletions
  1. 0 0
      css/css2.css
  2. 426 0
      moe/index.html
  3. 4 3
      sso/index.html

+ 0 - 0
sso/css2.css → css/css2.css


+ 426 - 0
moe/index.html

@@ -0,0 +1,426 @@
+<!DOCTYPE html>
+
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <title>moe</title>
+
+    <script type="text/javascript" src="/js/jquery.min.js"></script>
+    <link rel="stylesheet" href="/css/bootstrap.min.css">
+    <script type="text/javascript" src="/js/bootstrap.min.js"></script>
+
+    <link rel="preconnect" href="https://fonts.googleapis.com">
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+    <link href="/css/css2.css" rel="stylesheet">
+    <link rel="stylesheet" href="/css/style.css">
+    <script>
+        var status = 0, oid, user, pwd, paused = []
+        const rot = '43.143.233.184:81', root = 'https://43.143.233.184:81/'
+        function getCookie(name) {
+            let arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
+            if (arr != null) return arr[2];
+            return null;
+        }
+        function delCookie(name, path = 'u') {
+            var exp = new Date();
+            exp.setTime(exp.getTime() - 1);
+            var cval = getCookie(name);
+            if (cval != null)
+                document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString() + ((path == 'u') ? '' : ';path=' + path)
+        }
+        function getUrl(e) {
+            return e.replace('dd.sdsz.com.cn', rot).replace(/^http:/, 'https:').replace(rot.split(':')[0] + '/', rot + '/').replace('service=http%3A%2F%2F' + root, 'service=http%3A%2F%2Fdd.sdsz.com.cn')
+        }
+        function setStatus(e, fast) {
+            console.log('STATUS', e)
+            status = e
+            if (e == 1) {
+                paused = []
+                $('#loginSt').text('登录成功')
+                $('.login').hide(200)
+                $('#loginSt').addClass('label-success')
+                $('#loginSt').removeClass('label-danger')
+                $('.reqLogin').show(300)
+            } else if (e == 2) {
+                $('#loginSt').text('登录失败')
+                $('#loginSt').removeClass('label-success')
+                $('#loginSt').addClass('label-danger')
+            } else {
+                $('.login').show(200)
+                $('#loginSt').text('未登录')
+                $('#loginSt').removeClass('label-success')
+                $('#loginSt').removeClass('label-danger')
+                $('.reqLogin').hide(300 * !fast)
+                $('#user').text('-')
+            }
+        }
+        function delCookies(force = 0) {
+            if (force) {
+                delCookie('CASTGC', '/')
+                delCookie('moe', '/')
+                delCookie('gosh', '/score/')
+                if (force <= 2) {
+                    delCookie('gosh', '/sso/')
+                    delCookie('gowd', '/sso/')
+                }
+            }
+            if (force >= 2) {
+                delCookie('JSESSIONID', '/bxn-portal/')
+                delCookie('JSESSIONID', '/bxn-library/')
+                delCookie('JSESSIONID', '/bxn-core-uic/')
+            }
+            delCookie('JSESSIONID', '/')
+            delCookie('SSOID', '/')
+            delCookie('JSESSIONID', '/sso/')
+        }
+        function gget(url, call) {
+            fetch(url, {
+                "headers": {
+                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
+                },
+                "method": "GET",
+                "credentials": 'include'
+            }).then(e => e.text()).then(call)
+        }
+        function getStatus(ds, dt) {
+            let s = new Date(ds), t = new Date(dt), e = new Date();
+            console.log(s, t, e)
+            if (e < s) return '未开始'
+            if (e < t) return '进行中'
+            else return '已结束'
+        }
+        function adminStuff() {
+            // $('.box-contest').append('<input type="date" id="start" min="2022-01-01">')
+        }
+        function contestSubmit() {
+            fetch('contest/touch', {
+                headers: { 'Content-type': 'application/json' },
+                method: "POST",
+                credentials: 'include',
+                body: JSON.stringify({
+                    no: $('#tNo').val(),
+                    title: $('#tTitle').val(),
+                    description: $('#tDescription').val(),
+                    dates: new Date($('#tStart')[0].valueAsNumber).toUTCString(),
+                    datet: new Date($('#tEnd')[0].valueAsNumber).toUTCString()
+                }),
+            }).then(e => e.json()).then(e => {
+                if (e.no) alert('您无权进行此操作')
+                else {
+                    $('.tSend').addClass('glyphicon-success')
+                    setTimeout(() => $('.tSend').removeClass('glyphicon-success'), 1000)
+                    debug('TOUCH', 'affected ' + e.affectedRows + ' rows')
+                }
+            })
+        }
+        function postLogin() {
+            debug('LOGIN DONE.', 'initiate fetching.')
+            if (status != 1) return;
+            if (!user) user = getCookie('gosh'), pwd = getCookie('gowd')
+            document.cookie = "gosh=" + user + ";path=/score/;expires=Fri, 05 Feb 2077 12:34:56 GMT";
+            document.cookie = "gosh=" + user + ";path=/sso/;expires=Fri, 05 Feb 2077 12:34:56 GMT";
+            document.cookie = "gowd=" + pwd + ";path=/sso/;expires=Fri, 05 Feb 2077 12:34:56 GMT";
+            if (getCookie('moe')[0] == '!') $('#user').text('admin')
+            else get('bxn-portal/portal/api/proxy?username=true&userId=true&needvalidate=true&t=http%3A%2F%2F202.94.10.118%2Fbxn-library%2Fapi%2Flibrary%2FgetLatestBorrowBook%3Fcategory%3D1&resourceId=103519&cache=nocache&systime=0', e => {
+                e = JSON.parse(e)
+                $('#user').text(e.requestParams[0].ownerName)
+                oid = e.requestParams[0].ownerId
+            })
+            gget('contest', e => {
+                e = JSON.parse(e)
+                $('#contest').empty()
+                for (let i = 0; i < e.length; i++) {
+                    $('#contest').append(`\
+<li id="contest-${e[i].id}">\
+    <span onclick="$(this).toggleClass('active').siblings('div').toggle(300)" class="title">第 ${e[i].no} 届${e[i].title}\
+        <span class="pull-right" style="color:#999">${e[i].id} - ${getStatus(e[i].dates, e[i].datet)}</span>\
+    </span>
+    <div style="display:none">${e[i].description}</div>\
+</li>`)
+                }
+            })
+            if (getCookie('moe')[0] == '!') adminStuff()
+        }
+        function debug(e, str = '') {
+            $('.debugList').append(`<li class="auto-warp"><b>${e}</b> ${str} <span class="pull-right" style="color:#999">${status}</span></li>`)
+        }
+        function login() {
+            debug('LOGIN.')
+            if (status == 1) return;
+            delCookies()
+            user = $('#loginId').val(), pwd = $('#loginPwd').val()
+            return fetch(root + "sso/login", {
+                headers: {
+                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
+                    // "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
+                },
+                method: "GET",
+                mode: "cors",
+                credentials: 'include'
+            }).then(() => {
+                return fetch('https://43.143.233.184/moelogin', {
+                    method: 'POST',
+                    headers: { 'Content-type': 'application/json' },
+                    body: JSON.stringify({
+                        user: user,
+                        pwd: pwd,
+                        cook: getCookie('JSESSIONID')
+                    }),
+                    credentials: 'include',
+                })
+            }).then(e => e.text()).then(e => { setStatus((e != 'success') + 1), Promise.resolve() })
+        }
+        function matches(e) {
+            return e.match(/(^\[\]$|param":"|<tr>|DOCTYPE|in\?username=|requestParams|\"newmessage\"|Sorry, Page Not Found|北师大实验中学--登录)/s)
+        }
+        // 异步递归嘿嘿嘿,再多 302 也不怕;再加上回调函数,真是妙
+        async function next(e, call, ac, login) {
+            if (e.length < 3000 && !matches(e) && (!e.match('\/login\\?') || login)) {
+                return fetch(getUrl(e), {
+                    method: 'GET',
+                    credentials: 'include',
+                    headers: {
+                        Accept: ac
+                    }
+                }).then(e => e.text()).then(res => { next(res, call, ac, login) })
+            }
+            else return call(e), new Promise((resolve, reject) => { })
+        }
+        function pre(e, url, call) {
+            if (e.match('北师大实验中学--登录')) {
+                debug('OUTDATED CAS! NEED RELOGIN')
+                delCookie('CASTGC', '/')
+                tryLogin()
+            }
+            if (e.length < 3000 && e.match('\/login\\?')) {
+                var name = url.split('/')[0], f = paused.filter(e => e.name == name)
+                debug('FAILED', url)
+                if (url.match('\/login\\?')) return
+                if (f.length) f[0].arr.push(url), f[0].carr.push(call)
+                else {
+                    paused.push({ name: name, arr: [url], carr: [call] })
+                    debug('GET COOKIE...')
+                    get(name + '/casfailed.jsp', () => {
+                        let f = paused.filter(e => e.name == name)[0]
+                        for (let i = 0; i < f.arr.length; i++)get(f.arr[i], f.carr[i])
+                        paused.splice(paused.indexOf(f), 1)
+                    }, '*/*', 1)
+                }
+            } else {
+                $('#bxn' + url.split('bxn')[1].split(/(\/|%2F)/)[0]).addClass('bg-success').addClass('text-success')
+                if (status == 1) call(e)
+            }
+        }
+        function get(url, call = () => { }, ac = '*/*', login = 0) {
+            if (getCookie('moe')[0] == '!') return
+            console.log("GET", url)
+            debug('GET', url)
+            if (status != 1) return
+            next(root + url, e => { pre(e, url, call); }, ac, login)
+        }
+        let trying = 0
+        function tryLogin() {
+            if (trying) return debug('LOGIN', 'already in progress.')
+            if (getCookie('moe')[0] == '!') {
+                debug('LOGIN', 'admin!')
+                setStatus(1), postLogin()
+            } else if (getCookie('CASTGC')) {
+                debug('LOGIN', 'using CAS.')
+                setStatus(1), postLogin()
+            } else if (getCookie('gosh') && getCookie('gosh') != 'null' && getCookie('gowd') != 'null') {
+                debug('LOGIN', 'using stored cookie.')
+                setStatus(0)
+                trying = 1
+                $('#loginId').val(getCookie('gosh'))
+                $('#loginPwd').val(getCookie('gowd'))
+                login().then(() => { status == 2 ? setStatus(0, 1) : (trying = 0, postLogin()); })
+            } else debug('LOGIN', 'no available method.'), setStatus(0, 1)
+        }
+        $().ready(() => {
+            $('.e').addClass('reqLogin')
+            $('.e').removeClass('e')
+            tryLogin()
+            $("[data-toggle='tooltip']").tooltip();
+            $('.banner').text('庆祝 moe 建站 ' + Math.ceil((new Date().getTime() - 1676000714191) / 86400000) + ' 天')
+        })
+    </script>
+    <style>
+        .pass {
+            font-weight: bold;
+            font-family: 'Courier New', Courier, monospace;
+        }
+
+        li {
+            border-bottom: 3px solid #eee;
+            word-wrap: break-word;
+        }
+
+        li>.title {
+            transition-duration: 300ms;
+            display: inline-block;
+            width: 100%;
+            cursor: pointer;
+            font-size: 18px
+        }
+
+        li>.active.title {
+            font-size: 22px;
+            font-weight: bold;
+        }
+
+        li>.active+div {
+            background-image: linear-gradient(to right, #fffaf0, #f4f2ef);
+            border-left: 3px solid #ccc;
+            padding-left: 5px;
+        }
+
+        li:hover {
+            background-color: #eee;
+        }
+
+        .box {
+            transition-duration: 300ms;
+            min-height: 210px;
+        }
+
+        .box::before {
+            content: '';
+            display: block;
+            width: 100%;
+            height: 3px;
+            margin-top: 10px;
+            border-bottom: 1px solid;
+            border-image: linear-gradient(to right, transparent, #6aaad8, #75ddb6, transparent) 1;
+        }
+
+        .box:hover::before {
+            border-bottom: 3px solid;
+            border-image: linear-gradient(to right, transparent, #6aaad8, #75ddb6, transparent) 1;
+        }
+
+        .box:hover {
+            background-image: linear-gradient(#faffef, transparent);
+        }
+
+        .page-header.nohr {
+            margin-bottom: 0;
+            border-bottom: none;
+        }
+
+        span.full {
+            width: 100%;
+            display: inline-block;
+            cursor: pointer;
+        }
+
+        .breadcrumb {
+            padding: 0;
+            margin-bottom: 5px;
+        }
+
+        .auto-warp {
+            word-wrap: break-word;
+            word-break: break-all;
+            overflow: hidden;
+            transition-duration: 500ms;
+            max-height: 22.4px;
+        }
+
+        .auto-warp:hover {
+            max-height: 100px;
+        }
+    </style>
+</head>
+
+<body>
+    <div class="page-header nohr">
+        <h2>
+            <!-- <img src="RC.png" width="32px" style="position:relative;top:-4px"> -->
+            实萌
+        </h2>
+        <span id="loginSt" class="label label-default">未登录</span>
+        <span id="user" class="label label-default">-</span>
+        <button class="btn btn-danger btn-xs e" onclick="postLogin()" title="刷新数据">
+            <span class="glyphicon glyphicon-refresh"></span>
+        </button>
+        <button class="btn btn-danger btn-xs e" onclick="delCookies(1);setStatus(0)" onmouseenter="$('#double-off').css('scale','100%')" onmouseleave="$('#double-off').css('scale','0')" title="退出登录">
+            <span class="glyphicon glyphicon-log-out"></span>
+        </button>
+        <button id="double-off" class="btn btn-danger btn-xs e" onclick="delCookies(2);location.reload()" onmouseenter="$('#double-off').css('scale','100%')" onmouseleave="$('#double-off').css('scale','0')" style="scale:0;transition-duration: 1000ms;" data-toggle="tooltip" data-placement="right" title="全部重置">
+            <span class="glyphicon glyphicon-off"></span>
+        </button>
+        <button class="btn btn-danger btn-xs login" onclick="delCookies(2);location.reload()" data-toggle="tooltip" data-placement="right" title="全部重置">
+            <span class="glyphicon glyphicon-off"></span>
+        </button>
+    </div>
+
+    <div class="col-sm-12 e box box-contest">
+        <div class="page-header">
+            <h3><span class="glyphicon glyphicon-user"></span> 比赛列表
+            </h3>
+        </div>
+        <ul id="contest" class="list-unstyled"></ul>
+        <button class="btn btn-default" onclick="$('.contestNew').toggle(300)">新建比赛 <span class="glyphicon glyphicon-plus"></span></button>
+        <div class="contestNew">
+            <div class="col-md-4">
+                标题
+                <div class="input-group">
+                    <div class="input-group-addon">第</div>
+                    <input id="tNo" class="form-control" placeholder="0">
+                    <div class="input-group-addon">届</div>
+                    <input id="tTitle" class="form-control" placeholder="测试赛">
+                </div>
+            </div>
+            <div class="col-md-4">
+                开始时间
+                <input class="form-control" type="date" id="tStart" min="2022-01-01" value="2023-02-10">
+            </div>
+            <div class="col-md-4">
+                结束时间
+                <input class="form-control" type="date" id="tEnd" min="2022-01-01" value="2023-02-10">
+            </div>
+            <div class="col-sm-12" style="margin-top: 10px;">
+                <textarea id="tDescription" class="form-control" placeholder="介绍" style="resize: vertical"></textarea>
+                <button class="btn btn-default" onclick="contestSubmit()" style="margin-top: 10px;">提交 <span class="glyphicon glyphicon-send tSend"></span></button>
+            </div>
+        </div>
+    </div>
+
+    <div class="col-md-4 col-sm-6 box">
+        <div class="page-header">
+            <h3><span class="glyphicon glyphicon-user"></span> 账号
+                <ul class="btn-group breadcrumb debug" style="display: none;font-size:10px;top:5px">
+                    <li id="bxn-portal" onclick="get('bxn-portal/portal/osforstudent/index')">bxn-portal</li>
+                    <li id="bxn-core-uic" onclick="get('bxn-core-uic/uic/index')">bxn-core-uic</li>
+                    <li id="bxn-library" onclick="get('bxn-library/library/jumpExamreport?jumpUrl=')">bxn-library</li>
+                    <li id="bxn-office" onclick="get('bxn-office/mail/index')">bxn-office</li>
+                </ul>
+            </h3>
+        </div>
+        <button class="btn btn-default e" onclick="$('.debug').toggle(200)">debug</button>
+        <div class="login">
+            <br>
+            <div class="input-group">
+                <span class="input-group-addon">账号</span>
+                <input id="loginId" type="id" class="pass form-control" placeholder="20222222">
+            </div>
+            <br>
+            <div class="input-group">
+                <span class="input-group-addon">密码</span>
+                <input id="loginPwd" type="password" class="pass form-control" placeholder="password">
+                <span class="input-group-btn">
+                    <button class="btn btn-default" type="button" onclick="login().then(postLogin)">
+                        <span class="glyphicon glyphicon-log-out"></span> 登录
+                    </button>
+                </span>
+            </div>
+        </div>
+        <div class="debug" style="display: none;">
+            <button class="btn btn-default btn-xs" onclick="$('.debugList').empty()"><span class="glyphicon glyphicon-trash"></span> 清除</button>
+            <ul class="debugList list-unstyled" style="font-family: 'Courier New', Courier, monospace;"></ul>
+        </div>
+    </div>
+    <div style="position:fixed;bottom:10px;left:10px;color:#ccc">
+        北师大实验中学
+    </div>
+    <div style="position:fixed;bottom:10px;right:10px;color:#ccc" class="banner"></div>
+</body>

+ 4 - 3
sso/index.html

@@ -10,7 +10,7 @@
 
     <link rel="preconnect" href="https://fonts.googleapis.com">
     <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
-    <link href="css2.css" rel="stylesheet">
+    <link href="/css/css2.css" rel="stylesheet">
     <link rel="stylesheet" href="/css/style.css">
     <script>
         var status = 0, oid, user, pwd, paused = []
@@ -69,6 +69,7 @@
                 delCookie('JSESSIONID', '/bxn-core-uic/')
             }
             delCookie('JSESSIONID', '/')
+            delCookie('SSOID', '/')
             delCookie('JSESSIONID', '/sso/')
         }
         function getMail(from, i, id, uid) {
@@ -535,8 +536,8 @@
         <h2><img src="RC.png" width="32px" style="position:relative;top:-4px">
             数字校园
             <small id="detail" style="display:none">.</small>
-            <button class="btn btn-default btn-xs">
-                <span class="glyphicon glyphicon-question-sign" onclick="$('#detail').toggle(300)"></span>
+            <button class="btn btn-default btn-xs" onclick="$('#detail').toggle(300)">
+                <span class="glyphicon glyphicon-question-sign"></span>
             </button>
         </h2>
         <span id="loginSt" class="label label-default">未登录</span>