Commit 23b74e93 by liucan

feat:用户管理添加角色校验

parent 95c47d2c
// API路径配置文件 // API路径配置文件
// 这个文件确保所有API路径在一处统一管理,方便修改 // 这个文件确保所有API路径在一处统一管理,方便修改
import { pauseJob } from "./schedule"; import { pauseJob } from './schedule'
export const authApi = { export const authApi = {
login: "/auth/login", login: '/auth/login',
logout: "/auth/logout", logout: '/auth/logout'
} as const; } as const
export const scrapydApi = { export const scrapydApi = {
// scrapyd相关接口 // scrapyd相关接口
listProjects: "/scrapyd/listProjects", listProjects: '/scrapyd/listProjects',
listVersions: "/scrapyd/listVersions", listVersions: '/scrapyd/listVersions',
listSpiders: "/scrapyd/listSpiders", listSpiders: '/scrapyd/listSpiders',
listJobsMerge: "/scrapyd/listJobsMerge", listJobsMerge: '/scrapyd/listJobsMerge',
cancel: "/scrapyd/cancel", cancel: '/scrapyd/cancel',
cancelAllJob: "/scrapyd/cancelAllJob", cancelAllJob: '/scrapyd/cancelAllJob',
deleteVersion: "/scrapyd/deleteVersion", deleteVersion: '/scrapyd/deleteVersion',
deleteProject: "/scrapyd/deleteProject", deleteProject: '/scrapyd/deleteProject',
schedule: "/scrapyd/schedule", schedule: '/scrapyd/schedule',
daemonStatus: "/scrapyd/daemonStatus", daemonStatus: '/scrapyd/daemonStatus',
addVersion: "/scrapyd/addVersion", addVersion: '/scrapyd/addVersion',
// 日志相关 // 日志相关
logs: "/scrapyd/logs", logs: '/scrapyd/logs',
projectLogs: "/scrapyd/projectLogs", projectLogs: '/scrapyd/projectLogs',
spiderLogs: "/scrapyd/spiderLogs", spiderLogs: '/scrapyd/spiderLogs',
jobLog: "/scrapyd/jobLog", jobLog: '/scrapyd/jobLog',
errorLogs: "/errorLogs/list", errorLogs: '/errorLogs/list'
} as const; } as const
export const scheduleApi = { export const scheduleApi = {
// 调度任务相关 // 调度任务相关
addJob: "/schedule/addJob", addJob: '/schedule/addJob',
getJobs: "/schedule/getJobs", getJobs: '/schedule/getJobs',
pauseJob: "/schedule/pauseJob", pauseJob: '/schedule/pauseJob',
resumeJob: "/schedule/resumeJob", resumeJob: '/schedule/resumeJob',
removeJob: "/schedule/removeJob", removeJob: '/schedule/removeJob',
jobDetail: "/schedule/jobDetail", jobDetail: '/schedule/jobDetail',
state: "/schedule/state", state: '/schedule/state',
start: "/schedule/start", start: '/schedule/start',
shutdown: "/schedule/shutdown", shutdown: '/schedule/shutdown',
pause: "/schedule/pause", pause: '/schedule/pause',
resume: "/schedule/resume", resume: '/schedule/resume',
removeAllJobs: "/schedule/removeAllJobs", removeAllJobs: '/schedule/removeAllJobs',
scheduleLogs: "/schedule/scheduleLogs", scheduleLogs: '/schedule/scheduleLogs',
removeScheduleLogs: "/schedule/removeScheduleLogs", removeScheduleLogs: '/schedule/removeScheduleLogs'
} as const; } as const
export const scrapydServerApi = { export const scrapydServerApi = {
getScrapydServerPage: "/scrapydServer/getScrapydServerPage", getScrapydServerPage: '/scrapydServer/getScrapydServerPage',
addScrapydServer: "/scrapydServer/addScrapydServer", addScrapydServer: '/scrapydServer/addScrapydServer',
updateScrapydServer: "/scrapydServer/updateScrapydServer", updateScrapydServer: '/scrapydServer/updateScrapydServer',
updateScrapydServerStatus: "/scrapydServer/updateScrapydServerStatus", updateScrapydServerStatus: '/scrapydServer/updateScrapydServerStatus',
deleteScrapydServer: "/scrapydServer/deleteScrapydServer", deleteScrapydServer: '/scrapydServer/deleteScrapydServer'
} as const; } as const
// 系统相关 // 系统相关
export const systemApi = { export const systemApi = {
systemInfo: "/system/systemInfo", systemInfo: '/system/systemInfo',
systemData: "/system/systemData", systemData: '/system/systemData',
systemConfig: "/system/systemConfig", systemConfig: '/system/systemConfig',
loginHistoryList: "/actionHistory/loginHistoryList", loginHistoryList: '/actionHistory/loginHistoryList',
scrapydServerList: "/system/scrapydServerList", // 没用 scrapydServerList: '/system/scrapydServerList' // 没用
} as const; } as const
// 统计相关 // 统计相关
export const statsApi = { export const statsApi = {
statsList: "/statsCollection/listItem", statsList: '/statsCollection/listItem',
statsDetail: "/statsCollection/detail", statsDetail: '/statsCollection/detail',
removeStats: "/statsCollection/delete", removeStats: '/statsCollection/delete',
clearAllStats: "/statsCollection/clearAll", // TODO 未实现 clearAllStats: '/statsCollection/clearAll' // TODO 未实现
} as const; } as const
// 系统用户相关接口 // 系统用户相关接口
export const userApi = { export const userApi = {
userList: "/user/list", userList: '/user/list',
addUser: "/user/insert", addUser: '/user/insert',
updateUser: "/user/update", updateUser: '/user/update',
deleteUser: "/user/delete", deleteUser: '/user/delete',
batchDelete: "/user/batchDelete", batchDelete: '/user/batchDelete',
} as const; getUserRole: '/user/getUserRole'
} as const
// 系统用户相关接口 // 系统用户相关接口
export const spiderApi = { export const spiderApi = {
spiderList: "/scrapyd/listSpiders", spiderList: '/scrapyd/listSpiders'
} as const; } as const
// 爬虫任务相关接口 // 爬虫任务相关接口
export const spiderTaskApi = { export const spiderTaskApi = {
taskList: "/schedule/getJobs", taskList: '/schedule/getJobs',
taskRecord: "/schedule/scheduleLogs", taskRecord: '/schedule/scheduleLogs',
addTask: "/schedule/addJob", addTask: '/schedule/addJob',
deleteTask: "/schedule/removeJob", deleteTask: '/schedule/removeJob',
pauseJob: "/schedule/pauseJob", pauseJob: '/schedule/pauseJob',
resumeJob: "/schedule/resumeJob", resumeJob: '/schedule/resumeJob',
jobDetail: "/schedule/jobDetail", jobDetail: '/schedule/jobDetail',
taskCount: "/schedule/getAllJobCount", taskCount: '/schedule/getAllJobCount',
addSateNo: "/noradId/add", addSateNo: '/noradId/add',
getSateIdList: "/noradId/list", getSateIdList: '/noradId/list',
deleteSateNoList: "/noradId/delete", deleteSateNoList: '/noradId/delete',
addSateNoList: "/noradId/batchAdd", addSateNoList: '/noradId/batchAdd'
} as const; } as const
// 爬虫数据相关接口 // 爬虫数据相关接口
export const spiderDataApi = { export const spiderDataApi = {
dsnList: "/dsn/list", dsnList: '/dsn/list',
dsnDetail: "/dsn/detail", dsnDetail: '/dsn/detail',
dsnDataDelete: "/dsn/delete", dsnDataDelete: '/dsn/delete',
ituList: "/itu/list", ituList: '/itu/list',
ituDetail: "/itu/detail", ituDetail: '/itu/detail',
ituDataDelete: "/itu/delete", ituDataDelete: '/itu/delete',
stList: "/spaceTrack/list", stList: '/spaceTrack/list',
stDetail: "/spaceTrack/detail", stDetail: '/spaceTrack/detail',
stDataDelete: "/sspaceTrackt/delete", stDataDelete: '/sspaceTrackt/delete',
exportSpiderData: "/export/downloadFile", exportSpiderData: '/export/downloadFile',
esaList: "/esa/list", esaList: '/esa/list',
esaMissionDetail: "/esa/missionDetail", esaMissionDetail: '/esa/missionDetail',
esaStationDetail: "/esa/stationDetail", esaStationDetail: '/esa/stationDetail',
exportRecordList: "/exportRecord/list", exportRecordList: '/exportRecord/list'
} as const; } as const
// 爬虫数据相关接口 // 爬虫数据相关接口
export const dataApi = { export const dataApi = {
dataStatistics: "/statistic/dataStatistics", dataStatistics: '/statistic/dataStatistics',
taskStatistics: "/statistic/taskStatistics", taskStatistics: '/statistic/taskStatistics',
performanceStatistics: "/statistic/performanceStatistics", performanceStatistics: '/statistic/performanceStatistics',
allSpiderTaskStatistics: "/statistic/getAllTaskStatistics", allSpiderTaskStatistics: '/statistic/getAllTaskStatistics'
} as const; } as const
...@@ -95,3 +95,4 @@ export function getSateIdList() { ...@@ -95,3 +95,4 @@ export function getSateIdList() {
method: POST, method: POST,
}) as unknown as Promise<ApiResponse>; }) as unknown as Promise<ApiResponse>;
} }
import { request, POST } from '@/utils/request' import { request, POST } from '@/utils/request'
import type { ApiResponse, UserQueryParams } from '@/utils/request' import type { ApiResponse, UserQueryParams } from '@/utils/request'
import { authApi,userApi } from './apiPaths' import { authApi, userApi } from './apiPaths'
// 用户登录 // 用户登录
export function login(data: { username: string, password: string }): Promise<ApiResponse> { export function login(data: { username: string; password: string }): Promise<ApiResponse> {
return request({ return request({
url: authApi.login, url: authApi.login,
method: POST, method: POST,
...@@ -13,7 +13,7 @@ export function login(data: { username: string, password: string }): Promise<Api ...@@ -13,7 +13,7 @@ export function login(data: { username: string, password: string }): Promise<Api
// 获取用户信息 // 获取用户信息
export function getInfo() { export function getInfo() {
return new Promise(resolve => { return new Promise((resolve) => {
resolve({ resolve({
data: { data: {
roles: ['admin'], roles: ['admin'],
...@@ -77,3 +77,19 @@ export function batchDeleteUser(data: UserQueryParams) { ...@@ -77,3 +77,19 @@ export function batchDeleteUser(data: UserQueryParams) {
data data
}) as unknown as Promise<ApiResponse> }) as unknown as Promise<ApiResponse>
} }
// 查询用户角色
export function getUserRole() {
return request({
url: userApi.getUserRole,
method: POST
}) as unknown as Promise<ApiResponse>
}
//用户角色枚举
export const UserRole = {
ADMIN: 1,
NORMAL_USER: 0
} as const
export type UserRole = (typeof UserRole)[keyof typeof UserRole]
...@@ -26,19 +26,31 @@ ...@@ -26,19 +26,31 @@
<el-table-column property="nickname" label="用户名称" show-overflow-tooltip /> <el-table-column property="nickname" label="用户名称" show-overflow-tooltip />
<el-table-column property="role" label="用户角色" show-overflow-tooltip> <el-table-column property="role" label="用户角色" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ scope.row.role == 1 ? "管理员" : "普通用户" }} {{ scope.row.role == 1 ? '管理员' : '普通用户' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="status" label="用户状态" show-overflow-tooltip> <el-table-column property="status" label="用户状态" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ scope.row.status ? "启用" : "停用" }} {{ scope.row.status ? '启用' : '停用' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="create_time" label="创建时间" width="280" show-overflow-tooltip /> <el-table-column property="create_time" label="创建时间" width="280" show-overflow-tooltip />
<el-table-column label="操作" width="220"> <el-table-column label="操作" width="220">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" plain @click="handleEdit(scope.row)" id="editUser"> 编辑 </el-button> <el-button
<el-button link type="danger" plain @click="handleDelete(scope.row)"> 删除 </el-button> link
type="primary"
plain
@click="handleEdit(scope.row)"
id="editUser"
v-if="uRole === UserRole.ADMIN"
>
编辑
</el-button>
<el-button link type="danger" plain @click="handleDelete(scope.row)" v-if="uRole === UserRole.ADMIN">
删除
</el-button>
<el-button type="danger" plain disabled v-if="uRole === UserRole.NORMAL_USER">无操作权限</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -76,92 +88,101 @@ ...@@ -76,92 +88,101 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from "vue"; import { ref, onMounted } from 'vue'
import Pagination from "@/components/pagination/index.vue"; import Pagination from '@/components/pagination/index.vue'
import deleteDialog from "@/components/Delete/index.vue"; import deleteDialog from '@/components/Delete/index.vue'
import addUserDialog from "./components/addUserDialog.vue"; import addUserDialog from './components/addUserDialog.vue'
import { getUserList } from "@/api/user.ts"; import { getUserList, getUserRole, UserRole } from '@/api/user.ts'
import { DeleteMode } from "@/components/Delete/enum.ts"; import { DeleteMode } from '@/components/Delete/enum.ts'
import { AddMode } from "./components/enum.ts"; import { AddMode } from './components/enum.ts'
import { ElMessage } from "element-plus"; import { ElMessage } from 'element-plus'
import MenuTitle from "@/components/MenuTitle.vue"; import MenuTitle from '@/components/MenuTitle.vue'
const userId = ref<number>(-1); const userId = ref<number>(-1)
const userIds = ref<number[]>([]); const userIds = ref<number[]>([])
const nickName = ref<string>(""); const nickName = ref<string>('')
const userName = ref<string>(""); const userName = ref<string>('')
const userRole = ref<number>(0); const userRole = ref<number>(0)
const userStatus = ref<boolean>(true); const userStatus = ref<boolean>(true)
const userPassword = ref<string>(""); const userPassword = ref<string>('')
const showDeleteDialog = ref(false); const showDeleteDialog = ref(false)
const deleteMode = ref<DeleteMode>(DeleteMode.SINGLE_DELETE); const deleteMode = ref<DeleteMode>(DeleteMode.SINGLE_DELETE)
const dialogVisible = ref<boolean>(false); const dialogVisible = ref<boolean>(false)
const mode = ref<AddMode>(AddMode.ADD_MODE); const mode = ref<AddMode>(AddMode.ADD_MODE)
const tableData = ref([]); const tableData = ref([])
const pageObj = ref({ const pageObj = ref({
total: 0, total: 0,
pageSize: 10, pageSize: 10,
pageNo: 1, pageNo: 1
}); })
// 编辑用户信息的方法 // 编辑用户信息的方法
const handleEdit = async (row: any) => { const handleEdit = async (row: any) => {
mode.value = AddMode.UPDATE_MODE; mode.value = AddMode.UPDATE_MODE
nickName.value = row.nickname; nickName.value = row.nickname
userName.value = row.username; userName.value = row.username
userRole.value = row.role; userRole.value = row.role
userStatus.value = row.status; userStatus.value = row.status
userPassword.value = row.password; userPassword.value = row.password
dialogVisible.value = true; dialogVisible.value = true
userId.value = row.id; userId.value = row.id
}; }
// 弹窗关闭的方法 // 弹窗关闭的方法
const handleDelete = async (row: any) => { const handleDelete = async (row: any) => {
showDeleteDialog.value = true; showDeleteDialog.value = true
deleteMode.value = DeleteMode.SINGLE_DELETE; deleteMode.value = DeleteMode.SINGLE_DELETE
userId.value = row.id; userId.value = row.id
}; }
// 批量删除用户的方法 // 批量删除用户的方法
const handleBatchDelete = async () => { const handleBatchDelete = async () => {
if (!userIds.value || userIds.value.length === 0) { if (!userIds.value || userIds.value.length === 0) {
ElMessage({ ElMessage({
message: "请先选择要删除的用户", message: '请先选择要删除的用户',
type: "warning", type: 'warning'
}); })
return; return
} else { } else {
deleteMode.value = DeleteMode.BATCH_DELETE; deleteMode.value = DeleteMode.BATCH_DELETE
showDeleteDialog.value = true; showDeleteDialog.value = true
} }
}; }
// 多选框改变后的方法 // 多选框改变后的方法
const handleSelectionChange = (data: any) => { const handleSelectionChange = (data: any) => {
let array = []; let array = []
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
array.push(data[i].id); array.push(data[i].id)
} }
userIds.value = array; userIds.value = array
}; }
const openAddUserDialog = () => { const openAddUserDialog = () => {
mode.value = AddMode.ADD_MODE; mode.value = AddMode.ADD_MODE
dialogVisible.value = true; dialogVisible.value = true
}; }
const tableLoading = ref(false); const tableLoading = ref(false)
// 获取用户列表数据的方法 // 获取用户列表数据的方法
const getUserListData = async () => { const getUserListData = async () => {
tableLoading.value = true; tableLoading.value = true
const userList = await getUserList({ const userList = await getUserList({
page: pageObj.value.pageNo, page: pageObj.value.pageNo,
size: pageObj.value.pageSize, size: pageObj.value.pageSize
}); })
tableLoading.value = false; tableLoading.value = false
tableData.value = userList.data.list; tableData.value = userList.data.list
pageObj.value.total = userList.data.total; pageObj.value.total = userList.data.total
}; }
const uRole = ref<UserRole>(UserRole.NORMAL_USER)
// 查询用户角色
const getURole = async () => {
const res = await getUserRole()
uRole.value = res.data
}
onMounted(async () => { onMounted(async () => {
getUserListData(); await getURole()
}); getUserListData()
})
</script> </script>
<style scoped> <style scoped>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment