diff --git a/src/api.ts b/src/api.ts index 9d6ac0f..349c71c 100644 --- a/src/api.ts +++ b/src/api.ts @@ -7,6 +7,7 @@ import type { SubmissionOut, PromptMessage, TaskStatsOut, + TaskAsset, } from "./utils/type" import { BASE_URL, STORAGE_KEY } from "./utils/const" @@ -271,3 +272,46 @@ export const Helper = { return !!res.data.url ? res.data.url : "" }, } + +export const TaskAssets = { + async listChallenge(display: number): Promise { + return (await http.get(`/assets/challenge/${display}`)).data + }, + async uploadChallenge( + display: number, + name: string, + file: File, + ): Promise { + const form = new window.FormData() + form.append("name", name) + form.append("file", file) + return ( + await http.post(`/assets/challenge/${display}`, form, { + headers: { "content-type": "multipart/form-data" }, + }) + ).data + }, + async deleteChallenge(display: number, name: string) { + return (await http.delete(`/assets/challenge/${display}/${name}`)).data + }, + async listTutorial(display: number): Promise { + return (await http.get(`/assets/tutorial/${display}`)).data + }, + async uploadTutorial( + display: number, + name: string, + file: File, + ): Promise { + const form = new window.FormData() + form.append("name", name) + form.append("file", file) + return ( + await http.post(`/assets/tutorial/${display}`, form, { + headers: { "content-type": "multipart/form-data" }, + }) + ).data + }, + async deleteTutorial(display: number, name: string) { + return (await http.delete(`/assets/tutorial/${display}/${name}`)).data + }, +} diff --git a/src/components/editor/Preview.vue b/src/components/editor/Preview.vue index 7fb0e4a..683ff31 100644 --- a/src/components/editor/Preview.vue +++ b/src/components/editor/Preview.vue @@ -2,9 +2,9 @@
预览 - ({{ submission.view_count || 0 }}) + + ({{ submission.view_count || 0 }}) +
@@ -24,8 +24,9 @@ quaternary v-if="props.showCodeButton" @click="emits('showCode')" - >代码 + 代码 + 链接 @@ -58,6 +59,7 @@ interface Props { html: string css: string js: string + assetBaseUrl?: string submissionId?: string showCodeButton?: boolean clearable?: boolean @@ -113,6 +115,7 @@ function getContent() { 预览 + ${props.assetBaseUrl ? `` : ""} diff --git a/src/components/task/TaskAssetManager.vue b/src/components/task/TaskAssetManager.vue new file mode 100644 index 0000000..eb4f128 --- /dev/null +++ b/src/components/task/TaskAssetManager.vue @@ -0,0 +1,153 @@ + + + diff --git a/src/components/task/TaskPanel.vue b/src/components/task/TaskPanel.vue index f3c9daf..2e6a962 100644 --- a/src/components/task/TaskPanel.vue +++ b/src/components/task/TaskPanel.vue @@ -24,37 +24,76 @@ - {{ - progressText - }} + + {{ progressText }} + - - - - - - - - - + + + 素材 + + + + 提交记录 + + + + 编辑 + + + + 关闭 +
+ + + + + + + + +