Commit 23b74e93 by liucan

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

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