You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

361 lines
11 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<script setup>
/**
* name
* usersa0ChunLuyu
* date2022年12月25日 20:50:25
*/
import {
AdminDeleteAction,
AdminUpdateAction,
AdminEditPasswordAction,
AdminAuthSelectAction,
AdminCreateAction,
AdminListAction,
$response
} from '~/api'
import $router from '~/router'
import {onBeforeRouteUpdate} from "vue-router";
import {h} from "vue";
import {NTag} from 'naive-ui'
const default_page_options = {
page: 1,
status: 0,
search: ''
}
const page_options = ref(JSON.parse(JSON.stringify(default_page_options)))
onBeforeRouteUpdate((to) => {
routerChange(to.query)
})
const routerChange = (query) => {
page_options.value = {
page: Number(query.page) || default_page_options.page,
status: Number(query.status) || default_page_options.status,
search: query.search || default_page_options.search,
}
AdminList()
}
onMounted(() => {
routerChange($router.currentRoute.value.query)
AdminAuthSelect()
})
const admin_auth_select_list = ref([])
const admin_auth_loading = ref(false)
const AdminAuthSelect = async () => {
admin_auth_loading.value = true
const response = await AdminAuthSelectAction()
admin_auth_loading.value = false
$response(response, () => {
admin_auth_select_list.value = response.data.list
})
}
const admin_active = ref([])
const admin_list = ref([])
const admin_list_last_page = ref(0)
const AdminList = async () => {
const response = await AdminListAction(page_options.value)
$response(response, () => {
admin_list.value = response.data.data
admin_list_last_page.value = response.data.last_page
})
}
const admin_columns = [{
type: 'selection'
}, {
title: '昵称',
key: 'nickname'
}, {
title: '权限',
key: 'admin_auth_name',
render(row) {
return h(
'div',
{},
{
default: () => {
if (row.admin_auth_id === -1) return '超级管理员'
if (row.admin_auth_id === 0) return '无权限分组'
return !!row.admin_auth_name ? row.admin_auth_name : '异常权限组'
}
}
)
}
}, {
title: '状态',
key: 'status',
render(row) {
return h(
NTag,
{
type: row.status === 1 ? 'success' : 'error'
},
{
default: () => {
return row.status === 1 ? '可用' : '停用'
}
}
)
}
}]
const create_show = ref(false)
const create_data_default = {
nickname: '',
account: '',
password: '',
admin_auth_id: 0,
}
const create_data = ref(JSON.parse(JSON.stringify(create_data_default)))
const AdminCreate = async () => {
const response = await AdminCreateAction(create_data.value)
$response(response, () => {
window.$message().success(response.message)
create_show.value = false
create_data.value = JSON.parse(JSON.stringify(create_data_default))
AdminList()
})
}
const createShowClick = () => {
create_data.value = JSON.parse(JSON.stringify(create_data_default))
create_show.value = true
}
const searchClick = () => {
updatePage(1)
}
const updatePage = (page) => {
page_options.value.page = page
pagePush()
}
const pagePush = () => {
$router.push({
name: 'admin-list',
query: page_options.value
})
}
const update_show = ref(false)
const update_password_show = ref(false)
const update_data_default = {
id: 0,
nickname: '',
account_id: 0,
account: '',
password: '',
status: '',
admin_auth_id: 0,
}
const update_data = ref(JSON.parse(JSON.stringify(update_data_default)))
const updateShowClick = (type) => {
if (admin_active.value.length !== 1) return window.$message().error('请选择一个管理员')
update_data.value = JSON.parse(JSON.stringify(update_data_default))
for (let i = 0; i < admin_list.value.length; i++) {
if (admin_active.value[0] === admin_list.value[i].id) {
update_data.value = {
id: admin_list.value[i].id,
nickname: admin_list.value[i].nickname,
account_id: admin_list.value[i].account_id,
account: admin_list.value[i].account,
password: '',
status: admin_list.value[i].status,
admin_auth_id: admin_list.value[i].admin_auth_id,
}
type === 'info' ? update_show.value = true : update_password_show.value = true
return
}
}
}
const AdminUpdate = async () => {
const response = await AdminUpdateAction({
admin_id: update_data.value.id,
nickname: update_data.value.nickname,
status: update_data.value.status,
admin_auth_id: update_data.value.admin_auth_id,
})
$response(response, () => {
window.$message().success(response.message)
update_show.value = false
update_data.value = JSON.parse(JSON.stringify(update_data_default))
AdminList()
})
}
const AdminEditPassword = async () => {
const response = await AdminEditPasswordAction({
account_id: update_data.value.account_id,
password: update_data.value.password,
})
$response(response, () => {
window.$message().success(response.message)
update_password_show.value = false
update_data.value = JSON.parse(JSON.stringify(update_data_default))
AdminList()
})
}
const delete_show = ref(false)
const deleteShowClick = () => {
if (admin_active.value.length <= 0) return window.$message().error('请选择一个管理员')
delete_show.value = true
}
const AdminDelete = async () => {
const response = await AdminDeleteAction(admin_active.value)
$response(response, () => {
window.$message().success(response.message)
delete_show.value = false
admin_active.value = []
AdminList()
})
}
</script>
<template>
<div>
<n-modal v-model:show="delete_show" preset="card" :style="{width: '400px'}" title="删除确认" :auto-focus="false"
:bordered="false">
<div>
<n-space justify="center">
<n-button @click="AdminDelete()" type="info">确定</n-button>
<n-button @click="delete_show = false">取消</n-button>
</n-space>
</div>
</n-modal>
<n-modal v-model:show="update_password_show" preset="card" :style="{width: '500px'}" title="修改密码"
:auto-focus="false"
:bordered="false">
<div>
<n-space align="center">
<n-tag>
<div class="form_tag_wrapper">密码</div>
</n-tag>
<n-input class="form_input_wrapper" v-model:value="update_data.password"></n-input>
</n-space>
<n-button @click="AdminEditPassword()" type="info" mt-2>确定</n-button>
</div>
</n-modal>
<n-modal v-model:show="update_show" preset="card" :style="{width: '500px'}" title="修改信息" :auto-focus="false"
:bordered="false">
<div>
<n-space align="center">
<n-tag>
<div class="form_tag_wrapper">账号</div>
</n-tag>
<n-input disabled class="form_input_wrapper" v-model:value="update_data.account"></n-input>
</n-space>
<n-space mt-2 align="center">
<n-tag>
<div class="form_tag_wrapper">昵称</div>
</n-tag>
<n-input class="form_input_wrapper" v-model:value="update_data.nickname"></n-input>
</n-space>
<n-space mt-2 align="center">
<n-tag>
<div class="form_tag_wrapper">权限</div>
</n-tag>
<n-select class="form_input_wrapper" v-model:value="update_data.admin_auth_id" :options="[
update_data.admin_auth_id === -1 ? {value:-1,label:'超级管理员'}: {value:0,label:'暂不分配'},
...admin_auth_select_list
]"/>
<div>
<n-button @click="AdminAuthSelect()" :loading="admin_auth_loading" size="small" type="info">
<template #icon>
<n-icon>
<Icon type="refresh" :size="16"></Icon>
</n-icon>
</template>
刷新
</n-button>
</div>
</n-space>
<n-space mt-2 align="center">
<n-tag>
<div class="form_tag_wrapper">状态</div>
</n-tag>
<n-radio-group v-model:value="update_data.status" name="update_status_radio">
<n-space>
<n-radio :value="1">可用</n-radio>
<n-radio :value="2">停用</n-radio>
</n-space>
</n-radio-group>
</n-space>
<n-button @click="AdminUpdate()" type="info" mt-2>确定</n-button>
</div>
</n-modal>
<n-modal v-model:show="create_show" preset="card" :style="{width: '500px'}" title="新建" :auto-focus="false"
:bordered="false">
<div>
<n-space align="center">
<n-tag>
<div class="form_tag_wrapper">账号</div>
</n-tag>
<n-input class="form_input_wrapper" v-model:value="create_data.account"></n-input>
</n-space>
<n-space mt-2 align="center">
<n-tag>
<div class="form_tag_wrapper">昵称</div>
</n-tag>
<n-input class="form_input_wrapper" v-model:value="create_data.nickname"></n-input>
</n-space>
<n-space mt-2 align="center">
<n-tag>
<div class="form_tag_wrapper">密码</div>
</n-tag>
<n-input class="form_input_wrapper" v-model:value="create_data.password"></n-input>
</n-space>
<n-space mt-2 align="center">
<n-tag>
<div class="form_tag_wrapper">权限</div>
</n-tag>
<n-select class="form_input_wrapper" v-model:value="create_data.admin_auth_id" :options="[
{value:0,label:'暂不分配'},
...admin_auth_select_list
]"/>
<div>
<n-button @click="AdminAuthSelect()" :loading="admin_auth_loading" size="small" type="info">
<template #icon>
<n-icon>
<Icon type="refresh" :size="16"></Icon>
</n-icon>
</template>
刷新
</n-button>
</div>
</n-space>
<n-button @click="AdminCreate()" type="info" mt-2>确定</n-button>
</div>
</n-modal>
<n-card title="管理员列表">
<div>
<n-space align="center">
<n-tag>
<div class="form_tag_wrapper">昵称</div>
</n-tag>
<n-input class="form_input_wrapper" v-model:value="page_options.search"></n-input>
<n-tag>
<div class="form_tag_wrapper">状态</div>
</n-tag>
<n-radio-group v-model:value="page_options.status" name="status_radio">
<n-space>
<n-radio :value="0">全部</n-radio>
<n-radio :value="1">可用</n-radio>
<n-radio :value="2">停用</n-radio>
</n-space>
</n-radio-group>
<n-button @click="searchClick()" type="info">搜索</n-button>
</n-space>
<n-space mt-2>
<n-button @click="createShowClick()" type="success">新建</n-button>
<n-button @click="deleteShowClick()" type="error">删除</n-button>
<n-button @click="updateShowClick('info')" type="info">修改信息</n-button>
<n-button @click="updateShowClick('password')" type="info">修改密码</n-button>
</n-space>
<n-data-table mt-2 v-model:checked-row-keys="admin_active" :columns="admin_columns"
:row-key="row=>row.id" :data="admin_list"/>
<n-pagination v-if="admin_list_last_page > 1" @update:page="updatePage" mt-2 v-model:page="page_options.page"
:page-count="admin_list_last_page"/>
</div>
</n-card>
</div>
</template>
<style scoped>
</style>
<route>
{"meta":{"title":"管理员列表"}}
</route>