From afb66d2ad4f2980572423600f1547f67b6602c16 Mon Sep 17 00:00:00 2001 From: Menci Date: Tue, 18 Apr 2017 21:09:05 +0800 Subject: [PATCH] Add search problem page --- modules/problem.js | 34 ++++++++++++++++++++++++++++++++++ views/index.ejs | 14 ++++++++------ views/problems.ejs | 24 ++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/modules/problem.js b/modules/problem.js index bbdc621..5ef2978 100644 --- a/modules/problem.js +++ b/modules/problem.js @@ -49,6 +49,40 @@ app.get('/problems', async (req, res) => { } }); +app.get('/problems/search', async (req, res) => { + try { + let id = parseInt(req.query.keyword) || 0; + + let where = { + $or: { + title: { like: `%${req.query.keyword}%` }, + id: id + } + }; + + let order = [syzoj.db.literal('`id` = ' + id + ' DESC')]; + + let paginate = syzoj.utils.paginate(await Problem.count(where), req.query.page, syzoj.config.page.problem); + let problems = await Problem.query(paginate, where, order); + + await problems.forEachAsync(async problem => { + problem.allowedEdit = await problem.isAllowedEditBy(res.locals.user); + problem.judge_state = await problem.getJudgeState(res.locals.user, true); + problem.tags = await problem.getTags(); + }); + + res.render('problems', { + problems: problems, + paginate: paginate + }); + } catch (e) { + syzoj.log(e); + res.render('error', { + err: e + }); + } +}); + app.get('/problems/tag/:tagIDs', async (req, res) => { try { let tagIDs = Array.from(new Set(req.params.tagIDs.split(',').map(x => parseInt(x)))); diff --git a/views/index.ejs b/views/index.ejs index da19f0b..d35e157 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -123,13 +123,15 @@ <% } %>

搜索题目

-

近期比赛

diff --git a/views/problems.ejs b/views/problems.ejs index e86f80a..bd2e3ce 100644 --- a/views/problems.ejs +++ b/views/problems.ejs @@ -22,6 +22,16 @@ if (typeof tags !== 'undefined') tagIDs = tags.map(x => x.id); <%= tag.name %> <% } %> + <% } else { %> +
+ +
<% } %>
@@ -148,5 +158,19 @@ $(function () { $('#add_problem_dropdown').dropdown(); }); +
<% include footer %>