角色管理模块删除接口对接

This commit is contained in:
余菲 2022-05-26 14:57:01 +08:00
parent f13c7e862f
commit 2523c48806
8 changed files with 415 additions and 73 deletions

View File

@ -53,7 +53,7 @@ export function editDept(data) {
*/ */
export function deleteDept(id) { export function deleteDept(id) {
return request({ return request({
url: `/dept/delete${[id]}`, url: `/dept/delete/${id}`,
method: 'DELETE' method: 'DELETE'
}) })
} }

View File

@ -53,7 +53,7 @@ export function editMenu(data) {
*/ */
export function deleteMenu(id) { export function deleteMenu(id) {
return request({ return request({
url: `/menu/delete${[id]}`, url: `/menu/delete/${id}`,
method: 'DELETE' method: 'DELETE'
}) })
} }

View File

@ -63,9 +63,9 @@ export function setRoleStatus(data) {
* 删除角色 * 删除角色
* params * params
*/ */
export function deleteRole(id) { export function deleteRole(data) {
return request({ return request({
url: `/role/delete${[id]}`, url: `/role/delete/${data}`,
method: 'DELETE' method: 'DELETE'
}) })
} }

View File

@ -0,0 +1,250 @@
<template>
<Modal
:options="getModalOptions"
:on-positive-click="handleConfirm"
:on-negative-click="handleClose"
:on-close="handleClose"
>
<template #Context>
<n-form
ref="formRef"
:model="form"
label-placement="left"
:rules="rules"
:on-positive-click="handleConfirm"
:on-negative-click="handleClose"
>
<n-form-item
label="头像:"
path="avatar"
>
<uploadImage
:options="{
max:1,
action: '/upload/uploadImage/demo',
}"
size="2"
/>
</n-form-item>
<n-form-item label="用户编号:" path="code">
<n-input
v-model:value="form.code"
clearable
:maxlength="20"
placeholder="请输入用户编号"
/>
</n-form-item>
<n-form-item label="用户账号:" path="username">
<n-input
v-model:value="form.username"
clearable
:maxlength="20"
placeholder="请输入用户账号"
/>
</n-form-item>
<n-form-item
label="登录密码:"
path="password"
>
<n-input
v-model:value="form.password"
type="password"
:maxlength="20"
placeholder="请输入登录密码"
/>
</n-form-item>
<n-form-item label="用户姓名:" path="realname">
<n-input
v-model:value="form.realname"
clearable
:maxlength="20"
placeholder="请输入用户姓名"
/>
</n-form-item>
<n-form-item label="所属部门:" path="deptId">
<n-select
v-model:value="form.deptId"
:options="deptOptions"
placeholder="请选择所属部门"
/>
</n-form-item>
<n-form-item label="角色:" path="roleIds">
<n-select
v-model:value="form.roleIds"
clearable
:multiple="true"
:options="rolesOptions"
placeholder="请选择角色"
/>
</n-form-item>
<n-form-item label="状态" path="status">
<n-radio-group
v-model:value="form.status"
>
<n-radio :value="1">正常</n-radio>
<n-radio :value="2">禁用</n-radio>
</n-radio-group>
</n-form-item>
<n-form-item
label="备注:"
>
<n-input
v-model:value="form.note"
type="textarea"
:rows="3"
:maxlength="200"
placeholder="请输入备注"
/>
</n-form-item>
</n-form>
</template>
</Modal>
</template>
<script>
import { defineComponent, computed, onMounted, reactive, toRefs } from 'vue'
import Modal from '@/components/Modal/index.vue'
import uploadImage from '@/components/ImgUpload/index.vue'
import { getDeptAll } from '@/api/system/dept/index'
import { getRoleAll } from '@/api/system/role/index'
import { addUser, editUser } from '@/api/system/user/index'
import { dataToSelect } from '@/utils/handleData.js'
export default defineComponent({
name: 'UserModal',
components: { Modal, uploadImage },
props: {
visible: {
type: Boolean,
default: false
},
row: {
type: Object,
default: () => {}
}
},
emits: {
'update:visible': null,
'done': null
},
setup(props, { emit }) {
const data = reactive({
form: {
avatar: '/images/user/20211011/20211011151447698.jpg',
code: '',
deptId: null,
username: '',
realname: '',
password: '',
roleIds: [],
status: 1,
note: ''
},
deptOptions: [],
rolesOptions: []
})
const getModalOptions = computed(() => {
return {
title: Object.keys(props.row).length === 0 ? '添加用户' : '编辑用户',
show: props.visible,
form: Object.assign(data.form, props.row),
negativeText: '取消',
positiveText: '确认'
}
})
/* 关闭弹窗 */
const handleClose = () => {
emit('update:visible', false)
}
//
async function getDeptOptions() {
const res = await getDeptAll()
data.deptOptions = dataToSelect(res.data, { label: 'name', value: 'id' })
}
//
async function getRoleOptions() {
const res = await getRoleAll()
data.rolesOptions = dataToSelect(res.data, { label: 'name', value: 'id' })
}
onMounted(() => {
getDeptOptions()
getRoleOptions()
})
//
const handleUpload = ({ file }) => {
console.log(file)
// data.form.avatar = file.url
}
return {
getModalOptions,
handleClose,
...toRefs(data),
rules: reactive({
avatar: [
{ required: true, message: '请选择头像', type: 'string', trigger: 'blur' }
],
code: [
{ required: true, message: '请输入编号', trigger: 'blur' }
],
realname: [
{ required: true, message: '请输入用户姓名', type: 'string', trigger: 'blur' }
],
deptId: [
{ required: true, message: '请选择部门', type: 'number', trigger: 'blur' }
],
status: [
{ required: true, message: '请选择状态', type: 'number', trigger: 'blur' }
],
roleIds: [
{ required: true, message: '请选择角色', type: 'array', trigger: 'blur' }
],
username: [
{ required: true, message: '请输入用户账号', type: 'string', trigger: 'blur' }
]
}),
handleUpload
}
},
methods: {
//
handleConfirm() {
const type = Object.keys(this.row).length === 0 ? 'add' : 'edit'
this.$refs.formRef.validate((errors) => {
if (!errors) {
if (type === 'add') {
addUser(this.form).then(res => {
if (res.code === 0) {
this.handleClose()
this.$emit('done')
$message.success(res.msg)
} else {
$message.error(res.msg)
}
}).catch(e => {
console.log(e)
})
} else if (type === 'edit') {
editUser(this.form).then(res => {
if (res.code === 0) {
this.handleClose()
this.$emit('done')
$message.success(res.msg)
} else {
$message.error(res.msg)
}
})
}
}
})
}
}
})
</script>
<style scoped lang='scss'>
</style>

View File

@ -1,45 +1,72 @@
<template> <template>
<div> <div>
<n-card> <n-card>
<headSearch :info="data.info" @search="handleSearch" /> <headSearch :info="info" @search="handleSearch" />
<data-table <data-table
ref="tableRef" ref="tableRef"
:columns="data.columns" :columns="columns"
:row-key="(row) => row.id" :row-key="(row) => row.id"
:request="loadDataTable" :request="loadDataTable"
size="large" size="large"
scroll-x="1200" scroll-x="1200"
@update:checked-row-keys="handleCheck"
> >
<template #tableTitle> <template #tableTitle>
<n-button type="primary"> <n-button type="primary" @click="handleModal"> 新建 </n-button>
新建 <n-popconfirm
</n-button> negative-text="取消"
<n-button type="primary"> positive-text="确认"
删除 @positive-click="deleteComplex"
</n-button> >
<template #trigger>
<n-button type="primary">删除</n-button>
</template>
确定删除选中的数据吗?
</n-popconfirm>
</template> </template>
</data-table> </data-table>
</n-card> </n-card>
</div> </div>
<!-- 新增编辑弹窗 -->
<role-modal
v-if="modalShow"
v-model:visible="modalShow"
:row="rowData"
@done="handleSearch"
/>
</template> </template>
<script> <script>
import headSearch from '@/components/Search/index.vue' import headSearch from '@/components/Search/index.vue'
import dataTable from '@/components/DataTable/index.vue' import dataTable from '@/components/DataTable/index.vue'
import TableAction from '@/components/DataTable/tools/Action.vue' import TableAction from '@/components/DataTable/tools/Action.vue'
import { getRoleList } from '@/api/system/role/index' import { getRoleList, deleteRole } from '@/api/system/role/index'
import { h, ref, unref } from 'vue' import { h, ref, unref, toRefs, reactive } from 'vue'
import { reactive } from 'vue' import { NSwitch } from 'naive-ui'
import table from './table.js' import table from './table.js'
import info from './info.js' import info from './info.js'
import RoleModal from './components/RoleModal.vue'
export default { export default {
name: 'MenuPage', name: 'MenuPage',
components: { headSearch, dataTable }, components: { headSearch, dataTable, RoleModal },
setup() { setup() {
const data = reactive({ const data = reactive({
columns: [ columns: [
...table.columns, ...table.columns,
{
title: '状态',
key: 'status',
align: 'center',
width: 100,
render(row) {
return h(NSwitch, {
data: row.status,
value: row.status === 1,
onChange: setStatus.bind(row)
})
}
},
{ {
title: '操作', title: '操作',
align: 'center', align: 'center',
@ -61,9 +88,11 @@ export default {
label: '删除', label: '删除',
type: 'popconfirm', type: 'popconfirm',
auth: 'basic_list', auth: 'basic_list',
tip: '确定删除这条数据吗?',
props: { props: {
negativeText: '取消', negativeText: '取消',
positiveText: '确认' positiveText: '确认',
onPositiveClick: deleteSingle.bind(null, row.id)
} }
} }
], ],
@ -101,10 +130,66 @@ export default {
return await getRoleList(_params) return await getRoleList(_params)
} }
return { data, tableRef, loadDataTable, handleSearch } //
} function handleModal() {
data.rowData = {}
data.modalShow = true
} }
//
const selectedIds = ref([])
function handleCheck(rowKeys) {
selectedIds.value = rowKeys
}
//
function deleteComplex() {
if (selectedIds.value.length) {
deleteData(selectedIds.value)
} else {
$message.warning('请至少选中一条数据')
}
}
//
function deleteSingle(id) {
deleteData([id])
}
//
function deleteData(data) {
deleteRole(data)
.then((res) => {
if (res.code === 0) {
handleSearch()
$message.success(res.msg)
} else {
$message.error(res.msg)
}
})
.catch((e) => {
console.log(e)
})
}
//
function setStatus(e, row) {
console.log(e, row, '状态+++++++++++++=')
}
return {
...toRefs(data),
tableRef,
loadDataTable,
handleSearch,
handleModal,
handleCheck,
selectedIds,
deleteSingle,
deleteComplex,
deleteData,
setStatus
}
}
}
</script> </script>
<style scoped lang='scss'> <style scoped lang='scss'>
.n-button + .n-button { .n-button + .n-button {

View File

@ -45,12 +45,6 @@ const data = {
align: 'center' align: 'center'
}, },
{
title: '状态',
key: 'status',
align: 'center',
width: 100
},
{ {
title: '部门', title: '部门',
key: 'deptName', key: 'deptName',

View File

@ -25,17 +25,6 @@
}" }"
size="2" size="2"
/> />
<!-- <n-upload
action="https://www.mocky.io/v2/5e4bafc63100007100d8b70f"
list-type="image-card"
/>
<n-modal
preset="card"
style="width: 600px"
title="头像"
>
<img :src="form.avatar" style="width: 100%">
</n-modal> -->
</n-form-item> </n-form-item>
<n-form-item label="用户编号:" path="code"> <n-form-item label="用户编号:" path="code">
<n-input <n-input
@ -233,9 +222,9 @@ export default defineComponent({
if (res.code === 0) { if (res.code === 0) {
this.handleClose() this.handleClose()
this.$emit('done') this.$emit('done')
$message.success(res.data.msg) $message.success(res.msg)
} else { } else {
$message.error(res.data.msg) $message.error(res.msg)
} }
}).catch(e => { }).catch(e => {
console.log(e) console.log(e)
@ -245,9 +234,9 @@ export default defineComponent({
if (res.code === 0) { if (res.code === 0) {
this.handleClose() this.handleClose()
this.$emit('done') this.$emit('done')
$message.success(res.data.msg) $message.success(res.msg)
} else { } else {
$message.error(res.data.msg) $message.error(res.msg)
} }
}) })
} }

View File

@ -1,26 +1,26 @@
<template> <template>
<div> <div>
<n-card> <n-card>
<headSearch :info="data.info" @search="handleSearch" /> <headSearch :info="info" @search="handleSearch" />
<data-table <data-table
ref="tableRef" ref="tableRef"
:columns="data.columns" :columns="columns"
:row-key="(row) => row.id" :row-key="(row) => row.id"
:request="loadDataTable" :request="loadDataTable"
size="large" size="large"
@update:checked-row-keys="handleCheck" @update:checked-row-keys="handleCheck"
> >
<template #tableTitle> <template #tableTitle>
<n-button type="primary" @click="handleUser"> 新建 </n-button> <n-button type="primary" @click="handleModal"> 新建 </n-button>
<n-popconfirm <n-popconfirm
negative-text="取消" negative-text="取消"
positive-text="确认" positive-text="确认"
@positive-click="deleteUsers('plural')" @positive-click="deleteComplex"
> >
<template #trigger> <template #trigger>
<n-button type="primary"> 删除 </n-button> <n-button type="primary"> 删除 </n-button>
</template> </template>
确认要删除选中数据吗 确认要删除选中数据吗?
</n-popconfirm> </n-popconfirm>
</template> </template>
</data-table> </data-table>
@ -28,8 +28,8 @@
</div> </div>
<!-- 新增编辑弹窗 --> <!-- 新增编辑弹窗 -->
<user-modal <user-modal
v-if="data.modalShow" v-if="modalShow"
v-model:visible="data.modalShow" v-model:visible="modalShow"
:row="rowData" :row="rowData"
@done="handleSearch" @done="handleSearch"
/> />
@ -41,11 +41,11 @@ import dataTable from '@/components/DataTable/index.vue'
import TableAction from '@/components/DataTable/tools/Action.vue' import TableAction from '@/components/DataTable/tools/Action.vue'
import TableImage from '@/components/DataTable/tools/Image.vue' import TableImage from '@/components/DataTable/tools/Image.vue'
import TableTags from '@/components/DataTable/tools/Tags.vue' import TableTags from '@/components/DataTable/tools/Tags.vue'
import { getUserList, deleteUser } from '@/api/system/user/index.js' import { getUserList, deleteUser, resetPassword } from '@/api/system/user/index.js'
import { h, unref, toRefs, ref } from 'vue' import { h, unref, toRefs, ref, reactive } from 'vue'
import { reactive } from 'vue'
import UserModal from './components/UserModal.vue' import UserModal from './components/UserModal.vue'
import info from './info.js' import info from './info.js'
import { NSwitch } from 'naive-ui'
export default { export default {
name: 'MenuPage', name: 'MenuPage',
components: { dataTable, UserModal, headSearch }, components: { dataTable, UserModal, headSearch },
@ -101,18 +101,10 @@ export default {
align: 'center', align: 'center',
width: 100, width: 100,
render(row) { render(row) {
return h(TableTags, { return h(NSwitch, {
data: row.status, data: row.status,
filters: [ value: row.status === 1,
{ onChange: setStatus.bind(row)
key: 1,
label: '启用'
},
{
key: 2,
label: '禁用'
}
]
}) })
} }
}, },
@ -150,10 +142,22 @@ export default {
}, },
auth: 'basic_list' auth: 'basic_list'
}, },
{
label: '重置密码',
type: 'popconfirm',
auth: 'basic_list',
tip: '确定要重置为123456吗?',
props: {
negativeText: '取消',
positiveText: '确认',
onPositiveClick: resetPsw.bind(null, row.id)
}
},
{ {
label: '删除', label: '删除',
type: 'popconfirm', type: 'popconfirm',
auth: 'basic_list', auth: 'basic_list',
tip: '确定删除这条数据吗?',
props: { props: {
negativeText: '取消', negativeText: '取消',
positiveText: '确认', positiveText: '确认',
@ -196,7 +200,7 @@ export default {
} }
// //
function handleUser() { function handleModal() {
data.rowData = {} data.rowData = {}
data.modalShow = true data.modalShow = true
} }
@ -206,8 +210,8 @@ export default {
function handleCheck(rowKeys) { function handleCheck(rowKeys) {
selectedIds.value = rowKeys selectedIds.value = rowKeys
} }
// //
function deleteUsers() { function deleteComplex() {
if (selectedIds.value.length) { if (selectedIds.value.length) {
deleteData(selectedIds.value) deleteData(selectedIds.value)
} else { } else {
@ -224,26 +228,46 @@ export default {
deleteUser(data).then((res) => { deleteUser(data).then((res) => {
if (res.code === 0) { if (res.code === 0) {
handleSearch() handleSearch()
$message.success(res.data.msg) $message.success(res.msg)
} else { } else {
$message.error(res.data.msg) $message.error(res.msg)
} }
}).catch(e => { }).catch(e => {
console.log(e) console.log(e)
}) })
} }
//
function resetPsw(id) {
resetPassword({ id }).then(res => {
if (res.code === 0) {
handleSearch()
$message.success(res.msg)
} else {
$message.error(res.msg)
}
}).catch(e => {
console.log(e)
})
}
//
function setStatus(e, row) {
console.log(e, row, '状态+++++++++++++=')
}
return { return {
data, data,
loadDataTable, loadDataTable,
handleUser, handleModal,
...toRefs(data), ...toRefs(data),
tableRef, tableRef,
handleSearch, handleSearch,
deleteUsers,
handleCheck,
selectedIds, selectedIds,
deleteData deleteComplex,
handleCheck,
deleteData,
setStatus
} }
}, },
methods: { methods: {