Browse Source

错误反馈

jiaweiqi 3 years ago
parent
commit
e4f5fccd88

+ 2 - 2
apps/api/admin/examquestion/views.py

@@ -35,8 +35,8 @@ class ExamQuestionViewSet(CustomModelViewSet):
         validated_data = serializer.validated_data
         SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改试题库试题,id=%d' % (instance.id), validated_data)
 
-        if validated_data['feedback']:
-            feedback = ExamQuestionFeedback.getById(validated_data['feedback'])
+        if 'feedback' in self.request.data and self.request.data['feedback']:
+            feedback = ExamQuestionFeedback.getById(self.request.data['feedback'])
             feedback.process(self.request.user)
             feedback.save()
             SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'处理试题错误反馈,id=%d' % (feedback.id))

+ 2 - 2
apps/api/admin/knowledge/views.py

@@ -33,8 +33,8 @@ class KnowledgeBaseViewSet(CustomModelViewSet):
         validated_data = serializer.validated_data
         SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改知识[%s],id=%d' % (instance.name, instance.id), validated_data)
 
-        if validated_data['feedback']:
-            feedback = KnowledgeBaseFeedback.getById(validated_data['feedback'])
+        if 'feedback' in self.request.data and self.request.data['feedback']:
+            feedback = KnowledgeBaseFeedback.getById(self.request.data['feedback'])
             feedback.process(self.request.user)
             feedback.save()
             SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'处理知识错误反馈,id=%d' % (feedback.id))

+ 2 - 0
apps/examination/examquestion/serializers.py

@@ -113,6 +113,8 @@ class ExamQuestionFeedbackSerializer(serializers.ModelSerializer):
     question_title = serializers.CharField(source='main.title', read_only=True)
     type_text = serializers.CharField(source='get_type_display', read_only=True)
     status_text = serializers.CharField(source='get_status_display', read_only=True)
+    title = serializers.CharField(source='main.title', read_only=True)
+    create_user_text = serializers.CharField(source='create_user.name', read_only=True)
 
     class Meta:
         model = ExamQuestionFeedback

+ 1 - 0
apps/knowledge/serializers.py

@@ -31,6 +31,7 @@ class KnowledgeBaseFeedbackSerializer(serializers.ModelSerializer):
     name = serializers.CharField(source='main.name', read_only=True)
     type_text = serializers.CharField(source='get_type_display', read_only=True)
     status_text = serializers.CharField(source='get_status_display', read_only=True)
+    create_user_text = serializers.CharField(source='create_user.name', read_only=True)
 
     class Meta:
         model = KnowledgeBaseFeedback

+ 81 - 0
uis/admin/examquestion_feedback/details.html

@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>知识管理详细</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+    <style type="text/css">
+        .title {
+            width: 140px;
+            background: #efefef;
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md12">
+
+                    <div id="print_div">
+                        <table class="layui-table">
+
+                            <tr>
+                                <td class="title">题型:</td>
+                                <td id="question_type_text" class="cell"></td>
+                                <td class="title"></td>
+                                <td class="cell"></td>
+                            </tr>
+                            <tr>
+                                <td class="title">内容:</td>
+                                <td colspan="3" id="title" class="cell"></td>
+                            </tr>
+
+                            <tr>
+                                <td class="title">错误类型:</td>
+                                <td id="type_text" class="cell"></td>
+                                <td class="title">反馈人</td>
+                                <td id="create_user_text" class="cell"></td>
+                            </tr>
+
+                            <tr>
+                                <td class="title">处理状态:</td>
+                                <td id="status_text" class="cell"></td>
+                                <td class="title">处理时间</td>
+                                <td id="process_time" class="cell"></td>
+                            </tr>
+                            <tr>
+                                <td class="title">错误描述:</td>
+                                <td colspan="3" id="desc" class="cell"></td>
+                            </tr>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script src="../../layuiadmin/layui/layui.js?t=1"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'table'], function () {
+        var $ = layui.$;
+        var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+        $('.cell').each(function (index, element) {
+            element.innerHTML += (editdata[element.id] || '')
+        });
+    });
+</script>
+</body>
+</html>

+ 435 - 0
uis/admin/examquestion_feedback/edit.html

@@ -0,0 +1,435 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>添加运维宝典</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <form class="layui-form" action="" lay-filter="component-form-element">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <label class="layui-form-label"><font color='red' size="4">*</font>科目:</label>
+                        <div class="layui-input-inline">
+                            <select name="subject" id="id_subject" lay-verify="required" lay-filter="subjectChange">
+                                <option value="">请选择科目</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <label class="layui-form-label"><font color='red' size="4">*</font>章节:</label>
+                        <div class="layui-input-inline">
+                            <select name="chapter" id="id_chapter" lay-verify="required">
+                                <option value="">请选择章节</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <label class="layui-form-label"><font color='red' size="4">*</font>题型:</label>
+                        <div class="layui-input-inline">
+                            <select name="type" lay-verify="required" lay-filter="typeChange" id="id_type">
+                                <option value="">请选择题型</option>
+                                <option value="1">单选题</option>
+                                <option value="2">多选题</option>
+                                <option value="3">填空题</option>
+                                <option value="4">判断题</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <label class="layui-form-label"><font color='red' size="4">*</font>难度:</label>
+                        <div class="layui-input-inline">
+                            <select name="difficulty" lay-verify="required">
+                                <option value="">请选择难度</option>
+                                <option value="1">简单</option>
+                                <option value="2">中等</option>
+                                <option value="3">困难</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <label class="layui-form-label"><font color='red' size="4">*</font>分数:</label>
+                        <div class="layui-input-inline">
+                            <input type="text" name="scores" lay-verify="number"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"><font color='red' size="4">*</font>内容:</label>
+                    <div class="layui-input-block">
+                        <textarea class="layui-textarea" placeholder="请输内容" id="content_demo"></textarea>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"><font color='red' size="4">*</font>选项:</label>
+                    <div class="layui-input-block" id="id_table">
+                        <div class="layui-btn layui-btn-sm layui-btn-normal" id="add_answer">
+                            <i class="layui-icon layui-icon-add "></i> 添加答案
+                        </div>
+                        <div style="height: 5px"></div>
+                        <div id="tableRes" class="table-overlay" style="align-items: center">
+                            <table id="dataTable" lay-filter="dataTable"></table>
+                        </div>
+                    </div>
+                    <div class="layui-input-block layui-hide" id="id_panduan">
+                        <input type="radio" name="judgment" value="1" title="正确" lay-verify="required">
+                        <input type="radio" name="judgment" value="0" title="错误" lay-verify="required">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">解析:</label>
+                    <div class="layui-input-block">
+                        <textarea class="layui-textarea" placeholder="请输内容" name="analysis"></textarea>
+                    </div>
+                </div>
+
+                <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element"
+                        style="display: none">保存
+                </button>
+                <button class="layui-btn" type="button" id="upload_image" style="display: none"></button>
+            </form>
+        </div>
+    </div>
+</div>
+
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index',
+    }).use(['index', 'form', 'utils', 'table', 'layedit'], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            , table = layui.table
+            , layedit = layui.layedit
+            , form = layui.form;
+
+        var id = layui.view.getParameterByName('id');
+        var main_id = layui.view.getParameterByName('main_id');
+        var chapters = [], chapter_id = ''
+        admin.req({
+            url: '/admin/subject/dict/',
+            done: function (res) {
+                chapters = res.data.chapter;
+                var subject = res.data.subject;
+                var subject_node = $('#id_subject');
+                for (var i in subject) {
+                    var pid = subject[i].id;
+                    var subject_value = subject[i].name;
+                    subject_node.append("<option value='" + pid + "'>" + subject_value + "</option>");
+                }
+                form.render();
+                loadData()
+            }
+        });
+        var loadData = function () {
+            if (main_id) {
+                admin.req({
+                   url: '/admin/examquestion/' + main_id + '/',
+                    done: function (res) {
+                        if (res.code) {
+                            layer.msg(res.msg);
+                        }
+                        form.val("component-form-element", res.data);
+                        layedit.setContent(editIndex, res.data.title, false);
+                        chapter_id = res.data.chapter;
+                        subjectChange(res.data.subject);
+                        typeChange(res.data.type.toString(), res.data.items)
+                    }
+                })
+            }
+        };
+        var subjectChange = function (value) {
+            var chapter_option = '';
+            for (var i = 0; i < chapters.length; i++) {
+                if (chapters[i].subject_id == parseInt(value)) {
+                    if (chapters[i].id == chapter_id)
+                        chapter_option += "<option value=" + chapters[i].id + " selected>" + chapters[i].name + "</option>";
+                    else
+                        chapter_option += "<option value=" + chapters[i].id + ">" + chapters[i].name + "</option>";
+                }
+            }
+            $("#id_chapter").append(chapter_option);
+            form.render();
+        };
+        form.on('select(subjectChange)', function (data) {
+            $("#id_chapter").html('');
+            if (!data.value) return;
+            subjectChange(data.value)
+        });
+
+        var editIndex = layedit.build('content_demo', {
+            height: 180,
+            tool: [
+                'code', 'strong', 'italic', 'underline', 'del', 'addhr', '|', 'fontFomatt', 'colorpicker', 'face'
+                , '|', 'left', 'center', 'right', '|', 'link', 'unlink', 'anchors'
+                , '|', 'fullScreen'
+            ],
+        });
+        form.render(null, 'component-form-element');
+
+        form.on('submit(component-form-element)', function (data) {
+            data.field.title = layedit.getContent(editIndex);
+            var id_type = data.field.type
+            var oldData = table.cache[layTableId], rows = [], item = {}, error_msg = '', checked = 0
+
+            data.field.feedback = id;
+
+            for (var i = 0; i < oldData.length; i++) {
+                //单选题、多选、填空
+                if (!oldData[i].content) {
+                    error_msg = '选项' + oldData[i].answer + '请填写答案'
+                    break
+                }
+                if (oldData[i].LAY_CHECKED) {
+                    checked += 1
+                }
+                item = {
+                    id: oldData[i].id,
+                    content: oldData[i].content,
+                    right: oldData[i].LAY_CHECKED ? 1 : 0,
+                    order: oldData[i].LAY_TABLE_INDEX,
+                }
+                rows.push(item)
+
+            }
+            if (error_msg) {
+                layer.msg(error_msg, {icon: 2});
+                return false
+            }
+            if (!checked && id_type < 3) {
+                layer.msg('请选择一个正确答案!', {icon: 2});
+                return false
+            }
+            data.field.rows = JSON.stringify(rows);
+            admin.req({
+                url: '/admin/examquestion/' + main_id + "/"
+                , data: data.field
+                , type: 'put'
+                , done: function (res) {
+                    parent.layui.onSubmitChild(res.data);
+                }
+            });
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+        /////////////////////table
+        var tbWidth = $("#tableRes").width();
+        var cols = [
+            {title: '正确答案', type: 'radio', width: '7%',},
+            {field: 'answer', title: '选项', width: '7%',},
+            {field: 'content', title: '答案', edit: 'text', width: '50%',},
+            {
+                field: 'id', title: '操作', width: '20%', templet: function (d) {
+                    return '<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del" lay-id="' + d.id + '"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+                }
+            }
+        ]
+        var layTableId = "layTable";
+        var tableIns = table.render({
+            elem: '#dataTable',
+            id: layTableId,
+            data: [],
+            width: tbWidth,
+            page: false,
+            limit: 100,
+            loading: true,
+            even: true, //不开启隔行背景
+            cols: [cols],
+            done: function (data, date, total) {
+            }
+        });
+
+        var active = {
+            removeItem: function (index) {
+                var oldData = table.cache[layTableId];
+                oldData.splice(index, 1);    //删除一项
+                var id_type = $('#id_type').val()
+                for (var i = 0; i < oldData.length; i++) {
+                    if (id_type === "1" || id_type === "2") {
+                        //单选题、多选
+                        oldData[i].answer = answers[i]
+                    }
+                    else if (id_type === "3") {
+                        //填空题
+                        oldData[i].answer = '空白' + (parseInt(i) + 1)
+                    }
+                }
+                tableIns.reload({
+                    data: oldData,
+                });
+            },
+        }
+        //激活事件
+        var activeByType = function (type, arg) {
+            if (arguments.length === 2) {
+                active[type] ? active[type].call(this, arg) : '';
+            } else {
+                active[type] ? active[type].call(this) : '';
+            }
+        }
+        table.on('tool(dataTable)', function (obj) {
+            var data = obj.data, event = obj.event, tr = obj.tr; //获得当前行 tr 的DOM对象;
+            var data_index = tr.attr("data-index");
+            switch (event) {
+                case "del":
+                    //obj.del(); //删除对应行(tr)的DOM结构,并更新缓存
+                    activeByType('removeItem', data_index);
+                    layer.msg('删除成功', {icon: 6});
+                    break;
+            }
+        });
+        var answers = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
+            'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
+        form.on('select(typeChange)', function (data) {
+            // 更换题型,重新加载table
+            if (!data.value) return;
+            typeChange(data.value)
+        })
+        var typeChange = function (value, items = []) {
+            layui.$('#id_panduan').addClass('layui-hide')
+            layui.$('#id_table').removeClass('layui-hide')
+            var oldData = [], _cols = cols
+            if (value === "1") {
+                //单选题
+                if (items.length > 0) {
+                    for (var i = 0; i < items.length; i++) {
+                        oldData.push(
+                            {
+                                id: items[i].id,
+                                LAY_CHECKED: items[i].right,
+                                answer: answers[i],
+                                content: items[i].content,
+                            }
+                        )
+                    }
+                } else {
+                    for (var i = 0; i < 4; i++) {
+                        oldData.push(
+                            {
+                                id: '',
+                                answer: answers[i],
+                                content: '',
+                            }
+                        )
+                    }
+                }
+                _cols[0] = {title: '正确答案', type: 'radio', width: '7%',}
+            }
+            else if (value === "2") {
+                //多选题
+                if (items.length > 0) {
+                    for (var i = 0; i < items.length; i++) {
+                        oldData.push(
+                            {
+                                id: items[i].id,
+                                LAY_CHECKED: items[i].right,
+                                answer: answers[i],
+                                content: items[i].content,
+                            }
+                        )
+                    }
+                } else {
+                    for (var i = 0; i < 5; i++) {
+                        oldData.push(
+                            {
+                                id: '',
+                                answer: answers[i],
+                                content: '',
+                            }
+                        )
+                    }
+                }
+                _cols[0] = {title: '正确答案', type: 'checkbox', width: '7%',}
+            }
+            else if (value === "3") {
+                //填空题
+                if (items.length > 0) {
+                    for (var i = 0; i < items.length; i++) {
+                        oldData.push(
+                            {
+                                id: items[i].id,
+                                answer: '空白' + items[i].order,
+                                content: items[i].content,
+                            }
+                        )
+                    }
+                } else {
+                    for (var i = 0; i < 3; i++) {
+                        oldData.push(
+                            {
+                                id: '',
+                                answer: '空白' + (i + 1),
+                                content: '',
+                            }
+                        )
+                    }
+                }
+                _cols = _cols.slice(1, 4)
+                    _cols[0] = {field: 'answer', title: '选项', width: '7%',}
+            }
+            else if (value === "4") {
+                //判断题
+                layui.$('#id_panduan').removeClass('layui-hide')
+                layui.$('#id_table').addClass('layui-hide')
+            }
+            tableIns.reload({
+                data: oldData,
+                cols: [_cols],
+            });
+        }
+        $('#add_answer').on('click', function () {
+            var id_type = $('#id_type').val()
+            if (!id_type) {
+                layer.msg("请先选择题型!", {icon: 2})
+                return false
+            }
+
+            var oldData = table.cache[layTableId];
+            var oldData_len = oldData.length
+            if (id_type === "1" || id_type === "2") {
+                //单选题
+                oldData.push(
+                    {
+                        id: '',
+                        answer: answers[oldData_len],
+                        content: '',
+                    }
+                )
+            }
+            else if (id_type === "3") {
+                //填空题
+                oldData.push(
+                    {
+                        id: '',
+                        answer: '空白' + (oldData_len + 1),
+                        content: '',
+                    }
+                )
+            }
+            tableIns.reload({
+                data: oldData,
+            });
+        });
+
+    });
+</script>
+</body>
+</html>

+ 205 - 96
uis/admin/examquestion_feedback/index.html

@@ -1,118 +1,227 @@
 <!DOCTYPE html>
 <html>
 <head>
-  <meta charset="utf-8">
-  <title>试题错误反馈</title>
-  <meta name="renderer" content="webkit">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
-  <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
-  <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
-   <style type="text/css">
-        .input {
-            width: 70%;
-            border-radius: 2px;
-            height: 30px;
-            border-width: 1px;
-            border-color: lightgray;
-            border-style: solid;
-            background-color: white;
-            padding-left: 3px;
-            margin-top: 20px;
+    <meta charset="utf-8">
+    <title>试题错误反馈</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=agent-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+    <style type="text/css">
+        .seach_items {
+            float: right;
+            margin-left: 10px;
+        }
+    </style>
+    <style type="text/css">
+        .LAY-btns .layui-nav {
+            padding-left: 0;
+            padding-right: 10px;
+            top: -4px;
+            margin: 0 10px;
+            border: 0;
+            background-color: #009688;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-item {
+            line-height: 40px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child {
+            top: 34px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-bar {
+            display: none;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a {
+            color: #333;
+            background-color: #fff;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {
+            background-color: #f2f2f2;
+            color: #000;
+        }
+
+        .tableContent {
+            width: 100%;
+            display: flex;
+            justify-content: space-between;
+            flex-direction: row;
         }
     </style>
 </head>
 <body>
 
-  <div class="layui-fluid">
+<div class="layui-fluid">
     <div class="layui-card">
         <div class="layui-card-body" pad15>
-            <form class="layui-form" action="" lay-filter="component-form-element">
-              <div class="layui-row layui-col-space10 layui-form-item">
-                <div>
-                  <label><font color='red' size="4">*</font>商品提成比例:</label>
-                  <input type="text" name="package_percentage" lay-verify="required|numberGtZ" autocomplete="off" class="input">
-                  <label><font color='red' size="4" style="font-size: small;">佣金=商品优惠价*提成比例</font></label>
-                </div>
-                <div>
-                    <label ><font color='red' size="4">*</font>整车提成比例:</label>
-                    <input type="text" name="vehicle_percentage" lay-verify="required|numberGtZ" autocomplete="off" class="input">
-                    <label><font color='red' style="font-size: small;">佣金=车型定金*提成比例</font></label>
-                </div>
-              <div class="layui-form-item">
-                <div class="layui-input-block">
-                  <button class="layui-btn" lay-submit lay-filter="component-form-element">保存</button>
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md12">
+                    <div class="LAY-btns" style="margin-bottom: 10px;">
+                        <form class="layui-form" lay-filter="query-form-element">
+                            <div class="seach_items">
+                                <button class="layui-btn" lay-submit lay-filter="query-form-element"><i
+                                        class="layui-icon layui-icon-search"></i>查询
+                                </button>
+                            </div>
+                            <div class="seach_items">
+                                <input type="text" name="title" autocomplete="off" class="layui-input" placeholder="题目关键字"/>
+                            </div>
+                            <div class="seach_items">
+                                <select id="id_status" name="status">
+                                    <option value="" selected>处理状态</option>
+                                    <option value="1">未处理</option>
+                                    <option value="2">已处理</option>
+                                </select>
+                            </div>
+                            <div class="seach_items">
+                                <select id="id_chapter" name="chapter">
+                                    <option value="" selected>请选择章节</option>
+                                </select>
+                            </div>
+                            <div class="seach_items">
+                                <select id="id_subject" name="subject" lay-filter="subjectChange">
+                                    <option value="" selected>请选择科目</option>
+                                </select>
+                            </div>
+                        </form>
+                        <div style="clear: both;"></div>
+                    </div>
+                    <table class="layui-hide" id="knowledge_datagrid" lay-filter="exam_question-operate"></table>
+
+                    <script type="text/html" id="exam_question-operate-bar">
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="knowledge_detail"
+                            >查看</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="knowledge_edit"
+                            >修改试题</a>
+                        </div>
+                    </script>
                 </div>
-              </div>
-              </div>
-            </form>
-          </div>
+            </div>
         </div>
-      </div>
-
-
-  <script src="../../layuiadmin/layui/layui.js"></script>
-  <script>
-  layui.config({
-    base: '../../../layuiadmin/' //静态资源所在路径
-  }).extend({
-    index: 'lib/index' //主入口模块
-  }).use(['index', 'form', 'utils'], function(){
-    var $ = layui.$
-    ,admin = layui.admin
-    ,element = layui.element
-    ,form = layui.form;
-    form.render(null, 'component-form-element');
-    element.render('breadcrumb', 'breadcrumb');
-
-    admin.req({
-        url: '/tenant/config/',
-        done: function (res) {
-            var data = res.data;
-            var edit_data = {};
-            for(var i in data) {
-                if (data[i].property === 'package_percentage'){
-                    edit_data['package_percentage'] = data[i].value;
-                }else if (data[i].property === 'vehicle_percentage') {
-                    edit_data['vehicle_percentage'] = data[i].value;
+    </div>
+</div>
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'table', 'form', 'admin',], function () {
+        var $ = layui.$;
+        var table = layui.table
+            , admin = layui.admin
+            , form = layui.form;
+
+        table.render({
+            elem: '#knowledge_datagrid'
+            , url: '/admin/examquestion/feedback/'
+            , cols: [[
+                {title: '编号', type: 'numbers'}
+                , {field: 'question_type_text', title: '题型', width: 100}
+                , {field: 'title', title: '内容', width: 400}
+                , {field: 'type_text', title: '错误类型', width: 90}
+                , {field: 'desc', title: '错误描述', width: 300}
+                , {field: 'create_user_text', title: '反馈人', width: 80}
+                , {field: 'status_text', title: '处理状态', width: 90}
+                , {field: 'process_time', title: '处理时间', width: 200}
+                , {title: '操作', width: 160, align: 'center', fixed: 'right', toolbar: '#exam_question-operate-bar'}
+            ]]
+            , page: true
+            , height: 'full-108'
+        });
+
+        var chapters = [], chapter_id = '';
+        admin.req({
+            url: '/admin/subject/dict/',
+            done: function (res) {
+                chapters = res.data.chapter;
+                var subject = res.data.subject;
+                var subject_node = $('#id_subject');
+                for (var i in subject) {
+                    var pid = subject[i].id;
+                    var subject_value = subject[i].name;
+                    subject_node.append("<option value='" + pid + "'>" + subject_value + "</option>");
                 }
+                form.render();
             }
-            form.val("component-form-element", edit_data);
-            form.render();
-        }
-    });
+        });
 
-    form.on('submit(component-form-element)', function(data){
-      var save_data = [];
-      if (data.field['package_percentage']){
-          save_data.push({key: 'package_percentage', value: data.field['package_percentage']})
-      }
-      if (data.field['vehicle_percentage']){
-          save_data.push({key: 'vehicle_percentage', value: data.field['vehicle_percentage']})
-      }
-      admin.req({
-        url: '/tenant/config/'
-        ,data: {data: JSON.stringify(save_data)}
-        ,type: 'post'
-        ,done: function(res){
-            layer.open({
-                 type: 1
-                ,content: '<div style="padding: 20px 100px;">保存成功</div>'
-                ,btn: '关闭'
-                ,btnAlign: 'c' //按钮居中
-                ,shade: 0 //不显示遮罩
-                ,yes: function(){
-                  layer.closeAll();
-                  //admin.exit();
+        var subjectChange = function (value) {
+            var chapter_option = '';
+            for (var i = 0; i < chapters.length; i++) {
+                if (chapters[i].subject_id === parseInt(value)) {
+                    chapter_option += "<option value=" + chapters[i].id + ">" + chapters[i].name + "</option>";
                 }
+            }
+            $("#id_chapter").append(chapter_option);
+            form.render();
+        };
+        form.on('select(subjectChange)', function (data) {
+            $("#id_chapter").html('<option value="" selected>请选择章节</option>');
+            if (!data.value) return;
+            subjectChange(data.value)
+        });
+
+
+        //监听工具条
+        table.on('tool(exam_question-operate)', function (obj) {
+            var data = obj.data;
+            table.editdata = data;
+            if (obj.event === 'knowledge_edit') {
+                layer.open({
+                    type: 2,
+                    title: '修改试题',
+                    shadeClose: false,
+                    area: ['80%', '80%'],
+                    btn: ['保存', '取消'],
+                    yes: function (index, dom) {
+                        layui.onSubmitChild = function (res) {
+                            layer.close(index);
+                            table.reload('knowledge_datagrid', {});
+                        };
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'edit.html?id=' + data.id + '&main_id=' + data.main
+                });
+            } else if (obj.event === 'knowledge_detail') {
+                layer.open({
+                    type: 2,
+                    title: '查看详情',
+                    shadeClose: false,
+                    area: ['70%', '80%'],
+                    btn: ['关闭'],
+                    yes: function (index, dom) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'details.html'
+                });
+            }
+        });
+
+        form.on('submit(query-form-element)', function (data) {
+            table.reload('knowledge_datagrid', {
+                where: data.field
+                , page: {curr: 1}
             });
-        }
-      });
+            layer.closeAll();
+            return false
+        });
 
-      return false;
     });
 
-  });
-  </script>
+</script>
 </body>
 </html>

+ 2 - 2
uis/admin/index.html

@@ -71,7 +71,7 @@
                   <a lay-href="examquestion/index.html">试题管理</a>
                 </dd>
                 <dd data-name="nav">
-                  <a lay-href="tenant/index.html">错误反馈</a>
+                  <a lay-href="examquestion_feedback/index.html">错误反馈</a>
                 </dd>
               </dl>
             </li>
@@ -85,7 +85,7 @@
                   <a lay-href="knowledge/index.html">知识管理</a>
                 </dd>
                 <dd data-name="nav">
-                  <a lay-href="tenant/index.html">错误反馈</a>
+                  <a lay-href="knowledge_feedback/index.html">错误反馈</a>
                 </dd>
               </dl>
             </li>

+ 0 - 2
uis/admin/knowledge/edit.html

@@ -143,8 +143,6 @@
                 return false
             }
 
-            console.log(data.field)
-
             admin.req({
                 url: url
                 , data: data.field

+ 83 - 0
uis/admin/knowledge_feedback/details.html

@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>知识管理详细</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+    <style type="text/css">
+        .title {
+            width: 140px;
+            background: #efefef;
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md12">
+
+                    <div id="print_div">
+                        <table class="layui-table">
+
+                            <tr>
+                                <td class="title">名称:</td>
+                                <td id="name" class="cell"></td>
+                                <td class="title"></td>
+                                <td class="cell"></td>
+                            </tr>
+                            <tr>
+                                <td class="title">科目:</td>
+                                <td id="subject_name" class="cell"></td>
+                                <td class="title">章节:</td>
+                                <td id="chapter_name" class="cell"></td>
+                            </tr>
+
+                            <tr>
+                                <td class="title">错误类型:</td>
+                                <td id="type_text" class="cell"></td>
+                                <td class="title">反馈人</td>
+                                <td id="create_user_text" class="cell"></td>
+                            </tr>
+
+                            <tr>
+                                <td class="title">处理状态:</td>
+                                <td id="status_text" class="cell"></td>
+                                <td class="title">处理时间</td>
+                                <td id="process_time" class="cell"></td>
+                            </tr>
+                            <tr>
+                                <td class="title">错误描述:</td>
+                                <td colspan="3" id="desc" class="cell"></td>
+                            </tr>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script src="../../layuiadmin/layui/layui.js?t=1"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'table'], function () {
+        var $ = layui.$;
+        var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+        $('.cell').each(function (index, element) {
+            element.innerHTML += (editdata[element.id] || '')
+        });
+    });
+</script>
+</body>
+</html>

+ 170 - 0
uis/admin/knowledge_feedback/edit.html

@@ -0,0 +1,170 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>知识管理添加、修改</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <form class="layui-form" action="" lay-filter="component-form-element">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <label class="layui-form-label"><font color='red' size="4">*</font>科目:</label>
+                        <div class="layui-input-inline">
+                            <select name="subject" id="id_subject" lay-verify="required" lay-filter="subjectChange">
+                                <option value="">请选择科目</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <label class="layui-form-label"><font color='red' size="4">*</font>章节:</label>
+                        <div class="layui-input-inline">
+                            <select name="chapter" id="id_chapter" lay-verify="required">
+                                <option value="">请选择章节</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <label class="layui-form-label"><font color='red' size="4">*</font>名称:</label>
+                        <div class="layui-input-inline">
+                            <input type="text" name="name" lay-verify="required" class="layui-input">
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label"><font color='red' size="4">*</font>识别特征:</label>
+                    <div class="layui-input-block">
+                        <textarea class="layui-textarea" placeholder="请输内容" id="content_demo"></textarea>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">备注:</label>
+                    <div class="layui-input-block">
+                        <textarea class="layui-textarea" placeholder="请输内容" name="desc"></textarea>
+                    </div>
+                </div>
+
+                <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element"
+                        style="display: none">保存
+                </button>
+                <button class="layui-btn" type="button" id="upload_image" style="display: none"></button>
+            </form>
+        </div>
+    </div>
+</div>
+
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index',
+    }).use(['index', 'form', 'utils', 'table', 'layedit'], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            , table = layui.table
+            , layedit = layui.layedit
+            , form = layui.form;
+
+        var id = layui.view.getParameterByName('id');
+        var main_id = layui.view.getParameterByName('main_id');
+        var chapters = [], chapter_id = '';
+        admin.req({
+            url: '/admin/subject/dict/',
+            done: function (res) {
+                chapters = res.data.chapter;
+                var subject = res.data.subject;
+                var subject_node = $('#id_subject');
+                for (var i in subject) {
+                    var pid = subject[i].id;
+                    var subject_value = subject[i].name;
+                    subject_node.append("<option value='" + pid + "'>" + subject_value + "</option>");
+                }
+                form.render();
+                loadData()
+            }
+        });
+        var loadData = function () {
+            if (main_id) {
+                admin.req({
+                   url: '/admin/knowledge/' + main_id + '/',
+                    done: function (res) {
+                        if (res.code) {
+                            layer.msg(res.msg);
+                        }
+                        form.val("component-form-element", res.data);
+                        layedit.setContent(editIndex, res.data.feature, false);
+                        chapter_id = res.data.chapter;
+                        subjectChange(res.data.subject);
+                    }
+                })
+            }
+        };
+        var subjectChange = function (value) {
+            var chapter_option = '';
+            for (var i = 0; i < chapters.length; i++) {
+                if (chapters[i].subject_id === parseInt(value)) {
+                    if (chapters[i].id === chapter_id)
+                        chapter_option += "<option value=" + chapters[i].id + " selected>" + chapters[i].name + "</option>";
+                    else
+                        chapter_option += "<option value=" + chapters[i].id + ">" + chapters[i].name + "</option>";
+                }
+            }
+            $("#id_chapter").append(chapter_option);
+            form.render();
+        };
+        form.on('select(subjectChange)', function (data) {
+            $("#id_chapter").html('<option value="">请选择章节</option>');
+            if (!data.value) return;
+            subjectChange(data.value)
+        });
+
+        var editIndex = layedit.build('content_demo', {
+            height: 200,
+            tool: [
+                'code', 'strong', 'italic', 'underline', 'del', 'addhr', '|', 'fontFomatt', 'colorpicker', 'face'
+                , '|', 'left', 'center', 'right', '|', 'link', 'unlink', 'anchors'
+                , '|', 'fullScreen'
+            ],
+        });
+        form.render(null, 'component-form-element');
+
+        form.on('submit(component-form-element)', function (data) {
+            data.field.feature = layedit.getContent(editIndex);
+            if(!data.field.feature){
+                layer.msg('知识特征不能为空!', {icon: 2});
+                return false
+            }
+            data.field.feedback = id;
+
+            admin.req({
+                url:  '/admin/knowledge/' + main_id + "/"
+                , data: data.field
+                , type: 'put'
+                , done: function (res) {
+                    parent.layui.onSubmitChild(res.data);
+                }
+            });
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+
+    });
+</script>
+</body>
+</html>

+ 207 - 97
uis/admin/knowledge_feedback/index.html

@@ -1,118 +1,228 @@
 <!DOCTYPE html>
 <html>
 <head>
-  <meta charset="utf-8">
-  <title>修改密码</title>
-  <meta name="renderer" content="webkit">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
-  <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
-  <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
-   <style type="text/css">
-        .input {
-            width: 70%;
-            border-radius: 2px;
-            height: 30px;
-            border-width: 1px;
-            border-color: lightgray;
-            border-style: solid;
-            background-color: white;
-            padding-left: 3px;
-            margin-top: 20px;
+    <meta charset="utf-8">
+    <title>知识错误反馈</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=agent-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+    <style type="text/css">
+        .seach_items {
+            float: right;
+            margin-left: 10px;
+        }
+    </style>
+    <style type="text/css">
+        .LAY-btns .layui-nav {
+            padding-left: 0;
+            padding-right: 10px;
+            top: -4px;
+            margin: 0 10px;
+            border: 0;
+            background-color: #009688;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-item {
+            line-height: 40px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child {
+            top: 34px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-bar {
+            display: none;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a {
+            color: #333;
+            background-color: #fff;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {
+            background-color: #f2f2f2;
+            color: #000;
+        }
+
+        .tableContent {
+            width: 100%;
+            display: flex;
+            justify-content: space-between;
+            flex-direction: row;
         }
     </style>
 </head>
 <body>
 
-  <div class="layui-fluid">
+<div class="layui-fluid">
     <div class="layui-card">
         <div class="layui-card-body" pad15>
-            <form class="layui-form" action="" lay-filter="component-form-element">
-              <div class="layui-row layui-col-space10 layui-form-item">
-                <div>
-                  <label><font color='red' size="4">*</font>商品提成比例:</label>
-                  <input type="text" name="package_percentage" lay-verify="required|numberGtZ" autocomplete="off" class="input">
-                  <label><font color='red' size="4" style="font-size: small;">佣金=商品优惠价*提成比例</font></label>
-                </div>
-                <div>
-                    <label ><font color='red' size="4">*</font>整车提成比例:</label>
-                    <input type="text" name="vehicle_percentage" lay-verify="required|numberGtZ" autocomplete="off" class="input">
-                    <label><font color='red' style="font-size: small;">佣金=车型定金*提成比例</font></label>
-                </div>
-              <div class="layui-form-item">
-                <div class="layui-input-block">
-                  <button class="layui-btn" lay-submit lay-filter="component-form-element">保存</button>
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md12">
+                    <div class="LAY-btns" style="margin-bottom: 10px;">
+                        <form class="layui-form" lay-filter="query-form-element">
+                            <div class="seach_items">
+                                <button class="layui-btn" lay-submit lay-filter="query-form-element"><i
+                                        class="layui-icon layui-icon-search"></i>查询
+                                </button>
+                            </div>
+                            <div class="seach_items">
+                                <input type="text" name="name" autocomplete="off" class="layui-input" placeholder="名称关键字"/>
+                            </div>
+                            <div class="seach_items">
+                                <select id="id_status" name="status">
+                                    <option value="" selected>处理状态</option>
+                                    <option value="1">未处理</option>
+                                    <option value="2">已处理</option>
+                                </select>
+                            </div>
+                            <div class="seach_items">
+                                <select id="id_chapter" name="chapter">
+                                    <option value="" selected>请选择章节</option>
+                                </select>
+                            </div>
+                            <div class="seach_items">
+                                <select id="id_subject" name="subject" lay-filter="subjectChange">
+                                    <option value="" selected>请选择科目</option>
+                                </select>
+                            </div>
+                        </form>
+                        <div style="clear: both;"></div>
+                    </div>
+                    <table class="layui-hide" id="knowledge_datagrid" lay-filter="exam_question-operate"></table>
+
+                    <script type="text/html" id="exam_question-operate-bar">
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="knowledge_detail"
+                            >查看</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="knowledge_edit"
+                            >修改知识</a>
+                        </div>
+                    </script>
                 </div>
-              </div>
-              </div>
-            </form>
-          </div>
+            </div>
         </div>
-      </div>
-
-
-  <script src="../../layuiadmin/layui/layui.js"></script>
-  <script>
-  layui.config({
-    base: '../../../layuiadmin/' //静态资源所在路径
-  }).extend({
-    index: 'lib/index' //主入口模块
-  }).use(['index', 'form', 'utils'], function(){
-    var $ = layui.$
-    ,admin = layui.admin
-    ,element = layui.element
-    ,form = layui.form;
-    form.render(null, 'component-form-element');
-    element.render('breadcrumb', 'breadcrumb');
-
-    admin.req({
-        url: '/tenant/config/',
-        done: function (res) {
-            var data = res.data;
-            var edit_data = {};
-            for(var i in data) {
-                if (data[i].property === 'package_percentage'){
-                    edit_data['package_percentage'] = data[i].value;
-                }else if (data[i].property === 'vehicle_percentage') {
-                    edit_data['vehicle_percentage'] = data[i].value;
+    </div>
+</div>
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'table', 'form', 'admin',], function () {
+        var $ = layui.$;
+        var table = layui.table
+            , admin = layui.admin
+            , form = layui.form;
+
+        table.render({
+            elem: '#knowledge_datagrid'
+            , url: '/admin/knowledge/feedback/'
+            , cols: [[
+                {title: '编号', type: 'numbers'}
+                , {field: 'subject_name', title: '科目', width: 150}
+                , {field: 'chapter_name', title: '章节', width: 150}
+                , {field: 'name', title: '名称', width: 150}
+                , {field: 'type_text', title: '错误类型', width: 90}
+                , {field: 'desc', title: '错误描述', width: 300}
+                , {field: 'create_user_text', title: '反馈人', width: 80}
+                , {field: 'status_text', title: '处理状态', width: 90}
+                , {field: 'process_time', title: '处理时间', width: 200}
+                , {title: '操作', width: 160, align: 'center', fixed: 'right', toolbar: '#exam_question-operate-bar'}
+            ]]
+            , page: true
+            , height: 'full-108'
+        });
+
+        var chapters = [], chapter_id = '';
+        admin.req({
+            url: '/admin/subject/dict/',
+            done: function (res) {
+                chapters = res.data.chapter;
+                var subject = res.data.subject;
+                var subject_node = $('#id_subject');
+                for (var i in subject) {
+                    var pid = subject[i].id;
+                    var subject_value = subject[i].name;
+                    subject_node.append("<option value='" + pid + "'>" + subject_value + "</option>");
                 }
+                form.render();
             }
-            form.val("component-form-element", edit_data);
-            form.render();
-        }
-    });
+        });
 
-    form.on('submit(component-form-element)', function(data){
-      var save_data = [];
-      if (data.field['package_percentage']){
-          save_data.push({key: 'package_percentage', value: data.field['package_percentage']})
-      }
-      if (data.field['vehicle_percentage']){
-          save_data.push({key: 'vehicle_percentage', value: data.field['vehicle_percentage']})
-      }
-      admin.req({
-        url: '/tenant/config/'
-        ,data: {data: JSON.stringify(save_data)}
-        ,type: 'post'
-        ,done: function(res){
-            layer.open({
-                 type: 1
-                ,content: '<div style="padding: 20px 100px;">保存成功</div>'
-                ,btn: '关闭'
-                ,btnAlign: 'c' //按钮居中
-                ,shade: 0 //不显示遮罩
-                ,yes: function(){
-                  layer.closeAll();
-                  //admin.exit();
+        var subjectChange = function (value) {
+            var chapter_option = '';
+            for (var i = 0; i < chapters.length; i++) {
+                if (chapters[i].subject_id === parseInt(value)) {
+                    chapter_option += "<option value=" + chapters[i].id + ">" + chapters[i].name + "</option>";
                 }
+            }
+            $("#id_chapter").append(chapter_option);
+            form.render();
+        };
+        form.on('select(subjectChange)', function (data) {
+            $("#id_chapter").html('<option value="" selected>请选择章节</option>');
+            if (!data.value) return;
+            subjectChange(data.value)
+        });
+
+
+        //监听工具条
+        table.on('tool(exam_question-operate)', function (obj) {
+            var data = obj.data;
+            table.editdata = data;
+            if (obj.event === 'knowledge_edit') {
+                layer.open({
+                    type: 2,
+                    title: '修改知识',
+                    shadeClose: false,
+                    area: ['80%', '80%'],
+                    btn: ['保存', '取消'],
+                    yes: function (index, dom) {
+                        layui.onSubmitChild = function (res) {
+                            layer.close(index);
+                            table.reload('knowledge_datagrid', {});
+                        };
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'edit.html?id=' + data.id + '&main_id=' + data.main
+                });
+            } else if (obj.event === 'knowledge_detail') {
+                layer.open({
+                    type: 2,
+                    title: '查看详情',
+                    shadeClose: false,
+                    area: ['70%', '70%'],
+                    btn: ['关闭'],
+                    yes: function (index, dom) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'details.html'
+                });
+            }
+        });
+
+        form.on('submit(query-form-element)', function (data) {
+            table.reload('knowledge_datagrid', {
+                where: data.field
+                , page: {curr: 1}
             });
-        }
-      });
+            layer.closeAll();
+            return false
+        });
 
-      return false;
     });
 
-  });
-  </script>
+</script>
 </body>
-</html>
+</html>

+ 6 - 1
utils/custom_modelviewset.py

@@ -36,4 +36,9 @@ class CustomModelViewSet(ModelViewSet):
             return response_error(e.get_error_msg())
         except Exception as e:
             return response_error(str(e))
-        return response_ok()   
+        return response_ok()
+
+    def retrieve(self, request, *args, **kwargs):
+        instance = self.get_object()
+        serializer = self.get_serializer(instance)
+        return response_ok(serializer.data)