You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
house/fount/modules/config/add-or-update.vue

357 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<!-- 主容器块用于样式隔离与布局 -->
<div class="addEdit-block">
<!-- 表单组件绑定ruleForm数据模型使用ref方便在JS中引用 -->
<el-form
class="detail-form-content"
ref="ruleForm" <!-- -->
:model="ruleForm" <!-- 数据模型 -->
:rules="rules" <!-- 校验规则 -->
label-width="80px" <!-- 标签宽度 -->
:style="{backgroundColor:addEditForm.addEditBoxColor}" <!-- 动态背景色 -->
>
<!-- 布局行用于排列表单项 -->
<el-row>
<!-- 左半列跨度12占50% -->
<el-col :span="12">
<!-- 非查看模式时显示可编辑名称输入框 -->
<el-form-item class="input" v-if="type!='info'" label="名称" prop="name">
<!-- 输入框双向绑定ruleForm.name -->
<el-input v-model="ruleForm.name"
placeholder="名称" clearable :readonly="ro.name"></el-input> <!-- 可清空、只读控制 -->
</el-form-item>
<!-- 查看模式下显示只读名称输入框 -->
<div v-else>
<el-form-item class="input" label="名称" prop="name">
<!-- 强制只读状态 -->
<el-input v-model="ruleForm.name"
placeholder="名称" readonly></el-input> <!-- 只读模式 -->
</el-form-item>
</div>
</el-col>
<!-- 全宽列跨度24占100% -->
<el-col :span="24">
<!-- value -->
<el-form-item class="upload" v-if="type!='info' && !ro.value" label="值" prop="value">
<!-- 文件上传组件 -->
<file-upload
tip="点击上传值" <!-- 提示文字 -->
action="file/upload" <!-- 上传接口地址 -->
:limit="3" <!-- 最多上传3个文件 -->
:multiple="true" <!-- 支持多选 -->
:fileUrls="ruleForm.value?ruleForm.value:''" <!-- 初始文件路径 -->
@change="valueUploadChange" <!-- 上传完成后的回调 -->
></file-upload>
</el-form-item>
<!-- 查看模式下展示图片预览 -->
<div v-else>
<el-form-item v-if="ruleForm.value" label="值" prop="value">
<!-- 循环展示多个图片 -->
<img style="margin-right:20px;" v-bind:key="index" v-for="(item,index) in ruleForm.value.split(',')" :src="item" width="100" height="100"> <!-- 图片预览 -->
</el-form-item>
</div>
</el-col>
</el-row>
<!-- 提交/取消按钮组 -->
<el-form-item class="btn">
<!-- 非查看模式显示提交按钮 -->
<el-button v-if="type!='info'" type="primary" class="btn-success" @click="onSubmit">提交</el-button> <!-- 提交操作 -->
<!-- 非查看模式显示取消按钮 -->
<el-button v-if="type!='info'" class="btn-close" @click="back()">取消</el-button> <!-- 取消操作 -->
<!-- 查看模式显示返回按钮 -->
<el-button v-if="type=='info'" class="btn-close" @click="back()">返回</el-button> <!-- 返回操作 -->
</el-form-item>
</el-form>
</div>
</template>
<script>
// 导入校验工具函数:数字、整数、邮箱、手机号等
import { isNumber,isIntNumer,isEmail,isPhone, isMobile,isURL,checkIdCard } from "@/utils/validate";
export default {
data() {
let self = this;
// 身份证号码校验函数
var validateIdCard = (rule, value, callback) => {
if(!value){ // 如果值为空
callback(); // 不触发错误
} else if (!checkIdCard(value)) { // 校验身份证号码格式
callback(new Error("请输入正确的身份证号码")); // 触发错误提示
} else {
callback(); // 校验通过
}
};
// URL地址校验函数
var validateUrl = (rule, value, callback) => {
if(!value){ // 如果值为空
callback(); // 不触发错误
} else if (!isURL(value)) { // 校验URL格式
callback(new Error("请输入正确的URL地址")); // 触发错误提示
} else {
callback(); // 校验通过
}
};
// 手机号码校验函数
var validateMobile = (rule, value, callback) => {
if(!value){ // 如果值为空
callback(); // 不触发错误
} else if (!isMobile(value)) { // 校验手机号码格式
callback(new Error("请输入正确的手机号码")); // 触发错误提示
} else {
callback(); // 校验通过
}
};
// 固定电话号码校验函数
var validatePhone = (rule, value, callback) => {
if(!value){ // 如果值为空
callback(); // 不触发错误
} else if (!isPhone(value)) { // 校验固定电话格式
callback(new Error("请输入正确的电话号码")); // 触发错误提示
} else {
callback(); // 校验通过
}
};
// 邮箱地址校验函数
var validateEmail = (rule, value, callback) => {
if(!value){ // 如果值为空
callback(); // 不触发错误
} else if (!isEmail(value)) { // 校验邮箱格式
callback(new Error("请输入正确的邮箱地址")); // 触发错误提示
} else {
callback(); // 校验通过
}
};
// 数字校验函数
var validateNumber = (rule, value, callback) => {
if(!value){ // 如果值为空
callback(); // 不触发错误
} else if (!isNumber(value)) { // 校验是否为数字
callback(new Error("请输入数字")); // 触发错误提示
} else {
callback(); // 校验通过
}
};
// 整数校验函数
var validateIntNumber = (rule, value, callback) => {
if(!value){ // 如果值为空
callback(); // 不触发错误
} else if (!isIntNumer(value)) { // 校验是否为整数
callback(new Error("请输入整数")); // 触发错误提示
} else {
callback(); // 校验通过
}
};
return {
// 表单样式配置对象(包含所有样式参数)
addEditForm: {"btnSaveFontColor":"#fff", ...}, // 省略完整样式配置
id: '', // 当前记录ID
type: '', // 操作类型add/edit/view
ro:{ // 只读字段标识
name : false, // 名称字段是否只读
value : false, // 值字段是否只读
},
ruleForm: { // 表单数据模型
name: '', // 名称字段初始值
value: '', // 值字段初始值
},
rules: { // 表单验证规则
name: [
{ required: true, message: '名称不能为空', trigger: 'blur' }, // 必填项
],
value: [] // 空规则占位
}
};
},
props: ["parent"], // 接收父组件传参
computed: {}, // 计算属性(暂无)
created() { // 组件创建后执行
this.addEditStyleChange(); // 初始化表单样式
this.addEditUploadStyleChange(); // 初始化上传区域样式
},
methods: {
// 下载方法:打开文件链接
download(file){
window.open(`${file}`) // 新窗口打开文件链接
},
// 初始化方法带id和type参数
init(id,type) {
if (id) {
this.id = id; // 设置当前记录ID
this.type = type; // 设置操作类型
}
// 根据类型加载数据
if(this.type == 'info' || this.type == 'else'){
this.info(id); // 加载详情信息
} else if (this.type == 'cross') { // 处理跨模块数据
var obj = this.$storage.getObj('crossObj'); // 获取跨页传递数据
for (var o in obj){
if(o == 'name'){ // 名称字段处理
this.ruleForm.name = obj[o];
this.ro.name = true;
continue;
}
if(o == 'value'){ // 值字段处理
this.ruleForm.value = obj[o];
this.ro.value = true;
continue;
}
}
}
},
// 加载指定ID的详情数据
info(id) {
this.$http({ // 发起HTTP请求
url: `config/info/${id}`, // 请求URL
method: "get" // 请求方法
}).then(({ data }) => { // 成功回调
if (data && data.code === 0) {
this.ruleForm = data.data; // 填充表单数据
} else {
this.$message.error(data.msg); // 错误提示
}
});
},
// 表单提交处理
onSubmit() {
this.$refs["ruleForm"].validate(valid => { // 表单校验
if (valid) {
this.$http({ // 提交请求
url: `config/${!this.ruleForm.id ? "save" : "update"}`, // 动态URL
method: "post", // 请求方法
data: this.ruleForm // 提交数据
}).then(({ data }) => {
if (data && data.code === 0) { // 成功处理
this.$message({
message: "操作成功",
type: "success",
duration: 1500,
onClose: () => {
this.parent.showFlag = true;
this.parent.addOrUpdateFlag = false;
this.parent.configCrossAddOrUpdateFlag = false;
this.parent.search(); // 刷新父组件数据
this.parent.contentStyleChange();
}
});
} else {
this.$message.error(data.msg); // 失败提示
}
});
}
});
},
// UUID生成方法
getUUID () {
return new Date().getTime(); // 返回时间戳作为UUID
},
// 返回操作
back() {
// 重置父组件状态
this.parent.showFlag = true;
this.parent.addOrUpdateFlag = false;
this.parent.configCrossAddOrUpdateFlag = false;
this.parent.contentStyleChange();
},
// 文件上传变更处理
valueUploadChange(fileUrls) {
this.ruleForm.value = fileUrls; // 更新文件路径
this.addEditUploadStyleChange() // 重新计算上传区样式
},
// 动态样式设置
addEditStyleChange() {
this.$nextTick(() => {
// input样式设置
document.querySelectorAll('.addEdit-block .input .el-input__inner').forEach(el => {
el.style.height = this.addEditForm.inputHeight
el.style.color = this.addEditForm.inputFontColor
el.style.fontSize = this.addEditForm.inputFontSize
el.style.borderWidth = this.addEditForm.inputBorderWidth
el.style.borderStyle = this.addEditForm.inputBorderStyle
el.style.borderColor = this.addEditForm.inputBorderColor
el.style.borderRadius = this.addEditForm.inputBorderRadius
el.style.backgroundColor = this.addEditForm.inputBgColor
})
// label样式设置
document.querySelectorAll('.addEdit-block .input .el-form-item__label').forEach(el => {
el.style.lineHeight = this.addEditForm.inputHeight
el.style.color = this.addEditForm.inputLableColor
el.style.fontSize = this.addEditForm.inputLableFontSize
})
// 其他组件样式设置select/date/upload/textarea等...
})
},
// 上传组件样式调整
addEditUploadStyleChange() {
this.$nextTick(() => {
document.querySelectorAll('.addEdit-block .upload .el-upload-list--picture-card .el-upload-list__item').forEach(el => {
el.style.width = this.addEditForm.uploadHeight
el.style.height = this.addEditForm.uploadHeight
el.style.borderWidth = this.addEditForm.uploadBorderWidth
el.style.borderStyle = this.addEditForm.uploadBorderStyle
el.style.borderColor = this.addEditForm.uploadBorderColor
el.style.borderRadius = this.addEditForm.uploadBorderRadius
el.style.backgroundColor = this.addEditForm.uploadBgColor
})
})
},
}
};
</script>
<style lang="scss">
.editor{
height: 500px; //
& /deep/ .ql-container {
height: 310px; // Quill
}
}
.amap-wrapper {
width: 100%; //
height: 500px; //
}
.search-box {
position: absolute; //
}
.addEdit-block {
margin: -10px; //
}
.detail-form-content {
padding: 12px; //
}
.btn .el-button {
padding: 0; // 0
}
</style>