diff --git a/src/admin/announcement/components/Actions.vue b/src/admin/announcement/components/Actions.vue new file mode 100644 index 0000000..a76e319 --- /dev/null +++ b/src/admin/announcement/components/Actions.vue @@ -0,0 +1,44 @@ + + + diff --git a/src/admin/announcement/detail.vue b/src/admin/announcement/detail.vue new file mode 100644 index 0000000..4dc9f16 --- /dev/null +++ b/src/admin/announcement/detail.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/admin/announcement/list.vue b/src/admin/announcement/list.vue new file mode 100644 index 0000000..ac7bce8 --- /dev/null +++ b/src/admin/announcement/list.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/src/admin/api.ts b/src/admin/api.ts index 25e9d80..bec8086 100644 --- a/src/admin/api.ts +++ b/src/admin/api.ts @@ -1,6 +1,8 @@ import http from "utils/http" import { AdminProblem, + Announcement, + AnnouncementEdit, BlankContest, BlankProblem, Contest, @@ -175,3 +177,25 @@ export function getJudgeServer() { export function deleteJudgeServer(hostname: string) { return http.delete("admin/judge_server", { params: { hostname } }) } + +export function getAnnouncementList(offset = 0, limit = 10) { + return http.get("admin/announcement", { + params: { paging: true, offset, limit }, + }) +} + +export function getAnnouncement(id: number) { + return http.get("admin/announcement", { params: { id } }) +} + +export function deleteAnnouncement(id: number) { + return http.delete("admin/announcement", { params: { id } }) +} + +export function editAnnouncement(announcement: AnnouncementEdit) { + return http.put("admin/announcement", announcement) +} + +export function createAnnouncement(announcement: AnnouncementEdit) { + return http.post("admin/announcement", announcement) +} diff --git a/src/admin/contest/detail.vue b/src/admin/contest/detail.vue index 1db2b06..0f0f402 100644 --- a/src/admin/contest/detail.vue +++ b/src/admin/contest/detail.vue @@ -29,7 +29,7 @@ const contest = reactive({ rule_type: "ACM", password: "", real_time_rank: true, - visible: true, + visible: false, allowed_ip_ranges: [], }) @@ -112,7 +112,9 @@ onMounted(getContestDetail) v-model:value="contest.description" :min-height="200" /> - 保存 + + 保存 + diff --git a/src/admin/user/list.vue b/src/admin/user/list.vue index c796451..898e4f2 100644 --- a/src/admin/user/list.vue +++ b/src/admin/user/list.vue @@ -3,7 +3,7 @@ import { DataTableRowKey, SelectOption } from "naive-ui" import Pagination from "~/shared/components/Pagination.vue" import { parseTime } from "~/utils/functions" import { User } from "~/utils/types" -import { getUserList, deleteUsers, editUser } from "../api" +import { getUserList, deleteUsers, editUser, importUsers } from "../api" import Actions from "./components/Actions.vue" import Name from "./components/Name.vue" @@ -17,6 +17,7 @@ const query = reactive({ page: 1, keyword: "", }) +const [create, toggleCreate] = useToggle(false) const password = ref("") const userIDs = ref([]) @@ -93,14 +94,34 @@ async function onUserBanned(user: User) { }) } -async function onOpenEditModal(user: User) { +function createNewUser() { + toggleCreate(true) + userEditing.value = { + id: 0, + username: "", + real_name: "", + email: "", + admin_type: "Regular User", + problem_permission: "", + create_time: new Date(), + last_login: new Date(), + two_factor_auth: false, + open_api: false, + is_disabled: false, + password: "", + } + password.value = "" +} + +function onOpenEditModal(user: User) { userEditing.value = user password.value = "" } -async function onCloseEditModal() { +function onCloseEditModal() { userEditing.value = null password.value = "" + toggleCreate(false) } async function handleEditUser() { @@ -109,10 +130,24 @@ async function handleEditUser() { message.error("密码长度不得小于 6") return } - const user = Object.assign(userEditing.value, { password: password.value }) - await editUser(user) + if (create) { + const newUser = [ + [ + userEditing.value.username, + password.value, + userEditing.value.email, + userEditing.value.real_name, + ], + ] + await importUsers(newUser) + listUsers() + } else { + const user = Object.assign(userEditing.value, { password: password.value }) + await editUser(user) + } userEditing.value = null password.value = "" + toggleCreate(false) } onMounted(listUsers) @@ -121,7 +156,10 @@ watch(query, listUsers, { deep: true })