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.
 
 
 
 
 

797 lines
29 KiB

<template>
<div ref="main" class="main" v-loading="loading">
<el-row :gutter="20">
<el-col :span="24">
<el-card shadow="hover" class="mgb20">
<div class="flex-between">
<el-page-header @back="back" content="项目配置"></el-page-header>
<div v-if="!isDetail">
<el-button type="success" :loading="submiting === 0"
@click="handleSubmit(0, projectManage.isOpen = 1, projectManage.ztOpen = 1)">保存为草稿
</el-button>
<el-button type="primary" :loading="submiting === 1" @click="handleSubmit(1)">确定并发布</el-button>
</div>
</div>
</el-card>
<el-card shadow="hover" class="mgb20">
<div class="flex-center mgb20">
<p class="addhr_tag"></p>
<span>课程信息</span>
</div>
<div class="border-b-dashed"></div>
<div>
<el-form label-width="80px">
<div style="display: flex">
<el-form-item label="项目名称">
<el-input :disabled="isDetail" v-model.trim="projectManage.projectName" placeholder="20个字符以内"
@blur="projectNameExistis"></el-input>
</el-form-item>
<el-form-item label="备注">
<el-input v-model.trim="projectManage.remark" placeholder="20个字符以内"></el-input>
</el-form-item>
<el-form-item label="项目用途">
<el-select :disabled="isDetail" v-model="projectManage.permissions" placeholder="请选择"
@change="permissionChange">
<el-option label="练习" :value="0"></el-option>
<el-option label="考核" :value="1"></el-option>
<el-option label="竞赛" :value="2"></el-option>
</el-select>
</el-form-item>
</div>
</el-form>
</div>
</el-card>
<el-card shadow="hover" class="mgb20">
<div class="flex-center mgb20">
<p class="addhr_tag"></p>
<span>实验目标</span>
</div>
<div class="border-b-dashed"></div>
<div>
<el-form label-width="0">
<el-form-item>
<quill :border="true" :readonly="isDetail" v-model="projectManage.experimentTarget"
:type.sync="projectManage.experimentTargetType" radio :minHeight="150" :height="150" />
</el-form-item>
</el-form>
</div>
</el-card>
<el-card shadow="hover" class="mgb20">
<div class="flex-center mgb20">
<p class="addhr_tag"></p>
<span>项目背景</span>
</div>
<div class="border-b-dashed"></div>
<div>
<el-form label-width="0">
<el-form-item>
<quill :border="true" :readonly="isDetail" v-model="projectManage.experimentDescription"
:type.sync="projectManage.experimentDescriptionType" radio :minHeight="150" :height="150"
:index="1" />
</el-form-item>
</el-form>
</div>
</el-card>
<el-card shadow="hover" class="mgb20">
<div class="flex-between mgb20">
<div class="flex-center">
<p class="addhr_tag"></p>
<span>实验任务</span>
</div>
<div>
<el-button :disabled="isDetail" type="primary" @click="toJudgePoint('home')">进入判分点
</el-button>
</div>
</div>
<div class="border-b-dashed"></div>
<div class="mgb20 flex-between">
<div class="flex-center">
<div class="m-r-20" style="color: #f00">项目总分值:100分</div>
<!-- <div>权重&emsp;<div class="dib"><el-input></el-input></div></div> -->
</div>
<div>
<el-button :disabled="isDetail" class="m-r-20" type="text" @click="avgDistributionScore">
平均分配分值
</el-button>
<el-button :disabled="isDetail" class="m-r-20" type="text" @click="manualDistributionScore">
手动分配分值
</el-button>
<span>(待分配分值: {{ handDistributionScore }}/100分)</span>
</div>
</div>
<el-button :disabled="isDetail" type="primary" icon="el-icon-plus" round @click="handleAddJudgment"
style="margin-bottom: 10px">判分点
</el-button>
<el-button :disabled="isDetail" type="primary" icon="el-icon-delete" round @click="batchDeleteProjectJudgment"
style="margin-bottom: 10px">批量删除
</el-button>
<div class="draggable">
<el-table ref="projectJudgementTable" :data="projectJudgmentData" class="table" stripe header-align="center"
:use-virtual="isLc" :max-height="600" :row-height="60" :border="false"
@selection-change="handleSelectionProjectJudgment" row-key="judgmentId" v-loading="listLoading">
<el-table-column type="selection" width="55" align="center"></el-table-column>
<el-table-column prop="sort" label="序号" width="80" align="center">
<template slot-scope="scope">
{{ scope.row.sort }}
</template>
</el-table-column>
<el-table-column prop="name" label="判分指标" align="center" show-overflow-tooltip
min-width="140"></el-table-column>
<el-table-column prop="name" label="判分点名称" align="center" show-overflow-tooltip
min-width="140"></el-table-column>
<el-table-column label="实验要求" align="center" width="600">
<template slot-scope="scope">
<quill :readonly="true" elseRead="true" v-model="scope.row.experimentalRequirements" :index="2" />
</template>
</el-table-column>
<el-table-column prop="score" label="分数" align="center" width="120">
<template slot-scope="scope">
<el-input :disabled="isDetail" :key="scope.$index" type="number" step="0.1"
v-model.trim="scope.row.score"></el-input>
<!--
@input="scoreChange(scope.row, scope.$index)" -->
</template>
</el-table-column>
<el-table-column label="操作" width="140" align="center">
<template slot-scope="scope">
<el-button :disabled="isDetail" type="text" style="margin-right: 10px"
@click="toJudgePoint('edit', scope.row)">自定义</el-button>
<el-button :disabled="isDetail" type="text" @click="delJudgePoint(scope.$index)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-card>
<el-card shadow="hover" class="mgb20">
<div class="flex-between mgb20">
<div class="flex-center">
<p class="addhr_tag"></p>
<span>实验提示</span>
</div>
<div>
启用
<el-switch :disabled="isDetail" :active-value="0" :inactive-value="1"
v-model="projectManage.hintOpen"></el-switch>
</div>
</div>
<div class="border-b-dashed"></div>
<div>
<el-form label-width="0">
<el-form-item prop="tips" label="">
<quill :border="true" :readonly="isDetail" v-model="projectManage.experimentHint"
:type.sync="projectManage.experimentHintType" radio :minHeight="150" :height="400" :index="3" />
</el-form-item>
</el-form>
</div>
</el-card>
</el-col>
</el-row>
<!--选择判分点对话框-->
<el-dialog title="添加判分点" :visible.sync="dialogVisible" width="40%" :close-on-click-modal="false"
@close="closeJudgment">
<div class="text-right mgb10">
<div>
<el-input placeholder="请输入需要查找的判分点" prefix-icon="el-icon-search" v-model.trim="judgementpointsquery"
clearable></el-input>
</div>
</div>
<el-table v-loading="visibleLoading" :data="judgementData" ref="judgementTable" class="table" stripe
header-align="center" use-virtual :row-height="45" :max-height="400" :border="false"
@selection-change="handleSelectionJudgment" :row-key="rowKey">
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column>
<el-table-column prop="id" label="序号" align="center" width="100">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="name" label="判分点名称" align="center"></el-table-column>
<el-table-column label="操作" align="center" width="100">
<template slot-scope="scope">
<el-button size="mini" @click="toJudgePoint('view', scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<div slot="footer" class="dialog-footer">
<el-button @click="closeJudgment">取 消</el-button>
<el-button type="primary" :loading="savingJud" @click="saveJudgment"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import Setting from "@/setting";
import quill from "@/components/quill";
import Sortable from "sortablejs";
import { UTable, UTableColumn } from 'umy-ui'
import Decimal from 'decimal.js'
export default {
components: {
quill,
UTable,
UTableColumn
},
data () {
return {
projectId: this.$route.query.projectId,
founder: this.$route.query.founder,
token: btoa(sessionStorage.getItem("token")),
isDetail: this.$route.query.show,
isDetails: this.$route.query.isDetails,
projectManage: {
founder: 0, // 创建人角色(0、系统 1、老师)
projectName: "", // 项目名称
remark: '',
permissions: 0, // 项目用途(0、练习 1、考核 2、竞赛)
systemId: this.$route.query.systemId, // 系统id
hintOpen: 1, // 实验提示是否开启(0开启 1不开启 默认1)
experimentHint: "", // 实验提示
experimentTarget: "", // 实验目标
experimentDescription: "", // 项目背景
state: 0, // 状态(0、草稿箱 1、已发布)
isOpen: 0, // 是否开启(0开启 1未开启 默认0)
ztOpen: 0, // 是否开启(0开启 1未开启 默认0)
isDel: 0, // 是否删除(0、未删除 1、已删除 默认0)
experimentTargetType: '0',
experimentDescriptionType: '0',
experimentHintType: '0',
},
projectJudgmentData: [], //实验任务(项目判分点)
oriPer: '', // 原始项目用途,用于保存的时候对比是否有修改该值,如果有,要调另一个接口查询提示
selectedProjectJudgment: [], // 选中的项目判分点
dialogVisible: false, // 选择判分点对话框
judgementpointsquery: "", //条件筛选判分点
judgementData: [], // 判分点列表数据
selectedJudgment: [], // 选中的判分点
rowKey: "", // 判分点行数据的 Key
projectNameRepeat: false, // 项目名称是否重复
originName: '',
flag: false, //判分点表格分数是否禁用
avgValuelist: [], //取得判分点平均分的数组
searchTimer: null,
isToPoint: false, // 判断是否是跳转到判分点系统
visibleLoading: false, // 加载判分点数据
listLoading: false,// 列表加载
submiting: false, // 新增编辑防抖标识
updateTime: 0,
savingJud: false,
loading: false,
};
},
computed: {
lastSystemId () {
return this.$store.state.lastSystemId;
},
projectFields () {
return this.$store.state.projectFields;
},
handDistributionScore () {
//计算判分点分值,超出100提示,
let score = 0;
this.projectJudgmentData.forEach(e => {
if (e.score && !isNaN(e.score)) score = Decimal(e.score).add(Decimal(score))
});
if (isNaN(score)) {
return 0;
}
if (score > 100) {
this.$message.error("分配的数值已超过100");
}
return score;
},
// 是否流程点分类
isLc () {
const systemId = +this.$route.query.systemId
return systemId === 11 || systemId === 12 || systemId === 19
},
},
watch: {
// 监听信息是否有更改,有的话页面离开的时候要询问是否要保存
projectManage: {
handler () {
this.updateTime++
},
deep: true
},
judgementpointsquery (n) {
clearTimeout(this.searchTimer);
this.searchTimer = setTimeout(() => {
this.handleQueryJudgment();
}, 500);
}
},
mounted () {
if (this.$route.query.projectId) {
this.projectId = this.$route.query.projectId;
this.getInfoData();
} else {
this.rowDrop()
}
// 判断有没有缓存数据
if (JSON.stringify(this.projectFields) != "{}") {
let { projectManage, projectJudgmentData } = this.projectFields;
this.projectManage = projectManage;
this.projectJudgmentData = projectJudgmentData;
}
this.$refs.main.scrollTop = 0;
},
beforeDestroy () {
if (!this.isToPoint) {
this.$store.dispatch("setProject", {});
}
},
methods: {
permissionChange () {
if (this.projectManage.permissions) {
this.projectManage.hintOpen = 1
} else {
this.projectManage.hintOpen = 0
}
},
getInfoData () { // 获取详情数据
if (!this.isToPoint) {
this.loading = true
this.$get(`${this.api.getProjectDetail}?projectId=${this.projectId}`).then(res => {
let { projectManage, projectJudgmentVos } = res;
if (!projectManage.remark) projectManage.remark = projectManage.projectName // 如果没有备注,则直接显示项目名称
if (!projectManage.experimentDescriptionType) projectManage.experimentDescriptionType = '0'
if (!projectManage.experimentHintType) projectManage.experimentHintType = '0'
if (!projectManage.experimentTargetType) projectManage.experimentTargetType = '0'
this.projectManage = projectManage;
this.projectJudgmentData = projectJudgmentVos;
this.oriPer = projectManage.permissions
this.projectJudgmentData.forEach((e, i) => {
e.sort = i + 1;
});
this.loading = false
this.$nextTick(() => {
this.updateTime = 0
this.$refs.main.scrollTop = 0;
this.rowDrop();
});
}).catch(err => {
this.loading = false
});
}
},
projectNameExistis () { // 项目管理名称判重
const { projectName } = this.projectManage
if (this.originName === projectName) {
this.projectNameRepeat = false
} else {
this.$post(this.api.queryNameIsExist, { projectName }).then(res => {
if (res.status === 200) {
this.projectNameRepeat = false
}
}).catch(err => {
this.projectNameRepeat = true
})
}
},
systemChange () { // 切换系统
if (this.projectJudgmentData.length) {
this.$confirm("更换系统会清空实验任务,确认更换?", "提示", {
type: "warning"
}).then(() => {
this.projectJudgmentData = [];
this.$store.dispatch("setSystemId", this.projectManage.systemId);
}).catch(() => {
this.projectManage.systemId = this.lastSystemId;
console.log(this.lastSystemId, "this.lastSystemId");
});
}
},
// 去除空白标签
removeTag (val) {
return val.replace('<p><br></p>', '')
},
judgmentRelease (state) { //判断能否成功发布
let {
projectName,
experimentTarget,
experimentDescription,
experimentHint,
hintOpen
} = this.projectManage;
if (!projectName) {
this.$message.error("请输入项目名称");
return false;
}
if (this.projectNameRepeat) {
this.$message.error("项目名称重复!");
return false;
}
if (state) {
if (!experimentTarget || !this.removeTag(experimentTarget)) {
this.$message.error("请输入实验目标");
return false;
}
if (!experimentDescription || !this.removeTag(experimentDescription)) {
this.$message.error("请输入案例描述");
return false;
}
if (this.projectJudgmentData.length == 0) {
this.$message.error("请添加判分点");
return false;
}
if (this.handDistributionScore < 100) {
this.$message.error("判分点分数未满100");
return false;
}
if (this.handDistributionScore > 100) {
this.$message.error("判分点分数已超过100");
return false;
}
if ((!experimentHint || !this.removeTag(experimentHint)) && hintOpen == 0) {
this.$message.error("请输入实验提示");
return false;
}
}
return true;
},
handleSubmit (state) { //处理提交
if (this.submiting === 0 || this.submiting === 1) return false
if (!this.judgmentRelease(state)) { //判断页面是否有没有输入的内容
return;
}
this.submiting = state
this.$store.dispatch("setSystemId", this.projectManage.systemId);
this.projectManage.state = state;
this.projectManage.ztOpen = state ? 0 : 1
let { systemId } = this.projectManage;
if (this.projectId) {
if (systemId == 2 || systemId == 3) {
console.log("系统id:", systemId);
} else {
// 先走更新判分点中间表接口,再走更新项目接口
this.updateProjectJudgment();
}
} else {
if (systemId == 2 || systemId == 3) {
console.log("系统id:", systemId);
} else {
// 添加
let tempArr = this.projectJudgmentData.map(i => {
let obj = {
projectId: this.projectId ? this.projectId : "",
judgmentId: i.judgmentId,
score: i.score,
sort: i.sort
};
return obj;
});
let params = {
projectManage: this.projectManage,
projectJudgmentList: tempArr
};
this.addProject(params);
}
}
},
updateProject (params) { // 更新项目
this.$post(this.api[params.projectManage.state ? 'updateProjectManage' : 'editProjectDraft'], params).then(res => {
if (res.status === 200) {
// 中台创建的项目,并且更改了项目用途,就需要调这个接口
if (!params.projectManage.founder && this.oriPer !== params.projectManage.permissions) {
this.$get(`${this.api.checkConfig}?projectId=${this.projectId}`).then(res => {
this.$message.success(res.message === 'success' ? '更新实验项目成功' : res.message)
}).catch(err => { })
} else {
this.$message.success('更新实验项目成功')
}
this.toList();
}
}).catch(err => {
this.submiting = false
});
},
addProject (params) { // 添加项目
this.$post(this.api[params.projectManage.state ? 'addProjectManage' : 'saveProjectDraft'], params).then(res => {
if (res.status === 200) {
this.$message.success("添加实验项目成功");
this.$router.back();
}
}).catch(err => {
this.submiting = false
});
},
manualDistributionScore () { //点击手动分配分值
},
avgDistributionScore () {
//点击平均分配分值
if (this.projectJudgmentData.length) {
this.$get(this.api.avgValues, {
number: this.projectJudgmentData.length
}).then(res => {
if (res.status === 200 && res.data) {
this.projectJudgmentData = this.projectJudgmentData.map((item, index) => {
item.score = res.data[index];
return item;
});
// this.updateProjectJudgment();
}
});
}
},
handleMoveUp (index) { // 处理上移(作废)
let x = index;
let y = index + 1;
this.projectJudgmentData.splice(x - 1, 1, ...this.projectJudgmentData.splice(y - 1, 1, this.projectJudgmentData[x - 1]));
},
handleMoveDown (index) { // 处理下移(作废)
let x = index + 1;
let y = index + 2;
this.projectJudgmentData.splice(x - 1, 1, ...this.projectJudgmentData.splice(y - 1, 1, this.projectJudgmentData[x - 1]));
},
scoreChange (row, i) {
row.score = row.score.replace(/[^\d\.]/g, '')
this.projectJudgmentData.splice(i, 1, row);
},
delJudgePoint (index) { // 删除判分点
this.$confirm("确定要删除吗?", "提示", {
type: "warning"
}).then(() => {
this.projectJudgmentData.splice(index, 1);
}).catch(() => {
});
},
handleSelectionProjectJudgment (val) {
this.selectedProjectJudgment = val;
},
batchDeleteProjectJudgment () { // 批量删除判分点
if (this.selectedProjectJudgment.length) {
this.$confirm("确定要删除吗?", "提示", {
type: "warning"
}).then(() => {
// this.projectJudgmentData.splice(index, 1);
let list = this.projectJudgmentData;
let result = [];
list.map(i => {
this.selectedProjectJudgment.find(j => j.judgmentId === i.judgmentId) || result.push(i);
});
this.projectJudgmentData = result;
}).catch(() => {
});
} else {
this.$message.error("请选择判分点");
}
},
handleAddJudgment () { // 处理添加判分点
this.dialogVisible = true;
this.handleQueryJudgment();
},
handleQueryJudgment () { // 查询判分点数据
let { systemId } = this.projectManage;
this.$nextTick(() => {
this.$refs.judgementTable.clearSelection();
});
let params = {
name: this.judgementpointsquery,
pageNum: 1,
pageSize: 10000,
enable: 0,
systemId
};
if (systemId == 2 || systemId == 3) {
console.log("系统id:", systemId);
} else if (this.isLc) {
// (流程)交易类
this.rowKey = "lcId";
this.getProcessClassData(params);
} else {
// 编程类
this.rowKey = "bcId";
this.getProgrammingClassData(params);
}
},
getProcessClassData (params) { // 获取流程类判分点列表数据
this.visibleLoading = true;
this.$post(`${this.api.getLcJudgmentPoint}`, params).then(res => {
if (res.status === 200) {
let list = res.message.records;
let result = [];
list.map(i => {
i.judgmentId = i.lcId;
this.projectJudgmentData.find(j => j.judgmentId === i.judgmentId) || result.push(i);
});
this.visibleLoading = false;
this.judgementData = result;
}
}).catch(err => {
this.visibleLoading = false
});
},
getProgrammingClassData (params) { // 获取编程类判分点列表数据
this.visibleLoading = true;
this.$post(this.api.getBcJudgmentPoint, params).then(res => {
if (res.status === 200) {
let list = res.message.records;
let result = [];
list.map(i => {
i.judgmentId = i.bcId;
this.projectJudgmentData.find(j => j.judgmentId === i.judgmentId) || result.push(i);
});
this.visibleLoading = false;
this.judgementData = result;
}
}).catch(err => {
this.visibleLoading = false
});
},
handleSelectionJudgment (val) { // 处理多选判分点
this.selectedJudgment = val;
},
closeJudgment () { // 关闭判分点对话框
this.judgementpointsquery = "";
this.dialogVisible = false;
},
saveJudgment () { // 确认选择判分点
if (this.selectedJudgment.length) {
this.savingJud = true
this.judgementpointsquery = "";
this.dialogVisible = false;
let tempArr = this.selectedJudgment.map(i => {
this.$set(i, 'score', 0)
return i;
});
this.projectJudgmentData = this.projectJudgmentData.concat(tempArr);
this.projectJudgmentData.map((e, i) => {
e.sort = i + 1;
});
this.$nextTick(() => {
this.savingJud = false
this.$refs.projectJudgementTable.clearSelection();
});
} else {
this.$message.error("请选择判分点");
}
},
// 行拖拽
rowDrop () {
// 此时找到的元素是要拖拽元素的父容器
const tbody = document.querySelector(".el-table__body tbody");
const that = this;
this.$refs.projectJudgementTable && Sortable.create(tbody, {
// 指定父元素下可被拖拽的子元素
// draggable: ".draggable .el-table__row",
onUpdate ({ newIndex, oldIndex }) {
console.log("🚀 ~ onEnd ~ newIndex, oldIndex:", newIndex, oldIndex)
if (newIndex == oldIndex) return false
const currentRow = that.projectJudgmentData.splice(oldIndex, 1)[0]
that.projectJudgmentData.splice(newIndex, 0, currentRow)
}
});
},
// 修改判分点中间表
async updateProjectJudgment () {
let param = this.projectJudgmentData.map((e, i) => {
let obj = {
judgmentId: e.judgmentId,
projectId: this.projectId || "",
score: e.score,
sort: i + 1,
id: e.id
};
return obj;
});
await this.$post(`${this.api.updateProjectJudgment}?projectId=${this.projectId}`, param).then(res => {
let tempArr = this.projectJudgmentData.map(i => {
let obj = {
projectId: this.projectId ? this.projectId : "",
judgmentId: i.judgmentId,
score: i.score,
sort: i.sort
};
return obj;
});
let params = {
projectManage: this.projectManage,
projectJudgmentList: tempArr
};
this.updateProject(params);
}).catch(err => {
console.log(err);
});
},
handleCacheData () { // 处理缓存数据
this.isToPoint = true;
this.$store.dispatch("setProject", {
projectManage: this.projectManage,
projectJudgmentData: this.projectJudgmentData
});
},
toJudgePoint (type, row) { // 进入判分点系统
this.handleCacheData();
let jumpPath = Setting.jumpPath;
let { systemId } = this.projectManage;
let href = "";
if (type === "view") {
// 查看
if (systemId == 2) {
console.log(systemId);
} else if (systemId == 3) {
console.log(systemId);
} else if (this.isLc) {
// 交易类判分点(银行综合系统)
href = `${jumpPath}/#/Transaction?isView=true&systemId=${systemId}&lcId=${row.judgmentId}&token=${this.token}&referrer=${btoa(location.href)}`;
} else {
// 编程类判分点(python子系统)
href = `${jumpPath}/#/program?isView=true&systemId=${systemId}&bcId=${row.judgmentId}&token=${this.token}&referrer=${btoa(location.href)}`;
}
} else if (type === "edit") {
// 自定义(老师端隐藏此功能)
if (systemId == 2) {
console.log(systemId);
} else if (systemId == 3) {
console.log(systemId);
} else if (this.isLc) {
// 交易类判分点(银行综合系统)
href = `${jumpPath}/#/Transaction?isEdit=true&systemId=${systemId}&lcId=${row.judgmentId}&token=${this.token}&referrer=${btoa(location.href)}`;
} else {
// 编程类判分点(python子系统)
href = `${jumpPath}/#/program?isEdit=true&systemId=${systemId}&bcId=${row.judgmentId}&token=${this.token}&referrer=${btoa(location.href)}`;
}
} else if (type === "home") {
if (systemId == 2 || systemId == 3) {
href = `${jumpPath}/#/list`;
} else {
// 进入判分点系统首页(老师端隐藏此功能)
href = `${jumpPath}#/?systemId=${systemId}&token=${this.token}&referrer=${btoa(location.href)}`;
}
}
location.href = href;
},
// 返回列表
toList () {
this.$router.push(this.$store.state.innerReferrer)
},
// 返回
back () {
// 更改了信息才需要提示
if (this.updateTime) {
this.$confirm('编辑的内容未保存,是否保存?', "提示", {
type: "warning",
closeOnClickModal: false
}).then(() => {
this.handleSubmit(this.projectManage.state)
}).catch(() => {
this.toList()
})
} else {
this.toList()
}
}
}
};
</script>
<style lang="scss" scoped>
/deep/ .readonly .ql-toolbar {
height: 0;
padding: 0;
border-bottom: 0;
}
.main {
overflow: auto;
overflow-x: hidden;
height: calc(100vh - 161px);
}
</style>