Files
2026-09-08 19:49:21 +08:00

1381 lines
69 KiB
HTML

<!--#
layout("/layouts/platform.html"){
#-->
<style>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 100px;
height: 100px;
line-height: 100px;
text-align: center;
}
.avatar {
width: 100px;
height: 100px;
display: block;
}
.avatar-delete {
font-size: 20px;
color: red;
}
#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;
}
.el-upload--picture-card {
width: 100px;
height: 100px;
line-height: 100px;
}
.avatar-uploader .el-upload-list__item-actions {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
cursor: default;
text-align: center;
color: #fff;
opacity: 0;
font-size: 20px;
background-color: rgba(0, 0, 0, .5);
transition: opacity .3s;
}
.avatar-uploader .el-upload-list__item-actions:hover {
opacity: 1;
}
.avatar-uploader .el-upload-list__item-actions span {
cursor: pointer;
}
.avatar-uploader .el-upload-list__item-actions .el-upload-list__item-delete {
position: static;
font-size: inherit;
color: inherit;
display: inline-block;
}
.avatar-uploader .el-upload-list__item-actions .el-upload-list__item-delete i {
color: inherit;
}
</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" type="primary"></el-button>
</div>
<div class="pull-right offscreen-right">
<el-button @click="openAddQuestion" 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>
<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" header-align="center" label="操作" width="560px">
<template scope="scope">
<el-button @click="openCode(scope.row)" size="mini" type="primary">
二维码
</el-button>
<!--<el-button @click="$refs.sendMsg.openDialog(scope.row.activityuserscopeid)" size="mini"-->
<!-- type="primary">通知-->
<!--</el-button>-->
<el-button @click="sendMsg(scope.row)" size="mini" type="primary">通知
</el-button>
<!-- <el-button @click="openView(scope.row.qid)" size="mini" type="primary">查看</el-button>-->
<el-button @click="upStatus(scope.row.qid,2)" size="mini" type="primary"
type="success" v-if="scope.row.qflag==1||scope.row.qflag==3">
开启
</el-button>
<el-button @click="upStatus(scope.row.qid,3)" size="mini" type="primary"
type="danger" v-if="scope.row.qflag==2">关闭
</el-button>
<el-button @click="openEditBasicInfo(scope.row.qid)" size="mini"
type="primary"
type="primary">基础设置
</el-button>
<el-button @click="openEditIssue(scope.row.qid)" size="mini"
type="primary">题目设置
</el-button>
<el-button @click="deleteQuestion(scope.row.qid)" size="mini"
type="danger" v-if="scope.row.qflag==1||scope.row.qflag==3">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<div v-if="editMode==='basicInfo'">
<el-form :model="formData" :rules="formRules" label-position="right"
label-width="120px" ref="addform">
<vi-title2 title="基础设置"></vi-title2>
<el-form-item label="问卷类型" prop="qlx">
<el-radio-group @change="questionTypeChange" v-model="formData.qlx"
size="small">
<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 v-show="![1,3,4].includes(formData.qlx)" :gutter="20">
<el-col :span="12">
<el-form-item class="is-required" label="每日可答次数" label-width="120px"
prop="qrkdcs">
<el-input-number :max="100" :min="0"
controls-position="right"
placeholder="设0则不限制次数"
style="width: 100%"
v-model="formData.qrkdcs"></el-input-number>
<div class="text-primary">设0则不限制次数</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="每日答题时间" 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 :gutter="20">
<el-col :span="12">
<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="12">
<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">
<div style="display: flex; column-gap: 10px">
<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-button @click="userScopeDialog = true" type="primary">设置</el-button>-->
<el-button @click="$refs.drawerUserScope.userScopeDialog = true"
type="primary">设置
</el-button>
</div>
</el-form-item>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="出题模式" prop="ctMode">
<el-radio-group v-model="formData.ctMode" size="small">
<el-radio :label="1" border>定时定题</el-radio>
<el-radio :label="2" border>随机题目</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6" v-if="formData.ctMode===2">
<el-form-item label="单次出题数量" prop="ctNum">
<!--:max="formData.issues.length"-->
<el-input-number :min="1"
controls-position="right"
style="width: 100%"
v-model="formData.ctNum"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="是否抽奖" prop="isRaffle">
<el-radio-group v-model="formData.isRaffle" size="small">
<el-radio :label="true" border></el-radio>
<el-radio :label="false" border></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6" v-if="formData.isRaffle">
<el-form-item label="抽奖分数" prop="raffleScore">
<el-input-number :min="1"
controls-position="right"
style="width: 100%"
v-model="formData.raffleScore"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6" v-if="formData.isRaffle">
<el-form-item label="获奖人数" prop="raffleWinnerUserNum">
<el-input-number :max="10000" :min="1"
controls-position="right"
style="width: 100%"
v-model="formData.raffleWinnerUserNum"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="medium">取消</el-button>
<el-button @click="modifyBasicInfo" type="primary">确定</el-button>
</el-row>
</el-form>
</div>
<div v-else-if="editMode==='issueInfo'">
<div style="max-height: 700px;overflow-y: scroll">
<div class="btDiv mb10" title="编辑问卷标题与问卷说明">
<el-row style="text-align: center">
<h2>{{questionData.qtitle}}</h2>
</el-row>
</div>
<vi-title2 title="题目列表"></vi-title2>
<el-table :data="issueData" :key="tableKey"
class="issueList mt10"
default-expand-all="true"
highlight-current-row="true"
style="width: 100%">
<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">
<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-radio v-if="issue.row.iisdx==true"
:label="idx"
v-model="issue.row.xz"
border
disabled
style="margin-bottom: 5px;"
size="small">
<span :class="[wor.correct?'text-success':'']">{{wor.wtxt}}</span>
</el-radio>
<el-checkbox v-else-if="issue.row.iisdx==false"
style="margin-bottom: 5px;"
disabled
:key="idx" :label="idx">
<span :class="[wor.correct?'text-success':'']">{{wor.wtxt}}</span>
</el-checkbox>
<span v-else-if="wor.wistk==true" class="inputParent">
<el-input
size="mini"
style="border-top: none"
disabled
v-model="wor.tktxt"></el-input>
<span style="color:red;"
v-if="wor.wisbt==true">*</span>
</span>
<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>
<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="250">
<template scope="scope">
<el-button @click="openEditIssueDetail(scope.$index)" circle
icon="el-icon-setting"
size="small"
type="primary"></el-button>
<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="issueData.splice(scope.$index,1)" circle
icon="el-icon-delete"
size="small" type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</div>
<el-row class="mt10 p10" style="border-top: 1px dashed #e5e1e1;" type="flex"
justify="center">
<el-button
type="success"
:disabled="questionData.qlx===4 && issueData && issueData.length===1"
@click="issueData.push({wors:[{wtxt:'选项1',correct:false},{wtxt:'选项2',correct:false}],itx:1,its:'',iisrandom:false,iisbd:true,iisdx:true,iname:'<p><b>标题</b></p>',iplfs:1})">
添加题目
</el-button>
<el-button type="primary" @click="doModifyIssues">确定修改</el-button>
</el-row>
</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-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>
<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>
<!-- <el-drawer-->
<!-- title="我是标题" size="78%"-->
<!-- :visible.sync="userScopeDialog"-->
<!-- :with-header="false">-->
<!-- <div style="padding: 0px 16px;" class="clearfix">-->
<!-- <el-button icon="el-icon-back" style="font-size: 16px" type="text" @click="userScopeDialog = false">返回-->
<!-- </el-button>-->
<!-- </div>-->
<!-- <user-scope-->
<!-- :is_h04="${@shiro.hasRole('H04')}"-->
<!-- :is_a06="${@shiro.hasRole('A06')}"-->
<!-- :is_h02="${@shiro.hasRole('club01')}"-->
<!-- :is_sysadmin="${@shiro.hasRole('sysadmin')}"-->
<!-- :unionid="'${@shiro.getPrincipalProperty('unit').getUnionid()}'"-->
<!-- :group_id.sync="formData.activityUserScopeId"-->
<!-- ></user-scope>-->
<!-- </el-drawer>-->
<drawer-user-scope
@group_change="getActivityGroup"
ref="drawerUserScope"
:group_id.sync="formData.groupId"
></drawer-user-scope>
<send-msg ref="sendMsg" :url="url"></send-msg>
<el-dialog title="二维码" width="45%" :visible.sync="qrCodeDialogVisible">
<div id="qrcode" style="width: 200px;height: 200px;margin: 0 auto"></div>
</el-dialog>
<el-drawer title="详细设置" :visible.sync="issueWorDrawerVisible" size="80%">
<div class="p10" v-if="currentModifyIssue && questionData">
<vi-title2 title="题目设置"></vi-title2>
<el-row>
<span>
标题、提示
</span>
<el-button @click="openIssueName('iname')" plain size="small">
设置标题
</el-button>
<el-button @click="openIssueName('its')" plain size="small"
style="margin-left: 0px">
设置提示
</el-button>
</el-row>
<el-row type="flex" style="flex-flow: row wrap;column-gap: 10px;margin:20px 0">
<div>
<span>题目类型</span>
<el-select
@change="if(currentModifyIssue.itx==2){issueData[currentModifyIssueIndex].iplfs=1;issueData[currentModifyIssueIndex].iisdx=true;issueData[currentModifyIssueIndex].wors=[{}]}else{issueData[currentModifyIssueIndex].wors=[{wtxt:'选项1'},{wtxt:'选项2'}]}"
placeholder="题型" size="small"
style="width: 100px"
v-model="issueData[currentModifyIssueIndex].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>
<el-select placeholder="是否必答" size="small"
style="width: 100px"
v-model="issueData[currentModifyIssueIndex].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>
<el-select placeholder="单选/多选" size="small"
v-if="issueData[currentModifyIssueIndex].itx==1"
style="width: 100px"
v-model="issueData[currentModifyIssueIndex].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>
<el-input-number v-if="issueData[currentModifyIssueIndex].itx==1"
:max="5"
:min="1" controls-position="right"
placeholder="最小选择数"
size="small" style="width: 130px"
v-model="issueData[currentModifyIssueIndex].iminselect"></el-input-number>
<el-input-number v-if="issueData[currentModifyIssueIndex].itx==1"
:max="20"
:min="1" controls-position="right"
placeholder="最大选择数"
size="small" style="width: 130px"
v-model="issueData[currentModifyIssueIndex].imaxselect"></el-input-number>
</el-row>
<el-row v-if="questionData.qlx===2" class="mb20">
<div>
<span>题目分值:</span>
<el-input
placeholder="请输入分值"
size="small"
style="width: 120px"
type="number"
v-model="issueData[currentModifyIssueIndex]['fraction']">
</el-input>
</div>
</el-row>
<el-row class="mb20">
<span>显示日期</span>
<el-date-picker placeholder="请选择显示日期"
size="small"
type="date"
v-model="issueData[currentModifyIssueIndex]['displayDate']"
:disabled="formData.ctMode==2"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-row>
<el-row class="mb20">
<span>排序编号</span>
<el-input
v-if="questionData.ctMode==1"
v-model="issueData[currentModifyIssueIndex].ipxbh"
place="请输入排序编号"
style="width: 80px"
size="small"></el-input>
</el-row>
<template v-if="issueData[currentModifyIssueIndex].itx===1">
<vi-title2 title="选项设置"></vi-title2>
<el-row v-if="currentModifyIssue.itx==1">
<el-table :data="issueData[currentModifyIssueIndex].wors" border
style="width: 100%;margin-top: 10px;">
<el-table-column header-align="center" label="选项文字" property="wtxt">
<template slot-scope="scope">
<el-input placeholder="选项文字" size="small"
maxlength="100"
clearable
v-model="scope.row.wtxt"></el-input>
</template>
</el-table-column>
<el-table-column label="图片" align="center" header-align="center"
width="150px">
<template slot-scope="scope">
<el-upload
:action="FILE_UPLOAD_ADDRESS"
:before-upload="beforeAvatarUpload"
:on-success="(res,file)=>{handleAvatarSuccess(res,file,scope.row)}"
:show-file-list="false"
list-type="picture-card"
class="avatar-uploader">
<div style="position: relative" v-if="scope.row.wimg">
<img :src="FILE_STREAM_PREVIEW_ADDRESS+'?id='+ scope.row.wimg"
class="avatar">
<span class="el-upload-list__item-actions">
<span class="el-upload-list__item-delete"
@click.stop="(file)=>{handleRemove(file,scope.row)}">
<i class="el-icon-delete"></i>
</span>
</span>
</div>
<i class="el-icon-plus avatar-uploader-icon" v-else></i>
</el-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"
maxlength="100"
v-if="questionData.qlx!==4"
v-model="scope.row.wsm">
</el-input>
<el-button @click="openCakeDesc(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="请输入链接"
max="100"
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">
</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(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="questionData.qlx==2" width="80px">
<template slot-scope="scope">
<el-checkbox
@change="upCorrect(scope.$index,scope.row.correct)"
v-model="scope.row.correct"></el-checkbox>
</template>
</el-table-column>
<!-- <el-table-column align="center" header-align="center" label="单价" property="correct"-->
<!-- v-if="questionData.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="200px">
<template slot-scope="scope">
<el-button @click="worPx(scope.$index,true)" circle
icon="el-icon-top"
size="mini"
type="primary"></el-button>
<el-button @click="worPx(scope.$index,false)" circle
icon="el-icon-bottom"
size="mini" type="primary"></el-button>
<el-button
@click="issueData[currentModifyIssueIndex].wors.splice(scope.$index+1,0,{wtxt:'选项'+(issueData[currentModifyIssueIndex].wors.length+1)})"
circle
icon="el-icon-plus"
size="mini"
type="success"></el-button>
<el-button
@click="issueData[currentModifyIssueIndex].wors.splice(scope.$index,1)"
circle
icon="el-icon-minus"
size="mini"
type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-row>
</template>
</div>
</el-drawer>
<open-qr-code ref="openQRCode" :url="url"></open-qr-code>
</div>
<script>
let qsmEditor
let upTxtEditor
let cakeEditor
let vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
editMode: 'basicInfo',
cakeDialog: false,
addDialogVisible: false,
tableData: [],
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) {
return !val
},
issueIdx: null,
//标题 提示 属性
issuePropName: null,
delIssueIds: [],
delWorIds: [],
cake_subject: 0,
cake_subject_option_index: 0,
endTimeOptions: {
disabledDate(val) {
return val.getTime() < new Date().getTime()
}
},
activityUserScopeList: [],
userScopeDialog: false,
qrCodeDialogVisible: false,
questionData: {},
issueData: [],
currentModifyIssueIndex: 0,
issueWorDrawerVisible: false,
url: null
}
},
computed: {
currentModifyIssue() {
return this.issueData[this.currentModifyIssueIndex]
}
},
components: {
'tab-upload': httpVueLoader('/components/plugins/TabUpload.vue'),
'user-scope': httpVueLoader('/components/plugins/UserScope.vue'),
'send-msg': httpVueLoader('/components/plugins/SendMsgByGroupId.vue'),
'drawer-user-scope': httpVueLoader('/components/plugins/DrawerUserScope.vue'),
'open-qr-code': httpVueLoader('/components/plugins/OpenQRCode.vue')
},
methods: {
openCakeDesc({$index}) {
debugger
this.cake_subject_option_index = $index
this.cakeDialog = true
this.$nextTick(() => {
$('#cakeEditor').html("")
cakeEditor = new wangEditor('#cakeEditor')
cakeEditor.config.uploadImgShowBase64 = true // 使用 base64 保存图片
cakeEditor.create()
// const wsm = this.formData.issues[this.cake_subject]['wors'][this.cake_subject_option_index]['wsm']
const wsm = this.issueData[this.currentModifyIssueIndex]['wors'][$index]['wsm']
if (wsm) {
cakeEditor.txt.html(wsm)
}
})
},
upCakeDesc() {
const wsm = cakeEditor.txt.html()
this.$set(this.issueData[this.currentModifyIssueIndex]['wors'][this.cake_subject_option_index], 'wsm', wsm)
this.cakeDialog = false
},
questionTypeChange(val) {
if (val === 4 && this.formData.issues.length > 1) {
this.formData.issues = this.formData.issues.slice(0, 1);
}
},
//修改活动状态
async upStatus(qid, flag) {
const {msg, code} = await $.post(loc() + "/upStatus", {qid: qid, flag: flag})
if (code === 0) {
this.notifySuccess(msg)
this.pageData()
} else {
this.notifyWarning(msg)
}
},
//查看活动信息
async openView(qid) {
const {data, code} = await $.get(loc() + "/findOne", {qid: qid})
if (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.$refs.guava.view()
} else {
this.notifyWarning(msg)
}
},
//答案排序
worPx(widx, isTop) {
if (isTop && widx > 0) {
let v = JSON.parse(JSON.stringify(this.issueData[this.currentModifyIssueIndex].wors[widx]))
this.$set(this.issueData[this.currentModifyIssueIndex].wors, widx, this.issueData[this.currentModifyIssueIndex].wors[widx - 1])
this.$set(this.issueData[this.currentModifyIssueIndex].wors, widx - 1, v)
} else if (!isTop && widx < this.issueData[this.currentModifyIssueIndex].wors.length - 1) {
let v = JSON.parse(JSON.stringify(this.issueData[this.currentModifyIssueIndex].wors[widx]))
this.$set(this.issueData[this.currentModifyIssueIndex].wors, widx, this.issueData[this.currentModifyIssueIndex].wors[widx + 1])
this.$set(this.issueData[this.currentModifyIssueIndex].wors, widx + 1, v)
}
},
//默认选中
upMr(widx, val) {
if (val) {
const isRadioSelect = this.issueData[this.currentModifyIssueIndex]['iisdx']
if (isRadioSelect) {
this.issueData[this.currentModifyIssueIndex].wors.forEach(v => {
v.wismr = false
})
}
this.issueData[this.currentModifyIssueIndex].wors[widx].wismr = true
}
},
//是否正确答案
upCorrect(widx, val) {
if (val) {
const isRadioSelect = this.issueData[this.currentModifyIssueIndex]['iisdx']
if (isRadioSelect) {
this.issueData[this.currentModifyIssueIndex].wors.forEach(v => {
v.correct = false
})
}
this.issueData[this.currentModifyIssueIndex].wors[widx].correct = true
}
},
//题目排序
issuePx(idx, isTop) {
if (isTop && idx > 0) {
let v = JSON.parse(JSON.stringify(this.issueData[idx]))
this.issueData[idx] = this.issueData[idx - 1]
this.issueData[idx - 1] = v
} else if (!isTop && idx < this.issueData.length - 1) {
let v = JSON.parse(JSON.stringify(this.issueData[idx]))
this.issueData[idx] = this.issueData[idx + 1]
this.issueData[idx + 1] = v
}
},
//题干
upIssueName() {
this.issueData[this.currentModifyIssueIndex][this.issuePropName] = upTxtEditor.txt.html()
this.setTitleDialogVisible = false
},
//删除答案
delWor(props, scope) {
if (!this.isNull(scope.row.wid)) {
this.delWorIds.push(scope.row.wid)
}
this.issueData[this.currentModifyIssueIndex].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(name) {
this.issuePropName = name
this.setTitleDialogVisible = true
this.$nextTick(() => {
$('#upTxtEditor').html("")
upTxtEditor = new wangEditor('#upTxtEditor')
upTxtEditor.config.uploadImgShowBase64 = true // 使用 base64 保存图片
upTxtEditor.create()
if (this.issueData[this.currentModifyIssueIndex][name]) {
upTxtEditor.txt.html(this.issueData[this.currentModifyIssueIndex][name])
}
})
},
//删除问卷
async deleteQuestion(id) {
const confirm = await this.$confirm('确定要删除吗', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' === confirm) {
const {code, msg} = await $.post(loc() + "/deleteQuestion", {qid: id})
if (code === 0) {
this.notifySuccess(msg)
this.pageData()
} else {
this.notifyWarning(msg)
}
}
},
//新建问卷
openAddQuestion() {
this.$refs.guava.edit()
this.editMode = 'basicInfo'
setTimeout(() => {
$('#qsmEditor').html("")
qsmEditor = new wangEditor('#qsmEditor')
qsmEditor.config.uploadImgShowBase64 = true
qsmEditor.config.onchange = (html) => {
this.$set(this.formData, "qsm", html)
}
qsmEditor.create()
this.formData = {issues: [], qlx: 2, qrkdcs: 0}
}, 300)
},
//打开编辑问卷基础信息
async openEditBasicInfo(qid) {
const {code, data, msg} = await $.get(loc() + "/findBasicInfo", {qid: qid})
if (code === 0) {
setTimeout(() => {
$('#qsmEditor').html(data.qsm)
qsmEditor = new wangEditor('#qsmEditor')
qsmEditor.config.onchange = (html) => {
this.$set(this.formData, "qsm", html)
}
qsmEditor.create()
this.formData = data
if (!this.isNull(this.formData.qdtkssj) && !this.isNull(this.formData.qdtjssj)) {
this.$set(this.formData, 'qdtsj', [this.formData.qdtkssj, this.formData.qdtjssj])
}
}, 300)
this.editMode = 'basicInfo'
this.$refs.guava.edit()
} else {
this.notifyWarning(msg)
}
},
async modifyBasicInfo() {
if (this.formData.qlx === 4) {
if (this.formData.autoSelect && this.formData.endTime < new Date().getTime()) {
this.$message.warning('结束时间必须要大于当前时间')
return
}
}
//答题 并且是 定时定题
// if (this.formData.qlx === 2 && this.formData.ctMode === 1) {
// if (this.formData.issues.some(v => v.displayDate != null) && this.formData.issues.some(v => v.displayDate == null)) {
// this.$message.warning('显示日期只能全为空或者全不为空')
// return
// }
// }
const {code, msg} = await $.post(loc() + '/modifyBasicInfo', this.formData)
if (code === 0) {
this.notifySuccess(msg)
this.$refs.guava.index()
this.pageData()
} else {
this.notifyWarning(msg)
}
},
//打开题目设置
async openEditIssue(qid) {
const {data: questionData} = await $.get(loc() + "/findBasicInfo", {qid: qid})
this.questionData = questionData
const {data: issueData} = await $.get(loc() + "/issueList", {questionId: qid})
this.issueData = issueData
this.$refs.guava.edit()
this.editMode = 'issueInfo'
},
//题目详细设置
openEditIssueDetail(issueIndex) {
this.currentModifyIssueIndex = issueIndex
this.issueWorDrawerVisible = true
},
async getActivityUserScope() {
const resp = await $.get('/platform/activity/basic/scope/getActivityUserScopeGroup')
if (resp.code === 0) {
this.activityUserScopeList = resp.data
}
},
//修改题目
async doModifyIssues() {
//答题 并且是 定时定题
if (this.questionData.qlx === 2 && this.questionData.ctMode === 1) {
if (this.issueData.some(v => v.displayDate != null) && this.issueData.some(v => v.displayDate == null)) {
this.notifyWarning('显示日期只能全为空或者全不为空')
return
}
}
const confirm = await this.$confirm('您确定要提交吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' === confirm) {
const loading = this.$loading({
lock: true,
text: '提交中',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
const {code, msg} = await $.post(loc() + '/modifyIssues', {
questionId: this.questionData.qid,
issues: JSON.stringify(this.issueData)
})
loading.close()
if (code === 0) {
this.notifySuccess(msg)
this.$refs.guava.index()
this.pageData()
} else {
this.notifyWarning(msg)
}
}
},
beforeAvatarUpload(file) {
const isJPG = ['image/png', 'image/jpeg'].includes(file.type);
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isJPG) {
this.$message.error('上传图片只能是 jpg、png、jpeg 格式!');
}
if (!isLt2M) {
this.$message.error('上传图片大小不能超过 2MB!');
}
return isJPG && isLt2M;
},
handleAvatarSuccess(res, file, row) {
this.$set(row, 'wimg', res.data.id)
},
handleRemove(file, row) {
this.$set(row, 'wimg', null)
},
sendMsg(row) {
this.url = `<a href="` + (APP_DOMAIN + "/mobile/question/h5/list?type=" + row.qlx) + `">点击参与</a>`
this.$refs.sendMsg.openDialog(row.activityuserscopeid)
},
openCode(row) {
this.$refs.openQRCode.openCode("/mobile/question/h5/list?type=" + row.qlx)
},
},
created() {
this.getActivityUserScope()
this.pageData();
},
watch: {
'formData.activityUserScopeId': {
async handler(newVal, oldVal) {
await this.getActivityUserScope()
this.userScopeDialog = false
},
deep: true
},
}
})
</script>
<!--#
}
#-->