添加用户接口联调

This commit is contained in:
余菲 2022-05-25 14:38:40 +08:00
parent 32be584c98
commit 0159932ab2
5 changed files with 142 additions and 135 deletions

View File

@ -12,6 +12,7 @@
<script setup> <script setup>
import themeOverrides from '@/utils/ui/theme.js' import themeOverrides from '@/utils/ui/theme.js'
import LoadingBar from '@/components/LoadingBar/index.vue' import LoadingBar from '@/components/LoadingBar/index.vue'
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@ -9,8 +9,8 @@
<n-card :bordered="false"> <n-card :bordered="false">
<slot name="Context" /> <slot name="Context" />
<n-space style="float: right"> <n-space style="float: right">
<n-button>取消</n-button> <n-button @click="handleClose">取消</n-button>
<n-button type="primary">确认</n-button> <n-button type="primary" @click="handleClick">确认</n-button>
</n-space> </n-space>
</n-card> </n-card>
</n-modal> </n-modal>
@ -28,7 +28,7 @@ export default defineComponent({
} }
}, },
emits: { emits: {
click: null, // click save: null, // click
onClose: (value) => { onClose: (value) => {
return value return value
} }
@ -41,7 +41,7 @@ export default defineComponent({
} }
}) })
const handleClick = function() { const handleClick = function() {
emit('click') emit('save')
} }
const handleClose = function() { const handleClose = function() {
emit('onClose', true) emit('onClose', true)

View File

@ -38,38 +38,19 @@
<script> <script>
import { userLogin, userCaptcha } from '@/api/login/index.js' import { userLogin, userCaptcha } from '@/api/login/index.js'
import { setToken } from '@/utils/token' import { setToken } from '@/utils/token'
import { ref, reactive, onMounted } from 'vue' import { ref, toRefs, reactive, onMounted } from 'vue'
export default { export default {
name: 'LoginPage', name: 'LoginPage',
setup() { setup() {
const loginForm = reactive({ const data = reactive({
loginForm: {
username: '', username: '',
password: '', password: '',
key: '', key: '',
captcha: '', captcha: '',
remember: false remember: false
}) },
onMounted(() => { rules: {
changeCode(loginForm)
})
//
const captcha = ref('')
async function changeCode(form) {
const params = {
username: form.username,
password: form.password,
captcha: form.captcha
}
const captForm = await userCaptcha(params)
captcha.value = captForm.data.captcha
loginForm.key = captForm.data.key
}
return {
loginForm,
captcha,
changeCode,
rules: reactive({
username: { username: {
required: true, required: true,
trigger: ['blur', 'input'], trigger: ['blur', 'input'],
@ -85,12 +66,33 @@ export default {
trigger: ['blur', 'input'], trigger: ['blur', 'input'],
message: '请输入验证码' message: '请输入验证码'
} }
}
}) })
onMounted(() => {
changeCode(data.loginForm)
})
//
const captcha = ref('')
async function changeCode(form) {
const params = {
username: form.username,
password: form.password,
captcha: form.captcha
}
const captForm = await userCaptcha(params)
captcha.value = captForm.data.captcha
data.loginForm.key = captForm.data.key
}
return {
...toRefs(data),
captcha,
changeCode
} }
}, },
methods: { methods: {
handleLogin() { handleLogin() {
console.log(this.loginForm)
userLogin(this.loginForm).then((res) => { userLogin(this.loginForm).then((res) => {
if (res.code === 0) { if (res.code === 0) {
// token // token

View File

@ -1,5 +1,5 @@
<template> <template>
<Modal :options="getModalOptions" @on-close="handleClose"> <Modal :options="getModalOptions" @on-close="handleClose" @save="submitForm">
<template #Context> <template #Context>
<n-form <n-form
ref="formRef" ref="formRef"
@ -31,13 +31,6 @@
placeholder="请输入用户编号" placeholder="请输入用户编号"
/> />
</n-form-item> </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="username"> <n-form-item label="用户账号:" path="username">
<n-input <n-input
v-model:value="form.username" v-model:value="form.username"
@ -57,6 +50,21 @@
placeholder="请输入登录密码" placeholder="请输入登录密码"
/> />
</n-form-item> </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-form-item label="角色:" path="roleIds">
<n-select <n-select
v-model:value="form.roleIds" v-model:value="form.roleIds"
@ -66,26 +74,6 @@
placeholder="请选择角色" placeholder="请选择角色"
/> />
</n-form-item> </n-form-item>
<n-form-item
v-if="form.type==2"
label="驾照类型:"
path="driverType"
>
<n-select
v-model:value="form.driverType"
clearable
:options="[1, 2]"
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="status"> <n-form-item label="状态" path="status">
<n-radio-group <n-radio-group
v-model:value="form.status" v-model:value="form.status"
@ -94,31 +82,8 @@
<n-radio :value="2">禁用</n-radio> <n-radio :value="2">禁用</n-radio>
</n-radio-group> </n-radio-group>
</n-form-item> </n-form-item>
<n-form-item label="用户类型" path="type">
<n-radio-group
v-model:value="form.type"
>
<n-radio :value="1">普通用户</n-radio>
<n-radio :value="2">飞手</n-radio>
</n-radio-group>
</n-form-item>
<n-form-item
v-if="form.type==2"
label="驾照编号:"
path="driverCode"
>
<n-input
v-model:value="form.driverCode"
clearable
:maxlength="20"
placeholder="请输入驾照编号"
/>
</n-form-item>
<n-form-item <n-form-item
label="备注:" label="备注:"
:label-col="{sm: {span: 3}, xs: {span: 6}}"
:wrapper-col="{sm: {span: 21}, xs: {span: 18}}"
> >
<n-input <n-input
v-model:value="form.note" v-model:value="form.note"
@ -138,6 +103,7 @@ import { defineComponent, computed, onMounted, reactive, toRefs } from 'vue'
import Modal from '@/components/CardModal/index.vue' import Modal from '@/components/CardModal/index.vue'
import { getDeptAll } from '@/api/system/dept/index' import { getDeptAll } from '@/api/system/dept/index'
import { getRoleAll } from '@/api/system/role/index' import { getRoleAll } from '@/api/system/role/index'
import { addUser, editUser } from '@/api/system/user/index'
import { dataToSelect } from '@/utils/handleData.js' import { dataToSelect } from '@/utils/handleData.js'
export default defineComponent({ export default defineComponent({
name: 'UserModal', name: 'UserModal',
@ -155,13 +121,30 @@ export default defineComponent({
emits: { emits: {
'update:visible': null, 'update:visible': null,
onClose: null, onClose: null,
done: null 'done': null
}, },
setup(props, { emit }) { 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(() => { const getModalOptions = computed(() => {
return { return {
title: Object.keys(props.row).length === 0 ? '添加用户' : '编辑用户', title: Object.keys(props.row).length === 0 ? '添加用户' : '编辑用户',
show: props.visible show: props.visible,
form: Object.assign(data.form, props.row)
} }
}) })
@ -170,37 +153,16 @@ export default defineComponent({
emit('update:visible', false) emit('update:visible', false)
} }
const form = reactive({
avatar: '',
code: '',
deptId: null,
username: '',
realname: '',
password: '',
roleIds: [],
driverType: null,
driverCode: '',
type: 1,
status: 1,
note: ''
})
const optionsList = reactive({
deptOptions: [],
rolesOptions: []
})
// //
async function getDeptOptions() { async function getDeptOptions() {
const res = await getDeptAll() const res = await getDeptAll()
optionsList.deptOptions = dataToSelect(res.data, { label: 'name', value: 'id' }) data.deptOptions = dataToSelect(res.data, { label: 'name', value: 'id' })
console.log('部门选项:', optionsList.deptOptions)
} }
// //
async function getRoleOptions() { async function getRoleOptions() {
const res = await getRoleAll() const res = await getRoleAll()
optionsList.rolesOptions = dataToSelect(res.data, { label: 'name', value: 'id' }) data.rolesOptions = dataToSelect(res.data, { label: 'name', value: 'id' })
} }
onMounted(() => { onMounted(() => {
@ -209,37 +171,79 @@ export default defineComponent({
}) })
// //
const handleUpload = ({ file, event }) => { const handleUpload = ({ file }) => {
console.log(event) console.log(file)
form.avatar = file.url // data.form.avatar = file.url
} }
return { return {
getModalOptions, getModalOptions,
handleClose, handleClose,
form, ...toRefs(data),
rules: reactive({ rules: reactive({
avatar: { avatar: [
required: true, { required: true, message: '请选择头像', type: 'string', trigger: 'blur' }
trigger: 'blur', ],
message: '请上传头像' code: [
}, { required: true, message: '请输入编号', trigger: 'blur' }
code: { ],
required: true, realname: [
trigger: ['blur', 'input'], { required: true, message: '请输入用户姓名', type: 'string', trigger: 'blur' }
message: '请输入用户编号' ],
}, deptId: [
deptId: { { required: true, message: '请选择部门', type: 'number', trigger: 'blur' }
required: true, ],
trigger: 'blur', status: [
message: '请选择部门' { required: true, message: '请选择状态', type: 'number', trigger: 'blur' }
} ],
roleIds: [
{ required: true, message: '请选择角色', type: 'array', trigger: 'blur' }
],
username: [
{ required: true, message: '请输入用户账号', type: 'string', trigger: 'blur' }
]
}), }),
handleUpload, handleUpload
...toRefs(optionsList)
} }
}, },
methods: { methods: {
//
submitForm() {
const type = Object.keys(this.row).length === 0 ? 'add' : 'edit'
// this.$refs.formRef.validate((errors) => {
// console.log(errors, '++++++++')
// })
console.log(this.form)
if (type === 'add') {
addUser(this.form).then(res => {
if (res.data.code === 0) {
// this.$message.success(res.data.msg)
this.updateVisible(false)
this.$emit('done')
} else {
console.log(res.data.msg)
// this.$message.error(res.data.msg)
}
}).catch(e => {
console.log(e)
})
} else if (type === 'edit') {
editUser(this.form).then(res => {
if (res.data.code === 0) {
// this.$message.success(res.data.msg)
this.updateVisible(false)
this.$emit('done')
} else {
// this.$message.error(res.data.msg)
}
})
}
},
/* 更新visible */
updateVisible(value) {
this.$emit('update:visible', value)
}
} }
}) })
</script> </script>

View File

@ -15,7 +15,7 @@
</n-card> </n-card>
</div> </div>
<!-- 新增编辑弹窗 --> <!-- 新增编辑弹窗 -->
<user-modal v-if="data.modalShow" v-model:visible="data.modalShow" :row="rowData" /> <user-modal v-if="data.modalShow" v-model:visible="data.modalShow" :row="rowData" @done="loadDataTable"/>
</template> </template>
<script> <script>
@ -147,12 +147,12 @@ export default {
// //
function play(row) { function play(row) {
modalData.rowData = row modalData.rowData = row
console.log('编辑弹窗内容:', row)
data.modalShow = true data.modalShow = true
} }
const params = reactive({ const params = reactive({
name: '' page: 1,
limit: 10
}) })
const loadDataTable = async(res) => { const loadDataTable = async(res) => {