- 流程图题的工具栏最左边是「写代码 / 画流程图」。原来流程图藏在语言下拉里,叫一个名叫 Flowchart 的「语言」;画完一道题之后它还被记成语言偏好,下一道能画的题一打开就是画布 - 「交给 AI 点评」交完切到「结果」页签:评的时候写着「AI 正在看你的图」、画布照样能改; 评完是分数、评语、改进建议、四项得分,顶上一排历次分数,点哪次看哪次。 原来是提交按钮旁一个 1000px 的弹框,盖住画布,翻历次评分要一页一页点 - 画到 A / S:给「照着它写代码 →」,题单里 1.5 秒后回题单(和代码通过一样), 课堂条当场标成做完;只在这一页上刚评完的那次才算,进页面读到以前的 A 不跳 - 「把这一版载回画布」只在画布和那一版不一样时出现;载回、进页面读回草稿后都缩放到装下整张图 - 题单入口能画流程图了(原来只有题库入口能画),题单里的代码草稿、流程图草稿各存一份, 加入题单之前写的、画的不会一进题单就摆在编辑器里 - 手机上不给「画流程图」(节点库是拖放,手机上拖不动),题面里以前画好的那张照样看得到 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
113 lines
2.7 KiB
TypeScript
113 lines
2.7 KiB
TypeScript
import { normalizeLanguage } from "@oj2/contract"
|
|
import { defineStore } from "pinia"
|
|
import { STORAGE_KEY } from "utils/constants"
|
|
import storage from "utils/storage"
|
|
import type { Code, LANGUAGE } from "utils/types"
|
|
|
|
/**
|
|
* 代码编辑器状态管理 Store
|
|
* 管理全局的代码、输入、输出状态
|
|
*/
|
|
function savedCodeLanguage() {
|
|
const saved = normalizeLanguage(storage.get(STORAGE_KEY.LANGUAGE))
|
|
return saved && saved !== "Flowchart" ? saved : null
|
|
}
|
|
|
|
export const useCodeStore = defineStore("code", () => {
|
|
// ==================== 状态 ====================
|
|
const code = reactive<Code>({
|
|
value: "",
|
|
// 过一道 normalizeLanguage:上线那一刻学生浏览器的 localStorage 里存的还是
|
|
// 旧值 Python3,直接拿来用会被后端的契约挡掉(而且报错看不出是这个原因)
|
|
// 以前的版本会把 Flowchart 也记成语言偏好,那种老值在这里一并不认
|
|
language: savedCodeLanguage() ?? "Python",
|
|
})
|
|
|
|
const input = ref("")
|
|
const output = ref("")
|
|
|
|
// ==================== 计算属性 ====================
|
|
const isEmpty = computed(() => code.value.trim() === "")
|
|
|
|
// ==================== 操作 ====================
|
|
/**
|
|
* 设置代码内容
|
|
*/
|
|
function setCode(value: string) {
|
|
code.value = value
|
|
}
|
|
|
|
/**
|
|
* 设置编程语言
|
|
*/
|
|
function setLanguage(language: LANGUAGE) {
|
|
code.language = language
|
|
}
|
|
|
|
/**
|
|
* 设置输入
|
|
*/
|
|
function setInput(value: string) {
|
|
input.value = value
|
|
}
|
|
|
|
/**
|
|
* 设置输出
|
|
*/
|
|
function setOutput(value: string) {
|
|
output.value = value
|
|
}
|
|
|
|
/**
|
|
* 重置所有状态
|
|
*/
|
|
function reset() {
|
|
code.value = ""
|
|
input.value = ""
|
|
output.value = ""
|
|
}
|
|
|
|
/**
|
|
* 清空输出
|
|
*/
|
|
function clearOutput() {
|
|
output.value = ""
|
|
}
|
|
|
|
/**
|
|
* 语言变了就记下来,下一道题默认用它。**不记 Flowchart**:那是「画流程图」这种作业,
|
|
* 不是编程语言偏好 —— 记下来的话,画完一道流程图题,下一道能画的题一打开就是画布,
|
|
* 而学生这节课要写的是代码。切回「写代码」时用的也是这份偏好。
|
|
*/
|
|
watch(
|
|
() => code.language,
|
|
(newLanguage) => {
|
|
if (newLanguage !== "Flowchart") storage.set(STORAGE_KEY.LANGUAGE, newLanguage)
|
|
},
|
|
)
|
|
|
|
/** 学生习惯用的编程语言(从来不会是 Flowchart) */
|
|
function preferredLanguage(): LANGUAGE {
|
|
return savedCodeLanguage() ?? "Python"
|
|
}
|
|
|
|
return {
|
|
// 状态
|
|
code,
|
|
input,
|
|
output,
|
|
|
|
// 计算属性
|
|
isEmpty,
|
|
|
|
// 操作
|
|
setCode,
|
|
setLanguage,
|
|
preferredLanguage,
|
|
setInput,
|
|
setOutput,
|
|
reset,
|
|
clearOutput,
|
|
}
|
|
})
|