Skip to content

Commit cd8d948

Browse files
author
CodeJudge
committed
feat: 提交记录语言筛选
1 parent 4452f10 commit cd8d948

3 files changed

Lines changed: 33 additions & 3 deletions

File tree

backend/src/controllers/submissionController.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ function listSubmissions(req, res) {
7878
if (user_id) { const c = ' AND s.user_id = ?'; sql += c; countSql += c; params.push(user_id); }
7979
else { const c = ' AND s.user_id = ?'; sql += c; countSql += c; params.push(req.user.id); }
8080
if (status) { const c = ' AND s.status = ?'; sql += c; countSql += c; params.push(status); }
81+
if (req.query.language) { const c = ' AND s.language = ?'; sql += c; countSql += c; params.push(req.query.language); }
8182

8283
const total = queryOne(countSql, params).count;
8384
sql += ' ORDER BY s.created_at DESC LIMIT ? OFFSET ?';

frontend/src/pages/Submissions.tsx

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,17 @@ const STATUS_FILTERS = [
2929
{ label: '超时', value: 'time_limit_exceeded' },
3030
];
3131

32+
const LANGUAGE_FILTERS = [
33+
{ label: '全部语言', value: '' },
34+
{ label: 'JavaScript', value: 'javascript' },
35+
{ label: 'Python', value: 'python' },
36+
];
37+
3238
const PAGE_SIZE = 15;
3339

3440
export default function Submissions() {
3541
const [statusFilter, setStatusFilter] = useState('');
42+
const [languageFilter, setLanguageFilter] = useState('');
3643
const [page, setPage] = useState(1);
3744
const [data, setData] = useState<PaginatedResponse<SubmissionType> | null>(
3845
null
@@ -50,6 +57,7 @@ export default function Submissions() {
5057
limit: PAGE_SIZE,
5158
};
5259
if (statusFilter) params.status = statusFilter;
60+
if (languageFilter) params.language = languageFilter;
5361
const res = await api.submissions.list(params);
5462
setData(res);
5563
} catch (err: any) {
@@ -59,7 +67,7 @@ export default function Submissions() {
5967
} finally {
6068
setLoading(false);
6169
}
62-
}, [page, statusFilter]);
70+
}, [page, statusFilter, languageFilter]);
6371

6472
useEffect(() => {
6573
fetchSubmissions();
@@ -70,6 +78,11 @@ export default function Submissions() {
7078
setPage(1);
7179
};
7280

81+
const handleLanguageChange = (value: string) => {
82+
setLanguageFilter(value);
83+
setPage(1);
84+
};
85+
7386
const totalPages = data ? Math.ceil(data.total / PAGE_SIZE) : 0;
7487

7588
const getPageNumbers = (): (number | '...')[] => {
@@ -138,7 +151,7 @@ export default function Submissions() {
138151
</div>
139152

140153
{/* Status filter */}
141-
<div className="flex flex-wrap gap-1 mb-6">
154+
<div className="flex flex-wrap gap-1 mb-2">
142155
{STATUS_FILTERS.map((opt) => (
143156
<button
144157
key={opt.value}
@@ -153,6 +166,22 @@ export default function Submissions() {
153166
</button>
154167
))}
155168
</div>
169+
{/* Language filter */}
170+
<div className="flex flex-wrap gap-1 mb-6">
171+
{LANGUAGE_FILTERS.map((opt) => (
172+
<button
173+
key={opt.value}
174+
onClick={() => handleLanguageChange(opt.value)}
175+
className={`px-3 py-1.5 rounded-md text-sm transition-colors ${
176+
languageFilter === opt.value
177+
? 'bg-emerald-600 text-white'
178+
: 'bg-dark-800 text-gray-300 hover:bg-dark-700'
179+
}`}
180+
>
181+
{opt.label}
182+
</button>
183+
))}
184+
</div>
156185

157186
{/* Stats bar */}
158187
{data && (

frontend/src/services/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ const api = {
6565
submissions: {
6666
submit: (body: { problem_id: number; code?: string; language?: string; answer?: string | number }) =>
6767
request<import('../types').Submission>('/submissions', { method: 'POST', body: JSON.stringify(body) }),
68-
list: (params?: { problem_id?: number; status?: string; page?: number; limit?: number }) => {
68+
list: (params?: { problem_id?: number; status?: string; page?: number; limit?: number; language?: string }) => {
6969
const q = new URLSearchParams();
7070
if (params) Object.entries(params).forEach(([k, v]) => { if (v !== undefined) q.set(k, String(v)); });
7171
return request<import('../types').PaginatedResponse<import('../types').Submission>>(`/submissions?${q}`);

0 commit comments

Comments
 (0)