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/views/modules/discusswoyaodangfangzhu/add-or-update.vue

333 lines
12 KiB

<template>
<!-- 主容器 -->
<div class="addEdit-block">
<!-- 表单组件 -->
<el-form
class="detail-form-content"
ref="ruleForm" <!-- -->
:model="ruleForm" <!-- 绑定表单数据模型 -->
:rules="rules" <!-- 绑定验证规则 -->
label-width="80px" <!-- 标签宽度 -->
:style="{backgroundColor:addEditForm.addEditBoxColor}" <!-- 动态背景色 -->
>
<!-- 空行 -->
<el-row></el-row>
<!-- 评论内容区域 -->
<el-row>
<el-col :span="24"> <!-- 占满整列 -->
<!-- 编辑模式下的评论内容输入框 -->
<el-form-item class="textarea" v-if="type!='info'" label="评论内容" prop="content">
<el-input
style="min-width: 200px; max-width: 600px;" <!-- 输入框宽度限制 -->
type="textarea" <!-- 文本域类型 -->
:rows="8" <!-- 显示行数 -->
placeholder="评论内容" <!-- 占位符 -->
v-model="ruleForm.content" readonly> <!-- 双向绑定并只读 -->
</el-input>
</el-form-item>
<!-- 查看模式下的评论内容显示 -->
<div v-else>
<el-form-item v-if="ruleForm.content" label="评论内容" prop="content">
<span>{{ruleForm.content}}</span> <!-- 显示评论内容 -->
</el-form-item>
</div>
</el-col>
</el-row>
<!-- 回复内容区域 -->
<el-row>
<el-col :span="24"> <!-- -->
<!-- 编辑模式下的回复内容输入框 -->
<el-form-item class="textarea" v-if="type!='info'" label="回复内容" prop="reply">
<el-input
style="min-width: 200px; max-width: 600px;" <!-- 输入框宽度限制 -->
type="textarea" <!-- 文本域类型 -->
:rows="8" <!-- 显示行数 -->
placeholder="回复内容" <!-- 占位符 -->
v-model="ruleForm.reply"> <!-- 双向绑定回复内容 -->
</el-input>
</el-form-item>
<!-- 查看模式下的回复内容显示 -->
<div v-else>
<el-form-item v-if="ruleForm.reply" label="回复内容" prop="reply">
<span>{{ruleForm.reply}}</span> <!-- 显示回复内容 -->
</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)) {
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","selectFontSize":"14px",...}, // 完整样式省略
id: '', // 数据ID
type: '', // 页面类型(新增/编辑/查看)
ro:{ // 字段只读状态
refid : false,
userid : false,
content : false,
reply : false,
},
ruleForm: { // 表单数据模型
refid: '',
userid: '',
content: '',
reply: '',
},
rules: { // 表单验证规则
refid: [
{ required: true, message: '关联表id不能为空', trigger: 'blur' }, // 必填校验
],
userid: [
{ required: true, message: '用户id不能为空', trigger: 'blur' }, // 必填校验
],
content: [
{ required: true, message: '评论内容不能为空', trigger: 'blur' }, // 必填校验
],
reply: [] // 无校验
}
};
},
props: ["parent"], // 接收父组件传参
computed: {}, // 计算属性
created() { // 生命周期:创建时
this.addEditStyleChange(); // 初始化样式
this.addEditUploadStyleChange(); // 初始化上传样式
},
methods: {
// 下载文件方法
download(file){
window.open(`${file}`); // 新窗口打开文件链接
},
// 初始化方法
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=='refid'){ // 处理refid字段
this.ruleForm.refid = obj[o];
this.ro.refid = true; // 设置只读
continue;
}
if(o=='userid'){ // 处理userid字段
this.ruleForm.userid = obj[o];
this.ro.userid = true; // 设置只读
continue;
}
if(o=='content'){ // 处理content字段
this.ruleForm.content = obj[o];
this.ro.content = true; // 设置只读
continue;
}
if(o=='reply'){ // 处理reply字段
this.ruleForm.reply = obj[o];
this.ro.reply = true; // 设置只读
continue;
}
}
}
},
// 获取详情数据
info(id) {
this.$http({
url: `discusswoyaodangfangzhu/info/${id}`, // 请求路径
method: "get" // 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: `discusswoyaodangfangzhu/${!this.ruleForm.id ? "save" : "update"}`, // 动态路径
method: "post", // 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.discusswoyaodangfangzhuCrossAddOrUpdateFlag = false;
this.parent.search(); // 刷新数据
this.parent.contentStyleChange(); // 样式更新
}
});
} else {
this.$message.error(data.msg); // 错误提示
}
});
}
});
},
// 获取UUID
getUUID () {
return new Date().getTime(); // 返回时间戳
},
// 返回上一页
back() {
this.parent.showFlag = true; // 显示父组件
this.parent.addOrUpdateFlag = false; // 关闭当前页
this.parent.discusswoyaodangfangzhuCrossAddOrUpdateFlag = false;
this.parent.contentStyleChange(); // 样式更新
},
// 动态样式调整
addEditStyleChange() {
this.$nextTick(()=>{ // 等待DOM更新
// input样式应用
document.querySelectorAll('.addEdit-block .input .el-input__inner').forEach(el=>{
el.style.height = this.addEditForm.inputHeight; // 高度
el.style.color = this.addEditForm.inputFontColor; // 字体颜色
// ...其他样式设置(省略)
});
// textarea样式应用
document.querySelectorAll('.addEdit-block .textarea .el-textarea__inner').forEach(el=>{
el.style.height = this.addEditForm.textareaHeight; // 高度
// ...其他样式设置(省略)
});
// 按钮样式应用
document.querySelectorAll('.addEdit-block .btn .btn-success').forEach(el=>{
el.style.width = this.addEditForm.btnSaveWidth; // 宽度
// ...其他样式设置(省略)
});
})
},
// 上传控件样式调整
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; // 高度
// ...其他样式设置(省略)
})
})
},
}
};
</script>
<style lang="scss">
.editor{
height: 500px; /* */
& /deep/ .ql-container { /* */
height: 310px; /* */
}
}
.amap-wrapper { /* */
width: 100%; /* */
height: 500px; /* */
}
.search-box { /* */
position: absolute; /* */
}
.addEdit-block { /* */
margin: -10px; /* */
}
.detail-form-content { /* */
padding: 12px; /* */
}
.btn .el-button { /* */
padding: 0; /* padding */
}
</style>