mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
兼容IE
This commit is contained in:
1 parent
627e64a901
commit
1df19a7aa9
17 files changed
+62
-105
No files matched your search
+1
-2
@@ -2,10 +2,9 @@ node_modules/
|
|||||||
config.yaml
|
config.yaml
|
||||||
.build/
|
.build/
|
||||||
.uibuild/
|
.uibuild/
|
||||||
|
.cache/
|
||||||
__*
|
__*
|
||||||
ui/misc/.iconfont
|
ui/misc/.iconfont
|
||||||
ui/static/locale
|
ui/static/locale
|
||||||
.cache
|
|
||||||
.webpackStats.json
|
.webpackStats.json
|
||||||
module/**
|
|
||||||
!.gitkeep
|
!.gitkeep
|
||||||
@@ -80,11 +80,12 @@ class HomeSecurityHandler extends Handler {
|
|||||||
|
|
||||||
async get() {
|
async get() {
|
||||||
// TODO(iceboy): pagination? or limit session count for uid?
|
// TODO(iceboy): pagination? or limit session count for uid?
|
||||||
|
// TODO(masnn): UA & IP
|
||||||
const sessions = await token.getSessionListByUid(this.user._id);
|
const sessions = await token.getSessionListByUid(this.user._id);
|
||||||
const parsed = sessions.map((session) => ({
|
const parsed = sessions.map((session) => ({
|
||||||
...session,
|
...session,
|
||||||
updateUa: useragent.parse(session.updateUa || session.createUa || ''),
|
// updateUa: useragent.parse(session.updateUa || session.createUa || ''),
|
||||||
updateGeoip: geoip.ip2geo(session.updateIp || session.createIp, this.user.viewLang),
|
// updateGeoip: geoip.ip2geo(session.updateIp || session.createIp, this.user.viewLang),
|
||||||
_id: md5(session._id),
|
_id: md5(session._id),
|
||||||
isCurrent: session._id === this.session._id,
|
isCurrent: session._id === this.session._id,
|
||||||
}));
|
}));
|
||||||
@@ -116,7 +117,7 @@ class HomeSecurityHandler extends Handler {
|
|||||||
|
|
||||||
async postDeleteToken({ tokenDigest }) {
|
async postDeleteToken({ tokenDigest }) {
|
||||||
const sessions = await token.getSessionListByUid(this.user._id);
|
const sessions = await token.getSessionListByUid(this.user._id);
|
||||||
for (const session in sessions) {
|
for (const session of sessions) {
|
||||||
if (tokenDigest === md5(session._id)) {
|
if (tokenDigest === md5(session._id)) {
|
||||||
// eslint-disable-next-line no-await-in-loop
|
// eslint-disable-next-line no-await-in-loop
|
||||||
await token.delete(session._id, token.TYPE_SESSION);
|
await token.delete(session._id, token.TYPE_SESSION);
|
||||||
@@ -128,7 +129,7 @@ class HomeSecurityHandler extends Handler {
|
|||||||
|
|
||||||
async postDeleteAllTokens() {
|
async postDeleteAllTokens() {
|
||||||
await token.deleteByUid(this.user._id);
|
await token.deleteByUid(this.user._id);
|
||||||
this.back();
|
this.response.redirect = '/login';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ class ProblemImportHandler extends Handler {
|
|||||||
if (pid) pdoc.pid = pid;
|
if (pid) pdoc.pid = pid;
|
||||||
if (hidden) pdoc.hidden = true;
|
if (hidden) pdoc.hidden = true;
|
||||||
const _id = await problem.add(pdoc);
|
const _id = await problem.add(pdoc);
|
||||||
console.log(_id);
|
|
||||||
await problem.setTestdata(_id, testdata);
|
await problem.setTestdata(_id, testdata);
|
||||||
this.response.body = { pid: pid || _id };
|
this.response.body = { pid: pid || _id };
|
||||||
this.response.redirect = `/p/${pid || _id}/settings`;
|
this.response.redirect = `/p/${pid || _id}/settings`;
|
||||||
|
|||||||
+11
-10
@@ -32,25 +32,26 @@ class ProblemHandler extends Handler {
|
|||||||
this.checkPerm(PERM_VIEW_PROBLEM);
|
this.checkPerm(PERM_VIEW_PROBLEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
async get({ page = 1, category = null }) {
|
async get({ page = 1, category = '' }) {
|
||||||
this.response.template = 'problem_main.html';
|
this.response.template = 'problem_main.html';
|
||||||
const q = {};
|
const q = {};
|
||||||
let psdict = {};
|
let psdict = {};
|
||||||
if (category) q.category = category;
|
if (category) q.category = category;
|
||||||
if (!this.user.hasPerm(PERM_VIEW_PROBLEM_HIDDEN)) q.hidden = false;
|
if (!this.user.hasPerm(PERM_VIEW_PROBLEM_HIDDEN)) q.hidden = false;
|
||||||
const pdocs = await problem.getMany(q, { pid: 1 }, page, constants.PROBLEM_PER_PAGE);
|
const [pdocs, pcount] = await paginate(
|
||||||
|
problem.getMulti(q).sort({ pid: 1 }),
|
||||||
|
page,
|
||||||
|
constants.PROBLEM_PER_PAGE,
|
||||||
|
);
|
||||||
if (this.user.hasPerm(PERM_LOGGEDIN)) {
|
if (this.user.hasPerm(PERM_LOGGEDIN)) {
|
||||||
psdict = await problem.getListStatus(this.user._id, pdocs.map((pdoc) => pdoc._id));
|
psdict = await problem.getListStatus(this.user._id, pdocs.map((pdoc) => pdoc._id));
|
||||||
}
|
}
|
||||||
|
const path = [
|
||||||
|
['Hydro', '/'],
|
||||||
|
['problem_main', null],
|
||||||
|
];
|
||||||
this.response.body = {
|
this.response.body = {
|
||||||
path: [
|
path, page, pcount, pdocs, psdict, category,
|
||||||
['Hydro', '/'],
|
|
||||||
['problem_main', null],
|
|
||||||
],
|
|
||||||
page,
|
|
||||||
pdocs,
|
|
||||||
psdict,
|
|
||||||
category: '',
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ module.exports = {
|
|||||||
gravatar: misc.gravatar,
|
gravatar: misc.gravatar,
|
||||||
model,
|
model,
|
||||||
Context: global.Hydro.ui,
|
Context: global.Hydro.ui,
|
||||||
|
isIE: (str) => str.includes('MSIE') || str.includes('rv:11.0'),
|
||||||
});
|
});
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
env.render(name, state, (err, res) => {
|
env.render(name, state, (err, res) => {
|
||||||
|
|||||||
+3
-15
@@ -11,13 +11,13 @@ const Setting = (
|
|||||||
});
|
});
|
||||||
|
|
||||||
const PREFERENCE_SETTINGS = [
|
const PREFERENCE_SETTINGS = [
|
||||||
Setting('setting_display', 'view_lang', i18n,
|
Setting('setting_display', 'viewLang', i18n,
|
||||||
options.default_locale, 'select', 'UI Language'),
|
options.default_locale, 'select', 'UI Language'),
|
||||||
Setting('setting_display', 'timezone', [], // TODO(masnn) timezone
|
Setting('setting_display', 'timezone', [], // TODO(masnn) timezone
|
||||||
'Asia/Shanghai', 'select', 'Timezone'),
|
'Asia/Shanghai', 'select', 'Timezone'),
|
||||||
Setting('setting_usage', 'code_lang', builtin.LANG_TEXTS,
|
Setting('setting_usage', 'codeLang', builtin.LANG_TEXTS,
|
||||||
null, 'select', 'Default Code Language'),
|
null, 'select', 'Default Code Language'),
|
||||||
Setting('setting_usage', 'code_template', null,
|
Setting('setting_usage', 'codeTemplate', null,
|
||||||
null, 'textarea', 'Default Code Template',
|
null, 'textarea', 'Default Code Template',
|
||||||
'If left blank, the built-in template of the corresponding language will be used.'),
|
'If left blank, the built-in template of the corresponding language will be used.'),
|
||||||
];
|
];
|
||||||
@@ -28,22 +28,10 @@ const ACCOUNT_SETTINGS = [
|
|||||||
'We use <a href="https://en.gravatar.com/" target="_blank">Gravatar</a> to present your avatar icon.'),
|
'We use <a href="https://en.gravatar.com/" target="_blank">Gravatar</a> to present your avatar icon.'),
|
||||||
Setting('setting_info', 'qq', null,
|
Setting('setting_info', 'qq', null,
|
||||||
null, null, 'QQ'),
|
null, null, 'QQ'),
|
||||||
Setting('setting_info', 'wechat', null,
|
|
||||||
null, null, 'WeChat'),
|
|
||||||
Setting('setting_info', 'gender', builtin.USER_GENDER_RANGE,
|
Setting('setting_info', 'gender', builtin.USER_GENDER_RANGE,
|
||||||
null, 'select', 'Gender'),
|
null, 'select', 'Gender'),
|
||||||
Setting('setting_info', 'bio', null,
|
Setting('setting_info', 'bio', null,
|
||||||
null, 'markdown', 'Bio'),
|
null, 'markdown', 'Bio'),
|
||||||
Setting('setting_privacy', 'show_mail', builtin.PRIVACY_RANGE,
|
|
||||||
null, 'select', 'Email Visibility'),
|
|
||||||
Setting('setting_privacy', 'show_qq', builtin.PRIVACY_RANGE,
|
|
||||||
null, 'select', 'QQ Visibility'),
|
|
||||||
Setting('setting_privacy', 'show_wechat', builtin.PRIVACY_RANGE,
|
|
||||||
null, 'select', 'WeChat Visibility'),
|
|
||||||
Setting('setting_privacy', 'show_gender', builtin.PRIVACY_RANGE,
|
|
||||||
null, 'select', 'Gender Visibility'),
|
|
||||||
Setting('setting_privacy', 'show_bio', builtin.PRIVACY_RANGE,
|
|
||||||
null, 'select', 'Bio Visibility'),
|
|
||||||
Setting('setting_customize', 'background_img', builtin.BACKGROUND_RANGE,
|
Setting('setting_customize', 'background_img', builtin.BACKGROUND_RANGE,
|
||||||
null, 'image_radio', 'Profile Background Image',
|
null, 'image_radio', 'Profile Background Image',
|
||||||
'Choose the background image in your profile page.',
|
'Choose the background image in your profile page.',
|
||||||
|
|||||||
@@ -77,9 +77,9 @@ module.exports = {
|
|||||||
return coll.deleteMany({ uid });
|
return coll.deleteMany({ uid });
|
||||||
},
|
},
|
||||||
getMostRecentSessionByUid(uid) {
|
getMostRecentSessionByUid(uid) {
|
||||||
return coll.findOne({ uid, token_type: this.TYPE_SESSION }, { sort: { updateAt: -1 } });
|
return coll.findOne({ uid, tokenType: this.TYPE_SESSION }, { sort: { updateAt: -1 } });
|
||||||
},
|
},
|
||||||
getSessionListByUid(uid) {
|
getSessionListByUid(uid) {
|
||||||
return coll.find({ uid, token_type: this.TYPE_SESSION }).sort('updateAt', -1).toArray();
|
return coll.find({ uid, tokenType: this.TYPE_SESSION }).sort('updateAt', -1).toArray();
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
+9
-13
@@ -128,13 +128,12 @@ class Handler {
|
|||||||
this.now = new Date();
|
this.now = new Date();
|
||||||
this._handler.sid = this.request.cookies.get('sid');
|
this._handler.sid = this.request.cookies.get('sid');
|
||||||
this._handler.save = this.request.cookies.get('save');
|
this._handler.save = this.request.cookies.get('save');
|
||||||
this._handler.tokenType = token.TYPE_SESSION;
|
|
||||||
if (this._handler.save) this._handler.expireSeconds = options.session.saved_expire_seconds;
|
if (this._handler.save) this._handler.expireSeconds = options.session.saved_expire_seconds;
|
||||||
else this._handler.expireSeconds = options.session.unsaved_expire_seconds;
|
else this._handler.expireSeconds = options.session.unsaved_expire_seconds;
|
||||||
this.session = this._handler.sid
|
this.session = this._handler.sid
|
||||||
? await token.update(
|
? await token.update(
|
||||||
this._handler.sid,
|
this._handler.sid,
|
||||||
this._handler.tokenType,
|
token.TYPE_SESSION,
|
||||||
this._handler.expireSeconds,
|
this._handler.expireSeconds,
|
||||||
{
|
{
|
||||||
update_ip: this.request.ip,
|
update_ip: this.request.ip,
|
||||||
@@ -194,19 +193,16 @@ class Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async saveCookie() {
|
async saveCookie() {
|
||||||
if (this.session.sid) {
|
if (this.session._id) {
|
||||||
await token.update(
|
await token.update(
|
||||||
this.session.sid,
|
this.session._id,
|
||||||
this._handler.tokenType,
|
token.TYPE_SESSION,
|
||||||
this._handler.expireSeconds,
|
this._handler.expireSeconds,
|
||||||
{
|
this.session,
|
||||||
updateIp: this.request.ip,
|
|
||||||
updateUa: this.request.headers['user-agent'] || '',
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
[this.session.sid] = await token.add(
|
[this.session._id] = await token.add(
|
||||||
this._handler.tokenType,
|
token.TYPE_SESSION,
|
||||||
this._handler.expireSeconds,
|
this._handler.expireSeconds,
|
||||||
{
|
{
|
||||||
createIp: this.request.ip,
|
createIp: this.request.ip,
|
||||||
@@ -221,9 +217,9 @@ class Handler {
|
|||||||
if (this._handler.save) {
|
if (this._handler.save) {
|
||||||
cookie.expires = this.session.expireAt;
|
cookie.expires = this.session.expireAt;
|
||||||
cookie.maxAge = this._handler.expireSeconds;
|
cookie.maxAge = this._handler.expireSeconds;
|
||||||
this.request.cookies.set('save', 'true', cookie);
|
this.ctx.cookies.set('save', 'true', cookie);
|
||||||
}
|
}
|
||||||
this.ctx.cookies.set('sid', this.session.sid, cookie);
|
this.ctx.cookies.set('sid', this.session._id, cookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
async onerror(error) {
|
async onerror(error) {
|
||||||
|
|||||||
+1
-3
@@ -21,9 +21,7 @@ Bio Visibility: 个人简介可见性
|
|||||||
Blog: 博客
|
Blog: 博客
|
||||||
Boom!: 炸了!
|
Boom!: 炸了!
|
||||||
Browser: 浏览器
|
Browser: 浏览器
|
||||||
? By signing up a Hydro universal account, you can submit code and join discussions in all online
|
By signing up a Hydro universal account, you can submit code and join discussions in all online judging services provided by us.: 注册一个 Hydro 通用账户,您就可以在我们提供的所有在线评测服务上提交代码、参与讨论。
|
||||||
judging services provided by us.
|
|
||||||
: 注册一个 Hydro 通用账户,您就可以在我们提供的所有在线评测服务上提交代码、参与讨论。
|
|
||||||
CLOSE: 关闭
|
CLOSE: 关闭
|
||||||
Cancel: 取消
|
Cancel: 取消
|
||||||
Ok: 确定
|
Ok: 确定
|
||||||
|
|||||||
+1
-3
@@ -19,9 +19,7 @@ Bio Visibility: 個人簡介可見性
|
|||||||
Blog: 部落格
|
Blog: 部落格
|
||||||
Boom!: 炸了!
|
Boom!: 炸了!
|
||||||
Browser: 瀏覽器
|
Browser: 瀏覽器
|
||||||
? By signing up a Hydro universal account, you can submit code and join discussions in all online
|
By signing up a Hydro universal account, you can submit code and join discussions in all online judging services provided by us.: 註冊一個 Hydro 通用賬戶,您就可以在我們提供的所有線上評測服務上提交程式碼、參與討論。
|
||||||
judging services provided by us.
|
|
||||||
: 註冊一個 Hydro 通用賬戶,您就可以在我們提供的所有線上評測服務上提交程式碼、參與討論。
|
|
||||||
CLOSE: 關閉
|
CLOSE: 關閉
|
||||||
Cancel: 取消
|
Cancel: 取消
|
||||||
Ok: 確定
|
Ok: 確定
|
||||||
|
|||||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
|||||||
|
pastebin: 剪贴板
|
||||||
+17
-44
@@ -1,32 +1,5 @@
|
|||||||
{% extends "layout/wiki_base.html" %}
|
{% extends "layout/wiki_base.html" %}
|
||||||
{% block wiki_content %}
|
{% block wiki_content %}
|
||||||
<div class="section" data-heading-extract-to="#menu-item-about">
|
|
||||||
<div class="section__header">
|
|
||||||
<h1 class="section__title" id="about" data-heading>{{ _('About Vijos') }}</h1>
|
|
||||||
</div>
|
|
||||||
<div class="section__body typo">
|
|
||||||
{{ _('no_translation_warn')|safe }}
|
|
||||||
<p>Vijos 全称为 Velocious Informatics Judge Online System (高效信息学在线评测系统),致力于为用户提供安全、完善、开放的在线评测及题目交流等服务。</p>
|
|
||||||
<p>Vijos 是一个非营利性的公益网站,由 Mrw、同济大学和北京市第八十中学共同赞助。PingCAP、Google 和清华大学提供技术支持。</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="section" data-heading-extract-to="#menu-item-about">
|
|
||||||
<div class="section__header">
|
|
||||||
<h1 class="section__title" id="contact" data-heading>{{ _('Contact Us') }}</h1>
|
|
||||||
</div>
|
|
||||||
<div class="section__body typo">
|
|
||||||
<h3>{{ _('Discussion') }}:</h3>
|
|
||||||
<blockquote>{{ _('QQ Group') }}: 248452688</blockquote>
|
|
||||||
<h3>{{ _('Manager') }}:</h3>
|
|
||||||
<blockquote>{{ _('QQ') }}: 514649176<br>{{ _('Email') }}: mrw # vijos.org</blockquote>
|
|
||||||
<h3>{{ _('Development') }}:</h3>
|
|
||||||
<blockquote>{{ _('QQ') }}: 490241327<br>{{ _('Email') }}: dev $ vijos.org</blockquote>
|
|
||||||
<h3>{{ _('Ops') }}:</h3>
|
|
||||||
<blockquote>{{ _('QQ') }}: 459834574<br>{{ _('Email') }}: ops [at] vijos.org</blockquote>
|
|
||||||
<h3>{{ _('Feedback') }}:</h3>
|
|
||||||
<blockquote>{{ _('QQ') }}: 1744540592<br>{{ _('Email') }}: feedback &#64; vijos.org</blockquote>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="section" data-heading-extract-to="#menu-item-about">
|
<div class="section" data-heading-extract-to="#menu-item-about">
|
||||||
<div class="section__header">
|
<div class="section__header">
|
||||||
<h1 class="section__title" id="privacy" data-heading>{{ _('Privacy') }}</h1>
|
<h1 class="section__title" id="privacy" data-heading>{{ _('Privacy') }}</h1>
|
||||||
@@ -36,20 +9,20 @@
|
|||||||
<h4>1. 收集的信息</h4>
|
<h4>1. 收集的信息</h4>
|
||||||
<p>我们收集信息是为了向所有用户提供更好的服务。我们有两种信息收集方式:</p>
|
<p>我们收集信息是为了向所有用户提供更好的服务。我们有两种信息收集方式:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><p>您向我们提供信息。在您注册 Vijos 帐户时,我们会要求您提供个人信息,例如您的电子邮件地址、QQ号码等。</p>
|
<li><p>您向我们提供信息。在您注册 Hydro 帐户时,我们会要求您提供个人信息,例如您的电子邮件地址、QQ号码等。</p>
|
||||||
</li>
|
</li>
|
||||||
<li><p>我们在您使用服务的过程中获取信息。我们会收集关于您使用的服务以及使用方式的信息,例如您在何时使用了我们服务。</p>
|
<li><p>我们在您使用服务的过程中获取信息。我们会收集关于您使用的服务以及使用方式的信息,例如您在何时使用了我们服务。</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h4>2. 如何使用收集到的信息</h4>
|
<h4>2. 如何使用收集到的信息</h4>
|
||||||
<p>我们利用从所有服务中收集的信息来提供、维护、保护和改进这些服务,同时开发新的服务并保护 Vijos 以及用户的隐私。</p>
|
<p>我们利用从所有服务中收集的信息来提供、维护、保护和改进这些服务,同时开发新的服务并保护 Hydro 以及用户的隐私。</p>
|
||||||
<p>当我们要将信息用于本隐私权政策未载明的其它用途时,则会事先征求您的同意。</p>
|
<p>当我们要将信息用于本隐私权政策未载明的其它用途时,则会事先征求您的同意。</p>
|
||||||
<h4>3. 访问和更新您的个人信息</h4>
|
<h4>3. 访问和更新您的个人信息</h4>
|
||||||
<p>无论您在何时使用我们的服务,我们都力求让您能够访问自己的个人信息。如果这些信息有误,我们会努力通过各种方式让您快速更新信息或删除信息。在更新您的个人信息时,我们可能会要求您先验证自己的身份,然后再处理您的请求。</p>
|
<p>无论您在何时使用我们的服务,我们都力求让您能够访问自己的个人信息。如果这些信息有误,我们会努力通过各种方式让您快速更新信息或删除信息。在更新您的个人信息时,我们可能会要求您先验证自己的身份,然后再处理您的请求。</p>
|
||||||
<p>我们力求对服务进行完善的维护,以保护信息免遭意外或恶意的破坏。因此,当您从我们的服务中删除信息后,我们可能不会立即从在用的服务器中删除这些信息的残留副本,也可能不会从备份系统中删除相应的信息。</p>
|
<p>我们力求对服务进行完善的维护,以保护信息免遭意外或恶意的破坏。因此,当您从我们的服务中删除信息后,我们可能不会立即从在用的服务器中删除这些信息的残留副本,也可能不会从备份系统中删除相应的信息。</p>
|
||||||
<h4>4. 信息安全</h4>
|
<h4>4. 信息安全</h4>
|
||||||
<p>我们为您提供SSL加密访问服务,您可以通过SSL(https)使用我们的服务,这可以很大程度上保障在传输过程中您信息的安全。</p>
|
<p>我们为您提供SSL加密访问服务,您可以通过SSL(https)使用我们的服务,这可以很大程度上保障在传输过程中您信息的安全。</p>
|
||||||
<p>对于敏感数据(如您的密码),我们承诺在存储时进行高强度不可逆加密。Vijos 的管理员、维护人员等均不能够访问到敏感数据的明文,所有操作均无人工介入。</p>
|
<p>对于敏感数据(如您的密码),我们承诺在存储时进行高强度不可逆加密。Hydro 的管理员、维护人员等均不能够访问到敏感数据的明文,所有操作均无人工介入。</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" data-heading-extract-to="#menu-item-about">
|
<div class="section" data-heading-extract-to="#menu-item-about">
|
||||||
@@ -58,8 +31,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="section__body typo">
|
<div class="section__body typo">
|
||||||
{{ _('no_translation_warn')|safe }}
|
{{ _('no_translation_warn')|safe }}
|
||||||
<h4>0. 欢迎使用 Vijos</h4>
|
<h4>0. 欢迎使用 Hydro</h4>
|
||||||
<p>注册 Vijos 帐户和/或使用 Vijos 提供的服务(包括网页提供的在线服务和题目评测的非在线服务等),即表示您已同意本条款。请您务必审慎阅读,充分理解条款各项内容。</p>
|
<p>注册 Hydro 帐户和/或使用 Hydro 提供的服务(包括网页提供的在线服务和题目评测的非在线服务等),即表示您已同意本条款。请您务必审慎阅读,充分理解条款各项内容。</p>
|
||||||
<h4>1. 使用服务</h4>
|
<h4>1. 使用服务</h4>
|
||||||
<p>您必须遵守各项服务中提供的所有政策(包括但不限于讨论和题解的版规)。</p>
|
<p>您必须遵守各项服务中提供的所有政策(包括但不限于讨论和题解的版规)。</p>
|
||||||
<p>请勿滥用我们的服务。如,请勿干扰我们的服务,或尝试使用除我们提供的界面和指示以外的方法访问这些服务,或使用我们服务中出现的缺陷干扰其他网站或设施的正常运行。您仅能在法律允许的范围内使用我们的服务。</p>
|
<p>请勿滥用我们的服务。如,请勿干扰我们的服务,或尝试使用除我们提供的界面和指示以外的方法访问这些服务,或使用我们服务中出现的缺陷干扰其他网站或设施的正常运行。您仅能在法律允许的范围内使用我们的服务。</p>
|
||||||
@@ -71,32 +44,32 @@
|
|||||||
<li>发布、传送、传播广告信息及垃圾信息;</li>
|
<li>发布、传送、传播广告信息及垃圾信息;</li>
|
||||||
<li>其他法律法规禁止的行为。</li>
|
<li>其他法律法规禁止的行为。</li>
|
||||||
</ol>
|
</ol>
|
||||||
<p>如果您违反了约定,相关国家相关机关或机构可能会对您提起诉讼、进行行政处罚或采取其他制裁措施,Vijos 将给于协助。造成损害的,您应依法予以赔偿,Vijos 不承担任何责任。</p>
|
<p>如果您违反了约定,相关国家相关机关或机构可能会对您提起诉讼、进行行政处罚或采取其他制裁措施,Hydro 将给于协助。造成损害的,您应依法予以赔偿,Hydro 不承担任何责任。</p>
|
||||||
<p>如果 Vijos 发现或收到他人举报您发布的信息违反约定,Vijos 有权进行独立判断并采取技术手段予以删除、屏蔽或断开链接。同时,Vijos 有权视用户的行为性质,采取包括但不限于暂停或终止服务,限制、冻结或终止账户使用,追究法律责任等措施。</p>
|
<p>如果 Hydro 发现或收到他人举报您发布的信息违反约定,Hydro 有权进行独立判断并采取技术手段予以删除、屏蔽或断开链接。同时,Hydro 有权视用户的行为性质,采取包括但不限于暂停或终止服务,限制、冻结或终止账户使用,追究法律责任等措施。</p>
|
||||||
<h4>2. 版权</h4>
|
<h4>2. 版权</h4>
|
||||||
<p>使用我们的服务并不代表您拥有我们的服务或您所访问的内容的任何知识产权。网站上的所有材料(包括但不限于题目内容、用户界面、Wiki)版权均受保护,归 Vijos 所有。除非另有说明,本网站上的材料和服务仅用于个人和非商业用途,未经 Vijos 书面许可,不得复制、修改、创建衍生作品、传播、出版、公开演示、公开展示和分发从本网站获得的任何信息、文件、产品或服务。</p>
|
<p>使用我们的服务并不代表您拥有我们的服务或您所访问的内容的任何知识产权。网站上的所有材料(包括但不限于题目内容、用户界面、Wiki)版权均受保护,归 Hydro 所有。除非另有说明,本网站上的材料和服务仅用于个人和非商业用途,未经 Hydro 书面许可,不得复制、修改、创建衍生作品、传播、出版、公开演示、公开展示和分发从本网站获得的任何信息、文件、产品或服务。</p>
|
||||||
<h4>3. 您在我们服务中发布的内容</h4>
|
<h4>3. 您在我们服务中发布的内容</h4>
|
||||||
<p>我们的某些服务允许您提交内容。您保留对该内容持有的任何知识产权的所有权。</p>
|
<p>我们的某些服务允许您提交内容。您保留对该内容持有的任何知识产权的所有权。</p>
|
||||||
<p>当您上传内容或通过其他方式向我们的服务提交内容时,您授予 Vijos 使用、持有、存储、复制、修改、创建衍生作品、传播、出版、公开演示、公开展示和分发此内容等权利。您在此许可中授予的权限,仅能用于运营、宣传和改进我们的服务,以及开发新的服务。该项许可在您停止使用我们的服务后依然有效。某些服务可能会向您提供一些方法,用于访问和删除您提供给该服务的内容。对于您提交至我们服务的任何内容,请确保您拥有向我们授予此许可的必要权利。我们有权在未通知您的情况下删除我们认为侵犯了知识产权或违反了相关法律法规的内容。</p>
|
<p>当您上传内容或通过其他方式向我们的服务提交内容时,您授予 Hydro 使用、持有、存储、复制、修改、创建衍生作品、传播、出版、公开演示、公开展示和分发此内容等权利。您在此许可中授予的权限,仅能用于运营、宣传和改进我们的服务,以及开发新的服务。该项许可在您停止使用我们的服务后依然有效。某些服务可能会向您提供一些方法,用于访问和删除您提供给该服务的内容。对于您提交至我们服务的任何内容,请确保您拥有向我们授予此许可的必要权利。我们有权在未通知您的情况下删除我们认为侵犯了知识产权或违反了相关法律法规的内容。</p>
|
||||||
<h4>4. 对于发布题目的附加条款</h4>
|
<h4>4. 对于发布题目的附加条款</h4>
|
||||||
<p>您可以在 Vijos 上创建新题目。您上传到 Vijos 的题目,除了适用于本协议第三条(即“您在我们服务中发布的内容”)条款,还包含以下附加条款(若有冲突的条款,以附加条款中的优先):</p>
|
<p>您可以在 Hydro 上创建新题目。您上传到 Hydro 的题目,除了适用于本协议第三条(即“您在我们服务中发布的内容”)条款,还包含以下附加条款(若有冲突的条款,以附加条款中的优先):</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li><p>您上传到 Vijos 上的题目版权为 Vijos 和您共同拥有,我们会在相关页面或在对其进行分发、传播等操作时标明版权所有者。
|
<li><p>您上传到 Hydro 上的题目版权为 Hydro 和您共同拥有,我们会在相关页面或在对其进行分发、传播等操作时标明版权所有者。
|
||||||
</p></li>
|
</p></li>
|
||||||
<li><p>Vijos 尊重他人知识产权和合法权益,请您在上传题目前确保拥有题目内容(包括但不限于题目描述、数据、图片等)的著作权及信息网络传播权或者已经取得上述全部权利人的许可并不存在任何著作权纠纷。Vijos有权在不通知的情况下删除被认为侵权的题目。
|
<li><p>Hydro 尊重他人知识产权和合法权益,请您在上传题目前确保拥有题目内容(包括但不限于题目描述、数据、图片等)的著作权及信息网络传播权或者已经取得上述全部权利人的许可并不存在任何著作权纠纷。Hydro有权在不通知的情况下删除被认为侵权的题目。
|
||||||
</p></li>
|
</p></li>
|
||||||
<li><p>您可以申请将自己上传的优质题目合并到题库主干。我们的管理员会对您创建的题目的内容(包括但不限于评测数据等对用户不可见的信息)进行人工审核和适当修改以确认其符合国家基本法律法规。出于质量的考虑,我们也可能会拒绝您完全合法的合并到题库主干的请求。
|
<li><p>您可以申请将自己上传的优质题目合并到题库主干。我们的管理员会对您创建的题目的内容(包括但不限于评测数据等对用户不可见的信息)进行人工审核和适当修改以确认其符合国家基本法律法规。出于质量的考虑,我们也可能会拒绝您完全合法的合并到题库主干的请求。
|
||||||
</p></li>
|
</p></li>
|
||||||
<li><p>我们会维护服务的稳定,并对数据(包括您递交的题目)进行定期的备份,并尽量在关闭服务前通知您,但我们仍然不对任何题目(包括主干和非主干)提供永久存储或保留的承诺,出于安全的考虑推荐您自行保留题目的内容。
|
<li><p>我们会维护服务的稳定,并对数据(包括您递交的题目)进行定期的备份,并尽量在关闭服务前通知您,但我们仍然不对任何题目(包括主干和非主干)提供永久存储或保留的承诺,出于安全的考虑推荐您自行保留题目的内容。
|
||||||
</p></li>
|
</p></li>
|
||||||
<li><p>您有权决定 Vijos 是否公开您上传的题目的数据。公开题目数据意味着 Vijos 上的用户均有权利获取到您递交的题目的所有评测数据,但相关版权协议仍然生效。</p>
|
<li><p>您有权决定 Hydro 是否公开您上传的题目的数据。公开题目数据意味着 Hydro 上的用户均有权利获取到您递交的题目的所有评测数据,但相关版权协议仍然生效。</p>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
<h4>5. 隐私保护</h4>
|
<h4>5. 隐私保护</h4>
|
||||||
<p><a href="{{ reverse_url('about') }}#privacy">Vijos 隐私声明</a>介绍了您在使用我们的服务时,我们会如何处理您的个人数据和保护您的隐私。使用我们的服务即表示您同意 Vijos 可以按照我们的隐私权政策使用您的个人数据。</p>
|
<p><a href="/wiki/about#privacy">Hydro 隐私声明</a>介绍了您在使用我们的服务时,我们会如何处理您的个人数据和保护您的隐私。使用我们的服务即表示您同意 Hydro 可以按照我们的隐私权政策使用您的个人数据。</p>
|
||||||
<h4>6. 修改和终止服务</h4>
|
<h4>6. 修改和终止服务</h4>
|
||||||
<p>我们始终在不断更改和改进我们的服务。我们可能会增加或删除功能,也可能暂停或彻底停止某项服务。</p>
|
<p>我们始终在不断更改和改进我们的服务。我们可能会增加或删除功能,也可能暂停或彻底停止某项服务。</p>
|
||||||
<p>您可以随时停止使用我们的服务,尽管我们对此表示非常遗憾。Vijos 也可能随时停止向您提供服务,或随时对我们的服务增加或设置新的限制。</p>
|
<p>您可以随时停止使用我们的服务,尽管我们对此表示非常遗憾。Hydro 也可能随时停止向您提供服务,或随时对我们的服务增加或设置新的限制。</p>
|
||||||
<h4>7. 保证和免责声明</h4>
|
<h4>7. 保证和免责声明</h4>
|
||||||
<p>我们对服务内容、服务的具体功能,或其可靠性、可用性或满足您需要的能力不作任何承诺。我们的服务是按照现有技术和条件所能达到的现状提供的。我们会尽最大努力向您提供服务,确保服务的连贯性和安全性。但我们不能随时预见和防范法律、技术以及其他风险,包括但不限于不可抗力、病毒、木马、黑客攻击、系统不稳定、第三方服务瑕疵、政府行为等原因可能导致的服务中断、数据丢失以及其他的损失和风险。</p>
|
<p>我们对服务内容、服务的具体功能,或其可靠性、可用性或满足您需要的能力不作任何承诺。我们的服务是按照现有技术和条件所能达到的现状提供的。我们会尽最大努力向您提供服务,确保服务的连贯性和安全性。但我们不能随时预见和防范法律、技术以及其他风险,包括但不限于不可抗力、病毒、木马、黑客攻击、系统不稳定、第三方服务瑕疵、政府行为等原因可能导致的服务中断、数据丢失以及其他的损失和风险。</p>
|
||||||
<h4>8. 关于本条款</h4>
|
<h4>8. 关于本条款</h4>
|
||||||
@@ -116,8 +89,8 @@
|
|||||||
<blockquote>
|
<blockquote>
|
||||||
<p>第一次使用编辑器前,要先阅读编辑器快速入门和 Markdown 详细帮助。</p>
|
<p>第一次使用编辑器前,要先阅读编辑器快速入门和 Markdown 详细帮助。</p>
|
||||||
<p>不得将讨论、题解混淆。例如,不得将题解发布到讨论中,题解应发布在相应题目的题解区中。</p>
|
<p>不得将讨论、题解混淆。例如,不得将题解发布到讨论中,题解应发布在相应题目的题解区中。</p>
|
||||||
<p>发布(或回复)的所有内容不得包含会干扰 Vijos 用户界面呈现的相关内容。</p>
|
<p>发布(或回复)的所有内容不得包含会干扰 Hydro 用户界面呈现的相关内容。</p>
|
||||||
<p>发布(或回复)的所有内容不得包含恶意代码和指向恶意网站或 Vijos 明确禁止的网站的链接。</p>
|
<p>发布(或回复)的所有内容不得包含恶意代码和指向恶意网站或 Hydro 明确禁止的网站的链接。</p>
|
||||||
<p>特别地,发布(或回复)含有代码的内容时,应当将代码高亮。一个简单的方法是选中代码块然后按下 Tab 键。</p>
|
<p>特别地,发布(或回复)含有代码的内容时,应当将代码高亮。一个简单的方法是选中代码块然后按下 Tab 键。</p>
|
||||||
<p>发布的题解禁止只包含无详细注释的代码。题解中难以理解的代码应当有尽可能详细的注释。</p>
|
<p>发布的题解禁止只包含无详细注释的代码。题解中难以理解的代码应当有尽可能详细的注释。</p>
|
||||||
<p>打分、投票和评价应当客观。例如,对于题解的打分、投票和评价应当关注于题解本身的质量。</p>
|
<p>打分、投票和评价应当客观。例如,对于题解的打分、投票和评价应当关注于题解本身的质量。</p>
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
<div class="media__right medium">
|
<div class="media__right medium">
|
||||||
<form method="post">
|
<form method="post">
|
||||||
<input type="hidden" name="operation" value="delete_token">
|
<input type="hidden" name="operation" value="delete_token">
|
||||||
<input type="hidden" name="token_digest" value="{{ session._id }}">
|
<input type="hidden" name="tokenDigest" value="{{ session._id }}">
|
||||||
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
|
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
|
||||||
<input type="submit" value="{{ _('Logout This Session') }}" class="rounded button">
|
<input type="submit" value="{{ _('Logout This Session') }}" class="rounded button">
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
{% import "components/noscript_note.html" as noscript_note with context %}
|
{% import "components/noscript_note.html" as noscript_note with context %}
|
||||||
{% import "components/user.html" as user with context %}
|
{% import "components/user.html" as user with context %}
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html data-page="{{ page_name }}" data-layout="{{ layout_name }}" class="layout--{{ layout_name }} page--{{ page_name }} nojs" lang="{{ handler.view_lang }}">
|
<html data-page="{{ page_name }}" data-layout="{{ layout_name }}" class="layout--{{ layout_name }} page--{{ page_name }} nojs" lang="{{ handler.viewLang }}">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||||
@@ -24,20 +24,20 @@
|
|||||||
|
|
||||||
<link rel="stylesheet" media="all" href="{{ static_url('vj4.css') }}">
|
<link rel="stylesheet" media="all" href="{{ static_url('vj4.css') }}">
|
||||||
<title>{{ handler.renderTitle(page_title) }}</title>
|
<title>{{ handler.renderTitle(page_title) }}</title>
|
||||||
|
{% if not isIE(handler.request.headers['user-agent']) %}
|
||||||
<script>
|
<script>
|
||||||
var _htmlNode = document.documentElement;
|
var _htmlNode = document.documentElement;
|
||||||
_htmlNode.className = _htmlNode.className.replace(' nojs', ' hasjs');
|
_htmlNode.className = _htmlNode.className.replace(' nojs', ' hasjs');
|
||||||
var UiContext = {{ handler.UIContext|json|safe }};
|
var UiContext = {{ handler.UIContext|json|safe }};
|
||||||
var UserContext = {{ handler.user|json|safe }};
|
var UserContext = {{ handler.user|json|safe }};
|
||||||
</script>
|
</script>
|
||||||
|
{% endif %}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
{% block body %}{% endblock %}
|
{% block body %}{% endblock %}
|
||||||
<!-- TODO: includes jQuery, JSON3, ES5-shim in the shim -->
|
{% if not isIE(handler.request.headers['user-agent']) %}
|
||||||
<!--[if lte IE 8]>
|
|
||||||
<script type="text/javascript" src="{{ static_url('shim.js') }}"></script>
|
|
||||||
<![endif]-->
|
|
||||||
<script type="text/javascript" src="{{ static_url('locale/{0}.js'.format(handler.user.viewLang)) }}"></script>
|
<script type="text/javascript" src="{{ static_url('locale/{0}.js'.format(handler.user.viewLang)) }}"></script>
|
||||||
<script type="text/javascript" src="{{ static_url('vj4.js') }}"></script>
|
<script type="text/javascript" src="{{ static_url('vj4.js') }}"></script>
|
||||||
|
{% endif %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
{% if not isIE(handler.request.headers['user-agent']) %}
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<div class="row"><div class="columns">
|
<div class="row"><div class="columns">
|
||||||
{% if show_topics|default(true) %}
|
{% if show_topics|default(true) %}
|
||||||
@@ -69,3 +70,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</div></div>
|
</div></div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
@@ -40,12 +40,12 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="menu__seperator"></li>
|
<li class="menu__seperator"></li>
|
||||||
<li class="menu__item">
|
<li class="menu__item">
|
||||||
<a href="/home/account" class="menu__link">
|
<a href="/home/settings/account" class="menu__link">
|
||||||
<span class="icon icon-wrench"></span> {{ _('home_account') }}
|
<span class="icon icon-wrench"></span> {{ _('home_account') }}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="menu__item">
|
<li class="menu__item">
|
||||||
<a href="/home/preference" class="menu__link">
|
<a href="/home/settings/preference" class="menu__link">
|
||||||
<span class="icon icon-sliders"></span> {{ _('home_preference') }}
|
<span class="icon icon-sliders"></span> {{ _('home_preference') }}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
Reference in new issue
Block a user