diff --git a/.vscode/extensions.json b/.vscode/extensions.json
deleted file mode 100644
index c0a6e5a..0000000
--- a/.vscode/extensions.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"]
-}
diff --git a/src/components.d.ts b/src/components.d.ts
index 12c31a9..534a97b 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -37,6 +37,8 @@ declare module 'vue' {
NLayoutContent: typeof import('naive-ui')['NLayoutContent']
NLayoutHeader: typeof import('naive-ui')['NLayoutHeader']
NLayoutSider: typeof import('naive-ui')['NLayoutSider']
+ NList: typeof import('naive-ui')['NList']
+ NListItem: typeof import('naive-ui')['NListItem']
NMenu: typeof import('naive-ui')['NMenu']
NMessageProvider: typeof import('naive-ui')['NMessageProvider']
NModal: typeof import('naive-ui')['NModal']
diff --git a/src/oj/api.ts b/src/oj/api.ts
index 5efc8e3..cb49c00 100644
--- a/src/oj/api.ts
+++ b/src/oj/api.ts
@@ -170,10 +170,22 @@ export function updateProfile(data: { real_name: string; mood: string }) {
return http.put("profile", data)
}
-export function getAnnouncementList(offset = 10, limit = 10) {
+export function getAnnouncementList(offset = 0, limit = 10) {
return http.get("announcement", { params: { limit, offset } })
}
export function getAnnouncement(id: number) {
return http.get("announcement", { params: { id } })
}
+
+export function createMessage(data: {
+ recipient: number
+ message: string
+ submission: string
+}) {
+ return http.post("message", data)
+}
+
+export function getMessageList(offset = 0, limit = 10) {
+ return http.get("message", { params: { limit, offset } })
+}
diff --git a/src/oj/submission/detail.vue b/src/oj/submission/detail.vue
index 6e4abd6..4d24cbc 100644
--- a/src/oj/submission/detail.vue
+++ b/src/oj/submission/detail.vue
@@ -1,5 +1,5 @@
diff --git a/src/routes.ts b/src/routes.ts
index 2c2c8ef..f2973e8 100644
--- a/src/routes.ts
+++ b/src/routes.ts
@@ -84,6 +84,11 @@ export const ojs: RouteRecordRaw = {
component: () => import("oj/user/setting.vue"),
meta: { requiresAuth: true },
},
+ {
+ path: "message",
+ component: () => import("oj/user/message.vue"),
+ meta: { requiresAuth: true },
+ }
],
}
diff --git a/src/shared/components/Header.vue b/src/shared/components/Header.vue
index 62bc50f..9fe7ba5 100644
--- a/src/shared/components/Header.vue
+++ b/src/shared/components/Header.vue
@@ -72,6 +72,13 @@ const options: Array = [
onClick: () => router.push("/user"),
},
},
+ {
+ label: "我的消息",
+ key: "message",
+ props: {
+ onClick: () => router.push("/message"),
+ },
+ },
{
label: "我的提交",
key: "status",
diff --git a/src/shared/components/TextEditor.vue b/src/shared/components/TextEditor.vue
index ce6fc47..0c0d443 100644
--- a/src/shared/components/TextEditor.vue
+++ b/src/shared/components/TextEditor.vue
@@ -6,6 +6,7 @@ import { uploadImage } from "../../admin/api"
interface Props {
title: string
+ simple?: boolean
minHeight?: number
}
@@ -14,6 +15,7 @@ type InsertFnType = (url: string, alt: string, href: string) => void
const props = withDefaults(defineProps(), {
minHeight: 0,
+ simple: false,
})
const message = useMessage()
@@ -52,6 +54,20 @@ const toolbarConfig: Partial = {
],
}
+const toolbarConfigSimple: Partial = {
+ toolbarKeys: [
+ "bold",
+ "color",
+ "bgColor",
+ "emotion",
+ "uploadImage",
+ "insertLink",
+ "clearStyle",
+ "undo",
+ "redo",
+ ],
+}
+
const editorConfig: Partial = {
scroll: false,
MENU_CONF: {
@@ -93,7 +109,7 @@ async function customUpload(file: File, insertFn: InsertFnType) {