@@ -119,49 +119,54 @@ async function getProblemDetail() {
|
|||||||
toggleReady(true)
|
toggleReady(true)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const { data } = await getProblem(props.problemID)
|
try {
|
||||||
toggleReady(true)
|
const { data } = await getProblem(props.problemID)
|
||||||
problem.value.id = data.id
|
toggleReady(true)
|
||||||
problem.value._id = data._id
|
problem.value.id = data.id
|
||||||
problem.value.title = data.title
|
problem.value._id = data._id
|
||||||
problem.value.description = data.description
|
problem.value.title = data.title
|
||||||
problem.value.input_description = data.input_description
|
problem.value.description = data.description
|
||||||
problem.value.output_description = data.output_description
|
problem.value.input_description = data.input_description
|
||||||
problem.value.time_limit = data.time_limit
|
problem.value.output_description = data.output_description
|
||||||
problem.value.memory_limit = data.memory_limit
|
problem.value.time_limit = data.time_limit
|
||||||
problem.value.memory_limit = data.memory_limit
|
problem.value.memory_limit = data.memory_limit
|
||||||
problem.value.difficulty = data.difficulty
|
problem.value.memory_limit = data.memory_limit
|
||||||
problem.value.visible = data.visible
|
problem.value.difficulty = data.difficulty
|
||||||
problem.value.share_submission = data.share_submission
|
problem.value.visible = data.visible
|
||||||
problem.value.tags = data.tags
|
problem.value.share_submission = data.share_submission
|
||||||
problem.value.languages = data.languages
|
problem.value.tags = data.tags
|
||||||
problem.value.template = data.template
|
problem.value.languages = data.languages
|
||||||
problem.value.samples = data.samples
|
problem.value.template = data.template
|
||||||
problem.value.samples = data.samples
|
problem.value.samples = data.samples
|
||||||
problem.value.spj = data.spj
|
problem.value.samples = data.samples
|
||||||
problem.value.spj_language = data.spj_language
|
problem.value.spj = data.spj
|
||||||
problem.value.spj_code = data.spj_code
|
problem.value.spj_language = data.spj_language
|
||||||
problem.value.spj_compile_ok = data.spj_compile_ok
|
problem.value.spj_code = data.spj_code
|
||||||
problem.value.test_case_id = data.test_case_id
|
problem.value.spj_compile_ok = data.spj_compile_ok
|
||||||
problem.value.test_case_score = data.test_case_score
|
problem.value.test_case_id = data.test_case_id
|
||||||
problem.value.rule_type = data.rule_type
|
problem.value.test_case_score = data.test_case_score
|
||||||
problem.value.hint = data.hint
|
problem.value.rule_type = data.rule_type
|
||||||
problem.value.source = data.source
|
problem.value.hint = data.hint
|
||||||
problem.value.io_mode = data.io_mode
|
problem.value.source = data.source
|
||||||
if (problem.value.contest_id) {
|
problem.value.io_mode = data.io_mode
|
||||||
problem.value.contest_id = problem.value.contest_id
|
if (problem.value.contest_id) {
|
||||||
}
|
problem.value.contest_id = problem.value.contest_id
|
||||||
|
|
||||||
// 下面是用来显示的:
|
|
||||||
// 代码模板 和 模板开关
|
|
||||||
problem.value.languages.forEach((lang) => {
|
|
||||||
if (data.template[lang]) {
|
|
||||||
template[lang] = data.template[lang]
|
|
||||||
toggleNeedTemplate(true)
|
|
||||||
}
|
}
|
||||||
})
|
|
||||||
// 标签
|
// 下面是用来显示的:
|
||||||
tags.value.select = data.tags
|
// 代码模板 和 模板开关
|
||||||
|
problem.value.languages.forEach((lang) => {
|
||||||
|
if (data.template[lang]) {
|
||||||
|
template[lang] = data.template[lang]
|
||||||
|
toggleNeedTemplate(true)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// 标签
|
||||||
|
tags.value.select = data.tags
|
||||||
|
} catch (error) {
|
||||||
|
message.error("获取题目失败")
|
||||||
|
router.push({ name: "admin problem list" })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getTagList() {
|
async function getTagList() {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
import { NButton, NTag } from "naive-ui"
|
import { NButton, NTag } from "naive-ui"
|
||||||
import { parseTime } from "~/utils/functions"
|
import { parseTime } from "~/utils/functions"
|
||||||
import { Server } from "~/utils/types"
|
import { Server } from "~/utils/types"
|
||||||
import { usePermissions } from "~/utils/permissions"
|
|
||||||
import {
|
import {
|
||||||
deleteJudgeServer,
|
deleteJudgeServer,
|
||||||
editWebsite,
|
editWebsite,
|
||||||
@@ -18,14 +17,6 @@ interface Testcase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const message = useMessage()
|
const message = useMessage()
|
||||||
const router = useRouter()
|
|
||||||
const { canManageSystemConfig } = usePermissions()
|
|
||||||
|
|
||||||
// 权限检查:只有super_admin可以管理系统配置
|
|
||||||
if (!canManageSystemConfig.value) {
|
|
||||||
message.error("您没有权限访问此页面")
|
|
||||||
router.push("/admin")
|
|
||||||
}
|
|
||||||
|
|
||||||
const testcaseColumns: DataTableColumn<Testcase>[] = [
|
const testcaseColumns: DataTableColumn<Testcase>[] = [
|
||||||
{ title: "测试用例 ID", key: "id" },
|
{ title: "测试用例 ID", key: "id" },
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { NButton } from "naive-ui"
|
|||||||
import { getRank } from "oj/api"
|
import { getRank } from "oj/api"
|
||||||
import Pagination from "~/shared/components/Pagination.vue"
|
import Pagination from "~/shared/components/Pagination.vue"
|
||||||
import { useUserStore } from "~/shared/store/user"
|
import { useUserStore } from "~/shared/store/user"
|
||||||
import { usePermissions } from "~/utils/permissions"
|
|
||||||
import { getACRate } from "~/utils/functions"
|
import { getACRate } from "~/utils/functions"
|
||||||
import { Rank } from "~/utils/types"
|
import { Rank } from "~/utils/types"
|
||||||
import { getBaseInfo, randomUser10 } from "../api"
|
import { getBaseInfo, randomUser10 } from "../api"
|
||||||
@@ -14,14 +13,6 @@ const contestCount = ref(0)
|
|||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const message = useMessage()
|
const message = useMessage()
|
||||||
const { isSuperAdmin } = usePermissions()
|
|
||||||
|
|
||||||
// 权限检查:只有super_admin可以访问管理员首页
|
|
||||||
if (!isSuperAdmin.value) {
|
|
||||||
message.error("您没有权限访问此页面")
|
|
||||||
router.push("/admin/problem/list")
|
|
||||||
}
|
|
||||||
|
|
||||||
const showModal = ref(false)
|
const showModal = ref(false)
|
||||||
const luckyGuy = ref("")
|
const luckyGuy = ref("")
|
||||||
const data = ref<Rank[]>([])
|
const data = ref<Rank[]>([])
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { DataTableRowKey, SelectOption } from "naive-ui"
|
|||||||
import Pagination from "~/shared/components/Pagination.vue"
|
import Pagination from "~/shared/components/Pagination.vue"
|
||||||
import { parseTime, filterEmptyValue } from "~/utils/functions"
|
import { parseTime, filterEmptyValue } from "~/utils/functions"
|
||||||
import { User } from "~/utils/types"
|
import { User } from "~/utils/types"
|
||||||
import { usePermissions } from "~/utils/permissions"
|
|
||||||
import {
|
import {
|
||||||
deleteUsers,
|
deleteUsers,
|
||||||
editUser,
|
editUser,
|
||||||
@@ -18,13 +17,6 @@ import { USER_TYPE } from "~/utils/constants"
|
|||||||
const message = useMessage()
|
const message = useMessage()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const { canManageUsers } = usePermissions()
|
|
||||||
|
|
||||||
// 权限检查:只有super_admin可以管理用户
|
|
||||||
if (!canManageUsers.value) {
|
|
||||||
message.error("您没有权限访问此页面")
|
|
||||||
router.push("/admin")
|
|
||||||
}
|
|
||||||
|
|
||||||
const total = ref(0)
|
const total = ref(0)
|
||||||
const users = ref<User[]>([])
|
const users = ref<User[]>([])
|
||||||
|
|||||||
37
src/main.ts
37
src/main.ts
@@ -25,6 +25,7 @@ import App from "./App.vue"
|
|||||||
import { admins, ojs } from "./routes"
|
import { admins, ojs } from "./routes"
|
||||||
|
|
||||||
import { toggleLogin } from "./shared/composables/modal"
|
import { toggleLogin } from "./shared/composables/modal"
|
||||||
|
import { useUserStore } from "./shared/store/user"
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHistory(),
|
history: createWebHistory(),
|
||||||
@@ -41,23 +42,20 @@ router.beforeEach(async (to, from, next) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查管理员权限
|
// 检查权限
|
||||||
if (to.matched.some((record) =>
|
if (
|
||||||
record.meta.requiresAdmin ||
|
to.matched.some(
|
||||||
record.meta.requiresSuperAdmin ||
|
(record) =>
|
||||||
record.meta.requiresProblemPermission
|
record.meta.requiresSuperAdmin || record.meta.requiresProblemPermission,
|
||||||
)) {
|
)
|
||||||
|
) {
|
||||||
if (!storage.get(STORAGE_KEY.AUTHED)) {
|
if (!storage.get(STORAGE_KEY.AUTHED)) {
|
||||||
toggleLogin(true)
|
toggleLogin(true)
|
||||||
next("/")
|
next("/")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 动态导入用户store来检查权限
|
|
||||||
const { useUserStore } = await import("./shared/store/user")
|
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
|
|
||||||
// 确保用户信息已加载
|
|
||||||
if (!userStore.user) {
|
if (!userStore.user) {
|
||||||
try {
|
try {
|
||||||
await userStore.getMyProfile()
|
await userStore.getMyProfile()
|
||||||
@@ -66,26 +64,15 @@ router.beforeEach(async (to, from, next) => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查super admin权限
|
|
||||||
if (to.matched.some((record) => record.meta.requiresSuperAdmin)) {
|
if (to.matched.some((record) => record.meta.requiresSuperAdmin)) {
|
||||||
if (!userStore.isSuperAdmin) {
|
if (!userStore.isSuperAdmin) {
|
||||||
next("/admin")
|
next("/")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
} else if (
|
||||||
|
to.matched.some((record) => record.meta.requiresProblemPermission)
|
||||||
// 检查题目权限
|
) {
|
||||||
else if (to.matched.some((record) => record.meta.requiresProblemPermission)) {
|
|
||||||
if (!userStore.hasProblemPermission) {
|
if (!userStore.hasProblemPermission) {
|
||||||
next("/admin")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 检查基本admin权限
|
|
||||||
else if (to.matched.some((record) => record.meta.requiresAdmin)) {
|
|
||||||
if (!userStore.isAdminRole) {
|
|
||||||
next("/")
|
next("/")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,9 +107,8 @@ export const admins: RouteRecordRaw = {
|
|||||||
path: "",
|
path: "",
|
||||||
name: "admin home",
|
name: "admin home",
|
||||||
component: () => import("~/admin/setting/home.vue"),
|
component: () => import("~/admin/setting/home.vue"),
|
||||||
meta: { requiresAdmin: true },
|
meta: { requiresSuperAdmin: true },
|
||||||
},
|
},
|
||||||
// 只有super_admin可以访问的路由
|
|
||||||
{
|
{
|
||||||
path: "config",
|
path: "config",
|
||||||
name: "admin config",
|
name: "admin config",
|
||||||
@@ -148,46 +147,45 @@ export const admins: RouteRecordRaw = {
|
|||||||
props: true,
|
props: true,
|
||||||
meta: { requiresProblemPermission: true },
|
meta: { requiresProblemPermission: true },
|
||||||
},
|
},
|
||||||
// admin和super_admin都可以访问的路由
|
|
||||||
{
|
{
|
||||||
path: "contest/list",
|
path: "contest/list",
|
||||||
name: "admin contest list",
|
name: "admin contest list",
|
||||||
component: () => import("admin/contest/list.vue"),
|
component: () => import("admin/contest/list.vue"),
|
||||||
meta: { requiresAdmin: true },
|
meta: { requiresSuperAdmin: true },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "contest/create",
|
path: "contest/create",
|
||||||
name: "admin contest create",
|
name: "admin contest create",
|
||||||
component: () => import("admin/contest/detail.vue"),
|
component: () => import("admin/contest/detail.vue"),
|
||||||
meta: { requiresAdmin: true },
|
meta: { requiresSuperAdmin: true },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "contest/edit/:contestID",
|
path: "contest/edit/:contestID",
|
||||||
name: "admin contest edit",
|
name: "admin contest edit",
|
||||||
component: () => import("admin/contest/detail.vue"),
|
component: () => import("admin/contest/detail.vue"),
|
||||||
props: true,
|
props: true,
|
||||||
meta: { requiresAdmin: true },
|
meta: { requiresSuperAdmin: true },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "contest/:contestID/problem/list",
|
path: "contest/:contestID/problem/list",
|
||||||
name: "admin contest problem list",
|
name: "admin contest problem list",
|
||||||
component: () => import("admin/problem/list.vue"),
|
component: () => import("admin/problem/list.vue"),
|
||||||
props: true,
|
props: true,
|
||||||
meta: { requiresAdmin: true },
|
meta: { requiresSuperAdmin: true },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "contest/:contestID/problem/create",
|
path: "contest/:contestID/problem/create",
|
||||||
name: "admin contest problem create",
|
name: "admin contest problem create",
|
||||||
component: () => import("admin/problem/detail.vue"),
|
component: () => import("admin/problem/detail.vue"),
|
||||||
props: true,
|
props: true,
|
||||||
meta: { requiresAdmin: true },
|
meta: { requiresSuperAdmin: true },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "contest/:contestID/problem/edit/:problemID",
|
path: "contest/:contestID/problem/edit/:problemID",
|
||||||
name: "admin contest problem edit",
|
name: "admin contest problem edit",
|
||||||
component: () => import("admin/problem/detail.vue"),
|
component: () => import("admin/problem/detail.vue"),
|
||||||
props: true,
|
props: true,
|
||||||
meta: { requiresAdmin: true },
|
meta: { requiresSuperAdmin: true },
|
||||||
},
|
},
|
||||||
// 只有super_admin可以访问的路由
|
// 只有super_admin可以访问的路由
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user