fix(题目列表): 排序里多了个用不上的「按题号」,原来的最早创建、最多 / 最少提交、通过都没了——换回原来那一套
Deploy / deploy (push) Canceled after 0s
Deploy / deploy (push) Canceled after 0s
最新创建 / 最早创建 / 最多人做过 / 最少人做过 / 最多人做对 / 最少人做对。排序值和原来一样, 旧链接照样能用;「最多 / 最少」改成按人数,和最后一列「做对 / 做过」对得上。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
97426f0895
commit
e852bf4498
3 files changed
+33
-23
No files matched your search
@@ -121,12 +121,6 @@ function listItem(
|
|||||||
} satisfies ProblemListItem
|
} satisfies ProblemListItem
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 题号排序:先按长度再按字面,1001 < 1100 < P026 < SQL09,不会排成 1001、1100、11、2 */
|
|
||||||
const displayIdOrder = [
|
|
||||||
asc(sql`length(${schema.problem.displayId})`),
|
|
||||||
asc(schema.problem.displayId),
|
|
||||||
]
|
|
||||||
|
|
||||||
problemRoutes.get("/problems", optionalAuth, async (c) => {
|
problemRoutes.get("/problems", optionalAuth, async (c) => {
|
||||||
const user = c.get("user")
|
const user = c.get("user")
|
||||||
const limit = queryInteger(c.req.query("limit"), 20, { min: 1, max: 250 })
|
const limit = queryInteger(c.req.query("limit"), 20, { min: 1, max: 250 })
|
||||||
@@ -169,23 +163,26 @@ problemRoutes.get("/problems", optionalAuth, async (c) => {
|
|||||||
filters.push(notInArray(schema.problem.id, [...states.solved]))
|
filters.push(notInArray(schema.problem.id, [...states.solved]))
|
||||||
|
|
||||||
const where = and(...filters)
|
const where = and(...filters)
|
||||||
// 默认按最新创建(选了知识点也一样)。旧的排序值(最多提交、画流程图……)落到默认 ——
|
// 排序值沿用原来的(地址栏里存着的旧链接照样能用),但「最多 / 最少」现在按**人数**排,
|
||||||
// 类型已经拆成了单独的筛选
|
// 和列表最后一列「做对 / 做过」对得上:submission_number 是做过的人,accepted_number 是做对的人。
|
||||||
|
// 旧的「画流程图 / 语法检查」排序已经拆成类型筛选,传进来落到默认(最新创建)
|
||||||
const sort = problemListSortSchema.safeParse(c.req.query("sort") ?? "").data ?? ""
|
const sort = problemListSortSchema.safeParse(c.req.query("sort") ?? "").data ?? ""
|
||||||
const effective = sort || "new"
|
const byPeople = sort.endsWith("submission_number") || sort.endsWith("accepted_number")
|
||||||
const allCounts = effective === "popular" ? await problemUserCounts() : null
|
const allCounts = byPeople ? await problemUserCounts() : null
|
||||||
const popularity = allCounts
|
const people = allCounts
|
||||||
? sql`case ${schema.problem.id} ${sql.join(
|
? sql`case ${schema.problem.id} ${sql.join(
|
||||||
[...allCounts].map(([id, n]) => sql`when ${id} then ${n.solved}`),
|
[...allCounts].map(
|
||||||
|
([id, n]) =>
|
||||||
|
sql`when ${id} then ${sort.endsWith("accepted_number") ? n.solved : n.tried}`,
|
||||||
|
),
|
||||||
sql` `,
|
sql` `,
|
||||||
)} else 0 end`
|
)} else 0 end`
|
||||||
: null
|
: null
|
||||||
const order =
|
const order = people
|
||||||
effective === "id"
|
? [sort.startsWith("-") ? desc(people) : asc(people), desc(schema.problem.createTime)]
|
||||||
? displayIdOrder
|
: sort === "create_time"
|
||||||
: popularity
|
? [asc(schema.problem.createTime)]
|
||||||
? [desc(popularity), ...displayIdOrder]
|
: [desc(schema.problem.createTime)]
|
||||||
: [desc(schema.problem.createTime)]
|
|
||||||
const [totalRow] = await db
|
const [totalRow] = await db
|
||||||
.select({ value: countDistinct(schema.problem.id) })
|
.select({ value: countDistinct(schema.problem.id) })
|
||||||
.from(schema.problem)
|
.from(schema.problem)
|
||||||
|
|||||||
@@ -179,11 +179,14 @@ const countText = computed(() => {
|
|||||||
return { kind: "total" as const, n: total.value }
|
return { kind: "total" as const, n: total.value }
|
||||||
})
|
})
|
||||||
|
|
||||||
// ---- 排序:默认按最新创建(选了知识点也一样) ----
|
// ---- 排序:和原来同一套,「最多 / 最少」按人数(和最后一列「做对 / 做过」对得上) ----
|
||||||
const sortOptions = [
|
const sortOptions = [
|
||||||
{ label: "最新创建", value: "" },
|
{ label: "最新创建", value: "" },
|
||||||
{ label: "按题号", value: "id" },
|
{ label: "最早创建", value: "create_time" },
|
||||||
{ label: "最多人做对", value: "popular" },
|
{ label: "最多人做过", value: "-submission_number" },
|
||||||
|
{ label: "最少人做过", value: "submission_number" },
|
||||||
|
{ label: "最多人做对", value: "-accepted_number" },
|
||||||
|
{ label: "最少人做对", value: "accepted_number" },
|
||||||
]
|
]
|
||||||
|
|
||||||
// ---- 出题者 ----
|
// ---- 出题者 ----
|
||||||
|
|||||||
@@ -439,8 +439,18 @@ export const problemListSchema = paginatedSchema(problemListItemSchema)
|
|||||||
/** 题目列表「全部类型」下拉:有参考图 / 画流程图 / 语法要求 */
|
/** 题目列表「全部类型」下拉:有参考图 / 画流程图 / 语法要求 */
|
||||||
export const problemTypeFilterSchema = z.enum(["reference", "flowchart", "ast"])
|
export const problemTypeFilterSchema = z.enum(["reference", "flowchart", "ast"])
|
||||||
|
|
||||||
/** 题目列表的排序。空串是默认:按最新创建 */
|
/**
|
||||||
export const problemListSortSchema = z.enum(["", "id", "new", "popular"])
|
* 题目列表的排序。值沿用原来的(旧链接照样能用):空串 = 最新创建、create_time = 最早创建,
|
||||||
|
* ±submission_number / ±accepted_number 是做过 / 做对的**人数**,带 - 是从多到少
|
||||||
|
*/
|
||||||
|
export const problemListSortSchema = z.enum([
|
||||||
|
"",
|
||||||
|
"create_time",
|
||||||
|
"-submission_number",
|
||||||
|
"submission_number",
|
||||||
|
"-accepted_number",
|
||||||
|
"accepted_number",
|
||||||
|
])
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 题目列表顶上那行和左栏的进度。**只说做到了什么**:做对几道、这周新做对几道、
|
* 题目列表顶上那行和左栏的进度。**只说做到了什么**:做对几道、这周新做对几道、
|
||||||
|
|||||||
Reference in new issue
Block a user