dev-cl
qsh 4 months ago
parent c91a2b608f
commit fc71e47903
  1. 36
      src/api/pers/attendancePlan.js
  2. 31
      src/api/pers/employee.js
  3. 5
      src/api/system/app/index.js
  4. 26
      src/api/system/library/index.js
  5. 26
      src/api/system/library/resource.js
  6. 2
      src/utils/index.ts
  7. 14
      src/views/Home/Salary/index.vue
  8. 74
      src/views/Pers/Employee/Comp/DialogEmployee.vue
  9. 32
      src/views/Pers/Employee/index.vue
  10. 39
      src/views/Pers/Setting/Comp/AttendancePlan.vue
  11. 86
      src/views/Pers/Setting/Comp/DialogPlan.vue

@ -0,0 +1,36 @@
import request from '@/config/axios'
// 创建
export const createPlan = (data) => {
return request.post({ url: '/admin-api/oa/attendance-setting/create', data, isSubmitForm: true })
}
// 修改
export const updatePlan = (data) => {
return request.put({ url: '/admin-api/oa/attendance-setting/update', data })
}
// 修改状态
export const updatePlanStatus = (data) => {
return request.put({ url: '/admin-api/oa/attendance-setting/status/update', data })
}
// 分页
export const getPlanPage = (params) => {
return request.get({ url: '/admin-api/oa/attendance-setting/page', params })
}
// 列表
export const getPlanSimpleList = (params) => {
return request.get({ url: '/admin-api/oa/attendance-setting/simple-list', params })
}
// 详情
export const getPlanDetail = (id) => {
return request.get({ url: '/admin-api/oa/attendance-setting/get', params: { id } })
}
// 删除
export const deletePlan = (id) => {
return request.delete({ url: '/admin-api/oa/attendance-setting/delete', params: { id } })
}

@ -0,0 +1,31 @@
import request from '@/config/axios'
// 创建
export const createEmployee = (data) => {
return request.post({ url: '/admin-api/oa/employee/create', data, isSubmitForm: true })
}
// 修改
export const updateEmployee = (data) => {
return request.put({ url: '/admin-api/oa/employee/update', data })
}
// 修改状态
export const updateEmployeeStatus = (data) => {
return request.put({ url: '/admin-api/oa/employee/status/update', data })
}
// 分页
export const getEmployeePage = (params) => {
return request.get({ url: '/admin-api/oa/employee/page', params })
}
// 详情
export const getEmployeeDetail = (id) => {
return request.get({ url: '/admin-api/oa/employee/get', params: { id } })
}
// 删除
export const deleteEmployee = (id) => {
return request.delete({ url: '/admin-api/oa/employee/delete', params: { id } })
}

@ -0,0 +1,5 @@
import request from '@/config/axios'
export const getSimpleAppList = async () => {
return await request.get({ url: '/admin-api/system/serviceInstance/simple-list' })
}

@ -1,26 +0,0 @@
import request from '@/config/axios'
// 查询知识库列表
export const getLibraryPage = (params) => {
return request.get({ url: '/admin-api/crm/knowledge-lib/page', params })
}
// 查询知识库详情
export const getLibrary = (id) => {
return request.get({ url: '/admin-api/crm/knowledge-lib/get?id=' + id })
}
// 新增知识库
export const createLibrary = (data) => {
return request.post({ url: '/admin-api/crm/knowledge-lib/create', data })
}
// 修改知识库
export const updateLibrary = (data) => {
return request.put({ url: '/admin-api/crm/knowledge-lib/update', data })
}
// 删除知识库
export const deleteLibrary = (id) => {
return request.delete({ url: '/admin-api/crm/knowledge-lib/delete?id=' + id })
}

@ -1,26 +0,0 @@
import request from '@/config/axios'
// 查询资源列表
export const getResourcePage = (params) => {
return request.get({ url: '/admin-api/crm/knowledge-lib-info/page', params })
}
// 查询资源详情
export const getResource = (id) => {
return request.get({ url: '/admin-api/crm/knowledge-lib-info/get?id=' + id })
}
// 新增资源
export const createResource = (data) => {
return request.post({ url: '/admin-api/crm/knowledge-lib-info/create', data })
}
// 修改资源
export const updateResource = (data) => {
return request.put({ url: '/admin-api/crm/knowledge-lib-info/update', data })
}
// 删除资源
export const deleteResource = (id) => {
return request.delete({ url: '/admin-api/crm/knowledge-lib-info/delete?id=' + id })
}

@ -213,7 +213,7 @@ export const fenToYuan = (amount: string | number): number => {
export const removeNullField = (obj: Object) => { export const removeNullField = (obj: Object) => {
for (const key in obj) { for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) { if (Object.prototype.hasOwnProperty.call(obj, key)) {
if (obj[key] == '') { if (obj[key] === '' || obj[key] === null || obj[key] === undefined) {
delete obj[key] delete obj[key]
} }
} }

@ -84,6 +84,19 @@
<span v-else> {{ row.jbgz }}</span> <span v-else> {{ row.jbgz }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="奖金" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jiangjin"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jiangjin }}</span>
</template>
</el-table-column>
<el-table-column label="满勤" min-width="90px"> <el-table-column label="满勤" min-width="90px">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number <el-input-number
@ -269,7 +282,6 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<DialogCreateSalary ref="createSalaryRef" @success="getList" /> <DialogCreateSalary ref="createSalaryRef" @success="getList" />
<DialogImportSalary ref="importSalaryRef" @success="getList" />
</div> </div>
</template> </template>

@ -9,8 +9,8 @@
> >
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="员工姓名" prop="nickname"> <el-form-item label="员工姓名" prop="name">
<el-input v-model="formData.nickname" placeholder="请输入员工姓名" /> <el-input v-model="formData.name" placeholder="请输入员工姓名" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -35,8 +35,8 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="职位" prop="job"> <el-form-item label="职位" prop="post">
<el-input v-model="formData.job" placeholder="请输入职位" /> <el-input v-model="formData.post" placeholder="请输入职位" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -54,36 +54,38 @@
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12" :offset="0"> <el-col :span="12" :offset="0">
<el-form-item label="考勤方案" prop="kaoqinfangan"> <el-form-item label="考勤方案" prop="attendanceSettingId">
<el-select <el-select
v-model="formData.kaoqinfangan" v-model="formData.attendanceSettingId"
placeholder="选择考勤方案" placeholder="选择考勤方案"
clearable clearable
filterable filterable
> >
<el-option <el-option
v-for="item in kaoqinfanganOptions" v-for="item in attendanceSettingIdOptions"
:key="item.value" :key="item.attendanceSettingId"
:label="item.label" :label="item.name"
:value="item.value" :disabled="item.status == 1"
:value="item.attendanceSettingId"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" :offset="0"> <el-col :span="12" :offset="0">
<el-form-item label="开通系统" prop="kaitongxitong"> <el-form-item label="开通系统" prop="instanceIds">
<el-select <el-select
v-model="formData.kaitongxitong" v-model="formData.instanceIds"
placeholder="选择考勤方案" placeholder="选择考勤方案"
multiple multiple
clearable clearable
filterable filterable
> >
<el-option <el-option
v-for="item in kaitongxitongOptions" v-for="item in instanceIdsOptions"
:key="item.value" :key="item.instanceId"
:label="item.label" :label="item.instanceName"
:value="item.value" :disabled="item.status == 1"
:value="item.instanceId"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -123,8 +125,10 @@
<script name="DialogEmployee" setup> <script name="DialogEmployee" setup>
import { CommonStatusEnum } from '@/utils/constants' import { CommonStatusEnum } from '@/utils/constants'
import { formatDate } from '@/utils/formatTime' import { formatDate } from '@/utils/formatTime'
import { getPlanSimpleList } from '@/api/pers/attendancePlan'
import { getSimpleAppList } from '@/api/system/app'
import * as UserApi from '@/api/system/user' import * as EmployeeApi from '@/api/pers/employee'
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
@ -134,8 +138,7 @@ const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref({
nickname: '', name: '',
deptId: '',
mobile: '', mobile: '',
email: '', email: '',
id: undefined, id: undefined,
@ -145,12 +148,12 @@ const formData = ref({
remark: '', remark: '',
status: CommonStatusEnum.ENABLE, status: CommonStatusEnum.ENABLE,
hireDate: '', hireDate: '',
kaoqinfangan: undefined, attendanceSettingId: undefined,
kaitongxitong: [] instanceIds: []
}) })
const formRules = ref({ const formRules = ref({
nickname: [{ required: true, message: '员工姓名不能为空', trigger: 'blur' }], name: [{ required: true, message: '员工姓名不能为空', trigger: 'blur' }],
job: { required: true, message: '职位不能为空', trigger: 'blur' }, post: { required: true, message: '职位不能为空', trigger: 'blur' },
email: [ email: [
{ {
type: 'email', type: 'email',
@ -161,8 +164,8 @@ const formRules = ref({
mobile: [{ required: true, message: '手机号不能为空', trigger: 'blur' }] mobile: [{ required: true, message: '手机号不能为空', trigger: 'blur' }]
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
const kaoqinfanganOptions = ref([]) const attendanceSettingIdOptions = ref([])
const kaitongxitongOptions = ref([]) const instanceIdsOptions = ref([])
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (type, id) => { const open = async (type, id) => {
@ -174,7 +177,7 @@ const open = async (type, id) => {
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {
formData.value = await UserApi.getUser(id) formData.value = await EmployeeApi.getEmployeeDetail(id)
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
@ -184,8 +187,12 @@ const open = async (type, id) => {
defineExpose({ open }) // open defineExpose({ open }) // open
function getOptions() { function getOptions() {
kaoqinfanganOptions.value = [] getSimpleAppList().then((data) => {
kaitongxitongOptions.value = [] instanceIdsOptions.value = data
})
getPlanSimpleList().then((data) => {
attendanceSettingIdOptions.value = data
})
} }
/** 提交表单 */ /** 提交表单 */
@ -200,10 +207,10 @@ const submitForm = async () => {
try { try {
const data = formData.value const data = formData.value
if (formType.value === 'create') { if (formType.value === 'create') {
await UserApi.createUser(data) await EmployeeApi.createEmployee(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))
} else { } else {
await UserApi.updateUser(data) await EmployeeApi.updateEmployee(data)
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
} }
dialogVisible.value = false dialogVisible.value = false
@ -217,8 +224,7 @@ const submitForm = async () => {
/** 重置表单 */ /** 重置表单 */
const resetForm = () => { const resetForm = () => {
formData.value = { formData.value = {
nickname: '', name: '',
deptId: '',
mobile: '', mobile: '',
email: '', email: '',
id: undefined, id: undefined,
@ -228,8 +234,8 @@ const resetForm = () => {
remark: '', remark: '',
status: CommonStatusEnum.ENABLE, status: CommonStatusEnum.ENABLE,
hireDate: formatDate(new Date(), 'YYYY-MM-DD'), hireDate: formatDate(new Date(), 'YYYY-MM-DD'),
kaoqinfangan: undefined, attendanceSettingId: undefined,
kaitongxitong: [] instanceIds: []
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }

@ -2,7 +2,7 @@
<div> <div>
<el-form :model="searchForm" inline> <el-form :model="searchForm" inline>
<el-form-item> <el-form-item>
<el-input v-model="searchForm.name" placeholder="请输入员工姓名" /> <el-input v-model="searchForm.name" placeholder="请输入员工姓名" clearable />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-radio-group v-model="searchForm.status"> <el-radio-group v-model="searchForm.status">
@ -25,11 +25,11 @@
<el-table v-loading="loading" :data="tableList" border stripe> <el-table v-loading="loading" :data="tableList" border stripe>
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50" />
<el-table-column label="用户姓名" prop="nickname" /> <el-table-column label="用户姓名" prop="name" />
<el-table-column label="职位" prop="job" /> <el-table-column label="职位" prop="post" />
<el-table-column label="手机号码" prop="mobile" width="120" /> <el-table-column label="手机号码" prop="mobile" width="120" />
<el-table-column label="考勤方案" /> <el-table-column label="考勤方案" prop="attendanceSettingName" />
<el-table-column label="已开通系统" /> <el-table-column label="已开通系统" prop="instanceName" />
<el-table-column label="在职状态" key="status" width="150"> <el-table-column label="在职状态" key="status" width="150">
<template #default="scope"> <template #default="scope">
<el-switch <el-switch
@ -74,6 +74,12 @@
<script name="OAEmployee" setup> <script name="OAEmployee" setup>
import DialogEmployee from './Comp/DialogEmployee.vue' import DialogEmployee from './Comp/DialogEmployee.vue'
import { removeNullField } from '@/utils'
import * as EmployeeApi from '@/api/pers/employee'
const message = useMessage() //
const { t } = useI18n() //
const searchForm = ref({ const searchForm = ref({
name: undefined, name: undefined,
status: 0, status: 0,
@ -98,10 +104,9 @@ const total = ref(0)
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
try { try {
tableList.value = [{ status: 0 }] const data = await EmployeeApi.getEmployeePage(removeNullField(searchForm.value))
// const data = await UserApi.getUserPage(queryParams) tableList.value = data.list
// tableList.value = data.list total.value = data.total
// total.value = data.total
} finally { } finally {
loading.value = false loading.value = false
} }
@ -118,12 +123,13 @@ const handleStatusChange = async (row) => {
try { try {
// //
const text = row.status === 0 ? '启用' : '停用' const text = row.status === 0 ? '启用' : '停用'
await message.confirm('确认要"' + text + '""' + row.nickname + '"用户吗?') await message.confirm('确认要"' + text + '""' + row.name + '"用户吗?')
// //
await UserApi.updateUserStatus(row.id, row.status) await EmployeeApi.updateEmployeeStatus({ id: row.id, status: row.status })
// //
await getList() await getList()
} catch { } catch (err) {
console.log(err)
// //
row.status = row.status === 0 ? 1 : 0 row.status = row.status === 0 ? 1 : 0
} }
@ -135,7 +141,7 @@ const handleDelete = async (id) => {
// //
await message.delConfirm() await message.delConfirm()
// //
await UserApi.deleteUser(id) await EmployeeApi.deleteEmployee(id)
message.success(t('common.delSuccess')) message.success(t('common.delSuccess'))
// //
await getList() await getList()

@ -2,7 +2,7 @@
<div> <div>
<el-form :model="searchForm" inline> <el-form :model="searchForm" inline>
<el-form-item> <el-form-item>
<el-input v-model="searchForm.name" placeholder="方案名称" /> <el-input v-model="searchForm.name" placeholder="方案名称" clearable />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-select v-model="searchForm.status" placeholder="启用状态" clearable filterable> <el-select v-model="searchForm.status" placeholder="启用状态" clearable filterable>
@ -31,7 +31,9 @@
<el-table-column label="操作" width="200"> <el-table-column label="操作" width="200">
<template #default="scope"> <template #default="scope">
<el-button type="primary" link @click="openForm('update', scope.row)"> 修改 </el-button> <el-button type="primary" link @click="openForm('update', scope.row)"> 修改 </el-button>
<el-button type="primary" link @click="handleDelete(scope.row.id)"> 删除 </el-button> <el-button type="primary" link @click="handleDelete(scope.row.attendanceSettingId)">
删除
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -48,6 +50,11 @@
<script name="PersSetting" setup> <script name="PersSetting" setup>
import DialogPlan from './DialogPlan.vue' import DialogPlan from './DialogPlan.vue'
import * as PlanApi from '@/api/pers/attendancePlan'
import { removeNullField } from '@/utils'
const message = useMessage() //
const { t } = useI18n() //
const searchForm = ref({ const searchForm = ref({
name: undefined, name: undefined,
status: undefined, status: undefined,
@ -72,10 +79,9 @@ const total = ref(0)
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
try { try {
tableList.value = [{ status: 0 }] const data = await PlanApi.getPlanPage(removeNullField(searchForm.value))
// const data = await UserApi.getUserPage(queryParams) tableList.value = data.list
// tableList.value = data.list total.value = data.total
// total.value = data.total
} finally { } finally {
loading.value = false loading.value = false
} }
@ -92,14 +98,31 @@ const handleStatusChange = async (row) => {
const text = row.status === 0 ? '启用' : '停用' const text = row.status === 0 ? '启用' : '停用'
await message.confirm('确认要"' + text + '""' + row.name + '"方案吗?') await message.confirm('确认要"' + text + '""' + row.name + '"方案吗?')
// //
// await UserApi.updateUserStatus(row.id, row.status) await PlanApi.updatePlanStatus({
attendanceSettingId: row.attendanceSettingId,
status: row.status
})
// //
await getList() await getList()
} catch { } catch (err) {
console.log(err)
// //
row.status = row.status === 0 ? 1 : 0 row.status = row.status === 0 ? 1 : 0
} }
} }
/** 删除按钮操作 */
const handleDelete = async (id) => {
try {
//
await message.delConfirm()
//
await PlanApi.deletePlan(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

@ -12,19 +12,18 @@
<el-table :data="form.planList" border stripe> <el-table :data="form.planList" border stripe>
<el-table-column label="年份" width="150px"> <el-table-column label="年份" width="150px">
<template #default="{ row }"> <template #default="{ row }">
<el-date-picker <el-input-number
v-model="row.year" v-model="row.year"
type="year" size="small"
placeholder="选择年份" :min="1"
format="YYYY" :controls="false"
value-format="YYYY" style="width: 100px"
style="width: 120px"
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
v-for="item in 12" v-for="item in 12"
:prop="item" :prop="item + ''"
:key="item" :key="item"
:label="item + '月'" :label="item + '月'"
width="140px" width="140px"
@ -32,7 +31,7 @@
<el-table-column label="应出勤"> <el-table-column label="应出勤">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number <el-input-number
v-model="row[item].yingchuqin" v-model="row[item + ''].shouldWorkDay"
size="small" size="small"
:min="1" :min="1"
:max="31" :max="31"
@ -44,7 +43,7 @@
<el-table-column label="带薪假"> <el-table-column label="带薪假">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number <el-input-number
v-model="row[item].daixinjia" v-model="row[item].paidLeaveDay"
size="small" size="small"
:min="0" :min="0"
:max="31" :max="31"
@ -71,6 +70,8 @@
</template> </template>
<script setup name="DialogAttendancePlan"> <script setup name="DialogAttendancePlan">
import * as PlanApi from '@/api/pers/attendancePlan'
const message = useMessage() // const message = useMessage() //
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
@ -84,11 +85,25 @@ const open = async (type, row) => {
dialogTitle.value = type == 'create' ? `新增方案` : '修改方案' dialogTitle.value = type == 'create' ? `新增方案` : '修改方案'
formType.value = type formType.value = type
resetForm() resetForm()
if (row?.attendanceSettingId) {
if (row?.id) {
formLoading.value = true formLoading.value = true
try { try {
// comissionForm.value = await UserApi.getUser(id) const data = await PlanApi.getPlanDetail(row.attendanceSettingId)
const list = data.attendancePeriodS.map((item) => {
item.monthSettings.map((it) => {
item[it.month + ''] = {
shouldWorkDay: it.shouldWorkDay,
paidLeaveDay: it.paidLeaveDay
}
})
item.year = item.year
delete item.monthSettings
return item
})
form.value = {
name: data.name,
planList: list
}
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
@ -110,18 +125,18 @@ function resetForm() {
function handleAddYearPlan() { function handleAddYearPlan() {
form.value.planList.push({ form.value.planList.push({
year: new Date().getFullYear(), year: new Date().getFullYear(),
1: { yingchuqin: undefined, daixinjia: undefined }, 1: { shouldWorkDay: undefined, paidLeaveDay: undefined },
2: { yingchuqin: undefined, daixinjia: undefined }, 2: { shouldWorkDay: undefined, paidLeaveDay: undefined },
3: { yingchuqin: undefined, daixinjia: undefined }, 3: { shouldWorkDay: undefined, paidLeaveDay: undefined },
4: { yingchuqin: undefined, daixinjia: undefined }, 4: { shouldWorkDay: undefined, paidLeaveDay: undefined },
5: { yingchuqin: undefined, daixinjia: undefined }, 5: { shouldWorkDay: undefined, paidLeaveDay: undefined },
6: { yingchuqin: undefined, daixinjia: undefined }, 6: { shouldWorkDay: undefined, paidLeaveDay: undefined },
7: { yingchuqin: undefined, daixinjia: undefined }, 7: { shouldWorkDay: undefined, paidLeaveDay: undefined },
8: { yingchuqin: undefined, daixinjia: undefined }, 8: { shouldWorkDay: undefined, paidLeaveDay: undefined },
9: { yingchuqin: undefined, daixinjia: undefined }, 9: { shouldWorkDay: undefined, paidLeaveDay: undefined },
10: { yingchuqin: undefined, daixinjia: undefined }, 10: { shouldWorkDay: undefined, paidLeaveDay: undefined },
11: { yingchuqin: undefined, daixinjia: undefined }, 11: { shouldWorkDay: undefined, paidLeaveDay: undefined },
12: { yingchuqin: undefined, daixinjia: undefined } 12: { shouldWorkDay: undefined, paidLeaveDay: undefined }
}) })
} }
@ -135,16 +150,35 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
const arr = form.value.planList.map((item) => {
const list = []
for (let i = 1; i <= 12; i++) {
list.push({
month: i,
...item[i + '']
})
}
return {
year: item.year,
monthSettings: list
}
})
const data = {
name: form.value.name,
attendancePeriodS: arr
}
if (formType.value === 'create') { if (formType.value === 'create') {
// await ClassApi.createClassType(data) await PlanApi.createPlan(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))
} else { } else {
// await ClassApi.updateClassType(data) await PlanApi.updatePlan(data)
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
} }
dialogVisible.value = false dialogVisible.value = false
// //
emit('success') emit('success')
} catch (err) {
console.log(err)
} finally { } finally {
formLoading.value = false formLoading.value = false
} }

Loading…
Cancel
Save