Commit b323f506 by yzh

feat:完成了创建用户,用户列表接口。

parent 5973f881
...@@ -69,3 +69,11 @@ export const statsApi = { ...@@ -69,3 +69,11 @@ export const statsApi = {
removeStats: '/statsCollection/delete', removeStats: '/statsCollection/delete',
clearAllStats: '/statsCollection/clearAll' // TODO 未实现 clearAllStats: '/statsCollection/clearAll' // TODO 未实现
} as const } as const
export const userApi = {
// 系统用户相关接口
userList: '/user/list',
addUser: '/user/insert',
updateUser: '/user/update',
deleteUser: '/user/delete',
} as const
\ No newline at end of file
import { request, POST } from '@/utils/request' import { request, POST } from '@/utils/request'
import type { ApiResponse, QueryParams } from '@/utils/request' import type { ApiResponse, UserQueryParams } from '@/utils/request'
import { authApi } 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> {
...@@ -32,3 +32,39 @@ export function logout(): Promise<ApiResponse> { ...@@ -32,3 +32,39 @@ export function logout(): Promise<ApiResponse> {
method: POST method: POST
}) as unknown as Promise<ApiResponse> }) as unknown as Promise<ApiResponse>
} }
// 获取用户列表
export function getUserList(data: UserQueryParams) {
return request({
url: userApi.userList,
method: POST,
data
}) as unknown as Promise<ApiResponse>
}
// 新建用户
export function addUser(data: UserQueryParams) {
return request({
url: userApi.addUser,
method: POST,
data
}) as unknown as Promise<ApiResponse>
}
// 更新用户
export function updateUser(data: UserQueryParams) {
return request({
url: userApi.updateUser,
method: POST,
data
}) as unknown as Promise<ApiResponse>
}
// 删除用户
export function deleteUser(data: UserQueryParams) {
return request({
url: userApi.deleteUser,
method: POST,
data
}) as unknown as Promise<ApiResponse>
}
\ No newline at end of file
...@@ -19,7 +19,7 @@ const routes = computed(() => { ...@@ -19,7 +19,7 @@ const routes = computed(() => {
const filterHiddenRoutes = (routes: RouteRecordRaw[]): RouteRecordRaw[] => { const filterHiddenRoutes = (routes: RouteRecordRaw[]): RouteRecordRaw[] => {
return routes.filter((route: any) => { return routes.filter((route: any) => {
console.log(route,'每一项'); // console.log(route,'每一项');
// 如果当前路由标记为 hidden,则过滤掉 // 如果当前路由标记为 hidden,则过滤掉
if (route.meta?.hidden || route.hidden) { if (route.meta?.hidden || route.hidden) {
return false; return false;
......
...@@ -98,3 +98,13 @@ export interface QueryParams { ...@@ -98,3 +98,13 @@ export interface QueryParams {
export const request = (config: RequestConfig) => { export const request = (config: RequestConfig) => {
return instance(config); return instance(config);
} }
export interface UserQueryParams {
page?: number
size?: number
username?: string
nickname?: string
password?: string
role?: number
status?: boolean
}
\ No newline at end of file
...@@ -91,7 +91,6 @@ const getData = () => { ...@@ -91,7 +91,6 @@ const getData = () => {
} }
onMounted(() => { onMounted(() => {
console.log('爬虫管理');
}) })
</script> </script>
......
...@@ -39,7 +39,6 @@ defineProps({ ...@@ -39,7 +39,6 @@ defineProps({
}) })
onMounted(() => { onMounted(() => {
console.log('状态监控');
}) })
</script> </script>
......
<template> <template>
<el-dialog v-model="currentVisible" :title="currentMode === '1' ? '新增用户' : '编辑用户'" width="610" center align-center <el-dialog v-model="currentVisible" :title="currentMode === '1' ? '新增用户' : '编辑用户'" width="610" center align-center
@close="handleClose" draggable> @close="handleClose" draggable>
<el-form :inline="true"> <div v-if="currentMode === '1'">
<el-form :inline="true" >
<el-form-item label="用户账号:"> <el-form-item label="用户账号:">
<el-input v-model="userAccount" /> <el-input v-model="addNickName" />
</el-form-item> </el-form-item>
<el-form-item label="用户名称:"> <el-form-item label="用户名称:" >
<el-input v-model="userName" /> <el-input v-model="addUserName" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="m-t-4" /> <div class="m-t-4" />
<el-form :inline="true"> <el-form :inline="true">
<el-form-item label="用户备注:"> <el-form-item label="用户状态:">
<el-input v-model="userRemark" /> <el-select v-model="userStatusValue" placeholder=" " style="width: 180px;">
<el-option v-for="item in userStatusOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="用户密码:"> <el-form-item label="用户密码:">
<el-input v-model="userPassword" /> <el-input v-model="userPassword" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="m-t-4" />
<el-form :inline="true">
<el-form-item label="用户角色:">
<el-select v-model="userRoleValue" placeholder=" " style="width: 180px;">
<el-option v-for="item in userRoleOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-form>
</div>
<div class="m-t-4"> <div class="m-t-4">
</div> </div>
<div v-if="currentMode === '2'">
<el-form :inline="true" v-if="currentMode === '2'">
<el-form-item label="用户名称:" >
<el-input v-model="addNickName" />
</el-form-item>
<el-form-item label="用户角色:">
<el-select v-model="userRoleValue" placeholder=" " style="width: 180px;">
<el-option v-for="item in userRoleOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-form>
<div class="m-t-4" />
<el-form :inline="true" v-if="currentMode === '2'">
<el-form-item label="用户状态:">
<el-select v-model="userStatusValue" placeholder=" " style="width: 180px;">
<el-option v-for="item in userStatusOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="用户密码:">
<el-input v-model="userPassword" />
</el-form-item>
</el-form>
</div>
<div class="m-t-4" />
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button @click="handleClose">取消</el-button> <el-button @click="handleClose">取消</el-button>
...@@ -35,7 +71,30 @@ ...@@ -35,7 +71,30 @@
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import { defineProps } from 'vue'; import { defineProps } from 'vue';
import { watch } from 'vue' import { watch } from 'vue'
import { getUserList, addUser, deleteUser, updateUser } from '@/api/user.ts'
const userStatusValue = ref(true)
const userRoleValue = ref(1)
const userStatusOptions = [
{
value: true,
label: '启用'
},
{
value: '0',
label: '停用'
}
]
const userRoleOptions = [
{
value: false,
label: '管理员'
},
{
value: '0',
label: '普通用户'
}
]
const props = defineProps({ const props = defineProps({
dialogVisible: { dialogVisible: {
type: Boolean, type: Boolean,
...@@ -45,7 +104,7 @@ const props = defineProps({ ...@@ -45,7 +104,7 @@ const props = defineProps({
type: String, type: String,
default: 'add' default: 'add'
}, },
userCount: { nickName: {
type: String, type: String,
default: '' default: ''
}, },
...@@ -53,22 +112,30 @@ const props = defineProps({ ...@@ -53,22 +112,30 @@ const props = defineProps({
type: String, type: String,
default: '' default: ''
}, },
userRemark: { id: {
type: String, type: Number,
default: false default: false
}, },
userPassword: { userPassword: {
type: String, type: String,
default: '' default: ''
},
userStatus: {
type: Boolean,
default: ''
},
userRole: {
type: Number,
default: ''
} }
}) })
// 向父组件传递dialog值 // 向父组件传递dialog值
const emit = defineEmits(['update:dialogVisible', 'confirm']) const emit = defineEmits(['update:dialogVisible', 'confirm','getUserList'])
// 组件的状态 // 组件的状态
const currentVisible = ref(props.dialogVisible) const currentVisible = ref(props.dialogVisible)
const currentMode = ref(props.mode) const currentMode = ref(props.mode)
const userAccount = ref('') const addNickName = ref('')
const userName = ref('') const addUserName = ref('')
const userRemark = ref('') const userRemark = ref('')
const userPassword = ref('') const userPassword = ref('')
...@@ -78,9 +145,17 @@ const handleClose = () => { ...@@ -78,9 +145,17 @@ const handleClose = () => {
currentVisible.value = false currentVisible.value = false
} }
// 确定的方法 // 确定的方法
const handleConfirm = () => { const handleConfirm = async () => {
if (currentMode.value === '1') { if (currentMode.value === '1') {
await addUser({
nickname: addNickName.value,
username: addUserName.value,
password: userPassword.value,
role: userRoleValue.value,
status: userStatusValue.value
})
console.log(addUserName.value);
emit('getUserList')
} else if (currentMode.value === '2') { } else if (currentMode.value === '2') {
} }
...@@ -100,12 +175,32 @@ watch(() => currentVisible.value, ...@@ -100,12 +175,32 @@ watch(() => currentVisible.value,
emit('update:dialogVisible', newVal) emit('update:dialogVisible', newVal)
} }
) )
watch(() => props.mode, watch(() => props.mode,
(newVal) => { (newVal) => {
currentMode.value = newVal currentMode.value = newVal
} }
) )
watch(
// 监听需要同步的 props 集合
[() => props.dialogVisible, () => props.mode, () => props.nickName, () => props.userPassword, () => props.userStatus, () => props.userRole],
// 任一值变化时执行
([newVisible, newMode, newNickName, newPwd, newStatus, newRole]) => {
if (newVisible && newMode === '2') {
addNickName.value = newNickName;
userPassword.value = newPwd;
userStatusValue.value = newStatus;
userRoleValue.value = newRole;
}
// 弹窗关闭时,清空表单
if (!newVisible) {
addNickName.value = '';
addUserName.value = '';
userPassword.value = '';
}
},
{ immediate: true }
);
</script> </script>
<style> <style>
...@@ -120,6 +215,17 @@ watch(() => props.mode, ...@@ -120,6 +215,17 @@ watch(() => props.mode,
.el-dialog__title { .el-dialog__title {
color: #ffffff; color: #ffffff;
} }
.el-input__inner{
color: #ffffff;
}
.el-select__wrapper{
background-color:#1d5484 ;
box-shadow: 0,0,0,0;
border: none;
.el-select__placeholder{
color: #ffffff;
}
}
} }
/* 修改表单样式 */ /* 修改表单样式 */
...@@ -129,3 +235,7 @@ watch(() => props.mode, ...@@ -129,3 +235,7 @@ watch(() => props.mode,
} }
} }
</style> </style>
<style>
</style>
\ No newline at end of file
...@@ -13,12 +13,12 @@ ...@@ -13,12 +13,12 @@
<el-table :data="tableData" style="width: 100%" border :header-cell-style="{ textAlign: 'center' }" <el-table :data="tableData" style="width: 100%" border :header-cell-style="{ textAlign: 'center' }"
:cell-style="{ textAlign: 'center' }" :row-style="{ height: '58px' }"> :cell-style="{ textAlign: 'center' }" :row-style="{ height: '58px' }">
<el-table-column type="selection" width="40" /> <el-table-column type="selection" width="40" />
<el-table-column property="number" label="序号" width="55" /> <el-table-column property="number" label="序号" width="55" type="index" />
<el-table-column property="userCount" label="用户账号" show-overflow-tooltip /> <el-table-column property="username" label="用户账号" show-overflow-tooltip />
<el-table-column property="userName" label="用户名称" show-overflow-tooltip /> <el-table-column property="nickname" label="用户名称" show-overflow-tooltip />
<el-table-column property="userRemark" label="备注" show-overflow-tooltip /> <!-- <el-table-column property="userRemark" label="备注" show-overflow-tooltip /> -->
<el-table-column property="userPassword" label="用户密码" show-overflow-tooltip /> <!-- <el-table-column property="userPassword" label="用户密码" show-overflow-tooltip /> -->
<el-table-column property="createTime" 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 type="primary" plain @click="handleEdit(scope.row)"> <el-button type="primary" plain @click="handleEdit(scope.row)">
...@@ -35,10 +35,10 @@ ...@@ -35,10 +35,10 @@
@pagination="getData" /> @pagination="getData" />
</div> </div>
<!-- 删除弹窗组件 --> <!-- 删除弹窗组件 -->
<deleteDialog v-model:dialogVisible="showDeleteDialog" @mode="deleteMode" /> <deleteDialog v-model:dialogVisible="showDeleteDialog" @mode="deleteMode" />
<!-- 创建用户弹窗组件 --> <!-- 创建用户弹窗组件 -->
<addUserDialog v-model:dialogVisible="dialogVisible" :mode="mode" :user-count="userCount" :user-name="userName" <addUserDialog v-model:dialogVisible="dialogVisible" :mode="mode" :nick-name="nickName" :user-name="userName" :id="userId"
:user-remark="userRemark" :user-password="userPassword" /> :user-role="userRole" :user-status="userStatus" :user-password="userPassword" @get-user-list="getUserListData" />
</div> </div>
</template> </template>
...@@ -47,73 +47,43 @@ import { ref, onMounted } from 'vue' ...@@ -47,73 +47,43 @@ 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, addUser, deleteUser, updateUser } from '@/api/user.ts'
const userCount = ref('') const userId = ref(0)
const nickName = ref('')
const userName = ref('') const userName = ref('')
const userRemark = ref('') const userRole = ref(0)
const userStatus = ref(true)
const userPassword = ref('') const userPassword = ref('')
const showDeleteDialog = ref(false) const showDeleteDialog = ref(false)
const deleteMode = ref('2') const deleteMode = ref('2')
const dialogVisible = ref(false) const dialogVisible = ref(false)
const mode = ref('1') const mode = ref('1')
const tableData = ref([ const tableData = ref()
{
number: '1',
userCount: 'admin',
userName: '管理员',
userRemark: '-',
userPassword: '123456',
createTime: '2025-01-01 00:00:00',
},
{
name: '1',
},
{
name: '1',
},
{
name: '1',
},
{
name: '1',
},
{
name: '1',
},
{
name: '1',
},
{
name: '1',
},
{
name: '1',
},
{
name: '1',
}
])
const pageObj = ref({ const pageObj = ref({
total: 10, total: 12,
pageSize: 10, pageSize: 10,
pageNo: 1 pageNo: 1
}) })
const handleEdit = (row: any) => { const handleEdit = async (row: any) => {
mode.value = '2' mode.value = '2'
// userCount.value = row.name nickName.value = row.nickname
// userName.value = row.name userName.value = row.username
// userRemark.value = row.name userRole.value = row.role
// userPassword.value = row.name userStatus.value = row.status
userPassword.value = row.password
dialogVisible.value = true dialogVisible.value = true
console.log(row); // console.log(row);
} }
const handleDelete = (row: any) => { const handleDelete = (row: any) => {
showDeleteDialog.value = true showDeleteDialog.value = true
} }
const getData = () => { const getData = (number: number) => {
console.log('getData'); // console.log('getData');
console.log(number);
} }
const handleDeleteConfirm = () => { const handleDeleteConfirm = () => {
...@@ -123,9 +93,17 @@ const openAddUserDialog = () => { ...@@ -123,9 +93,17 @@ const openAddUserDialog = () => {
mode.value = '1' mode.value = '1'
dialogVisible.value = true dialogVisible.value = true
} }
const getUserListData = async () => {
const userList = await getUserList({
page: 1,
size: 10
})
tableData.value = userList.data
console.log(tableData.value);
onMounted(() => { }
console.log('系统管理'); onMounted(async () => {
getUserListData()
}) })
</script> </script>
......
...@@ -96,7 +96,6 @@ const goToTaskInformation = () => { ...@@ -96,7 +96,6 @@ const goToTaskInformation = () => {
router.push({ path: '/osSpiderManager/list' }) router.push({ path: '/osSpiderManager/list' })
} }
onMounted(() => { onMounted(() => {
console.log('任务信息');
}) })
</script> </script>
......
...@@ -240,7 +240,6 @@ const getData = () => { ...@@ -240,7 +240,6 @@ const getData = () => {
} }
onMounted(() => { onMounted(() => {
console.log('任务执行记录');
}) })
</script> </script>
......
...@@ -30,7 +30,7 @@ export default defineConfig({ ...@@ -30,7 +30,7 @@ export default defineConfig({
proxy: { proxy: {
// 代理API请求,使用更精确的路径匹配 // 代理API请求,使用更精确的路径匹配
'/api': { '/api': {
target: 'http://127.0.0.1:5000/', target: 'http://192.168.0.200:5001/',
changeOrigin: true, changeOrigin: true,
}, },
} }
......
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