| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430 | {extend name="common/common2" /}{block name="main"}<style>    .main-content{        background-color: #f0f0f0;    }    .page-content{        padding: 0;        background-color: #f0f0f0;    }    .page-content2{        padding: 8px 20px 24px;        position: relative;    }    .box-left{        width: 200px;        position: fixed;        z-index: 10;        top: 100px;        left: 210px;        bottom: 40px;        border: 1px solid #000;    }    .question-box{        width: 800px;        margin:0 auto;        background-color: #ffffff;        margin-top: 10px;        padding: 55px 35px;        box-shadow: #bbbbbb;        min-height: 800px;        overflow: hidden;    }    .question-box-title,.question-box-desc,.question-box-btn{        padding: 10px 0;        overflow: hidden;    }    .question-box-desc{        text-indent:30px;    }    .question-box-info{        padding: 15px 0;        overflow: hidden;        cursor: pointer;    }    .border-line{        border-top: 1px solid #cccccc;        border-bottom: 1px solid #cccccc;    }    .question-form{        height: 34px;        line-height: 34px;        margin: 5px 0;        overflow: hidden;    }    .question-form-option{        height: auto;        margin: 5px 0;        overflow: hidden;    }    .question-form-title{        display: inline-block;        width: 30px;        height: 100%;    }    .question-form-input{        display: inline-block;        width: 690px;        height: 100%;    }    .question-options{        width: 640px;        height: 32px;        color: #606266!important;        font-size: 13px!important;        padding: 5px 15px!important;        border-width: 1px;        border-style: solid;        border-color: rgb(229, 230, 231);    }    .xz:focus,.form-select:focus,.question-options:focus{        border-color: #148d8f !important;        outline:0;    }    ul, ol {        margin: 0;    }    .form-select{        height: 32px;        color: #606266!important;        font-size: 13px!important;        padding: 5px 15px!important;        box-shadow:none;        border-width: 1px;        border-style: solid;        border-color: rgb(229, 230, 231);    }    .xz{        width: 60px;        line-height: 1.2px;        padding: 5px 4px;        border-width: 1px;        border-style: solid;        border-color: rgb(229, 230, 231);    }    .lb{        width: 100px !important;    }</style><div class="row">    <div class="col-sm-12">        <div class="ibox float-e-margins">            <div class="ibox-content">                <div class="page-content2" id="vueapp">                    <div class="question-box">                        <div class="question-box-title">                            <h3 v-if="editother !== 1" class="text-center" @click="editOthers(1)">{{title}}</h3>                            <input v-if="editother === 1" type="text" v-model="title" class="form-control" placeholder="请输入标题">                        </div>                        <div class="question-box-desc">                            <div v-if="editother !== 2" @click="editOthers(2)">{{description}}</div>                            <textarea v-if="editother === 2" v-model="description" class="form-control" rows="3" placeholder="请输入描述"></textarea>                        </div>                        <draggable :list="question" :move="getdata2" @update="datadragEnd2" :options="{animation: 100,handle:'.dargDiv2'}">                            <transition-group name="list-complete" >                                <div v-for="(item,index) in question" :key="index" class="question-box-list">                                    <div v-if="edit !== item.id" class="question-box-info dargDiv2">                                        <div @click="editQuestion(item)">                                            <div>{{index + 1}}、{{item.title}} <span v-if="item.required" class="text-danger">*</span></div>                                            <div>{{item.remark}}</div>                                            <div v-if="item.type === 'radio'||item.type === 'checkbox'" style="padding: 20px;">                                                <div v-for="(oitem,oindex) in item.options" :key="oindex">                                                    <label><input :type="item.type" disabled>{{oitem.text}}</label>                                                </div>                                            </div>                                            <div v-if="item.type === 'text'" style="padding: 10px 20px;">                                                <input type="text" style="width: 100%" readonly>                                            </div>                                            <div v-if="item.type === 'textarea'" style="padding: 10px 20px;">                                                <textarea rows="3" style="width: 100%" readonly></textarea>                                            </div>                                            <div v-if="item.type === 'star'" style="padding: 10px 20px;">                                                <span>{{item.star_min_text}}</span>                                                  <label v-for="n in item.star_val_max" :key="n"><input type="radio" disabled>{{n}}  </label>                                                <span>{{item.star_max_text}}</span>                                              </div>                                        </div>                                    </div>                                    <div v-if="edit === item.id" class="question-box-info border-line">                                        <div class="question-form">                                            <div class="question-form-title">题目</div>                                            <div class="question-form-input">                                                <input type="text" v-model="item.title" class="form-control">                                            </div>                                        </div>                                        <div class="question-form">                                            <div class="question-form-title">备注</div>                                            <div class="question-form-input">                                                <input type="text" v-model="item.remark" class="form-control">                                            </div>                                        </div>                                        <div class="question-form">                                            <div class="question-form-title"> </div>                                            <div class="question-form-input">                                                <select  class="form-select" v-model="item.type" @change="changeType">                                                    <option v-for="(type,index2) in types" :key="index2" :value="type.val">{{type.name}}</option>                                                </select>                                                                                                   <label><input type="checkbox" v-model="item.required" checked>必填</label>                                                                                                   <label v-if="item.type === 'text'||item.type === 'textarea'">字数限制 <input v-model="item.limit" type="number"  class="xz"> 字</label>                                            </div>                                        </div>                                        <div class="question-form-option" v-if="item.type === 'radio'||item.type === 'checkbox'">                                            <ul class="list-group" id="question-options">                                                <draggable :list="item.options" :move="getdata" @update="datadragEnd" :options="{animation: 100,handle:'.dargDiv'}">                                                    <transition-group name="list-complete" >                                                        <li v-for="(item3,index3) in item.options" :key="index3" class="list-group-item">                                                            <span class="glyphicon glyphicon-menu-hamburger dargDiv"></span>                                                                                                                         <input type="text" v-model="item3.text"  class="question-options ">                                                                                                                         <span @click="delOption(item,item3.id)">×</span>                                                        </li>                                                    </transition-group>                                                </draggable>                                            </ul>                                            <a href="javascript:;" @click="addOption(item)">添加选项</a>                                        </div>                                        <div class="question-form-option" v-if="item.type === 'star'">                                            量表程度 <input class="xz lb"  v-model="item.star_min_text" type="text"> - <input v-model="item.star_max_text" type="text" class="xz lb"   >     量表范围 {{item.star_val_min}} - {{item.star_val_max}}                                        </div>                                        <div class="question-form" style="text-align: center;margin-top: 20px;">                                            <button class="btn btn-primary btn-sm" type="button" @click="confirm(item)">确定</button>                                            <button class="btn btn-danger btn-sm" type="button" @click="delQuestion(index)">删除</button>                                        </div>                                    </div>                                </div>                            </transition-group>                        </draggable>                        <div class="question-box-btn" v-if="!edit">                            <button type="button" class="btn btn-primary btn-block" @click="addQuestion">新增题目</button>                        </div>                        <div class="question-box-btn" v-if="question.length > 0 && title && !edit">                            <button type="button" class="btn btn-success btn-block" onclick="savequestionnaire(this)">保存问卷</button>                        </div>                    </div>                </div>            </div>        </div>    </div></div>{/block}{block name="script"}<script type="text/javascript" src="/static/vuejs/require.js"></script><script>    $(document).ready(function(){        formSetValue("enable", {$info.enable|default=1});    });    var question = [];    var qstr = '';    var tstr = '';    var dstr = '';    var types = [        {"name":"单选题",val:"radio"},        {"name":"多选题",val:"checkbox"},        {"name":"单行文本题",val:"text"},        {"name":"多行文本题",val:"textarea"},        {"name":"量表题",val:"star"},    ];    require.config({        urlargs: "ver=1.0_0",        paths:{            "vue":'/static/vuejs/vue.min2',            "sortablejs":'/static/vuejs/sortable',            "vuedraggable":'/static/vuejs/vuedraggable'        },        shim:{            'vue':{                exports:'vue'            }        }    });    require(['vue','vuedraggable'],function(Vue,draggable){        Vue.component('draggable', draggable);        var vm = new Vue({            el: '#vueapp',            data: {                question: question,                title: '满意度调查',                description: '满意度调查描述',                editother: 0,                types: types,                edit: 0,                maxid: 1,                info: {                    id: 1,                    title: "",                    remark: "",                    type: "radio", // radio=单选 checkbox=多选 text=单行文本题 textarea=多行文本题 star=量表题                    required: true, // true=不填                    options: [{                        id: 2,                        text: "选项"                    }],                    star_min_text: "非常不满意",                    star_max_text: "非常满意",                    star_val_min: 1,                    star_val_max: 5,                    limit: 200 // 单行文本题/多行文本题字数限制                }            },            computed: {                resoptions: function () {                    return JSON.parse(JSON.stringify(this.question));                }            },            watch: {                resoptions: function (newval, oldval) {                    console.log(newval, oldval);                    this.formatData();                },            },            created: function () {                this.formatData();            },            methods: {                addQuestion() {                    const item = JSON.parse(JSON.stringify(this.info));                    item.id = this.maxid;                    item.options[0].id = this.maxid;                    this.maxid += 2;                    this.edit = item.id;                    this.editother = 0;                    this.question.push(JSON.parse(JSON.stringify(item)));                },                editQuestion(obj) {                    this.edit = obj.id;                    this.editother = 0;                },                delQuestion(index) {                    let oldoptions = JSON.parse(JSON.stringify(this.question));                    let newoptions = [];                    for(let o in oldoptions){                        if(o != index){                            newoptions.push(oldoptions[o]);                        }                    }                    this.question = JSON.parse(JSON.stringify(newoptions));                    this.edit = 0;                },                addOption(obj){                    this.question.forEach((item) => {                        const info = item;                    if(obj.id === item.id){                        const oitem = {                            id: this.maxid,                            text: "选项"                        };                        this.maxid += 1;                        info.options.push(oitem);                    }                })                },                delOption(obj,id){                    this.question.forEach((item) => {                        const info = item;                    if(obj.id === item.id){                        const opts = item.options.filter((item2) => {                            return item2.id !== id;                    });                        info.options = opts;                    }                })                },                editOthers(val){                    this.editother = val;                    this.edit = 0;                },                changeType(val){                    console.log(this.question);                },                confirm(obj){                    // 检查内容是否填写完整                    if(obj.title === ''){                        layer.msg('题目不能为空');                        return false;                    }                    if(obj.type === 'radio'||obj.type === 'checkbox'){                        if(obj.options.lenght === 0){                            layer.msg('未设置选项');                            return false;                        }                        for (let o in obj.options){                            if(obj.options[o].text === ''){                                layer.msg('选项内容不能为空');                                return false;                            }                        }                    }                    if(obj.type === 'star'){                        if(obj.star_min_text === '' || obj.star_max_text === ''){                            layer.msg('量表程度不能为空');                            return false;                        }                    }                    this.edit = 0;                },                formatData(){                    qstr = JSON.stringify(this.question);                    tstr = this.title;                    dstr = this.description;                },                getdata: function(evt){                    console.log(evt);                },                datadragEnd:function(evt){                    console.log('拖动前的索引:'+evt.oldIndex);                    console.log('拖动后的索引:'+evt.newIndex);                    console.log(evt);                },                getdata2: function(evt){                    console.log(evt);                },                datadragEnd2:function(evt){                    console.log('拖动前的索引:'+evt.oldIndex);                    console.log('拖动后的索引:'+evt.newIndex);                    console.log(evt);                }            }        })    });    function savequestionnaire(_self) {        var flag = $(_self).attr('data-flag');        if(flag == 1){            return false;        }        $(_self).attr('data-flag',1).html('保 存...');        var url = "add";        $.post(url,{title:tstr,description:dstr,question:qstr},function (res) {            if(res.code === 1){                parent.layer.closeAll();            }else{                layer.msg(res.info);            }            $(_self).attr('data-flag',0).html('保 存')        });    }</script>{/block}
 |