Bonus-AI-LargeScreen/src/views/updateFace/addFace.vue

277 lines
6.6 KiB
Vue
Raw Normal View History

2024-08-24 09:11:50 +08:00
<template>
<div v-if="visible" class="modal-overlay">
<div class="modal-content" :style="{ width: computedWidth }">
<div class="modal-header">
<h2>{{ title }}</h2>
<span style="color: white;cursor:pointer" @click="close"></span>
</div>
<div class="modal-body">
<div class="modal-body-left">
<input
type="file"
2024-08-26 10:15:17 +08:00
accept="image/jpeg,image/png"
2024-08-24 09:11:50 +08:00
style="display: none"
ref="fileInput"
@change="handleFileChange"
/>
<img
v-if="imageUrl"
:src="imageUrl"
class="avatar"
@click="selectFile"
alt="Avatar"
/>
<i
v-else
class="el-icon-plus avatar-uploader-icon"
@click="selectFile"
></i>
</div>
<div class="modal-body-right">
<el-form ref="form" :model="form" :rules="rules">
<el-form-item prop="name">
<el-input v-model="form.name" placeholder="请输入人员姓名" size="small"/>
</el-form-item>
<el-form-item prop="idCardNumber">
<el-input v-model="form.idCardNumber" placeholder="请输入人员身份证号" size="small"/>
</el-form-item>
<el-form-item prop="sex">
<el-radio-group v-model="form.sex">
<el-radio label="男" style="color: white"></el-radio>
<el-radio label="女" style="color: white"></el-radio>
</el-radio-group>
</el-form-item>
</el-form>
</div>
</div>
<div class="modal-footer">
<el-button type="primary" size="mini" plain @click="submitForm">确定</el-button>
<el-button plain size="mini" @click="confirm">取消</el-button>
</div>
</div>
</div>
</template>
<script>
import {updateFace} from '@/api/updateFace/updateFace'
2024-08-24 16:16:40 +08:00
import midPic from "@/views/updateFace/midPic.vue";
import faceListShowPic from "@/views/updateFace/faceListShowPic.vue";
2024-08-24 09:11:50 +08:00
const validationRules = {
name: [
{required: true, message: '人员名称不能为空', trigger: 'blur'},
2024-08-27 14:20:50 +08:00
{min: 2, max: 15, message: '用户名称长度必须介于 2 和 15 之间', trigger: 'blur'},
2024-08-26 10:15:17 +08:00
{
validator: (rule, value, callback) => {
2024-08-27 14:20:50 +08:00
const chineseNamePattern = /^[\u4e00-\u9fa5·]{2,15}$/
2024-08-26 10:15:17 +08:00
if (!chineseNamePattern.test(value)) {
callback(new Error('姓名只能包含中文字符'));
} else {
callback();
}
},
trigger: 'blur'
}
2024-08-24 09:11:50 +08:00
],
idCardNumber: [
2024-08-26 10:15:17 +08:00
{required: true, message: '人员身份证号不能为空', trigger: 'blur'},
{
validator: (rule, value, callback) => {
const idCardPattern = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[\dXx]$/;
if (!idCardPattern.test(value)) {
callback(new Error('身份证号码格式不正确'));
} else {
callback();
}
},
trigger: 'blur'
}
2024-08-24 09:11:50 +08:00
],
sex: [
{required: true, message: '请选择性别', trigger: 'change'}
]
};
export default {
props: {
title: {
type: String,
default: '弹窗标题'
},
value: {
type: Boolean,
default: false
},
width: {
type: String,
default: '400px' // 默认宽度
}
},
data() {
return {
visible: this.value,
imageUrl: '',
form: {
name: '',
idCardNumber: '',
sex: ''
},
rules: validationRules
};
},
watch: {
value(val) {
this.visible = val;
2024-08-24 16:16:40 +08:00
this.$emit('visible-change', val);
2024-08-24 09:11:50 +08:00
if (val) {
this.resetParameters(); // 每次打开时清除参数
}
}
},
computed: {
computedWidth() {
return this.width; // 返回传入的宽度
}
},
methods: {
resetParameters() {
this.imageUrl = '';
this.form = {
name: '',
idCardNumber: '',
sex: ''
};
},
submitForm() {
this.$refs.form.validate(valid => {
if (valid) {
if (!this.form.file) {
this.$message.error("请选择人脸照片")
return
}
let formData = new FormData();
formData.append('name', this.form.name);
formData.append('idCardNumber', this.form.idCardNumber);
formData.append('sex', this.form.sex)
formData.append('file', this.form.file)
updateFace(formData).then(res => {
if (res.code == 200) {
this.$message.success(res.msg)
this.close();
} else {
this.$message.error(res.msg)
}
})
}
});
},
close() {
2024-08-24 16:16:40 +08:00
this.visible = false;
2024-08-26 17:48:44 +08:00
faceListShowPic.methods.getList();
2024-08-24 16:16:40 +08:00
this.$emit('input', this.visible);
2024-08-24 09:11:50 +08:00
},
confirm() {
this.close();
},
selectFile() {
this.$refs.fileInput.click();
},
handleFileChange(event) {
const file = event.target.files[0];
if (file) {
2024-08-26 17:48:44 +08:00
const maxSizeInMB = 20; // 最大文件大小单位MB
const maxSizeInBytes = maxSizeInMB * 1024 * 1024;
if (file.size > maxSizeInBytes) {
this.$message.error(`文件大小不能超过 ${maxSizeInMB} MB`);
return;
}
2024-08-24 09:11:50 +08:00
this.imageUrl = URL.createObjectURL(file);
this.form.file = file;
}
}
}
};
</script>
2024-08-24 16:16:40 +08:00
<style lang="scss">
2024-08-24 09:11:50 +08:00
.modal-overlay {
z-index: 1000;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
}
.modal-content {
background-image: url("../../assets/images/backimg.png");
background-size: 100% 100%;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.modal-header {
display: flex;
height: 40px;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 20px;
h2 {
color: white;
}
}
.modal-body {
padding: 10px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-around;
}
.modal-body-left {
width: 178px;
height: 178px;
}
.avatar {
width: 178px;
height: 178px;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
border: 1px dashed #8c939d;
}
.avatar-uploader-icon:hover {
color: #0C70FA;
border: 1px dashed #0C70FA;
}
.modal-body-right {
padding: 10px;
width: 50%;
}
.modal-footer {
padding: 10px;
display: flex;
justify-content: flex-end;
align-items: center;
}
</style>