const option_name = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']; var init_count = 0; var fa_form; define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'upload'], function ($, undefined, Backend, Table, Form, Upload) { var Controller = { index: function () { // 初始化表格参数配置 Table.api.init({ extend: { index_url: 'exam/question/index' + location.search, add_url: 'exam/question/add', edit_url: 'exam/question/edit', del_url: 'exam/question/del', multi_url: 'exam/question/multi', import_url: 'exam/question/import', table: 'exam_question', } }); var table = $("#table"); //在普通搜索渲染后 table.on('post-common-search.bs.table', function (event, table) { let form = $("form", table.$commonsearch); $("input[name='cate_id']", form).addClass("selectpage").data("source", "exam/cate/selectpage").data("params", {"custom[kind]": "QUESTION","isTree":true}).data("orderBy", "sort desc"); // $("input[name='is_material_child']", form).val(0); // $("input[name='exam_type_id']", form).addClass("selectpage").data("source", "exam_type/index").data("orderBy", "sort desc"); Form.events.cxselect(form); Form.events.selectpage(form); }); //当内容渲染完成给编辑按钮添加`data-area`属性,点击列表编辑按钮时全屏 table.on('post-body.bs.table', function (e, settings, json, xhr) { $(".btn-add").data("area", ["100%", "100%"]); $(".btn-editone").data("area", ["100%", "100%"]); }); // 初始化表格 table.bootstrapTable({ url: $.fn.bootstrapTable.defaults.extend.index_url, pk: 'id', sortName: 'id', search: false, showExport: false,//隐藏导出 showToggle: false,//隐藏浏览模式 showColumns: false,//隐藏显示隐藏模式 searchFormVisible: true,//默认显示搜索表单 escape:false,//false解析html,默认为true不解析 columns: [ [ {checkbox: true}, {field: 'id', title: __('Id')}, {field: 'cate_id', title: __('Cate_id'), autocomplete: false, visible: false}, {field: 'cate.name', title: __('Cate_id'), operate: false}, // {field: 'exam_type_id', title: __('Exam_type_id'), visible: false}, // {field: 'examtype.name', title: __('Exam_type_id'), operate: false}, { field: 'kind', title: __('Kind'), searchList: {"JUDGE": __('Judge'), "SINGLE": __('Single'), "MULTI": __('Multi'), /*"FILL": __('Fill'),*/ "SHORT": __('Short')/*, "MATERIAL": __('Material')*/}, formatter: Table.api.formatter.normal, // operate: "IN", }, {field: 'title', title: __('Title'), autocomplete: false, operate: 'LIKE', formatter: Table.api.formatter.content}, /*{ field: 'is_material_child', title: __('属于材料题子题'), searchList: {"0": __('否'), "1": __('是')}, defaultValue: 0, visible: false },*/ /* { field: 'difficulty', title: __('Difficulty'), searchList: {"EASY": __('Easy'), "GENERAL": __('General'), "HARD": __('Hard')}, formatter: Table.api.formatter.normal },*/ { field: 'answer', title: __('Answer'), halign: 'center', align: 'left', operate: false, formatter: function (value, row, index) { var answer = value; if (row.kind == 'FILL') { try { answer = ''; let fill_answers = JSON.parse(row.answer); for (let i = 0; i < fill_answers.length; i++) { answer += '填空位' + (i + 1) + ':' + fill_answers[i].answers.join('、') + '
'; } } catch (e) { console.log('answer', index, answer, e); return value; } } else if (row.kind == 'SHORT') { try { let short_answers = JSON.parse(row.answer); answer = '标准答案:' + short_answers.answer + '
'; for (let i = 0; i < short_answers.config.length; i++) { // answer += '关键词' + (i + 1) + ':' + short_answers[i].answer + '
'; answer += '关键词' + (i + 1) + ':' + short_answers.config[i].answer + '(' + short_answers.config[i].score + '分)
'; } } catch (e) { console.log('short answer', index, answer, e); return value; } } else if (row.kind == 'MATERIAL') { return '-'; } console.log('answer', value, answer); return answer; } }, { field: 'status', title: __('Status'), searchList: {"NORMAL": __('Normal'), "HIDDEN": __('Hidden')}, formatter: Table.api.formatter.status, operate: false }, { field: 'total_count', title: '总答题次数', }, { field: 'right_count', title: '答对数', }, { field: 'error_count', title: '答错数', }, /*{ field: 'createtime', title: __('Createtime'), operate: 'RANGE', addclass: 'datetimerange', autocomplete: false, formatter: Table.api.formatter.datetime },*/ /*{ field: 'updatetime', title: __('Updatetime'), operate: 'RANGE', addclass: 'datetimerange', autocomplete: false, formatter: Table.api.formatter.datetime },*/ { field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate } ] ] }); // 为表格绑定事件 Table.api.bindevent(table); // 打开导入页面 $('.btn-importPage').click(function () { Fast.api.open('exam/question/import', '导入试题', { area: ['800px', '380px'], callback: function (data) { table.bootstrapTable('refresh'); } }); }); }, recyclebin: function () { // 初始化表格参数配置 Table.api.init({ extend: { 'dragsort_url': '' } }); var table = $("#table"); // 初始化表格 table.bootstrapTable({ url: 'exam/question/recyclebin' + location.search, pk: 'id', sortName: 'id', escape:false,//false解析html,默认为true不解析 columns: [ [ {checkbox: true}, {field: 'id', title: __('Id')}, {field: 'title', title: __('Title'), align: 'left', formatter: Table.api.formatter.content}, { field: 'deletetime', title: __('Deletetime'), operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime }, { field: 'operate', width: '130px', title: __('Operate'), table: table, events: Table.api.events.operate, buttons: [ { name: 'Restore', text: __('Restore'), classname: 'btn btn-xs btn-info btn-ajax btn-restoreit', icon: 'fa fa-rotate-left', url: 'exam/question/restore', refresh: true }, /*{ name: 'Destroy', text: __('Destroy'), classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit', icon: 'fa fa-times', url: 'exam/question/destroy', refresh: true }*/ ], formatter: Table.api.formatter.operate } ] ] }); // 为表格绑定事件 Table.api.bindevent(table); }, add: function () { fa_form = Form Controller.api.bindevent(); $('input[name="row[kind]"]')[0].click() setTimeout(() => { optionCtrl(Form); init_count++; }, 500) }, edit: function () { Controller.api.bindevent(); optionCtrl(Form, 'edit'); init_count++; }, image: function () { // Controller.api.bindevent(); Form.api.bindevent($("form[role=form]"), function (data, ret) { let img = $('#c-imgs').val(); if (!img) { Toastr.warning('未上传图片文件'); } Fast.api.close(img); }, function (data, ret) { Toastr.error("失败"); }); }, import: function () { Controller.api.bindevent(); // 手动绑定导入事件 Upload.api.upload($('.btn-import'), function (data, ret) { let cate = $('#c-cate_id').val(); // let exam_type = $('#c-exam_type_id').val(); if (!cate) { // || !exam_type Fast.api.msg('请先选择所属类型及考试分类再进行上传!') return false; } $('#file_url').val(data.url); Fast.api.ajax({ url: 'exam/question/importExcel', data: { file: data.url, cate: cate, // exam_type: exam_type }, }, function (data, ret) { console.log(data, ret) $('#question_count').html(`本次上传识别到 ${data.count} 道题`) }); }); $('#test').click(function () { Fast.api.ajax({ url: 'exam/question/test', }, function (data, ret) { console.log(data, ret) return false }) }) }, // 选择题目页面 select: function () { // 初始化表格参数配置 Table.api.init({ extend: { index_url: 'exam/question/select' + location.search, // add_url: 'exam/question/add', // edit_url: 'exam/question/edit', // del_url: 'exam/question/del', // multi_url: 'exam/question/multi', // import_url: 'exam/question/import', table: 'exam_question', } }); var table = $("#table"); //在普通搜索渲染后 table.on('post-common-search.bs.table', function (event, table) { let form = $("form", table.$commonsearch); $("input[name='cate_id']", form).addClass("selectpage").data("source", "exam/cate/selectpage").data("params", {"custom[kind]": "QUESTION"}).data("orderBy", "sort desc"); // $("input[name='exam_type_id']", form).addClass("selectpage").data("source", "exam_type/index").data("orderBy", "sort desc"); Form.events.cxselect(form); Form.events.selectpage(form); }); // 初始化表格 table.bootstrapTable({ url: $.fn.bootstrapTable.defaults.extend.index_url, pk: 'id', sortName: 'id', search: false, showExport: false,//隐藏导出 showToggle: false,//隐藏浏览模式 showColumns: false,//隐藏显示隐藏模式 searchFormVisible: true,//默认显示搜索表单 escape:false,//false解析html,默认为true不解析 columns: [ [ {checkbox: true}, {field: 'id', title: __('Id')}, {field: 'cate_id', title: __('Cate_id'), autocomplete: false, visible: false}, {field: 'cate.name', title: __('Cate_id'), operate: false}, { field: 'kind', title: __('Kind'), searchList: {"JUDGE": __('Judge'), "SINGLE": __('Single'), "MULTI": __('Multi'), "FILL": __('Fill'), "SHORT": __('Short'), "MATERIAL": __('Material')}, formatter: Table.api.formatter.normal }, {field: 'title', title: __('Title'), autocomplete: false, operate: 'LIKE', formatter: Table.api.formatter.content}, { field: 'difficulty', title: __('Difficulty'), searchList: {"EASY": __('Easy'), "GENERAL": __('General'), "HARD": __('Hard')}, formatter: Table.api.formatter.normal }, { field: 'answer', title: __('Answer'), halign: 'center', align: 'left', operate: false, formatter: function (value, row, index) { var answer = value; // 填空题 if (row.kind == 'FILL') { try { answer = ''; let fill_answers = JSON.parse(row.answer); for (let i = 0; i < fill_answers.length; i++) { answer += '填空位' + (i + 1) + ':' + fill_answers[i].answers.join('、') + '
'; } } catch (e) { console.log('fill answer', index, answer, e); return value; } } else if (row.kind == 'SHORT') { try { answer = ''; let short_answers = JSON.parse(row.answer); for (let i = 0; i < short_answers.length; i++) { // answer += '关键词' + (i + 1) + ':' + short_answers[i].answer + '
'; answer += '关键词' + (i + 1) + ':' + short_answers[i].answer + '(' + short_answers[i].score + '分)
'; } } catch (e) { console.log('short answer', index, answer, e); return value; } } return answer; } }, { field: 'status', title: __('Status'), searchList: {"NORMAL": __('Normal'), "HIDDEN": __('Hidden')}, formatter: Table.api.formatter.status, operate: false }, ] ] }); // 为表格绑定事件 Table.api.bindevent(table); // 批量确认选择 $('.btn-confirm-choose').click(function () { // Table.api.select // var ids = Table.api.selectedids(table);//获取选中列的id // if (ids.length == 0){ // layer.alert("请选择题目"); // return false; // } var rows = $("#table").bootstrapTable('getSelections'); console.log('select questions', rows, rows.length, 'length') if (rows.length == 0){ layer.alert("请选择题目"); return false; } Fast.api.close(rows); }); }, api: { bindevent: function () { Form.api.bindevent( $("form[role=form]"), () => { console.log('success', this) }, () => { console.log('fail', this) }, () => { console.log('submit', this, valid_result) // 触发验证 $('#valid').click() return valid_result; }, ); // 题库和材料题联动 $('#c-cate_id').on('change', function () { $("#c-material_question_id").selectPageClear() }); $("#c-material_question_id").data("params", function () { const cate_id = $("input[name='row[cate_id]']").val(); return { custom: { cate_id: cate_id, kind: 'MATERIAL', } } }); } } }; return Controller; }); function optionCtrl(Form, type = 'add') { console.log('init_count', init_count) if (init_count > 0) { return; } $('.btn-append').html(' 添加选项'); // 添加选项 $(document).on("fa.event.appendfieldlist", '[data-name="row[options_json]"] .btn-append', function () { console.log('append xxx') $('.btn-dragsort').hide(); let dd = $('dd[class="form-inline"]'); let options_img = $('#c-options_img'); let question_num = dd.length; if (question_num > 8) { Toastr.error('选项不能超过8个'); // $('input[name="row[options_json]['+question_num+'][value]"]').next().click(); // $('input[name="row[options_json]['+question_num+'][value]"]').parent().remove(); dd[question_num - 1].remove(); return false; } // 重排选项名称 sortOptions(); // 删除选项 bindRemoveOption(); // 添加上传图片控件 // $(dd[question_num - 1]).append(imageUploadHtml('row[options_json][' + (question_num - 1) + '][image]')); // $(dd[question_num - 1]).append(editorHtml('row[options_json][' + (question_num - 1) + '][image]')); // Form.api.bindevent($("form[role=form]")); // 添加设为答案按钮 $(dd[question_num - 1]).append('设为答案'); // 添加上传图片按钮 $(dd[question_num - 1]).append('上传图片'); if (options_img.val()) { let option_img_json = JSON.parse(options_img.val()) if(option_img_json) { option_img_json.forEach((item) => { let index = option_name.indexOf(item.key) // 不知为啥会执行两次 if ($('.option-preview-' + index).length === 0) { $(dd[index]).append(previewHtml(index, item.value)); } }) } } bindSetAnswer(); bindUploadImage(); if (type === 'edit') { initEditBtn() } }); } // 编辑时处理按钮文本 function initEditBtn() { let answer = $('#c-answer').val() if (!answer) return console.log('initEditBtn answer', answer) $('.btn-set').each(function (index, ele) { const key = $($(ele).parent().find('input')[0]).val() console.log('initEditBtn key', key) if (key && answer.indexOf(key) > -1) { $(ele).removeClass('btn-info').addClass('btn-warning').text('取消答案').data('type', 'CANCEL') } }) } // 监听删除选项按钮事件 function bindRemoveOption() { $('.btn-remove').click(function () { //延迟重排选项名称 setTimeout(() => { sortOptions(); }, 300); }); } // 监听设为答案按钮事件 function bindSetAnswer() { $('.btn-set').unbind('click').click(function () { let type = $(this).data('type'); let name = $($(this).parent().children('input')[0]).val(); let answer_type = getAnswerType(); let c_answer = $('#c-answer'); // 设为答案 if (type === 'SET') { // 单选 if (answer_type === 'SINGLE' || !c_answer.val()) { c_answer.val(name); $('.btn-set').removeClass('btn-warning').addClass('btn-info').text('设为答案').data('type', 'SET'); $(this).removeClass('btn-info').addClass('btn-warning').text('取消答案').data('type', 'CANCEL'); } else {// 多选 let answers = c_answer.val(); let answer_arr = answers.split(','); answer_arr.push(name); answer_arr = unique(answer_arr); c_answer.val(answer_arr.join(',')); $(this).removeClass('btn-info').addClass('btn-warning').text('取消答案').data('type', 'CANCEL'); } } else {// 取消答案 // 单选 if (answer_type === 'SINGLE') { if (c_answer.val() === name) { c_answer.val(''); $(this).removeClass('btn-warning').addClass('btn-info').text('设为答案').data('type', 'SET'); } } else {// 多选 let answers = c_answer.val(); let answer_arr = answers.split(','); answer_arr = answer_arr.filter(function (item) { return item !== name; }); console.log(answer_arr); c_answer.val(answer_arr.join(',')); $(this).removeClass('btn-warning').addClass('btn-info').text('设为答案').data('type', 'SET'); } } }); } // 监听上传图片按钮事件 function bindUploadImage() { $('.btn-image').unbind('click').click(function () { let index = $(this).data('id') Fast.api.open('exam/question/image', '选项图片', { area: ['500px', '300px'], callback: function (data) { if (!data) { return } // if ($($('dd[class="form-inline"]')[index]).find('.plupload-preview').length > 0) { // return // } // 加预览图 $($('dd[class="form-inline"]')[index]).append(previewHtml(index, data)) // 赋值图片数据 $('#c-options_img').html(JSON.stringify(getAllPreview())) bindDeleteImage() } }) }); bindDeleteImage() } // 删除图片按钮事件 function bindDeleteImage() { $('.btn-option-img-trash').unbind('click').click(function () { let index = $(this).data('id') $('#c-option_preview_' + index).remove() // 赋值图片数据 $('#c-options_img').html(JSON.stringify(getAllPreview())) }); } // 重排选项名称 function sortOptions() { $('dd[class="form-inline"]').each(function (index, ele) { console.log(option_name[index]); // 配置选项名并设为只读 $($(this).find('.form-control')[0]).val(option_name[index]).attr('readonly', 'readonly'); }); } function unique(arr) { arr.sort(); let newArr = [arr[0]]; for (let i = 1; i < arr.length; i++) { if (arr[i] !== newArr[newArr.length - 1]) { newArr.push(arr[i]); } } return newArr; } function getAnswerType() { let kind = $('input[type="radio"][name="row[kind]"]:checked').val(); return kind === 'MULTI' ? 'MULTI' : 'SINGLE'; } function getAllPreview() { let options_img = [] $('.option-preview').each(function (index, ele) { index = $(ele).data('id') options_img.push({ key: getOptionNameByIndex(index), value: $(this).data('url') }) }) return options_img } function getOptionNameByIndex(index) { console.log('getOptionNameByIndex', index) return $($($('dd[class="form-inline"]')[index]).find('.form-control')[0]).val(); } function previewHtml(id, value) { let cdnurl = Fast.api.cdnurl(value) return ''; } function editorHtml(id, value) { return ''; } function imageUploadHtml(id) { let html = '
' html += ''; html += '
'; html += ''; html += ''; html += '
'; html += ''; html += '
'; html += ''; return html; }