智能沉淀进每一个模型
需求洞察 · 方案共创 · 数据寻源
训练执行 · 交付,全链路本地工作台
(function () {
'use strict';
/* ── 视频同步:master 漂移 >0.12s 时对齐 ── */
var vids = Array.prototype.slice.call(document.querySelectorAll('video'));
var reduce = window.matchMedia && matchMedia('(prefers-reduced-motion: reduce)').matches;
if (reduce) { vids.forEach(function (v) { v.removeAttribute('autoplay'); v.pause(); }); }
else if (vids.length > 1) {
var master = vids[0];
master.addEventListener('timeupdate', function () {
for (var i = 1; i < vids.length; i++) {
if (Math.abs(vids[i].currentTime - master.currentTime) > 0.12) {
try { vids[i].currentTime = master.currentTime; } catch (e) {}
}
}
});
}
/* ── 已登录直接放行 ── */
fetch('/auth/check', { credentials: 'same-origin' }).then(function (r) {
if (r.ok) {
var next = new URLSearchParams(location.search).get('next');
location.replace(next && next.charAt(0) === '/' ? next : '/');
}
}).catch(function () {});
/* ── 登录提交 ── */
var form = document.getElementById('loginForm');
var fmsg = document.getElementById('fmsg');
var btn = document.getElementById('btnLogin');
var btnLabel = document.getElementById('btnLabel');
form.addEventListener('submit', function (ev) {
ev.preventDefault();
fmsg.textContent = '';
document.getElementById('fldUser').classList.remove('err');
document.getElementById('fldPass').classList.remove('err');
btn.disabled = true; btnLabel.textContent = '验证中…';
fetch('/auth/login', {
method: 'POST',
credentials: 'same-origin',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
username: document.getElementById('username').value.trim(),
password: document.getElementById('password').value
})
}).then(function (r) {
return r.json().then(function (j) { return { ok: r.ok, j: j }; });
}).then(function (res) {
if (res.ok && res.j.ok) {
btnLabel.textContent = '欢迎回来';
var next = new URLSearchParams(location.search).get('next');
location.href = next && next.charAt(0) === '/' ? next : '/';
} else {
fmsg.textContent = (res.j && res.j.error) || '登录失败,请重试';
document.getElementById('fldUser').classList.add('err');
document.getElementById('fldPass').classList.add('err');
btn.disabled = false; btnLabel.textContent = '进入智库';
}
}).catch(function () {
fmsg.textContent = '网络异常,请稍后重试';
btn.disabled = false; btnLabel.textContent = '进入智库';
});
});
(一次性,绝对时间表) ── */
if (!document.documentElement.classList.contains('intro')) return;
var EXPO = 'cubic-bezier(.16,1,.3,1)', QUINT = 'cubic-bezier(.22,1,.36,1)',
QUART = 'cubic-bezier(.25,1,.5,1)', TYPE = 'cubic-bezier(.22,.85,.24,1)';
var phoneM = window.matchMedia && matchMedia('(max-width:599px)').matches ? 0.86 : 1;
function K(t, d) { return { duration: d * phoneM * 1000, delay: t * phoneM * 1000, fill: 'both' }; }
var anims = [];
function run() {
var root = document.documentElement;
anims.push(document.querySelector('.logo').animate(
[{ opacity: 0, transform: 'scale(.9)' }, { opacity: 1, transform: 'scale(1)' }],
Object.assign(K(0.00, .70), { easing: EXPO })));
Array.prototype.forEach.call(document.querySelectorAll('nav a'), function (a, i) {
anims.push(a.animate([{ opacity: 0, transform: 'translateY(7px)' }, { opacity: 1, transform: 'translateY(0)' }],
Object.assign(K(0.12 + i * .055, .62), { easing: QUINT })));
});
Array.prototype.forEach.call(document.querySelectorAll('h1 .ln > span'), function (sp, i) {
anims.push(sp.animate([{ transform: 'translateY(120%)' }, { transform: 'translateY(0%)' }],
Object.assign(K(0.34 + i * .09, .98), { easing: TYPE })));
});
anims.push(document.querySelector('.sub').animate(
[{ opacity: 0, transform: 'translateY(14px)' }, { opacity: 1, transform: 'translateY(0)' }],
Object.assign(K(0.74, .72), { easing: QUINT })));
anims.push(document.querySelector('.btn-cta').animate(
[{ clipPath: 'inset(0 100% 0 0)' }, { clipPath: 'inset(0 0% 0 0)' }],
Object.assign(K(0.90, .70), { easing: EXPO })));
/* 表单字段在 CTA 之后逐级浮入 */
['#fldUser', '#fldPass', '#fmsg', '.foot'].forEach(function (sel, i) {
var el = document.querySelector(sel);
if (!el) return;
anims.push(el.animate(
[{ opacity: 0, transform: 'translateY(14px)' }, { opacity: 1, transform: 'translateY(0)' }],
Object.assign(K(1.00 + i * .07, .60), { easing: QUINT })));
});
Array.prototype.forEach.call(document.querySelectorAll('.rule'), function (r, i) {
anims.push(r.animate([{ transform: 'scaleY(0)' }, { transform: 'scaleY(1)' }],
Object.assign(K(0.98 + i * .07, .60), { easing: QUART })));
});
Array.prototype.forEach.call(document.querySelectorAll('.num'), function (n, i) {
anims.push(n.animate([{ opacity: 0, transform: 'translateY(12px)' }, { opacity: 1, transform: 'translateY(0)' }],
Object.assign(K(1.04 + i * .085, .66), { easing: QUINT })));
});
Array.prototype.forEach.call(document.querySelectorAll('.lab'), function (n, i) {
anims.push(n.animate([{ opacity: 0, transform: 'translateY(10px)' }, { opacity: 1, transform: 'translateY(0)' }],
Object.assign(K(1.10 + i * .085, .62), { easing: QUINT })));
});
var done = false;
function finish() {
if (done) return; done = true;
anims.forEach(function (a) { a.cancel(); });
root.classList.remove('intro');
}
var last = anims[anims.length - 1];
Promise.all(anims.map(function (a) { return a.finished.catch(function () {}); })).then(finish);
setTimeout(finish, 4000);
}
var started = false;
function start() { if (started) return; started = true; run(); }
var p = (document.fonts && document.fonts.ready) ? document.fonts.ready : Promise.resolve();
Promise.race([p, new Promise(function (r) { setTimeout(r, 1000); })]).then(function () {
requestAnimationFrame(function () { start(); setTimeout(start, 1200); });
});
})();