Files
UNION_NJUST/target/classes/views/platform/zgfw/question/question.html
T
2026-09-23 09:38:39 +08:00

1457 lines
82 KiB
HTML

<!--#
layout("/layouts/platform.html"){
#-->
<style>
#qsmEditor .w-e-text-container {
height: 200px !important;
}
#qsmEditor div {
z-index: 0 !important;
}
.btDiv {
cursor: pointer;
}
.btDiv:hover {
background-color: rgb(240, 240, 240);
}
.shou {
cursor: pointer;
}
.issue {
cursor: pointer;
padding: 20px 0;
}
.issue:hover {
background-color: rgb(240, 240, 240);
}
.el-divider {
background-color: #409EFF;
}
.el-divider__text {
color: #409EFF;
}
.inputParent input {
border: none;
border-bottom: 1px solid rgb(220, 223, 230);
border-radius: 0;
}
.issueList > .el-table__header-wrapper {
display: none;
}
.issueList .el-table__expanded-cell {
background-color: rgb(250, 250, 250) !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="btn-group tool-button">
<el-date-picker
:clearable="false"
placeholder="选择年"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
<div class="btn-group tool-button">
<el-input placeholder="请输入内容" v-model="pageForm.qtitle">
<template slot="prepend">标题</template>
</el-input>
</div>
<div class="btn-group tool-button">
<el-button @click="doSearch" icon="el-icon-search"
style="background-color:#409eff;color: white;"></el-button>
</div>
<div class="pull-right offscreen-right">
<el-button @click="openAdd" plain size="medium" type="primary"><i class="ti-plus"></i> 新建问卷调查
</el-button>
</div>
</el-card>
<el-card class="mt20" shadow="never">
<el-table :data="tableData" align="center" header-align="center" size="medium" style="width: 100%">
<el-table-column
align="center" header-align="center" label="序号" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="标题"
prop="qtitle">
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="说明"
prop="qsm"
show-overflow-tooltip="true">
<template scope="scope">
<div v-html="scope.row.qsm" v-if="!isNull(scope.row.qsm)">{{scope.row.qsm}}</div>
<span v-else>暂无</span>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="创建人"
prop="username">
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="创建时间"
prop="qctime">
</el-table-column>
<el-table-column align="center" label="类型" prop="qlx">
<template scope="{row}">
<span v-if="row.qlx===1">调查</span>
<span v-if="row.qlx===2">答题</span>
<span v-if="row.qlx===3">购物调查</span>
<span v-if="row.qlx===4">意向选择</span>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="状态"
prop="qflag">
<template scope="scope">
<span style="color: #E6A23C" v-if="scope.row.qflag==1">未开启</span>
<span style="color: #67C23A" v-if="scope.row.qflag==2">已开启</span>
<span style="color: #F56C6C" v-if="scope.row.qflag==3">已关闭</span>
</template>
</el-table-column>
<!-- <el-table-column align="center" label="问卷调查二维码">-->
<!-- <template slot-scope="scope">-->
<!-- <el-button size="small" plain type="primary" @click="saveCode(scope.row.qid)">保存二维码-->
<!-- </el-button>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column align="center" header-align="center" label="操作" width="300px">
<template scope="scope">
<el-button @click="openView(scope.row.qid)" size="small">查看</el-button>
<el-button @click="upZt(scope.row.qid,2)" plain size="small"
type="success" v-if="scope.row.qflag==1||scope.row.qflag==3">开启
</el-button>
<el-button @click="upZt(scope.row.qid,3)" plain size="small"
type="danger" v-if="scope.row.qflag==2">关闭
</el-button>
<el-button @click="openEdit(scope.row.qid)" plain size="small"
type="primary" v-if="scope.row.qflag==1||scope.row.qflag==3">编辑
</el-button>
<el-button @click="doDelete(scope.row.qid)" plain size="small"
type="danger" v-if="scope.row.qflag==1||scope.row.qflag==3">删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
:current-page="pageForm.pageNumber"
:page-size="pageForm.pageSize"
:page-sizes="[10, 20, 30, 50]"
:total="pageForm.totalCount"
@current-change="pageNumberChange"
@size-change="pageSizeChange"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
</el-row>
</el-card>
</template>
<template #edit_func>
<el-button @click="operation" plain size="medium" type="primary">确定</el-button>
</template>
<template #edit>
<div style="height:calc(100vh - 180px);overflow-y: scroll">
<el-form :model="formData" :rules="formRules" label-position="right" label-width="120px"
ref="addform">
<el-divider content-position="left"><span style="color:#409EFF;">设置标题</span></el-divider>
<el-form-item label="问卷类型" prop="qlx">
<el-radio-group @change="questionTypeChange" v-model="formData.qlx">
<el-radio :label="1" border>调查</el-radio>
<el-radio :label="2" border>答题</el-radio>
<el-radio :label="3" border>购物调查</el-radio>
<el-radio :label="4" border>意向选择</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item class="is-required" label="标题" prop="qtitle">
<el-input placeholder="请填写标题"
v-model="formData.qtitle"></el-input>
</el-form-item>
<el-row :gutter="20" v-show="formData.qlx!==4">
<el-col :span="10">
<el-form-item class="is-required" label="每日可答次数" label-width="120px" prop="qrkdcs">
<el-input-number :max="100" :min="1"
controls-position="right"
style="width: 100%" v-model="formData.qrkdcs"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="每日答题时间" label-width="200px" prop="qdtkssj">
<el-time-picker
end-placeholder="结束时间"
is-range
placeholder="选择时间范围"
range-separator="-"
start-placeholder="开始时间"
style="width: 100%"
v-model="formData.qdtsj"
value-format="HH:mm:ss">
</el-time-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="开始时间" prop="startTime">
<el-date-picker
style="width: 100%"
type="datetime"
v-model="formData.startTime"
value-format="timestamp">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="结束时间" prop="endTime">
<el-date-picker
:picker-options="endTimeOptions"
style="width: 100%"
type="datetime"
v-model="formData.endTime"
value-format="timestamp">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8" v-show="formData.qlx===4">
<el-form-item label="自动选择默认项" label-width="150px" prop="autoSelect">
<el-switch
v-model="formData.autoSelect"
>
</el-switch>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="说明" prop="qsm">
<div id="qsmEditor"></div>
</el-form-item>
<el-form-item label="参加人员" prop="activityUserScopeId">
<el-select clearable v-model="formData.activityUserScopeId">
<el-option :key="item.groupId"
:label="item.groupName"
:value="item.groupId"
v-for="item in activityUserScopeList"></el-option>
</el-select>
</el-form-item>
<div class="btDiv" style="margin-bottom: 10px" title="编辑问卷标题与问卷说明">
<el-row style="text-align: center">
<h2>{{formData.qtitle}}</h2>
</el-row>
<el-row>
<el-col :span="21" offset="1">
<div v-html="formData.qsm" v-if="!isNull(formData.qsm)">{{formData.qsm}}
</div>
</el-col>
</el-row>
</div>
<el-divider content-position="left">题目列表</el-divider>
<el-row style="margin-top: 10px">
<el-table :data="formData.issues" :key="tableKey"
class="issueList"
default-expand-all="true"
highlight-current-row="true"
style="width: 100%">
<el-table-column label="选项" type="expand">
<template slot-scope="props">
<el-row style="margin-bottom: 10px">
<div class="btn-group tool-button mt5">
题目设置:
</div>
<div class="btn-group tool-button mt5">
<el-button @click="openIssueName(props.$index,'iname')"
size="small">
设置标题
</el-button>
</div>
<div class="btn-group tool-button mt5">
<el-button @click="openIssueName(props.$index,'its')" size="small">
设置提示
</el-button>
</div>
<div class="btn-group tool-button mt5">
<el-select
@change="if(props.row.itx==2){props.row.iplfs=1;props.row.iisdx=true;props.row.wors=[{}]}else{props.row.wors=[{wtxt:'选项1'},{wtxt:'选项2'}]}"
placeholder="题型" size="small"
style="width: 100px"
v-model="props.row.itx">
<el-option
:key="item.x"
:label="item.y"
:value="item.x"
v-for="item in [{x:1,y:'选择题'},{x:2,y:'填空题'}]">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5">
<el-select placeholder="是否必答" size="small"
style="width: 100px"
v-model="props.row.iisbd">
<el-option
:key="item.x"
:label="item.y"
:value="item.x"
v-for="item in [{x:true,y:'必答'},{x:false,y:'选答'}]">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5" v-if="props.row.itx==1">
<el-select placeholder="单选/多选" size="small"
style="width: 100px"
v-model="props.row.iisdx">
<el-option
:key="item.x"
:label="item.y"
:value="item.x"
v-for="item in [{x:true,y:'单选'},{x:false,y:'多选'}]">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5" v-if="props.row.iisdx==false">
<el-input-number :max="5"
:min="1" controls-position="right"
placeholder="最小选择数"
size="small" style="width: 130px"
v-model="props.row.iminselect"></el-input-number>
</div>
<div class="btn-group tool-button mt5" v-if="props.row.iisdx==false">
<el-input-number :max="20"
:min="1" controls-position="right"
placeholder="最大选择数"
size="small" style="width: 130px"
v-model="props.row.imaxselect"></el-input-number>
</div>
<div class="btn-group tool-button mt5" v-if="props.row.itx==1">
<el-select @change="if(props.row.iplfs==2){props.row.icolnum=2}"
placeholder="排列方式"
size="small"
style="width: 110px"
v-model="props.row.iplfs">
<el-option
:key="item.x"
:label="item.y"
:value="item.x"
v-for="item in [{x:1,y:'竖向排列'},{x:2,y:'横向排列'}]">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button mt5" v-if="props.row.iplfs==2">
<el-input-number :max="12"
:min="1" controls-position="right"
placeholder="每行多少列"
size="small" style="width: 130px"
v-model="props.row.icolnum"></el-input-number>
</div>
<div class="btn-group tool-button mt5" v-if="formData.qlx===2">
<el-input
placeholder="请输入分值"
size="small"
style="width: 120px"
type="number"
v-model="formData.issues[props.$index]['fraction']">
</el-input>
</div>
<div class="btn-group tool-button mt5">
<el-date-picker placeholder="请选择显示日期"
size="small"
type="date"
v-model="formData.issues[props.$index]['displayDate']"
value-format="yyyy-MM-dd">
</el-date-picker>
</div>
</el-row>
<el-row v-if="props.row.itx==1">
<el-table :data="props.row.wors" border style="width: 100%">
<el-table-column header-align="center"
label="选项文字"
property="wtxt">
<template slot-scope="scope">
<el-row>
<el-col :span="20">
<el-input placeholder="选项文字" size="small"
maxlength="100"
v-model="scope.row.wtxt"></el-input>
</el-col>
<el-col :span="2">
<el-button
@click="props.row.wors.splice(scope.$index+1,0,{wtxt:'选项'+(props.row.wors.length+1)})"
circle
icon="el-icon-plus"
size="mini"
style="margin-left: 5px"
type="info"></el-button>
</el-col>
<el-col :span="2">
<el-button @click="props.row.wors.splice(scope.$index,1)"
circle
icon="el-icon-minus"
size="mini"
style="margin-left: 5px"
type="info"></el-button>
</el-col>
</el-row>
</template>
</el-table-column>
<el-table-column align="center" header-align="center"
label="图片"
width="130px">
<template slot-scope="scope">
<tab-upload :allowfiles="['png','jpg','jpeg','svg']"
:filex="scope.row.wimg ? FILE_STREAM_PREVIEW_ADDRESS + '?id=' + scope.row.wimg : ''"
:resfile.sync="scope.row.wimg"
maxnum="1"></tab-upload>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="说明"
property="wsm"
width="250px"
>
<template slot-scope="scope">
<el-input
autosize
placeholder="请输入说明"
type="textarea"
v-if="formData.qlx!==4"
v-model="scope.row.wsm">
</el-input>
<el-button @click="openCakeDesc(props,scope)" type="text"
v-else>
编辑说明
</el-button>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="链接"
property="wlj"
width="150px"
>
<template slot-scope="scope">
<el-input
autosize
placeholder="请输入链接"
type="textarea"
v-model="scope.row.wlj">
</el-input>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="允许填空"
property="wistk"
width="80px"
>
<template slot-scope="scope">
<template>
<el-checkbox v-model="scope.row.wistk">
<!-- {{scope.row.wistk==true?'允许':'不允许'}}-->
</el-checkbox>
<el-checkbox v-if="scope.row.wistk"
v-model="scope.row.wisbt">必填
</el-checkbox>
</template>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="默认选中"
property="wismr"
width="80px"
>
<template slot-scope="scope">
<template>
<el-checkbox
@change="upMr(props.$index,scope.$index,scope.row.wismr)"
v-model="scope.row.wismr"></el-checkbox>
</template>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="是否正确答案"
property="correct"
v-if="formData.qlx==2"
width="80px"
>
<template slot-scope="scope">
<template>
<el-checkbox
@change="upCorrect(props.$index,scope.$index,scope.row.correct)"
v-model="scope.row.correct"></el-checkbox>
</template>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="单价"
property="correct"
v-if="formData.qlx==3"
width="200px"
>
<template slot-scope="scope">
<el-input-number :max="100000"
:precision="2" :step="1"
controls-position="right"
v-model="scope.row.price"></el-input-number>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="上移"
width="80px"
>
<template slot-scope="scope">
<el-button @click="worPx(props.$index,scope.$index,true)" circle
icon="el-icon-top"
size="small"
type="info"></el-button>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="下移"
width="80px"
>
<template slot-scope="scope">
<el-button @click="worPx(props.$index,scope.$index,false)" circle
icon="el-icon-bottom"
size="small" type="info"></el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row v-if="props.row.itx==2">
</el-row>
</template>
</el-table-column>
<el-table-column align="left" header-align="left" label="issue">
<template scope="issue">
<el-col :span="1">
<span style="color: red" v-if="issue.row.iisbd">*</span>
<span style="font-weight: bolder">{{issue.$index+1}}.</span>
</el-col>
<el-col :span="23">
<el-row>
<el-col :span="1" v-if="issue.row.fraction">
<span>({{issue.row.fraction}}分)</span>
</el-col>
<el-col :span="23">
<span v-html="issue.row.iname"></span>
</el-col>
</el-row>
<el-row>
<div style="color: rgb(160,160,160)" v-html="issue.row.its"
v-if="!isNull(issue.row.its)"></div>
</el-row>
<el-row v-if="issue.row.itx==1">
<template v-if="issue.row.iplfs==1">
<!--竖向排列-->
<el-row v-for="wor,idx in issue.row.wors">
<el-row style="margin-top: 5px" v-if="wor.wimg">
<el-image
:src="FILE_STREAM_PREVIEW_ADDRESS + '?id=' +wor.wimg"
fit="fill"
style="max-width: 100px;max-height: 100px"></el-image>
</el-row>
<el-row style="margin-top: 5px" v-if="!isNull(wor.wimg)">
<div style="color: rgb(160,160,160);text-align: left">
<div v-html="wor.wsm"></div>
</div>
</el-row>
<el-row style="margin-top: 5px">
<el-radio :label="idx"
v-if="issue.row.iisdx==true" v-model="issue.row.xz">
<div v-html="wor.wtxt"></div>
<!-- {{wor.wtxt}} &nbsp;-->
<span class="inputParent"
v-if="wor.wistk==true"><el-input
size="mini" style="border-top: none"
v-model="wor.tktxt"></el-input> <span
style="color:red;"
v-if="wor.wisbt==true">*</span></span>
</el-radio>
<el-checkbox :key="idx" :label="idx"
v-if="issue.row.iisdx==false">
{{wor.wtxt}} <span class="inputParent"
v-if="wor.wistk==true"><el-input
size="mini" style="border-top: none"
v-model="wor.tktxt"></el-input> <span
style="color:red;"
v-if="wor.wisbt==true">*</span></span>
</el-checkbox>
<el-row style="margin-top: 5px"
v-if="isNull(wor.wimg)&&!isNull(wor.wsm)">
<div style="color: rgb(160,160,160)">
<div v-html="wor.wsm"></div>
</div>
</el-row>
</el-row>
</el-row>
</template>
<template v-if="issue.row.iplfs==2">
<!--横向排列-->
<el-row :gutter="20" v-for="idx1 in issue.row.wors.length">
<el-col :span="parseInt(24/issue.row.icolnum)"
v-for="idx2 in issue.row.icolnum">
<div v-if="(idx1-1)*issue.row.icolnum+idx2<=issue.row.wors.length">
<el-row style="margin-top: 5px"
v-if="issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wimg">
<el-image
:src="FILE_STREAM_PREVIEW_ADDRESS + '?id=' +issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wimg"
fit="fill"
style="max-width: 100px;max-height: 100px"></el-image>
</el-row>
<el-row style="margin-top: 5px"
v-if="!isNull(issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wimg)">
<div style="color: rgb(160,160,160);text-align: left">
{{issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wsm}}
</div>
</el-row>
<el-row style="margin-top: 5px">
<el-radio :label="idx1+'-'+idx2"
v-if="issue.row.iisdx==true"
v-model="issue.row.xz">
{{issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wtxt}}
&nbsp;<span
class="inputParent"
v-if="issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wistk==true"><el-input
size="mini"
style="border-top: none"
v-model="issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].tktxt"></el-input> <span
style="color:#ff0000;"
v-if="issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wisbt==true">*</span></span>
</el-radio>
<el-checkbox :key="idx1+'-'+idx2"
:label="idx1+'-'+idx2"
v-if="issue.row.iisdx==false">
{{issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wtxt}}
<span class="inputParent"
v-if="issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wistk==true"><el-input
size="mini"
style="border-top: none"
v-model="issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].tktxt"></el-input> <span
style="color:red;"
v-if="issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wisbt==true">*</span></span>
</el-checkbox>
<el-row style="margin-top: 5px"
v-if="isNull(issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wimg)&&!isNull(issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wsm)">
<div style="color: rgb(160,160,160)">
&nbsp;&nbsp;&nbsp;&nbsp;{{issue.row.wors[((idx1-1)*issue.row.icolnum+idx2)-1].wsm}}
</div>
</el-row>
</el-row>
</div>
</el-col>
</el-row>
</template>
</el-row>
<el-row v-if="issue.row.itx==2">
<el-input size="small" style="width: 50%"
v-for="wor in issue.row.wors"
v-model="issue.row.tktxt"></el-input>
</el-row>
</el-col>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="操作" width="180px">
<template scope="scope">
<el-button @click="issuePx(scope.$index,true)" circle icon="el-icon-top"
size="small"
type="primary"></el-button>
<el-button @click="issuePx(scope.$index,false)" circle icon="el-icon-bottom"
size="small" type="primary"></el-button>
<el-button @click="formData.issues.splice(scope.$index,1)" circle
icon="el-icon-delete"
size="small" type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row style="text-align: center;margin-top: 10px">
<el-button
:disabled="formData.qlx===4 && formData.issues && formData.issues.length===1"
@click="formData.issues.push({wors:[{wtxt:'选项1'},{wtxt:'选项2'}],itx:1,its:'',iisrandom:false,iisbd:true,iisdx:true,iname:'<p><b>标题</b></p>',iplfs:1})">
添加题目
</el-button>
</el-row>
</el-form>
</div>
</template>
<template #view>
<div style="height:calc(100vh - 180px);overflow-y: scroll">
<el-card class="box-card v-box" shadow="never">
<div style="padding-left: 20px;padding-right: 20px">
<el-row style="text-align: center">
<h2>{{viewData.qtitle}}</h2>
</el-row>
<el-row style="margin-bottom: 20px">
<div v-html="viewData.qsm"></div>
</el-row>
<el-row style="border-bottom: 1px solid rgb(200,200,200);padding: 20px 0;margin-bottom: 20px"
v-for="issue,idx in viewData.issues">
<el-col :span="1">
<span style="color: red" v-if="issue.iisbd">*</span>
<span style="font-weight: bolder">{{idx+1}}.</span>
</el-col>
<el-col :span="23">
<el-row>
<div v-html="issue.iname"></div>
</el-row>
<el-row>
<div style="color: rgb(160,160,160)" v-html="issue.its"
v-if="!isNull(issue.its)"></div>
</el-row>
<el-row v-if="issue.itx==1">
<template v-if="issue.iplfs==1">
<!--竖向排列-->
<el-row :style="isNull(wor.wimg)?'':'text-align: center'"
v-for="wor,idx in issue.wors">
<el-row style="margin-top: 5px" v-if="!isNull(wor.wimg)">
<el-image
:src="FILE_STREAM_PREVIEW_ADDRESS + '?id=' +wor.wimg"
fit="cover"
style="width: 100px;max-width: 100px"></el-image>
</el-row>
<el-row style="margin-top: 5px" v-if="!isNull(wor.wimg)">
<div style="color: rgb(160,160,160);text-align: left" v-html="wor.wsm">
</div>
</el-row>
<el-row style="margin-top: 5px">
<el-radio :label="idx" v-if="issue.iisdx==true" v-model="issue.xz">
{{wor.wtxt}} &nbsp;<span class="inputParent" v-if="wor.wistk==true"><el-input
size="mini" style="border-top: none"
v-model="wor.tktxt"></el-input> <span
style="color:red;" v-if="wor.wisbt==true">*</span></span>
</el-radio>
<el-checkbox :key="idx" :label="idx" v-if="issue.iisdx==false">
{{wor.wtxt}} <span class="inputParent" v-if="wor.wistk==true"><el-input
size="mini" style="border-top: none"
v-model="wor.tktxt"></el-input> <span
style="color:red;" v-if="wor.wisbt==true">*</span></span>
</el-checkbox>
<el-row style="margin-top: 5px"
v-if="isNull(wor.wimg)&&!isNull(wor.wsm)">
<div style="color: rgb(160,160,160)" v-html="wor.wsm">
</div>
</el-row>
</el-row>
</el-row>
</template>
<template v-if="issue.iplfs==2">
<!--横向排列-->
<el-row :gutter="20" v-for="idx1 in issue.wors.length">
<el-col :span="parseInt(24/issue.icolnum)"
v-for="idx2 in issue.icolnum">
<div :style="isNull(issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wimg)?'':'text-align: center'"
v-if="(idx1-1)*issue.icolnum+idx2<=issue.wors.length">
<el-row style="margin-top: 5px"
v-if="!isNull(issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wimg)">
<el-image
:src="issue.wors[((idx1-1)*issue.icolnum+idx2)-1].islocal?issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wimg:FILE_STREAM_PREVIEW_ADDRESS + '?id=' +issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wimg"
fit="cover"
style="width: 100%;max-width: 300px"></el-image>
</el-row>
<el-row style="margin-top: 5px"
v-if="!isNull(issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wimg)">
<div style="color: rgb(160,160,160);text-align: left">
{{issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wsm}}
</div>
</el-row>
<el-row style="margin-top: 5px">
<el-radio :label="idx1+'-'+idx2" v-if="issue.iisdx==true"
v-model="issue.xz">
{{issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wtxt}}
&nbsp;<span
class="inputParent"
v-if="issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wistk==true"><el-input
size="mini"
style="border-top: none"
v-model="issue.wors[((idx1-1)*issue.icolnum+idx2)-1].tktxt"></el-input> <span
style="color:red;"
v-if="issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wisbt==true">*</span></span>
</el-radio>
<el-checkbox :key="idx1+'-'+idx2" :label="idx1+'-'+idx2"
v-if="issue.iisdx==false">
{{issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wtxt}}
<span class="inputParent"
v-if="issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wistk==true"><el-input
size="mini"
style="border-top: none"
v-model="issue.wors[((idx1-1)*issue.icolnum+idx2)-1].tktxt"></el-input> <span
style="color:red;"
v-if="issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wisbt==true">*</span></span>
</el-checkbox>
<el-row style="margin-top: 5px"
v-if="isNull(issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wimg)&&!isNull(issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wsm)">
<div style="color: rgb(160,160,160)">
&nbsp;&nbsp;&nbsp;&nbsp;{{issue.wors[((idx1-1)*issue.icolnum+idx2)-1].wsm}}
</div>
</el-row>
</el-row>
</div>
</el-col>
</el-row>
</template>
</el-row>
<el-row v-if="issue.itx==2">
<el-input size="small" style="width: 50%" v-for="wor in issue.wors"
v-model="issue.tktxt"></el-input>
</el-row>
</el-col>
</el-row>
</div>
</el-card>
</div>
</template>
</guava>
<!-- <el-row class="transition-row">-->
<!-- <transition name="el-zoom-in-center">-->
<!-- <div v-show="v=='add'||v=='edit'" class="transition-item">-->
<!-- <el-card class="box-card v-box" shadow="never">-->
<!-- <div slot="header" class="clearfix">-->
<!-- <el-button icon="el-icon-back" type="text" @click="v='index'"-->
<!-- style="font-size: 18px">返回-->
<!-- </el-button>-->
<!-- <div class="pull-right offscreen-right mt5">-->
<!-- <el-button size="medium" type="primary" plain @click="operation">确 定</el-button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </el-card>-->
<!-- </div>-->
<!-- </transition>-->
<!-- <transition name="el-zoom-in-center">-->
<!-- <div v-show="v=='view'" class="transition-item">-->
<!-- </div>-->
<!-- </transition>-->
<!-- </el-row>-->
<el-dialog :close-on-click-modal="false"
:visible.sync="setTitleDialogVisible" custom-class="ViewDialogClass" width="50%">
<div id="upTxtEditor"></div>
<span class="dialog-footer" slot="footer">
<el-button @click="setTitleDialogVisible = false" v-show="!addDialogVisible">取 消</el-button>
<el-button @click="upIssueName" type="primary">确 定</el-button>
</span>
</el-dialog>
<a id="download" style="display: none"></a>
<div id="qrcode" style="display: none;width: 500px;height: 500px"></div>
<el-dialog :close-on-click-modal="false" :visible.sync="cakeDialog" id="cakeDialog" title="编辑说明" width="50%">
<div id="cakeEditor"></div>
<span class="dialog-footer" slot="footer">
<el-button @click="cakeDialog = false">取 消</el-button>
<el-button @click="upCakeDesc" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script src="${base!}/assets/platform/js/jquery.qrcode.min.js"></script>
<script>
let qsmEditor
let upTxtEditor
let cakeEditor
let vue = new Vue({
el: '#app',
data() {
return {
cakeDialog: false,
addDialogVisible: false,
tableData: [],
v: 'index',
pageForm: {
searchName: "",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
qlx: 1,
pageOrderName: "",
pageOrderBy: "",
year: new Date().getFullYear() + ''
},
viewData: {issue: [{word: []}]},
formData: {issues: [{wors: [{}]}]},
setTitleDialogVisible: false,
formRules: {
qtitle: [{required: true, message: '请填写标题', trigger: ['blur', 'change']}],
qlx: [{required: true, message: '请选择类型', trigger: ['blur', 'change']}],
},
isNull(val) {
if (val == '' || val == undefined || val == null) {
return true
}
return false
},
issueIdx: null,
issueName: null,
delIssueIds: [],
delWorIds: [],
tableKey: '',
appid: 'wx9fd2b07ea126f9f6',
redirect_uri: location.protocol + "//" + location.host,
cake_subject: 0,
cake_subject_option: 0,
endTimeOptions: {
disabledDate(val) {
return val.getTime() < new Date().getTime()
}
},
activityUserScopeList: []
}
},
components: {
'tab-upload': httpVueLoader('/components/plugins/TabUpload.vue')
},
methods: {
openCakeDesc(subject, option) {
this.cake_subject = subject.$index
this.cake_subject_option = option.$index
this.cakeDialog = true
this.$nextTick(() => {
$('#cakeEditor').html("")
cakeEditor = new window.wangEditor('#cakeEditor')
cakeEditor.config.uploadImgShowBase64 = true // 使用 base64 保存图片
// cakeEditor.customConfig.uploadImgShowBase64 = true
cakeEditor.create()
console.log(cakeEditor)
const wsm = this.formData.issues[this.cake_subject]['wors'][this.cake_subject_option]['wsm']
if (wsm) {
cakeEditor.txt.html(wsm)
}
})
},
upCakeDesc() {
const wsm = cakeEditor.txt.html()
this.formData.issues[this.cake_subject]['wors'][this.cake_subject_option]['wsm'] = wsm
this.cakeDialog = false
},
questionTypeChange(val) {
if (val === 4 && this.formData.issues.length > 1) {
this.formData.issues = this.formData.issues.slice(0, 1);
}
},
IEVersion() {
let userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
let isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1; //判断是否IE<11浏览器
let isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器
let isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1;
if (isIE) {
let reIE = new RegExp("MSIE (\\d+\\.\\d+);");
reIE.test(userAgent);
let fIEVersion = parseFloat(RegExp["$1"]);
if (fIEVersion == 7) {
return 7;
} else if (fIEVersion == 8) {
return 8;
} else if (fIEVersion == 9) {
return 9;
} else if (fIEVersion == 10) {
return 10;
} else {
return 6;//IE版本<=7
}
} else if (isEdge) {
return 'edge';//edge
} else if (isIE11) {
return 11; //IE11
} else {
return -1;//不是ie浏览器
}
},
dwnCode(name) {
let type = 'png';
if (this.IEVersion() != -1) {
let blob = $("canvas").get(0).msToBlob();
window.navigator.msSaveBlob(blob, name + '_' + (new Date()).getTime() + '.' + type);
} else {
$('#download').attr({
href: $("canvas").get(0).toDataURL('image/png').replace("image/png", "image/octet-stream"),
download: name + '_' + (new Date()).getTime() + '.' + type
}).get(0).click();
}
},
saveCode(qid) {
let self = this
$("#qrcode").html("")
$("#qrcode").qrcode({ //设置css
render: "canvas", //二维码的生成方式
width: $("#qrcode").width(), //生成二维码的宽度
height: $("#qrcode").width(), //生成二维码的高度
text: self.redirect_uri + '/platform/zgfw/mobile/questionnaire?qid=' + qid,
correctLevel: 3 //容错级别,默认为2,最高为3,为了让用户扫码最快,容错级别应当设为最低
});
this.$nextTick(() => {
this.dwnCode("问卷调查")
})
},
upZt(qid, flag) {
$.post("/platform/zgfw/question/upZt", {qid: qid, flag: flag}, (data) => {
if (data.code == 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
})
},
openView(qid) {
$.get("/platform/zgfw/question/findOne", {qid: qid}, (data) => {
if (data.code == 0) {
data.data.issues.forEach((issue) => {
issue.xz = []
issue.wors.forEach((wor) => {
if (wor.wismr == true && issue.iisdx == true
) {
issue.xz = wor.wid
} else if (wor.wismr == true && issue.iisdx == false) {
issue.xz.push(wor.wid)
}
})
if (issue.iplfs == 2) {
issue.wors_ = []
for (let i = 0; i < issue.wors.length; i += issue.icolnum) {
let arr = []
for (let j = 0; j < issue.icolnum; j++) {
arr.push(issue.wors[i + j])
}
issue.wors_.push(arr)
}
}
})
this.viewData = data.data
// this.v = 'view'
this.$refs.guava.view()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
})
},
worPx(iidx, widx, isTop) {
if (isTop && widx > 0) {
let v = JSON.parse(JSON.stringify(this.formData.issues[iidx].wors[widx]))
this.$set(this.formData.issues[iidx].wors, widx, this.formData.issues[iidx].wors[widx - 1])
this.$set(this.formData.issues[iidx].wors, widx - 1, v)
} else if (!isTop && widx < this.formData.issues[iidx].wors.length - 1) {
let v = JSON.parse(JSON.stringify(this.formData.issues[iidx].wors[widx]))
this.$set(this.formData.issues[iidx].wors, widx, this.formData.issues[iidx].wors[widx + 1])
this.$set(this.formData.issues[iidx].wors, widx + 1, v)
}
},
upMr(iidx, widx, val) {
if (this.formData.issues[iidx].iisdx && val == true) {
this.formData.issues[iidx].wors.forEach((v) => {
v.wismr = false
})
this.formData.issues[iidx].wors[widx].wismr = true
}
},
upCorrect(iidx, widx, val) {
if (this.formData.issues[iidx].iisdx && val) {
this.formData.issues[iidx].wors.forEach((v) => {
v.correct = false
})
this.formData.issues[iidx].wors[widx].correct = true
}
},
issuePx(idx, isTop) {
if (isTop && idx > 0) {
let v = JSON.parse(JSON.stringify(this.formData.issues[idx]))
this.formData.issues[idx] = this.formData.issues[idx - 1]
this.formData.issues[idx - 1] = v
} else if (!isTop && idx < this.formData.issues.length - 1) {
let v = JSON.parse(JSON.stringify(this.formData.issues[idx]))
this.formData.issues[idx] = this.formData.issues[idx + 1]
this.formData.issues[idx + 1] = v
}
},
upIssueName() {
this.formData.issues[this.issueIdx][this.issueName] = upTxtEditor.txt.html()
this.issueIdx = null
this.issueName = null
this.setTitleDialogVisible = false
},
delWor(props, scope) {
if (!this.isNull(scope.row.wid)) {
this.delWorIds.push(scope.row.wid)
}
props.row.wors.splice(scope.$index, 1)
},
delIssue(scope) {
if (!this.isNull(scope.row.iid)) {
this.delIssueIds.push(scope.row.iid)
}
this.formData.issues.splice(scope.$index, 1)
},
openIssueName(idx, name) {
this.issueIdx = idx
this.issueName = name
this.setTitleDialogVisible = true
this.$nextTick(() => {
$('#upTxtEditor').html("")
E = window.wangEditor
upTxtEditor = new E('#upTxtEditor')
upTxtEditor.config.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
'backColor', // 背景颜色
'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
'table', // 表格
'code', // 插入代码
'undo', // 撤销
'redo' // 重复
]
upTxtEditor.config.uploadImgShowBase64 = true // 使用 base64 保存图片
upTxtEditor.create()
if (!this.isNull(this.formData.issues[idx][name])) {
upTxtEditor.txt.html(this.formData.issues[idx][name])
}
})
},
doDelete(id) {
let that = this
this.$confirm('确定要删除吗', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback(a, b) {
if ("confirm" == a) {//确认后再执行
$.post(base + "/platform/zgfw/question/delete", {qid: id}, (data) => {
if (data.code == 0) {
that.$message({
message: data.msg,
type: 'success'
});
that.pageData();
} else {
that.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
openAdd() {
this.$refs.guava.edit()
this.$nextTick(() => {
$('#qsmEditor').html("")
E = window.wangEditor
qsmEditor = new E('#qsmEditor')
qsmEditor.config.fontNames = [
'宋体',
'微软雅黑',
'Arial',
'Tahoma',
'Verdana'
]
qsmEditor.config.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
'backColor', // 背景颜色
'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
'table', // 表格
'code', // 插入代码
'undo', // 撤销
'redo' // 重复
]
qsmEditor.config.uploadImgShowBase64 = true
qsmEditor.config.onchange = (html) => {
this.$set(this.formData, "qsm", html)
}
qsmEditor.create()
this.formData = {issues: [], qlx: 2, qrkdcs: 1}
})
},
openEdit(qid) {
$.get("/platform/zgfw/question/findOne", {qid: qid}, (data) => {
if (data.code == 0) {
this.$nextTick(() => {
$('#qsmEditor').html(data.data.qsm)
E = window.wangEditor
qsmEditor = new E('#qsmEditor')
qsmEditor.config.onchange = (html) => {
this.$set(this.formData, "qsm", html)
}
qsmEditor.create()
this.formData = data.data
if (!this.isNull(this.formData.qdtkssj) && !this.isNull(this.formData.qdtjssj)) {
this.$set(this.formData, 'qdtsj', [this.formData.qdtkssj, this.formData.qdtjssj])
}
})
// this.v = "edit"
this.$refs.guava.edit()
} else {
this.$message.error(data.msg)
}
})
},
operation() {
if (this.formData.qlx === 4) {
if (this.formData.autoSelect && this.formData.endTime < new Date().getTime()) {
this.$message.warning('结束时间必须要大于当前时间')
return
}
}
if (this.formData.qid) {
this.doEdit()
} else {
this.doAdd()
}
// if (this.v == 'edit') {
// this.doEdit()
// } else if (this.v == 'add') {
// this.doAdd()
// }
},
doEdit() {
if (this.formData.issues.length < 1) {
this.$message.warning('请先添加问题!')
return
}
this.formData.issues.forEach((issue) => {
if (issue.iisdx == true) {
issue.iminselect = undefined
issue.imaxselect = undefined
}
if (issue.iplfs == 1) {
issue.icolnum = undefined
}
issue.wors.forEach((wor) => {
if (wor.wistk != true) {
wor.wisbt = undefined
}
})
})
if (!this.isNull(this.formData.qdtsj) && this.formData.qdtsj.length > 0) {
this.formData.qdtkssj = this.formData.qdtsj[0]
this.formData.qdtjssj = this.formData.qdtsj[1]
} else {
this.formData.qdtkssj = undefined
this.formData.qdtjssj = undefined
}
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.post(base + "/platform/zgfw/question/doEdit", {question: JSON.stringify(this.formData)}, (data) => {
if (data.code == 0) {
// this.v = 'index'
this.$refs.guava.index()
this.pageData()
this.$message.success(data.msg)
} else {
this.$message.error(data.msg);
}
loading.close()
})
},
doAdd() {
this.formData.issues.forEach(v => {
if (v.iisdx == true) {
v.iminselect = undefined
v.imaxselect = undefined
}
if (v.iplfs == 1) {
v.icolnum = undefined
}
v.wors.forEach(wor => {
if (wor.wistk != true) {
wor.wisbt = undefined
}
})
})
if (!this.isNull(this.formData.qdtsj) && this.formData.qdtsj.length > 0) {
this.formData.qdtkssj = this.formData.qdtsj[0]
this.formData.qdtjssj = this.formData.qdtsj[1]
}
const loading = this.$loading({
lock: true,
text: '数据提交中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
$.post(base + "/platform/zgfw/question/doAdd", {question: JSON.stringify(this.formData)}, (data) => {
if (data.code == 0) {
// this.v = 'index'
this.$refs.guava.index()
this.pageData()
this.$message.success(data.msg)
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
loading.close()
})
},
doSearch() {
this.pageForm.pageNumber = 1;
this.pageData();
},
pageOrder(column) {//按字段排序
switch (column.order) {
case 'descending':
column.order = 'desc'
break
case "ascending":
column.order = 'asc'
break
}
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {//加载分页数据
sublime.showLoadingbar();//显示loading
$.post(base + "/platform/zgfw/question/data", this.pageForm, (data) => {
sublime.closeLoadingbar();//关闭loading
if (data.code == 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
},
async getActivityUserScope() {
const resp = await $.get('/platform/activity/basic/scope/getActivityUserScopeGroup')
if (resp.code === 0) {
this.activityUserScopeList = resp.data
}
}
},
created() {
this.getActivityUserScope()
this.pageData();
},
})
</script>
<!--#
}
#-->