parent
a39f5672e9
commit
3e6289ab4d
@ -1,61 +0,0 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询列表
|
||||
export function listStaff(query) {
|
||||
return request({
|
||||
url: '/api/sys/staff/list/searchList',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// select
|
||||
export function select() {
|
||||
return request({
|
||||
url: '/api/sys/staff/list/teacherSelect',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询详细
|
||||
export function getStaff(staffId) {
|
||||
return request({
|
||||
url: '/api/sys/staff/info/detailById/' + staffId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增
|
||||
export function addStaff(data) {
|
||||
return request({
|
||||
url: '/api/sys/staff/add/addSysStaff',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改
|
||||
export function updateStaff(data) {
|
||||
return request({
|
||||
url: '/api/sys/staff/update/updateSysStaff',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除
|
||||
export function delStaff(teacherId) {
|
||||
return request({
|
||||
url: '/api/sys/staff/delete/deleteById/' + teacherId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 导出
|
||||
export function exportStaff(query) {
|
||||
return request({
|
||||
url: '/api/sys/staff/export',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
@ -1,423 +0,0 @@
|
||||
<!-- 添加员工 -->
|
||||
<template>
|
||||
<el-dialog :title="title" :visible.sync="open" width="700px">
|
||||
<el-form ref="form" v-loading="loadingChange" :model="form" :rules="rules" label-width="120px" class="add-form">
|
||||
<div class="title top">
|
||||
<div class="title-content">员工基本信息</div>
|
||||
</div>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="员工姓名:" prop="staffName">
|
||||
<el-input v-model="form.staffName" placeholder="请输入员工姓名" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="联系电话:" prop="phone">
|
||||
<el-input v-model="form.phone" placeholder="请输入联系电话" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="邮箱:" prop="emailAddress">
|
||||
<el-input v-model="form.emailAddress" placeholder="请输入邮箱" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="性别:" prop="sex">
|
||||
<el-select v-model="form.sex" placeholder="请选择性别">
|
||||
<el-option
|
||||
v-for="dict in sexOptions"
|
||||
:key="dict.dictValue"
|
||||
:label="dict.dictLabel"
|
||||
:value="dict.dictValue"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="入职日期:" prop="entryDate">
|
||||
<el-date-picker
|
||||
v-model="form.entryDate"
|
||||
clearable
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="选择入职日期"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="所属部门:" prop="deptId">
|
||||
<treeselect v-model="form.deptId" :options="deptOptions" placeholder="请选择归属部门" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="人事状态:" prop="personnelStatus">
|
||||
<el-select
|
||||
v-model="form.personnelStatus"
|
||||
filterable
|
||||
allow-create
|
||||
placeholder="选择人事状态:"
|
||||
clearable
|
||||
default-first-option
|
||||
>
|
||||
<el-option
|
||||
v-for="item in personnelStatusOptions"
|
||||
:key="item.dictValue"
|
||||
:label="item.dictLabel"
|
||||
:value="item.dictValue"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="任课教师:" class="align-left">
|
||||
<el-switch v-model="form.teacher" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="系统账号:" class="align-left">
|
||||
<el-switch v-model="form.loginUser" :disabled="form.userId !== undefined" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div class="title top">
|
||||
<div class="title-content">登录账号</div>
|
||||
</div>
|
||||
<el-row v-if="form.loginUser">
|
||||
<el-col :span="24">
|
||||
<el-form-item label="允许登录系统" prop="locked" class="align-left">
|
||||
<el-radio-group v-model="form.locked">
|
||||
<el-radio label="0">允许</el-radio>
|
||||
<el-radio label="1">不允许</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="登录账号" prop="username">
|
||||
<el-input v-model="form.username" :readonly="form.userId !== undefined" :disabled="form.userId !== undefined" placeholder="请输入用户名" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="密码" prop="password">
|
||||
<el-input v-if="form.userId === undefined" v-model="form.password" placeholder="请输入密码" show-password />
|
||||
<el-button v-else icon="el-icon-refresh" @click="handleResetPwd">重置密码</el-button>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-if="form.userId === undefined" :span="12">
|
||||
<el-form-item label="确认密码" prop="checkPass" show-password>
|
||||
<el-input v-model="form.checkPass" placeholder="请输入密码" show-password />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="角色">
|
||||
<el-tree
|
||||
ref="role"
|
||||
:data="roleOptions"
|
||||
show-checkbox
|
||||
node-key="id"
|
||||
default-expand-all
|
||||
:default-checked-keys="checkRoleIds"
|
||||
empty-text="加载中,请稍后"
|
||||
:props="defaultProps"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="所属校区:" prop="belongCampus" class="align-left">
|
||||
<el-radio-group v-model="form.belongCampus">
|
||||
<el-radio
|
||||
v-for="item in belongCampus"
|
||||
:key="item.id"
|
||||
:label="item.id"
|
||||
:value="item.id"
|
||||
>{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-if="form.belongCampus === 'part'" :span="24">
|
||||
<el-form-item label="选择校区:" prop="partCampus" class="align-left">
|
||||
<el-checkbox-group v-model="form.partCampus">
|
||||
<el-checkbox v-for="(item) in campusOptions" :key="item.id" :label="item.id" name="partCampus">{{ item.label }}</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row v-else>
|
||||
<el-col :span="24">
|
||||
暂未创建登录系统的账号,如需创建,请打开上方'系统账号'进行创建。
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" :loading="loadingChange" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script>
|
||||
import { addStaff, updateStaff } from '@/api/school/system/staff'
|
||||
import { checkUsernameUnique, resetUserPwd } from '@/api/school/system/user'
|
||||
import Treeselect from '@riophae/vue-treeselect'
|
||||
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
|
||||
import { campusList, campusSelect, treeSelect } from '@/api/school/system/dept'
|
||||
import { treeSelectLimitUserHasRole as roleTreeSelect } from '@/api/school/system/role/index'
|
||||
import { isUsername, isPass, isSerialNumber } from '@/utils/validate'
|
||||
export default {
|
||||
components: { Treeselect },
|
||||
data() {
|
||||
const validateUsernameUnique = (rule, value, callback) => {
|
||||
if (this.form.loginUser && this.form.userId === undefined) {
|
||||
checkUsernameUnique(value).then(response => {
|
||||
const unique = response.data
|
||||
if (!unique) {
|
||||
callback(new Error('该账号已被注册,请更换'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
})
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const validateSerialNumber = (rule, value, callback) => {
|
||||
if (!isSerialNumber(value)) {
|
||||
callback(new Error('请输入正确的手机号码'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
return {
|
||||
title: '',
|
||||
open: false,
|
||||
loadingChange: false,
|
||||
// 性别 数据字典
|
||||
sexOptions: [],
|
||||
// 人事状态
|
||||
personnelStatusOptions: [],
|
||||
// 所属部门
|
||||
deptOptions: [],
|
||||
// 用户角色
|
||||
roleOptions: undefined,
|
||||
defaultProps: {
|
||||
children: 'children',
|
||||
label: 'label'
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
baseRule: {
|
||||
staffName: [
|
||||
{ required: true, message: '员工姓名不能为空', trigger: 'blur' }
|
||||
],
|
||||
phone: [
|
||||
{ required: true, message: '联系电话不能为空', trigger: 'blur' },
|
||||
{ validator: validateSerialNumber, trigger: 'blur' }
|
||||
],
|
||||
emailAddress: [
|
||||
{ required: true, message: '邮箱不能为空', trigger: 'blur' }
|
||||
],
|
||||
sex: [
|
||||
{ required: true, message: '性别 不能为空', trigger: 'blur' }
|
||||
],
|
||||
entryDate: [
|
||||
{ required: true, message: '入职日期不能为空', trigger: 'blur' }
|
||||
],
|
||||
personnelStatus: [
|
||||
{ required: true, message: '请选择人事状态', trigger: 'blur' }
|
||||
]
|
||||
},
|
||||
checkRoleIds: [],
|
||||
validateUsernameUnique: validateUsernameUnique,
|
||||
campusOptions: [],
|
||||
belongCampus: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
rules() {
|
||||
const validatePass = (rule, value, callback) => {
|
||||
if (!this.form.loginUser) {
|
||||
callback()
|
||||
return
|
||||
}
|
||||
if (value === undefined || value === '') {
|
||||
callback(new Error('请输入密码'))
|
||||
} else if (!isPass(value)) {
|
||||
callback(new Error('最少6位,包含大小写字母和特殊字符'))
|
||||
} else {
|
||||
if (this.form.checkPass !== '' && this.form.checkPass !== undefined) {
|
||||
this.$refs.form.validateField('checkPass')
|
||||
}
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const validateCheckPass = (rule, value, callback) => {
|
||||
if (!this.form.loginUser) {
|
||||
callback()
|
||||
return
|
||||
}
|
||||
if (value === undefined || value === '') {
|
||||
callback(new Error('请再次输入密码'))
|
||||
} else if (value !== this.form.password) {
|
||||
callback(new Error('两次输入密码不一致!'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
const validateUsername = (rule, value, callback) => {
|
||||
if (!this.form.loginUser) {
|
||||
callback()
|
||||
return
|
||||
}
|
||||
if (value === undefined || value === '') {
|
||||
callback(new Error('请输入账号'))
|
||||
} else if (!isUsername(value)) {
|
||||
callback(new Error('4到16位(字母,数字,下划线)'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
if (this.form.userId === undefined && this.form.loginUser) {
|
||||
return Object.assign({}, this.baseRule, {
|
||||
locked: [
|
||||
{ required: true, message: '请选择是否允许登录系统', trigger: 'blur' }
|
||||
],
|
||||
username: [
|
||||
{ validator: validateUsername, trigger: 'blur' },
|
||||
{ validator: this.validateUsernameUnique, trigger: 'blur' }
|
||||
],
|
||||
password: [
|
||||
{ validator: validatePass, trigger: 'blur' }
|
||||
],
|
||||
checkPass: [
|
||||
{ validator: validateCheckPass, trigger: 'blur' }
|
||||
]
|
||||
})
|
||||
} else {
|
||||
return this.baseRule
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getDeptTreeSelect()
|
||||
this.getRoleTreeSelect()
|
||||
this.getDictListByDictType('sys_user_sex').then(response => {
|
||||
this.sexOptions = response.data
|
||||
})
|
||||
this.getDictListByDictType('personnel_status').then(response => {
|
||||
this.personnelStatusOptions = response.data
|
||||
})
|
||||
campusList().then(response => {
|
||||
this.campusOptions = response.data
|
||||
})
|
||||
campusSelect().then(response => {
|
||||
this.belongCampus = response.data
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
/** 查询部门下拉树结构 */
|
||||
getDeptTreeSelect() {
|
||||
treeSelect().then(response => {
|
||||
this.deptOptions = response.data
|
||||
})
|
||||
},
|
||||
getRoleTreeSelect() {
|
||||
roleTreeSelect().then(response => {
|
||||
this.roleOptions = response.data
|
||||
})
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm: function() {
|
||||
this.$refs['form'].validate(valid => {
|
||||
if (valid) {
|
||||
if (this.form.loginUser) {
|
||||
this.form.roleIds = this.getRoleAllCheckedKeys()
|
||||
}
|
||||
if (this.form.staffId !== undefined) {
|
||||
this.loadingChange = true
|
||||
updateStaff(this.form).then(response => {
|
||||
this.loadingChange = false
|
||||
if (response.respCode === '0000') {
|
||||
this.msgSuccess('修改成功')
|
||||
this.open = false
|
||||
this.$emit('ok')
|
||||
} else {
|
||||
this.msgError(response.respMsg)
|
||||
}
|
||||
}).catch(() => {
|
||||
this.loadingChange = false
|
||||
})
|
||||
} else {
|
||||
this.loadingChange = true
|
||||
addStaff(this.form).then(response => {
|
||||
this.loadingChange = false
|
||||
if (response.respCode === '0000') {
|
||||
this.msgSuccess('新增成功')
|
||||
this.open = false
|
||||
this.$emit('ok')
|
||||
} else {
|
||||
this.msgError(response.respMsg)
|
||||
}
|
||||
}).catch(() => {
|
||||
this.loadingChange = false
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false
|
||||
this.reset()
|
||||
},
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
locked: '0',
|
||||
belongCampus: undefined,
|
||||
partCampus: []
|
||||
}
|
||||
this.resetForm('form')
|
||||
},
|
||||
// 已选择角色id
|
||||
getRoleAllCheckedKeys() {
|
||||
// 半选中的菜单节点
|
||||
const halfCheckedKeys = this.$refs.role.getHalfCheckedKeys()
|
||||
// 目前被选中的菜单节点
|
||||
const checkedKeys = this.$refs.role.getCheckedKeys()
|
||||
checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
|
||||
return checkedKeys
|
||||
},
|
||||
// 重置密码
|
||||
handleResetPwd() {
|
||||
this.$prompt('请输入"' + this.form.username + '"的新密码', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
inputPattern: /^.*(?=.{6,16})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$/,
|
||||
inputErrorMessage: '密码最少6位,包含大小写字母和特殊字符'
|
||||
}).then(({ value }) => {
|
||||
resetUserPwd(this.form.userId, value).then(response => {
|
||||
if (response.respCode === '0000') {
|
||||
this.msgSuccess('修改成功,新密码是:' + value)
|
||||
} else {
|
||||
this.msgError(response.msg)
|
||||
}
|
||||
})
|
||||
}).catch(() => {})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style rel="stylesheet/scss" lang="scss" scoped>
|
||||
.title {
|
||||
padding: 15px 0px;
|
||||
color: rgba(0,0,0,.85);
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
&.top {
|
||||
padding-top: 0px;
|
||||
}
|
||||
.title-content{
|
||||
border-left: 3px solid #409EFF;
|
||||
padding-left: 10px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
Loading…
Reference in new issue