feat: 添加管理员权限控制和状态持久化

This commit is contained in:
2025-09-02 12:31:48 +08:00
parent 652b913930
commit c938e5b770
8 changed files with 180 additions and 59 deletions

View File

@@ -1,14 +1,15 @@
<script setup lang="ts">
import {useCounterStore} from "@/stores/counter.ts";
import {ref} from 'vue'
import {ref, watch} from 'vue'
import axios from "@/axios.ts";
const result = ref()
const value = ref('')
const getInfo = () => {
axios.get('/api/token/info', {
params: {
token: useCounterStore().token
token: value.value
}
}).then(res => {
if (res.status == 200) {
@@ -20,35 +21,64 @@ const getInfo = () => {
const deleteDedup = () => {
axios.delete('/api/token/info', {
params: {
token: useCounterStore().token,
token: value.value,
dedup_bf: true
}
}).then(res => {
getInfo()
})
getInfo()
}
const deleteRedis = () => {
axios.delete('/api/token/info', {
params: {
token: useCounterStore().token,
token: value.value,
cache_list: true
}
}).then(res => {
getInfo()
})
getInfo()
}
getInfo()
setInterval(getInfo, 5000)
watch(value, (newValue) => {
console.log(newValue)
getInfo()
})
interface optionsType {
value: string
}
const options = ref([] as optionsType[])
value.value = useCounterStore().token
axios.get('/api/token').then(res => {
if (res.status == 200) {
res.data.result.forEach((item: any) => {
options.value.push({"value": item.token})
})
}
})
</script>
<template>
<p>当前Token{{ useCounterStore().token }}</p>
<el-button type="danger" @click="deleteDedup">删除去重记录值</el-button>
<el-button type="danger" @click="deleteRedis">删除Redis数据</el-button>
<b>当前Token</b>
<el-select v-model="value" placeholder="选择Token" style="width: 240px">
<el-option
v-for="item in options"
:key="item.value"
:value="item.value"
/>
</el-select>
<el-divider/>
<el-button type="primary" @click="getInfo">手动刷新</el-button>
<b>Token信息每5秒刷新</b>
<el-button type="primary" plain @click="getInfo">手动刷新</el-button>
<el-descriptions
:title="'Token信息 - ' + useCounterStore().token+'(每5秒刷新)'"
direction="vertical"
:column="4"
border
@@ -57,6 +87,13 @@ setInterval(getInfo, 5000)
<el-descriptions-item label="去重记录值">{{ result?.dedup_items_number }}</el-descriptions-item>
<el-descriptions-item label="Redis中数据条数">{{ result?.cache_list_number }}</el-descriptions-item>
</el-descriptions>
<div v-if="useCounterStore().isAdmin">
<p><b>管理</b></p>
<el-button type="danger" @click="deleteDedup">删除去重记录值</el-button>
<el-button type="danger" @click="deleteRedis">删除Redis数据</el-button>
</div>
</template>
<style scoped>

View File

@@ -114,46 +114,36 @@ const deleteToken = (row: any) => {
ElMessage.error(error.response?.data?.error)
})
}
const inputPassWord = ref('')
const checkPassword = () => {
if (inputPassWord.value == "admin") {
ElMessage({
message: '密码正确',
type: 'success',
})
useCounterStore().isAdmin = true
} else {
ElMessage.error('密码错误')
}
}
</script>
<template>
<!--添加Token-->
<el-input v-model="input" style="width: 200px" placeholder="请输入Token名称"/>
<el-select v-model="value" placeholder="选择去重对象" style="width: 200px">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-button type="primary" @click="addToken">添加Token</el-button>
<!--非管理员-->
<div v-if="!useCounterStore().isAdmin" style="margin: auto auto; max-width: 400px">
<el-alert title="您没有权限访问此页面,输入管理员密码" type="error" :closable="false" show-icon/>
<p></p>
<el-input v-model="inputPassWord" style="width: 400px" placeholder="请输入管理员密码"/>
<p></p>
<el-button type="primary" @click="checkPassword">确认</el-button>
</div>
<!--Token列表-->
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="token" label="Token" width="180"/>
<el-table-column prop="dedup_object" label="去重对象" width="180"/>
<el-table-column label="操作">
<template #default="scope">
<el-button @click="viewDetails(scope.row)">查看详细</el-button>
<el-button @click="dialogDedupObjectVisible(scope.row)" type="primary">更改去重对象</el-button>
<el-popconfirm
width="180"
title="确认删除此Token吗"
confirm-button-text="确认"
cancel-button-text="取消"
@confirm="deleteToken(scope.row)"
>
<template #reference>
<el-button type="danger">删除此Token</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<el-dialog v-model="dedupObjectVisible" title="更改去重对象" width="400">
<!--管理员-->
<div v-if="useCounterStore().isAdmin">
<!--添加Token-->
<el-input v-model="input" style="width: 200px" placeholder="请输入Token名称"/>
<el-select v-model="value" placeholder="选择去重对象" style="width: 200px">
<el-option
v-for="item in options"
@@ -162,12 +152,48 @@ const deleteToken = (row: any) => {
:value="item.value"
/>
</el-select>
<template #footer>
<el-button type="primary" @click="updateDedupObject">
确定
</el-button>
</template>
</el-dialog>
<el-button type="primary" @click="addToken">添加Token</el-button>
<!--Token列表-->
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="token" label="Token" width="180"/>
<el-table-column prop="dedup_object" label="去重对象" width="180"/>
<el-table-column label="操作">
<template #default="scope">
<el-button @click="viewDetails(scope.row)">查看详细</el-button>
<el-button @click="dialogDedupObjectVisible(scope.row)" type="primary">更改去重对象</el-button>
<el-popconfirm
width="180"
title="确认删除此Token吗"
confirm-button-text="确认"
cancel-button-text="取消"
@confirm="deleteToken(scope.row)"
>
<template #reference>
<el-button type="danger">删除此Token</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<el-dialog v-model="dedupObjectVisible" title="更改去重对象" width="400">
<el-select v-model="value" placeholder="选择去重对象" style="width: 200px">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<template #footer>
<el-button type="primary" @click="updateDedupObject">
确定
</el-button>
</template>
</el-dialog>
</div>
</template>
<style scoped>