123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656 |
- let configs_count = {}
- let config_dialog = 0
- define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'jstree'], function ($, undefined, Backend, Table, Form) {
- //读取选中的条目
- $.jstree.core.prototype.get_all_checked = function (full) {
- var obj = this.get_selected(), i, j;
- for (i = 0, j = obj.length; i < j; i++) {
- obj = obj.concat(this.get_node(obj[i]).parents);
- }
- obj = $.grep(obj, function (v, i, a) {
- return v != '#';
- });
- obj = obj.filter(function (itm, i, a) {
- return i == a.indexOf(itm);
- });
- return full ? $.map(obj, $.proxy(function (i) {
- return this.get_node(i);
- }, this)) : obj;
- };
- var Controller = {
- index: function () {
- // 初始化表格参数配置
- Table.api.init({
- extend: {
- index_url: 'exam/paper/index' + location.search,
- add_url: 'exam/paper/add',
- edit_url: 'exam/paper/edit',
- del_url: 'exam/paper/del',
- multi_url: 'exam/paper/multi',
- import_url: 'exam/paper/import',
- table: 'exam_paper',
- }
- });
- 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='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,//默认显示搜索表单
- columns: [
- [
- {checkbox: true},
- {field: 'id', title: __('Id'), operate: false},
- {field: 'cate_id', title: __('Cate_id'), autocomplete: false, visible: false},
- {field: 'cate.name', title: __('Cate_id'), operate: false},
- {field: 'title', title: __('Title'), autocomplete: false, operate: 'LIKE'},
- {field: 'image', title: __('Image'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image},
- // {field: 'configs', title: __('Configs'), operate: 'LIKE'},
- {field: 'quantity', title: __('Quantity'), operate: false},
- {field: 'total_score', title: __('Total_score'), operate: false},
- {field: 'pass_score', title: __('Pass_score'), operate: false},
- {field: 'limit_count', title: __('Limit_count'), operate: false},
- {
- field: 'mode',
- title: __('Mode'),
- searchList: {"RANDOM": __('Random'), "FIX": __('Fix')},
- formatter: Table.api.formatter.normal
- },
- {
- field: 'limit_time',
- title: __('Limit_time'),
- operate: false,
- autocomplete: false,
- formatter: function (value) {
- return Controller.api.formatDuring(value)
- }
- },
- {
- field: 'start_time',
- title: __('Start_time'),
- operate: 'RANGE',
- addclass: 'datetimerange',
- autocomplete: false,
- formatter: Table.api.formatter.datetime
- },
- {
- field: 'end_time',
- title: __('End_time'),
- operate: 'RANGE',
- addclass: 'datetimerange',
- autocomplete: false,
- formatter: Table.api.formatter.datetime
- },
- // {field: 'is_only_room', title: __('Is_only_room'), searchList: {"1":__('Yes'),"0":__('No')}, formatter: Table.api.formatter.toggle},
- {
- field: 'status',
- title: __('Status'),
- searchList: {"NORMAL": __('Normal'), "HIDDEN": __('Hidden')},
- formatter: Table.api.formatter.status
- },
- {
- 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,
- buttons:[
- {
- name:'selectuser',
- text:'选择用户',
- title:'选择用户',
- icon:'fa fa-exclamation-circle',
- classname:'btn btn-xs btn-info btn-dialog btn-selectuser',
- url:'exam/paper/selectuser/id/{ids}?dialog=1',
- target:'_self',
- },
- {
- name:'grade',
- text:'成绩',
- title:'成绩',
- icon:'fa fa-exclamation-circle',
- classname:'btn btn-xs btn-info btn-dialog btn-grade',
- url:'exam/grade/index/paper_id/{ids}?dialog=1',
- target:'_self',
- },
- {
- name:'nograde',
- text:'缺考',
- title:'缺考',
- icon:'fa fa-exclamation-circle',
- classname:'btn btn-xs btn-info btn-dialog btn-nograde',
- url:'exam/paper/nograde/id/{ids}',
- target:'_self',
- }
- ],
- events: Table.api.events.operate,
- formatter: Table.api.formatter.operate
- }
- ]
- ],
- onLoadSuccess:function(){
- // 这里就是数据渲染结束后的回调函数
- $(".btn-selectuser").data("area", ['80%','80%']);
- $(".btn-grade").data("area", ['90%','90%']);
- $(".btn-nograde").data("area", ['90%','90%']);
- }
- });
- // 为表格绑定事件
- Table.api.bindevent(table);
- },
- recyclebin: function () {
- // 初始化表格参数配置
- Table.api.init({
- extend: {
- 'dragsort_url': ''
- }
- });
- var table = $("#table");
- // 初始化表格
- table.bootstrapTable({
- url: 'exam/paper/recyclebin' + location.search,
- pk: 'id',
- sortName: 'id',
- columns: [
- [
- {checkbox: true},
- {field: 'id', title: __('Id')},
- {field: 'title', title: __('Title'), align: 'left'},
- {
- 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/paper/restore',
- refresh: true
- },
- /*{
- name: 'Destroy',
- text: __('Destroy'),
- classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit',
- icon: 'fa fa-times',
- url: 'exam/paper/destroy',
- refresh: true
- }*/
- ],
- formatter: Table.api.formatter.operate
- }
- ]
- ]
- });
- // 为表格绑定事件
- Table.api.bindevent(table);
- },
- add: function () {
- Controller.api.bindevent()
- Controller.api.bindConfigs()
- Controller.api.bindTime()
- },
- selectuser: function () {
- Controller.apisu.bindevent();
- },
- nograde: function () {
- Controller.api.bindevent()
- },
- edit: function () {
- Controller.api.bindevent()
- Controller.api.bindConfigs()
- Controller.api.getCountScore()
- Controller.api.renderCountScore()
- Controller.api.bindTime()
- },
- apisu: {
- bindevent: function () {
- Form.api.bindevent($("form[role=form]"), null, null, function () {
- if ($("#treeview").length > 0) {
- var r = $("#treeview").jstree("get_all_checked");
- $("input[name='row[user_rule]']").val(r.join(','));
- }
- return true;
- });
- //渲染权限节点树
- //销毁已有的节点树
- $("#treeview").jstree("destroy");
- Controller.apisu.rendertree(nodeData);
- //全选和展开
- $(document).on("click", "#checkall", function () {
- $("#treeview").jstree($(this).prop("checked") ? "check_all" : "uncheck_all");
- });
- $(document).on("click", "#expandall", function () {
- $("#treeview").jstree($(this).prop("checked") ? "open_all" : "close_all");
- });
- $("select[name='row[pid]']").trigger("change");
- },
- rendertree: function (content) {
- $("#treeview")
- .on('redraw.jstree', function (e) {
- $(".layer-footer").attr("domrefresh", Math.random());
- })
- .jstree({
- "themes": {"stripes": true},
- "checkbox": {
- "keep_selected_style": false,
- },
- "types": {
- "root": {
- "icon": "fa fa-folder-open",
- },
- "menu": {
- "icon": "fa fa-folder-open",
- },
- "file": {
- "icon": "fa fa-file-o",
- }
- },
- "plugins": ["checkbox", "types"],
- "core": {
- 'check_callback': true,
- "data": content
- }
- });
- },
- },
- api: {
- bindevent: function () {
- Form.api.bindevent($("form[role=form]"), function () {
- }, function () {
- }, function () {
- let mode = $('input[name="row[mode]"]:checked').val()
- console.log('submit mode', mode)
- if (mode === 'FIX') {
- $('#valid').click()
- return valid_result;
- } else {
- let configs = $('#c-configs').val()
- console.log('configs', configs)
- if (!configs) {
- Layer.alert('请配置试卷出题规则')
- return false
- }
- let quantity = $('.span_quantity').text()
- if (quantity !== $('#c-quantity').val()) {
- Layer.alert('试卷出题规则的选取题数与试卷题目数量不一致')
- return false
- }
- let total_score = $('.span_total_score').text()
- if (total_score !== $('#c-total_score').val()) {
- Layer.alert('试卷出题规则的总分与试卷总分不一致')
- return false
- }
- let limit_time_hour = $('#c-limit_time_hour').val()
- let limit_time_minute = $('#c-limit_time_minute').val()
- let limit_time = (limit_time_hour ? limit_time_hour : 0) * 3600 + (limit_time_minute ? limit_time_minute : 0) * 60
- $('#c-limit_time').val(limit_time)
- }
- return true
- });
- },
- // 选题模式设置
- bindConfigs: function () {
- // 选题模式弹窗
- $('.btn-configs').click(function () {
- let quantity = $('#c-quantity').val()
- let total_score = $('#c-total_score').val()
- if (!quantity || !total_score) {
- Layer.msg('请先设置题目数量和试卷总分')
- return false
- }
- config_dialog = Layer.open({
- type: 1,
- shade: false,
- title: '随机选题配置',
- area: ['600px', '600px'],
- zIndex: 1,
- content: $('#configsDialog'),
- cancel: function () {
- }
- })
- })
- // 选题库获取题数
- $(document).on("change", "#config-cate_id", function () {
- Controller.api.getCountScore()
- })
- // 选取题更改
- $('.input_count').change(function () {
- let type = $(this).data('type')
- let count = $(this).val()
- let score = $('.input_' + type + '_score').val()
- Controller.api.calcCountScore(type, count, score)
- })
- // 每题分数更改
- $('.input_score').change(function () {
- let type = $(this).data('type')
- let count = Controller.api.formatVal($('.input_' + type).val())
- let score = Controller.api.formatVal($(this).val())
- Controller.api.calcCountScore(type, count, score)
- })
- // 分难度更改
- $('.checkbox_difficulty').change(function () {
- let type = $(this).data('type')
- let value = $(this).is(':checked')
- let ul = $('.ul_' + type + '_difficulty')
- let input_count = Controller.api.formatVal($('.input_' + type))
- let input_score = Controller.api.formatVal($('.input_' + type + '_score'))
- let span_score = Controller.api.formatVal($('.span_' + type + '_score'))
- if (value) {
- ul.removeClass('hide').show()
- input_count.attr('disabled', 'disabled')
- input_score.attr('disabled', 'disabled')
- span_score.hide()
- // 触发计算
- $(ul.find('.input_count')[0]).trigger('change')
- } else {
- ul.addClass('hide').hide()
- input_count.removeAttr('disabled', 'disabled')
- input_score.removeAttr('disabled', 'disabled')
- span_score.show()
- }
- // $('.input_count').trigger('change')
- })
- // 保存选题配置 TODO 弃用
- $('#btnSaveConfig').click(function () {
- Controller.api.saveConfig()
- })
- },
- // 保存选题配置
- saveConfig() {
- let configs = {
- cate_ids: $('#config-cate_id').val(),
- all: {},
- judge: {
- difficulty: {}
- },
- single: {
- difficulty: {}
- },
- multi: {
- difficulty: {}
- },
- fill: {
- difficulty: {}
- },
- short: {
- difficulty: {}
- },
- material: {
- difficulty: {}
- },
- }
- // 总
- $('#divAll').find('span').each(function (index, ele) {
- let key = $(ele).attr('class').replace('span_', '')
- configs.all[key] = parseInt(Controller.api.formatVal($(ele).text()))
- })
- // 题型配置
- $('.input_kind_count').each(function (index, ele) {
- let type = $(ele).data('type')
- configs[type]['count'] = parseInt(Controller.api.formatVal($(ele).val()))
- configs[type]['score'] = parseInt(Controller.api.formatVal($(ele).next('span').find('.input_score').val()))
- configs[type]['total_score'] = configs[type]['count'] * configs[type]['score']
- configs[type]['use_difficulty'] = $(ele).parent().find('.checkbox_difficulty').is(':checked')
- })
- // 难度配置
- $('.ul_difficulty').find('.input_count').each(function (index, ele) {
- let type_key = $(ele).data('type').split('_')
- let type = type_key[0]
- let key = type_key[1]
- configs[type].difficulty[key] = {
- count: parseInt(Controller.api.formatVal($(ele).val())),
- score: parseInt(Controller.api.formatVal($(ele).next('.input_score').val()))
- }
- configs[type].difficulty[key]['total_score'] = configs[type].difficulty[key].count * configs[type].difficulty[key].score
- })
- console.log('configs', configs)
- $('#c-configs').val(JSON.stringify(configs))
- Layer.close(config_dialog)
- },
- // 根据题库设置题数、分数
- getCountScore() {
- let cate_ids = $('#config-cate_id').val()
- if (cate_ids) {
- configs_count = {}
- Fast.api.ajax({
- url: 'exam/question/getCount',
- type: 'post',
- data: {cate_ids: cate_ids}
- }, function (data, ret) {
- configs_count = data
- if (!configs_count) {
- return false
- }
- let quantity = $('#c-quantity').val()
- let total_score = $('#c-total_score').val()
- let sing_score = parseInt(total_score / quantity)
- for (let key of Object.keys(configs_count)) {
- let value = configs_count[key]
- $('.span_' + key + '_total').text(value)
- $('.input_' + key).attr('max', value)
- $('.input_' + key + '_score').attr('max', sing_score)//.val(sing_score)
- }
- return false
- });
- }
- },
- calcCountScore(type, count, score) {
- // 计算题型总分
- $('.span_' + type + '_total_score').text(count * score)
- // 计算分难度的总分
- if (type.indexOf('_') > 0) {
- let parent_type = type.split('_')[0]
- let ul = $('.ul_' + parent_type + '_difficulty')
- let parent_count_input = $('.input_' + parent_type)
- let parent_score_span = $('.span_' + parent_type + '_total_score')
- let sum_count = 0
- let sum_score = 0
- ul.find('.input_count').each(function (index, ele) {
- let single_score = $(ele).next('input').val()
- sum_count += parseInt($(ele).val())
- sum_score += parseInt($(ele).val()) * single_score
- })
- parent_count_input.val(sum_count)
- parent_score_span.text(sum_score)
- }
- // 总题数
- let kind_total_count = 0
- $('.input_kind_count').each(function (index, ele) {
- kind_total_count += parseInt($(ele).val())
- })
- $('.span_quantity').text(kind_total_count)
- // 计算总分
- let kind_total_score = 0
- $('.span_kind_total_score').each(function (index, ele) {
- kind_total_score += parseInt($(ele).text())
- })
- $('.span_total_score').text(kind_total_score)
- // 保存配置
- Controller.api.saveConfig()
- },
- // 根据配置设置题数渲染数据
- renderCountScore() {
- // 考试时间渲染
- const limit_time = $('#c-limit_time').val() ? $('#c-limit_time').val() : 0
- if (limit_time) {
- let hour = Math.floor(limit_time / 3600)
- let minute = Math.floor(limit_time / 60) % 60
- $('#c-limit_time_hour').val(hour)
- $('#c-limit_time_minute').val(minute)
- }
- let configs_val = $('#c-configs').val()
- console.log('configs_val', configs_val)
- const config_json = configs_val && typeof configs_val === 'string' ? JSON.parse(configs_val) : {}
- if (config_json && config_json.cate_ids) {
- for (const key in config_json) {
- if (key === 'all') {
- $('.span_quantity').text(config_json.all.quantity)
- $('.span_total_score').text(config_json.all.total_score)
- } else {
- const kind_config = config_json[key]
- $('.input_count[data-type="' + key + '"]').val(kind_config['count'])
- $('.input_score[data-type="' + key + '"]').val(kind_config['score'])
- $('.span_' + key + '_total_score').text(kind_config['total_score'])
- if (kind_config['use_difficulty'] === true) {
- $('.checkbox_' + key).click()
- const difficulty_config = kind_config['difficulty']
- for (const k in difficulty_config) {
- let difficulty_count = difficulty_config[k].count ? difficulty_config[k].count : 0
- let difficulty_score = difficulty_config[k].score ? difficulty_config[k].score : 0
- let difficulty_total_score = difficulty_count * difficulty_score
- $('.input_' + key + '_' + k).val(difficulty_count)
- $('.input_' + key + '_' + k + '_score').val(difficulty_score)
- $('.span_' + key + '_' + k + '_total_score').text(difficulty_total_score)
- }
- }
- }
- }
- // 触发计算
- // $($('.ul_judge_difficulty').find('.input_count')[0]).trigger('change')
- }
- },
- // 限定时间事件,59分转小时
- bindTime() {
- $('#c-limit_time_minute').change(function (ele) {
- let minute = $(this).val()
- if (minute >= 60) {
- $('#c-limit_time_minute').val(0)
- let hour_ctrl = $('#c-limit_time_hour')
- hour_ctrl.val(parseInt(hour_ctrl.val()) + 1)
- }
- })
- },
- // 绑定固定选题配置按钮事件
- bindFixButton() {
- $('.btn-fix-configs').click(function () {
- Fast.api.open('exam/question/select', '选择试题', {
- area: ['90%', '90%'],
- callback: function (data) {
- if (!data) {
- return
- }
- }
- })
- });
- },
- // 秒数转时分秒格式
- formatDuring (second) {
- var hours = parseInt((second % (60 * 60 * 24)) / (60 * 60));
- var minutes = parseInt((second % (60 * 60)) / (60));
- var seconds = (second % (60));
- return hours + "时 " + minutes + "分 " + seconds + "秒";
- },
- // 获取数字值
- formatVal (val) {
- return isNaN(val) ? 0 : val
- },
- }
- };
- return Controller;
- });
|