diff --git a/src/api/login.js b/src/api/login.js index 2ade08b..046ff8b 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -112,3 +112,20 @@ export const userRegister = async (qq_code, password, token, captcha) => { } }; +/** + * 管理员修改用户权限 + * @param {string} uuid - 用户uuid + * @param {string} privilege - 新权限 + * @returns {Promise} 无返回值,成功即为修改成功 + */ +export const adminChangeUserPrivilege = async (uuid, privilege) => { + try { + await axiosInstance.put('/admin/change_user_privilege', { + uuid, + privilege + }); + } catch (error) { + throw error; + } +} + diff --git a/src/router/index.js b/src/router/index.js index 0742236..bb0ba29 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -82,11 +82,16 @@ const routes = [ name: 'Terrain', component: () => import('@/views/index/TerrainList.vue') }, - { - path: 'PIC2TGA', - name: 'PIC2TGA', - component: () => import('@/views/index/PIC2TGA.vue') - }, + { + path: 'PIC2TGA', + name: 'PIC2TGA', + component: () => import('@/views/index/PIC2TGA.vue') + }, + { + path: 'terrainGenerate', + name: 'TerrainGenerate', + component: () => import('@/views/index/TerrainGenerate.vue') + } ] }, { diff --git a/src/views/backend/Dashboard.vue b/src/views/backend/Dashboard.vue index 8ac1245..3463083 100644 --- a/src/views/backend/Dashboard.vue +++ b/src/views/backend/Dashboard.vue @@ -24,6 +24,9 @@
  • 用户管理
  • +
  • + 管理员修改用户权限 +
  • @@ -65,7 +68,7 @@
    - +
    @@ -75,6 +78,7 @@ import { ref, onMounted, computed, onUnmounted } from 'vue' import { useRouter } from 'vue-router' import { getUserInfo } from '@/utils/jwt' +import AdminEditUserPrivilege from '@/components/backend/AdminEditUserPrivilege.vue' const router = useRouter() const hasToken = ref(false) @@ -91,10 +95,12 @@ const isAdmin = computed(() => { }) async function checkPrivilege() { + console.log('正在验证权限'); const token = localStorage.getItem('access_token') hasToken.value = !!token if (!token) { router.push('/') + console.log('验证结束'); return; } try { @@ -105,6 +111,7 @@ async function checkPrivilege() { localStorage.removeItem('access_token') currentUserData.value = null router.push('/') + console.log('验证结束'); return; } } catch (e) { @@ -112,12 +119,14 @@ async function checkPrivilege() { localStorage.removeItem('access_token') currentUserData.value = null router.push('/') + console.log('验证结束'); } + console.log('验证结束'); } onMounted(() => { checkPrivilege(); - privilegeCheckTimer = setInterval(checkPrivilege, 2 * 60 * 1000); + privilegeCheckTimer = setInterval(checkPrivilege, 60 * 1000); }) onUnmounted(() => { diff --git a/src/views/index.vue b/src/views/index.vue index fbcf6c6..0bee3d1 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -117,6 +117,19 @@ onUnmounted(() => { // 移除事件监听器 document.removeEventListener('click', handleClickOutside) }) + +// 判断每个一级菜单是否有可见项 +const showTerrainList = true // 地形图列表始终可见 +const showTerrainGenerate = computed(() => isLoggedIn.value && currentUserData.value) +const showWeaponMatch = computed(() => isLoggedIn.value && currentUserData.value && hasPrivilege(currentUserData.value.privilege, ['lv-admin', 'lv-mod'])) +const showPic2Tga = computed(() => isLoggedIn.value && currentUserData.value) +const showDemands = computed(() => isLoggedIn.value && currentUserData.value) +const showCompetition = computed(() => isLoggedIn.value && currentUserData.value && hasPrivilege(currentUserData.value.privilege, ['lv-admin', 'lv-competitor'])) + +const showTerrainMenu = computed(() => showTerrainList || showTerrainGenerate.value) +const showOnlineToolsMenu = computed(() => showWeaponMatch.value || showPic2Tga.value) +const showPublicMenu = computed(() => showDemands.value) +const showCompetitionMenu = computed(() => showCompetition.value)