Ver código fonte

考试管理

jiaweiqi 3 anos atrás
pai
commit
39946bdd8e

+ 4 - 4
apps/api/admin/exam/views.py

@@ -51,12 +51,12 @@ class ExamViewSet(CustomModelViewSet):
             exam = Exam.getById(pk)
             exam.change_examinee(user_ids)
             exam.save()
-            SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'添加考生,id=%d' % exam.id, request.POST.get('users'))
+            SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'添加考生,id=%d' % exam.id, request.POST.get('user_ids'))
         return response_ok()
 
     @action(methods=['post'], detail=True)
     def allocation_fixed_exampaper(self, request, pk):
-        exampaper_id = json.loads(request.POST.get('exampaper_id'))
+        exampaper_id = request.POST.get('exampaper_id')
 
         with transaction.atomic():
             exam = Exam.getById(pk)
@@ -68,7 +68,7 @@ class ExamViewSet(CustomModelViewSet):
 
     @action(methods=['post'], detail=True)
     def allocation_random_exampaper(self, request, pk):
-        data = request.data
+        data = request.data.copy()
 
         with transaction.atomic():
             exam = Exam.getById(pk)
@@ -97,7 +97,7 @@ class ExamViewSet(CustomModelViewSet):
             item = {
                 'id':row['user_id'],
                 'username': row['user__username'],
-                'department_name': row['user__department__name'],
+                'department_text': row['user__department__name'],
             }
             result.append(item)
         return response_ok(result)

+ 3 - 3
apps/examination/exam/models.py

@@ -20,11 +20,11 @@ class Exam(models.Model):
     TYPE_JSON = [{'id': item[0], 'value': item[1]} for item in TYPE_CHOICES]
 
     name = models.CharField(max_length=200, verbose_name=u"名称")
-    subject = models.ForeignKey(Subject, verbose_name=u"科目", on_delete=models.PROTECT)
-    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"试卷类型")
+    subject = models.ForeignKey(Subject, verbose_name=u"科目", on_delete=models.PROTECT, null=True, editable=False)
+    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"试卷类型", null=True, editable=False)
     duration = models.IntegerField(verbose_name=u'时长')
     exam_time = models.DateTimeField(verbose_name=u"考试时间")
-    exampaper = models.ForeignKey(ExamPaper, verbose_name=u"试卷", on_delete=models.PROTECT)
+    exampaper = models.ForeignKey(ExamPaper, verbose_name=u"试卷", on_delete=models.PROTECT, null=True, editable=True)
     desc = models.TextField(verbose_name=u"备注", null=True, blank=True)
 
     examinee_count = models.IntegerField(verbose_name=u'考试人数', default=0, editable=False)

+ 12 - 1
apps/examination/exam/serializers.py

@@ -1,18 +1,29 @@
 # coding=utf-8
 
 from rest_framework import serializers
-from .models import Exam
+from .models import Exam, ExamLog
 from utils.exceptions import CustomError
 
 class ExamSerializer(serializers.ModelSerializer):
     subject_name = serializers.CharField(source='subject.name', read_only=True)
     type_text = serializers.CharField(source='get_type_display', read_only=True)
     create_user_text = serializers.CharField(source='create_user.username', read_only=True)
+    question_total_scores = serializers.IntegerField(source='exampaper.question_total_scores', read_only=True)
+    passline = serializers.IntegerField(source='exampaper.passline', read_only=True)
+    exampaper_name = serializers.CharField(source='exampaper.name', read_only=True)
+    examinee_name = serializers.SerializerMethodField()
 
     class Meta:
         model = Exam
         fields = "__all__"
 
+    def get_examinee_name(self, obj):
+        examinees = ExamLog.objects.filter(exam=obj, delete=False).values('user__username')
+        examinee_list = [item['user__username'] for item in examinees]
+        if examinee_list:
+            return ','.join(examinee_list)
+        return ''
+
     def create(self, validated_data):
         validated_data['create_user'] = self.context['request'].user
         instance = super(ExamSerializer, self).create(validated_data)

+ 98 - 0
uis/admin/exam/details.html

@@ -0,0 +1,98 @@
+<!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 id="subject_name" class="cell"></td>
+                            </tr>
+
+                            <tr>
+                                <td class="title">时长:</td>
+                                <td id="duration" class="cell"></td>
+                                <td class="title">考试时间:</td>
+                                <td id="exam_time" class="cell"></td>
+                            </tr>
+                            <tr>
+                                <td class="title">总分:</td>
+                                <td id="question_total_scores" class="cell"></td>
+                                <td class="title">及格线:</td>
+                                <td id="passline" class="cell"></td>
+                            </tr>
+                            <tr>
+                                <td class="title">试卷类型:</td>
+                                <td id="type_text" class="cell"></td>
+                                <td class="title">试卷:</td>
+                                <td id="exampaper_name" class="cell"></td>
+                            </tr>
+                            <tr>
+                                <td class="title">添加人:</td>
+                                <td id="create_user_text" class="cell"></td>
+                                <td class="title">添加时间:</td>
+                                <td id="create_time" class="cell"></td>
+                            </tr>
+                            <tr id="id_analysis">
+                                <td class="title">备注:</td>
+                                <td colspan="3" id="desc" class="cell"></td>
+                            </tr>
+                            <tr id="id_analysis">
+                                <td class="title">参加人员:</td>
+                                <td colspan="3" id="examinee_name" 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) {
+            if (element.id === 'passline'){
+                element.innerHTML += (editdata[element.id] || 0)
+            }else{
+                element.innerHTML += (editdata[element.id] || '')
+            }
+
+        });
+
+    });
+</script>
+</body>
+</html>

+ 108 - 0
uis/admin/exam/edit.html

@@ -0,0 +1,108 @@
+<!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">
+                            <input type="text" name="name" class="layui-input" lay-verify="required">
+                        </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="exam_time" class="layui-input" id="id_exam_time" lay-verify="required">
+                        </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="duration" lay-verify="intGeZ|required" class="layui-input">
+                        </div>
+                    </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>
+            </form>
+        </div>
+    </div>
+</div>
+
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index',
+    }).use(['index', 'form', 'utils', 'laydate', ], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            ,laydate = layui.laydate
+            , form = layui.form;
+
+        var id = layui.view.getParameterByName('id');
+
+        form.render(null, 'component-form-element');
+        laydate.render({
+            elem: '#id_exam_time'
+            ,type: 'datetime'
+            ,trigger: 'click'
+            ,format: 'yyyy-MM-dd HH:mm:ss'
+        })
+
+        if (id) {
+            var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+            form.val("component-form-element", editdata);
+        }
+
+        var url = id ? '/admin/exam/' + id + "/" : '/admin/exam/';
+        var method = id ? 'put' : 'post';
+
+        form.on('submit(component-form-element)', function(data){
+
+          admin.req({
+            url: url
+            , data: data.field
+            , type: method
+            ,done: function(res){
+                parent.layui.onSubmitChild(res.data);
+            }
+          });
+
+          return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+    });
+</script>
+</body>
+</html>

+ 211 - 0
uis/admin/exam/examinee_edit.html

@@ -0,0 +1,211 @@
+<!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">
+        .seach_items {float:right;margin-left: 10px;}
+    </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-md4">
+            <div class="LAY-btns" style="margin-bottom: 5px;">
+                    <div class="seach_items">
+                        <button class="layui-btn" id="search_user">查询</button>
+                    </div>
+                    <div class="seach_items">
+                        <input type="text"  id="id_name" autocomplete="off" class="layui-input" placeholder="名称"/>
+                    </div>
+                <div style="clear: both;"></div>
+            </div>
+            <table class="layui-hide" id="subject_datagrid"></table>
+              <button class="layui-btn" id="add_check" style="margin-top: 5px">添加选中</button>
+          </div>
+
+          <div class="layui-col-md4">
+            <div class="LAY-btns" style="margin-bottom: 10px;">
+                  <div class="layui-col-xs2">
+                        <label class="layui-form-label">选中的人员</label>
+                    </div>
+                    <div style="clear: both;"></div>
+                </div>
+
+            <table class="layui-hide" id="dataTable" lay-filter="dataTable"></table>
+          <button class="layui-btn" id="remove_check" style="margin-top: 10px">删除选中</button>
+          </div>
+
+            <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element"
+                        style="display: none">保存
+                </button>
+        </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', 'form'], function(){
+    var $ = layui.$;
+    var table = layui.table
+        ,form = layui.form
+        ,admin = layui.admin;
+    var exam_id = layui.view.getParameterByName('exam_id');
+    if (!exam_id){
+        layer.msg('请选择考试!', {icon: 2});
+        return false
+    }
+
+    admin.req({
+        url: '/admin/exam/' + exam_id + '/examinee/',
+        type:'get',
+        done: function (res) {
+            tableIns.reload({
+                data: res.data,
+                cols: [cols],
+            });
+        }
+    });
+
+
+    table.render({
+      elem: '#subject_datagrid'
+      ,url: '/admin/user/?type=2'
+      ,cols: [[
+          {type:'checkbox'}
+        ,{field:'username', title:'姓名'}
+        ,{field:'department_text', title:'部门'}
+      ]]
+        ,height: 'full-145'
+      ,page: true
+      , done: function () {
+      }
+    });
+
+
+    $('#search_user').on('click', function () {
+        table.reload('subject_datagrid', {
+            where: {username: $('#id_name').val()}
+            , page: {curr: 1}
+        });
+    })
+
+    var cols = [
+        {type:'checkbox'},
+        {field: 'username', title: '姓名'},
+        {field: 'department_text', title: '部门'},
+    ]
+
+    var layTableId = "layTable";
+    var tableIns = table.render({
+        elem: '#dataTable',
+        id: layTableId,
+        data: [],
+        page: false,
+        limit:1000000,
+        loading: true,
+        height: 'full-145',
+        even: true, //不开启隔行背景
+        cols: [cols],
+        done: function (data, date, total) {
+        }
+    });
+
+
+
+
+     $('#add_check').on('click', function () {
+          var selectData = layui.table.checkStatus('subject_datagrid').data;
+          // 获取左边表格选中数据后 刷新右边表格
+         var oldData = [];
+         oldData = table.cache[layTableId];
+
+         for (var i=0; i<selectData.length; i++){
+             var is_have = false;
+             for (var j=0; j<oldData.length; j++){
+                 if (selectData[i].id === oldData[j].id){
+                     is_have = true
+                 }
+             }
+
+             if(!is_have){
+                 oldData.push({
+                     id: selectData[i].id,
+                     username: selectData[i].username,
+                     department_text: selectData[i].department_text
+                 })
+             }
+         }
+
+         tableIns.reload({
+            data: oldData,
+            cols: [cols],
+        });
+      })
+
+      $('#remove_check').on('click', function () {
+
+
+          var oldData = table.cache[layTableId];
+
+          for (var x in oldData){
+              if (oldData[x].LAY_CHECKED){
+                  oldData.splice(x)
+              }
+          }
+
+          tableIns.reload({
+            data: oldData,
+            cols: [cols],
+        });
+      })
+
+
+      form.on('submit(component-form-element)', function(data){
+          var users = table.cache[layTableId];
+          if (users.length === 0){
+              layer.msg('请添加考生!', {icon: 2});
+                return false
+          }
+          if (!exam_id){
+            layer.msg('请选择考试!', {icon: 2});
+            return false
+        }
+          user_ids = [];
+          for (var i=0; i<users.length; i++){
+              user_ids.push(users[i].id)
+          }
+            admin.req({
+            url: '/admin/exam/' + exam_id + '/add_examinee/'
+            , data: {user_ids: JSON.stringify(user_ids)}
+            , type: 'post'
+            ,done: function(res){
+                parent.layui.onSubmitChild(res.data);
+            }
+          });
+
+          return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+
+
+});
+  </script>
+</body>
+</html>

+ 420 - 0
uis/admin/exam/exampaper_edit.html

@@ -0,0 +1,420 @@
+<!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="type" lay-verify="required" lay-filter="typeChange" id="id_type">
+                                <option value="1" selected>固定试卷</option>
+                                <option value="2">随机试卷</option>
+                            </select>
+                        </div>
+                    </div>
+
+                </div>
+
+
+                <div class="layui-form-item" id="fixed_exampaper">
+                    <div class="layui-inline">
+                        <label class="layui-form-label"><font color='red' size="4">*</font>选择试卷:</label>
+                        <div class="layui-input-inline">
+                            <input type="text" id="exampaper_name" class="layui-input">
+                        </div>
+                        <div class="layui-input-inline">
+                            <button type="button" class="layui-btn" id="search_btn">查询 </button>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <div id="fixed">
+                        <label class="layui-form-label"></label>
+                        <div class="layui-input-block" id="id_table">
+                            <div id="tableRes" class="table-overlay" style="align-items: center">
+                                <table id="dataTable" lay-filter="dataTable"></table>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div id="random">
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>配置:</label>
+                                <div class="layui-inline" style="width: 80%">
+                                <label class="layui-form-label">单选题:</label>
+                                <div class="layui-inline" style="width: 85%">
+                                    每题
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="single_scores" autocomplete="off" class="layui-input">
+                                      </div>
+                                    分
+                                    ,简单
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="single_simple_count" autocomplete="off" class="layui-input single">
+                                      </div>
+
+                                    ,中等
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="single_mid_count" autocomplete="off" class="layui-input single">
+                                      </div>
+                                    ,困难
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="single_hard_count" autocomplete="off" class="layui-input single">
+                                      </div>
+                                    <div class="layui-inline" style="width: 10%">
+                                        <label id="id_single_total_count" class="layui-form-label">共&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;题</label>
+                                      </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"></label>
+                                <div class="layui-inline" style="width: 80%">
+                                <label class="layui-form-label">多选题:</label>
+                                <div class="layui-inline" style="width: 85%">
+                                    每题
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="multiple_scores" autocomplete="off" class="layui-input">
+                                      </div>
+                                    分
+                                    ,简单
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="multiple_simple_count" autocomplete="off" class="layui-input multiple">
+                                      </div>
+
+                                    ,中等
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="multiple_mid_count" autocomplete="off" class="layui-input multiple">
+                                      </div>
+                                    ,困难
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="multiple_hard_count" autocomplete="off" class="layui-input multiple">
+                                      </div>
+                                    <div class="layui-inline" style="width: 10%">
+                                        <label id="id_multiple_total_count" class="layui-form-label">共&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;题</label>
+                                      </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"></label>
+                                <div class="layui-inline" style="width: 80%">
+                                <label class="layui-form-label">判断题:</label>
+                                <div class="layui-inline" style="width: 85%">
+                                    每题
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="judgment_scores" autocomplete="off" class="layui-input">
+                                      </div>
+                                    分
+                                    ,简单
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="judgment_simple_count" autocomplete="off" class="layui-input judgment">
+                                      </div>
+
+                                    ,中等
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="judgment_mid_count" autocomplete="off" class="layui-input judgment">
+                                      </div>
+                                    ,困难
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="judgment_hard_count" autocomplete="off" class="layui-input judgment">
+                                      </div>
+                                    <div class="layui-inline" style="width: 10%">
+                                        <label id="id_judgment_total_count" class="layui-form-label">共&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;题</label>
+                                      </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"></label>
+                                <div class="layui-inline" style="width: 80%">
+                                <label class="layui-form-label">填空题:</label>
+                                <div class="layui-inline" style="width: 85%">
+                                    每题
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="fill_scores" autocomplete="off" class="layui-input">
+                                      </div>
+                                    分
+                                    ,简单
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="fill_simple_count" autocomplete="off" class="layui-input fill">
+                                      </div>
+
+                                    ,中等
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="fill_mid_count" autocomplete="off" class="layui-input fill">
+                                      </div>
+                                    ,困难
+                                    <div class="layui-inline" style="width: 10%">
+                                        <input type="text" lay-verify="intGtz" name="fill_hard_count" autocomplete="off" class="layui-input fill">
+                                      </div>
+                                    <div class="layui-inline" style="width: 10%">
+                                        <label id="id_fill_total_count" class="layui-form-label">共&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;题</label>
+                                      </div>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+
+                </div>
+
+                <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element"
+                        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', ], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            , table = layui.table
+            , form = layui.form;
+
+        var exam_id = layui.view.getParameterByName('exam_id');
+
+
+        admin.req({
+            url: '/admin/subject/dict/',
+            done: function (res) {
+                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 () {
+            var subject = $('#id_subject').val();
+            var type = $('#id_type').val();
+            if (type === '1'){
+                $('#fixed').show();
+                $('#fixed_exampaper').show();
+                $('#random').hide();
+
+                if (subject){
+                    table_reload(subject)
+                }
+
+            }else{
+                $('#fixed').hide();
+                $('#fixed_exampaper').hide();
+                $('#random').show();
+            }
+        };
+
+        $('.single').on("input", function (e) {
+            var total = 0;
+            $('.single').each(function (i) {
+                var target =  $('.single')[i];
+                var val = parseInt(target.value);
+                if(!isNaN(val) && val){
+                    total += val
+                }
+            });
+             var txt = '共&nbsp;&nbsp;&nbsp;&nbsp;' + total + '&nbsp;&nbsp;&nbsp;&nbsp;题';
+            $('#id_single_total_count').html(txt);
+        });
+        $('.multiple').on("input", function (e) {
+            var total = 0;
+            $('.multiple').each(function (i) {
+                var target =  $('.multiple')[i];
+                var val = parseInt(target.value);
+                if(!isNaN(val) && val){
+                    total += val
+                }
+            });
+            var txt = '共&nbsp;&nbsp;&nbsp;&nbsp;' + total + '&nbsp;&nbsp;&nbsp;&nbsp;题';
+            $('#id_multiple_total_count').html(txt);
+        });
+        $('.fill').on("input", function (e) {
+            var total = 0;
+            $('.fill').each(function (i) {
+                var target =  $('.fill')[i];
+                var val = parseInt(target.value);
+                if(!isNaN(val) && val){
+                    total += val
+                }
+            });
+            var txt = '共&nbsp;&nbsp;&nbsp;&nbsp;' + total + '&nbsp;&nbsp;&nbsp;&nbsp;题';
+            $('#id_fill_total_count').html(txt);
+        });
+        $('.judgment').on("input", function (e) {
+            var total = 0;
+            $('.judgment').each(function (i) {
+                var target =  $('.judgment')[i];
+                var val = parseInt(target.value);
+                if(!isNaN(val) && val){
+                    total += val
+                }
+            });
+            var txt = '共&nbsp;&nbsp;&nbsp;&nbsp;' + total + '&nbsp;&nbsp;&nbsp;&nbsp;题';
+            $('#id_judgment_total_count').html(txt);
+        });
+
+        form.render(null, 'component-form-element');
+
+        $('#search_btn').on('click', function () {
+            var subject = $('#id_subject').val();
+            var name = $('#exampaper_name').val();
+            table_reload(subject, name)
+        });
+
+        var typeChange = function (value) {
+            // 如果试卷类型是固定试卷  根据科目和类型 去后端请求相应类型的试卷 加载  如果是 随机试卷 改变table
+            if (value === '2'){
+                $('#fixed').hide();
+                $('#fixed_exampaper').hide();
+                $('#random').show();
+            }else if (value === '1'){
+                $('#fixed').show();
+                $('#fixed_exampaper').show();
+                $('#random').hide();
+            }else{
+                layer.msg('请选择一个合法试卷类型!', {icon: 2});
+                return false
+            }
+
+            var subject = $('#id_subject').val();
+            if (subject && value === '1'){
+                table_reload(subject);
+            }
+        };
+
+        var subjectChange = function (value) {
+            // 如果试卷类型是 固定试卷  科目改变了添加相应科目的固定试卷  如果是随机试卷不做处理
+            var type = $('#id_type').val();
+            if (type && type === '1'){
+                table_reload(value);
+            }
+        };
+        // 试卷类型修改 重新加载table
+        form.on('select(typeChange)', function (data) {
+            if (!data.value) return;
+            typeChange(data.value)
+        });
+        // 科目改变 重新加载table
+        form.on('select(subjectChange)', function (data) {
+            if (!data.value) return;
+            subjectChange(data.value)
+        });
+
+        var tbWidth = $('#tableRes').width();
+        var cols = [
+            {title: '', type: 'radio', width: '5%', },
+            {title: '编号', type: 'numbers', width: '8%', },
+            {title: '名称', field: 'name', width: '20%', },
+            {title: '科目', field: 'subject_name', width: '15%', },
+            {title: '总分', field: 'question_total_scores', width: '10%', },
+            {title: '及格线', field: 'passline', width: '10%', },
+            {title: '添加人', field: 'create_user_text', width: '10%', },
+            {title: '时间', field: 'create_time', width: '22%', },
+        ]
+        
+        var layTableId = 'layTable';
+        var tableIns = table.render({
+            elem: '#dataTable',
+            id: layTableId,
+            data: [],
+            width: tbWidth,
+            page: true,
+            limit: 10,
+            loading: true,
+            even: true,
+            cols: [cols],
+            done: function (data, date, total) {
+            }
+        })
+
+        var table_reload = function (subject, name='') {
+            admin.req({
+                url: '/admin/exampaper/?subject=' + subject + '&name=' + name,
+                type: 'get',
+                done: function (res) {
+                    tableIns.reload({
+                        data: res.data,
+                        cols: [cols],
+                    });
+                }
+            });
+        };
+
+        form.on('submit(component-form-element)', function(data){
+            if (data.field.type === '1'){
+                var url = '/admin/exam/' + exam_id + '/allocation_fixed_exampaper/';
+                var tableData = table.cache[layTableId], exampaper_id = '', checked = 0;
+
+                for (var i = 0; i < tableData.length; i++) {
+                    if (tableData[i].LAY_CHECKED){
+                        checked += 1;
+                        exampaper_id = tableData[i].id;
+                    }
+                }
+
+                if (checked !==1 ){
+                    layer.msg('请选择一张试卷!', {icon: 2});
+                    return false;
+                }
+                data.field['exampaper_id'] = exampaper_id
+            }else{
+                url = '/admin/exam/' + exam_id + '/allocation_random_exampaper/';
+            }
+
+            admin.req({
+            url: url
+            , data: data.field
+            , type: 'post'
+            ,done: function(res){
+                parent.layui.onSubmitChild(res.data);
+            }
+          });
+
+          return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+    });
+</script>
+</body>
+</html>

+ 277 - 97
uis/admin/exam/index.html

@@ -1,118 +1,298 @@
 <!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;">
+                        <div style="float: left">
+                            <button class="layui-btn layui-btn-sm" id="exam_add">
+                                <i class="layui-icon layui-icon-add-circle"></i>添加
+                            </button>
+                        </div>
+                        <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 name="type">
+                                    <option value="" selected>请选择试卷类型</option>
+                                    <option value="1">固定试卷</option>
+                                    <option value="2">随机试卷</option>
+                                </select>
+                            </div>
+                            <div class="seach_items">
+                                <select id="id_subject" name="subject">
+                                    <option value="" selected>请选择科目</option>
+                                </select>
+                            </div>
+
+                        </form>
+                        <div style="clear: both;"></div>
+                    </div>
+                    <table class="layui-hide" id="exam_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="exampaper_distribution"
+                            >分配试卷</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="examinee_add"
+                            >添加考生</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="exam_detail"
+                            >查看</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="exam_edit"
+                            >修改</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="exam_delete"
+                            >删除</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;
+
+        admin.req({
+            url: '/admin/subject/dict/',
+            done: function (res) {
+                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();
-                }
+        table.render({
+            elem: '#exam_datagrid'
+            , url: '/admin/exam/'
+            , cols: [[
+                {title: '编号', type: 'numbers'}
+                , {field: 'name', title: '名称', width: 200}
+                , {field: 'subject_name', title: '科目', width: 120}
+                , {field: 'exam_time', title: '考试时间', width: 180}
+                , {field: 'type_text', title: '试卷类型', width: 120}
+                , {field: 'examinee_count', title: '考试人数', width: 120}
+                , {field: 'duration', title: '时长', width: 120}
+                , {field: 'question_total_scores', title: '总分', width: 80}
+                , {field: 'passline', title: '及格线', width: 80}
+                , {field: 'create_user_text', title: '添加人', width: 100}
+                , {field: 'create_time', title: '添加时间', width: 180}
+                , {title: '操作', width: 310, align: 'center', fixed: 'right', toolbar: '#exam_question-operate-bar'}
+            ]]
+            , page: true
+            , height: 'full-108'
+        });
+
+        //监听工具条
+        table.on('tool(exam_question-operate)', function (obj) {
+            var data = obj.data;
+            table.editdata = data;
+            if (obj.event === 'exam_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('exam_datagrid', {});
+                        };
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'edit.html?id=' + data.id
+                });
+            }
+            else if (obj.event === 'exam_delete') {
+                layer.confirm('确定要删除该考试吗?', function (index) {
+                    layer.close(index);
+                    admin.req({
+                        url: '/admin/exam/' + data.id + '/'
+                        , type: 'delete'
+                        , done: function (res) {
+                            table.reload('exam_datagrid', {});
+                        }
+                    });
+                });
+            }
+            else if(obj.event === 'exampaper_distribution') {
+                //分配试卷
+                layer.open({
+                    type: 2,
+                    title: '分配试卷',
+                    shadeClose: false,
+                    area: ['95%', '80%'],
+                    btn: ['保存', '取消'],
+                    yes: function (index, dom) {
+                        layui.onSubmitChild = function (res) {
+                            layer.close(index);
+                            table.reload('exam_datagrid', {});
+                        };
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'exampaper_edit.html?exam_id=' + data.id
+                });
+            }
+            else if(obj.event === 'examinee_add'){
+                //添加考生
+                layer.open({
+                    type: 2,
+                    title: '添加考生',
+                    shadeClose: false,
+                    area: ['80%', '85%'],
+                    btn: ['保存', '取消'],
+                    yes: function (index, dom) {
+                        layui.onSubmitChild = function (res) {
+                            layer.close(index);
+                            table.reload('exam_datagrid', {});
+                        };
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'examinee_edit.html?exam_id=' + data.id
+                });
+            }
+            else if (obj.event === 'exam_detail') {
+                layer.open({
+                    type: 2,
+                    title: '查看详情',
+                    shadeClose: false,
+                    area: ['70%', '65%'],
+                    btn: ['关闭'],
+                    yes: function (index, dom) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'details.html'
+                });
+            }
+        });
+
+        form.on('submit(query-form-element)', function (data) {
+            table.reload('exam_datagrid', {
+                where: data.field
+                , page: {curr: 1}
             });
-        }
-      });
+            layer.closeAll();
+            return false
+        });
 
-      return false;
+        $('#exam_add').on('click', function () {
+            layer.open({
+                type: 2,
+                title: '添加试卷',
+                area: ['70%', '90%'],
+                btn: ['保存', '取消'],
+                yes: function (index, dom) {
+                    layui.onSubmitChild = function (res) {
+                        layer.close(index);
+                        table.reload('exam_datagrid', {});
+                    };
+                    layui.submitChild();
+                },
+                btn2: function (index, layero) {
+                    layer.close(index);//关闭当前按钮
+                },
+                content: 'edit.html'
+            });
+        });
     });
 
-  });
-  </script>
+</script>
 </body>
 </html>

+ 1 - 1
uis/admin/index.html

@@ -99,7 +99,7 @@
                   <a lay-href="exampaper/index.html">试卷管理</a>
                 </dd>
                 <dd data-name="nav">
-                  <a lay-href="tenant/index.html">考试管理</a>
+                  <a lay-href="exam/index.html">考试管理</a>
                 </dd>
                 <dd data-name="nav">
                   <a lay-href="applet/index.html">考试记录</a>