aircraft-admin/src/views/system/pilot/index.vue
2025-08-18 10:55:40 +08:00

368 lines
14 KiB
Vue

<template>
<div class="app-container">
<el-row :gutter="20">
<!--飞行员数据-->
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<!--工具栏-->
<div class="head-container">
<div>
<!-- 搜索 -->
<el-input
v-model="query.name"
clearable
size="small"
placeholder="输入飞行员名称"
style="width: 200px;"
class="filter-item"
@keyup.enter.native="crud.toQuery"
/>
<rrOperation />
<el-button
v-permission="permission.add"
class="filter-item"
size="mini"
type="primary"
icon="el-icon-plus"
@click="crud.toAdd"
>
新增飞行员
</el-button>
</div>
</div>
<!--表单渲染-->
<el-dialog append-to-body :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title"
@close="uploadDisabled = false;">
<el-form ref="form" v-loading="loading" :model="form" :rules="rules" size="small" label-width="80px">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6" class="mb20">
<el-form-item label="姓名" prop="name">
<el-input v-model="form.name" placeholder="请输入姓名" @keydown.native="keydown($event)" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6" class="mb20">
<el-form-item label="账户" prop="username">
<el-input v-model="form.username" placeholder="请输入账户" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6" class="mb20">
<el-form-item label="手机号" prop="phone">
<el-input v-model.number="form.phone" type="tel" placeholder="请输入手机号" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6" class="mb20">
<el-form-item label="区域" prop="areaId">
<el-select v-model="form.areaId" placeholder="请选择区域" @change="changeArea">
<el-option v-for="item in areas" :key="item.name" :label="item.name" :value="item.id"/>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6" class="mb20">
<el-form-item label="景区" prop="scenicId">
<el-select v-model="form.scenicId" placeholder="请选择景区">
<el-option v-for="item in scenics" :key="item.name"
:label="item.name" :value="Number(item.id)"/>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6" class="mb20">
<el-form-item label="飞行资质" prop="qualification">
<el-select v-model="form.qualification" placeholder="请选择飞行资质" clearable>
<el-option v-for="item in dict.user_qualification" :key="item.id" :label="item.label" :value="item.value"/>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6" class="mb20">
<el-form-item label="飞行资质附件" prop="files" label-width="120px">
<el-upload
ref="uploadRef"
action="#"
list-type="picture-card"
:class="{ disabled: uploadDisabled }"
:limit="1"
:file-list="form.files"
:on-change="handleChange"
:auto-upload="false"
>
<div style="display: flex;flex-direction: column;align-items: center;justify-content: center;margin-top: -20px;">
<i class="el-icon-plus" style="font-size: 30px;" />
<span style="margin: 5px 0 -20px;line-height: 20px">上传</span>
</div>
<template #file="{ file }">
<div>
<img class="el-upload-list__item-thumbnail" :src="file.url" alt="">
<span class="el-upload-list__item-actions">
<span
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
>
<i class="el-icon-zoom-in" />
</span>
<span
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete" />
</span>
</span>
</div>
</template>
</el-upload>
<el-dialog append-to-body :visible.sync="dialogVisible" top="20vh">
<div>
<img :src="dialogImageUrl" style="width: 100%" alt="Preview Image">
</div>
</el-dialog>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer" style="margin-top: -30px;">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
</div>
</el-dialog>
<!--表格渲染-->
<el-table ref="table" v-loading="crud.loading" :data="crud.data" style="width: 100%;" @selection-change="crud.selectionChangeHandler">
<el-table-column :show-overflow-tooltip="true" prop="name" label="姓名" align="center"/>
<el-table-column :show-overflow-tooltip="true" prop="username" label="账户" align="center"/>
<el-table-column :show-overflow-tooltip="true" prop="phone" width="100" label="手机号" align="center"/>
<el-table-column :show-overflow-tooltip="true" prop="areaName" label="区域" :formatter="commonFormatter" align="center"/>
<el-table-column :show-overflow-tooltip="true" prop="scenicName" label="景区" :formatter="commonFormatter" align="center"/>
<el-table-column :show-overflow-tooltip="true" prop="createTime" width="135" label="创建日期" align="center"/>
<el-table-column
v-if="checkPer(['admin','user:edit','user:del'])"
label="操作"
width="115"
align="center"
fixed="right"
>
<template slot-scope="scope">
<udOperation
:data="scope.row"
:permission="permission"
:disabled-dle="scope.row.id === user.id"
/>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<pagination />
</el-col>
</el-row>
</div>
</template>
<script>
import crudPilot from '@/api/system/pilot'
import { isvalidPhone } from '@/utils/validate'
import { allAreas } from '@/api/system/area'
import { allScenic } from '@/api/system/scenic'
import { getAll } from '@/api/system/role'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import udOperation from '@crud/UD.operation'
import pagination from '@crud/Pagination'
import { mapGetters } from 'vuex'
import { upload } from '@/utils/upload'
const defaultForm = { id: null, username: null, name: null,
phone: null, areaId: null, scenicId: null, roles: null, qualification: null,
qualificationAttachment: null, files: [], userType: null, enabled: 1 }
export default {
name: 'Pilot',
components: { rrOperation, udOperation, pagination },
cruds() {
return CRUD({ title: '飞行员', url: 'api/emEmployees/findByPage', crudMethod: { ...crudPilot }, optShow: { add: true, reset: true }})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
// 数据字典
dicts: ['user_qualification'],
data() {
// 自定义验证
const validPhone = (rule, value, callback) => {
if (!value) {
callback(new Error('请输入电话号码'))
} else if (!isvalidPhone(value)) {
callback(new Error('请输入正确的11位手机号码'))
} else {
callback()
}
}
return {
height: document.documentElement.clientHeight - 180 + 'px;',
roles: [],
defaultProps: { children: 'children', label: 'name', isLeaf: 'leaf' },
permission: {
add: ['admin', 'user:add'],
edit: ['admin', 'user:edit'],
del: ['admin', 'user:del']
},
areas: [],
scenics: [],
uploadDisabled: false,
dialogVisible: false,
loading: false,
dialogImageUrl: '',
rules: {
username: [
{ required: true, message: '请输入账户', trigger: 'blur' },
{ min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
],
name: [
{ required: true, message: '请输入姓名', trigger: 'blur' },
{ min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
],
phone: [
{ required: true, trigger: 'blur', validator: validPhone }
],
areaId: [
{ required: true, message: '区域不能为空', trigger: 'blur' }
],
scenicId: [
{ required: true, message: '景区不能为空', trigger: 'blur' }
],
qualification: [
{ required: true, message: '飞行资质不能为空', trigger: 'blur' }
],
files: [
{ required: false, message: '请上传资质文件', trigger: 'change' }
],
}
}
},
computed: {
...mapGetters([
'user',
'imagesUploadApi'
])
},
created() {
this.crud.msg.add = '新增成功'
},
mounted: function() {
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 180 + 'px;'
}
},
methods: {
// 禁止输入空格
keydown(e) {
if (e.keyCode === 32) {
e.returnValue = false
}
},
// 预览图片
handlePictureCardPreview(file, uploadFiles) {
this.dialogImageUrl = file.url
this.dialogVisible = true
},
// 删除图片
handleRemove(file, uploadFiles) {
this.$refs['uploadRef'].clearFiles()
this.form.qualificationAttachment = ''
this.form.files = [];
this.uploadDisabled = false
},
commonFormatter(row, column){
return row[column.property] || '暂无';
},
// 触发图片上传
handleChange(file, uploadFiles) {
if (file.raw.type === 'image/png' || file.raw.type === 'image/jpeg' || file.raw.type === 'image/jpg' || file.raw.type === 'image/gif') {
this.loading = true
this.form.files = uploadFiles
this.uploadDisabled = true
try {
upload(this.imagesUploadApi, file.raw).then(res => {
if(res.status === 200){
const data = res.data;
const url = data.fileFullPath;
this.form.qualificationAttachment = url;
this.loading = false;
}else{
this.$message.error(`图片上传失败!`);
this.loading = false;
return;
}
})
} catch (error) {
this.loading = false
this.$message.error('图片上传失败!')
}
} else {
this.$confirm('图片的格式不正确,请重新选择!', '提示', {
confirmButtonText: '确定',
type: 'warning'
})
uploadFiles.pop()
this.uploadDisabled = false
}
},
// 选择区域
changeArea(value){
this.form.scenicId = '';
allScenic({areaId: value}).then(res=>{
this.scenics = res || [];
})
},
// 新增与编辑前做的操作
[CRUD.HOOK.afterToCU](crud, form) {
this.getRoles()
this.getAreas()
if(form.scenicId&&form.areaId){
allScenic({areaId: form.areaId}).then(res=>{
this.scenics = res || [];
})
}
},
// 新增前将多选的值设置为空
[CRUD.HOOK.beforeToAdd]() {
this.roleDatas = []
},
// 初始化编辑时候的角色与岗位
[CRUD.HOOK.beforeToEdit](crud, form) {
this.roleDatas = []
if(form.scenicId) form.scenicId = Number(form.scenicId);
if(form.qualificationAttachment){
this.form.files = [{url: form.qualificationAttachment,}]
this.uploadDisabled = true;
}
},
// 提交前做的操作
[CRUD.HOOK.afterValidateCU](crud) {
// const rolesIds = this.roles.find(item=>item.name === '飞行员').id;
crud.form.userType = 1;
// crud.form.roles = [{id:rolesIds}];
return true;
},
// 获取全部区域
getAreas(){
allAreas().then(res => {
this.areas = res;
})
},
// 获取弹窗内角色数据
getRoles() {
getAll().then(res => {
this.roles = res
}).catch(() => { })
},
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .el-upload--picture-card,::v-deep .el-upload-list__item{
width: 110px !important;
height: 110px !important;
display: flex;
align-items: center;
justify-content: center;
}
::v-deep .disabled{
.el-upload--picture-card{
display: none;
}
}
</style>