瀏覽代碼

Merge remote-tracking branch 'origin/master'

jiaweiqi 3 年之前
父節點
當前提交
221f26a25c

+ 12 - 0
apps/api/admin/examquestion/urls.py

@@ -0,0 +1,12 @@
+# coding=utf-8
+from django.conf.urls import url, include
+from rest_framework.routers import SimpleRouter
+
+from .views import *
+
+urlpatterns = [
+]
+
+router = SimpleRouter()
+router.register(r'', ExamQuestionViewSet)
+urlpatterns += router.urls

+ 32 - 0
apps/api/admin/examquestion/views.py

@@ -0,0 +1,32 @@
+# coding=utf-8
+import json
+from django.db.models import Sum, F
+from rest_framework.decorators import action
+from rest_framework.views import APIView
+from django.db import transaction
+from django.db.models import Q
+from utils.custom_modelviewset import CustomModelViewSet
+from utils import response_ok, response_error
+from utils.permission import IsAdministrator
+from apps.examination.examquestion.serializers import *
+from apps.examination.examquestion.filters import *
+from apps.system.models import SysLog
+
+class ExamQuestionViewSet(CustomModelViewSet):
+    permission_classes = [IsAdministrator, ]
+    queryset = ExamQuestion.objects.filter(delete=False)
+    serializer_class = ExamQuestionSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter()
+        f = ExamQuestionFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def destroy(self, request, *args, **kwargs):
+        print(444444444)
+        with transaction.atomic():
+            instance = self.get_object()
+            instance.delete = True
+            instance.save()
+            SysLog.objects.addnew(request.user, SysLog.INSERT, u"删除试题,id=%d" % instance.id)
+        return response_ok()

+ 3 - 1
apps/api/admin/urls.py

@@ -13,4 +13,6 @@ urlpatterns = [
     url(r'^department/', include('apps.api.admin.department.urls')),
     url(r'^user/', include('apps.api.admin.user.urls')),
     url(r'^subject/', include('apps.api.admin.subject.urls')),
-]
+
+    url(r'^examquestion/', include('apps.api.admin.examquestion.urls')),
+]

+ 1 - 1
apps/examination/exampaper/models.py

@@ -71,6 +71,6 @@ class ExamPaperDetail(models.Model):
 
     class Meta:
         db_table = "exam_paper_detail"
-        ordering = ['id']
+        ordering = ['order']
         verbose_name = u"试卷明细"
         default_permissions = ()

+ 15 - 0
apps/examination/examquestion/filters.py

@@ -0,0 +1,15 @@
+# coding=utf-8
+import django_filters
+
+from .models import *
+
+class ExamQuestionFilter(django_filters.FilterSet):
+    chapter = django_filters.CharFilter(field_name='chapter_id')
+    subject = django_filters.CharFilter(field_name='chapter__subject_id')
+    type = django_filters.CharFilter(field_name='type')
+    title = django_filters.CharFilter(field_name='title', lookup_expr='icontains')
+
+    class Meta:
+        model = ExamQuestion
+        fields = '__all__'
+

+ 4 - 4
apps/examination/examquestion/models.py

@@ -36,7 +36,7 @@ class ExamQuestion(models.Model):
     title = models.TextField(verbose_name=u"题目")
     judgment = models.BooleanField(verbose_name=u'判断题答案', default=False)
     analysis = models.TextField(verbose_name=u"解析", null=True, blank=True)
-    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'录入人', editable=False, on_delete=models.PROTECT)
+    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'录入人',related_name='exam_question_user', editable=False, on_delete=models.PROTECT)
     create_time = models.DateTimeField(verbose_name=u"录入时间", default=timezone.now, editable=False)
     delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
 
@@ -91,8 +91,8 @@ class ExamQuestionFeedback(models.Model):
 
     main = models.ForeignKey(ExamQuestion, verbose_name=u"试题", on_delete=models.PROTECT)
     type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"错误类型")
-    desc = models.TextField(verbose_name=u"错误描述", null=True, blank=True)
-    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'反馈人', editable=False, on_delete=models.PROTECT, related_name="exam_question_feedback_ref_create_user")
+    desc = models.TextField(verbose_name=u"错误描述")
+    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'反馈人',related_name='exam_question_feedback_user', editable=False, on_delete=models.PROTECT)
     create_time = models.DateTimeField(verbose_name=u"反馈时间", default=timezone.now, editable=False)
     status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'处理状态', default=UNTREATED)
     process_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"处理人", on_delete=models.PROTECT, null=True, related_name="exam_question_feedback_ref_process_user")
@@ -102,4 +102,4 @@ class ExamQuestionFeedback(models.Model):
         db_table = "exam_question_feedback"
         ordering = ['-id']
         verbose_name = u"错误反馈"
-        default_permissions = ()
+        default_permissions = ()

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

@@ -0,0 +1,18 @@
+# coding=utf-8
+from rest_framework import serializers
+from .models import *
+
+class ExamQuestionSerializer(serializers.ModelSerializer):
+    subject = serializers.CharField(source='chapter.subject.id', read_only=True)
+    create_user_text = serializers.CharField(source='create_user.username', read_only=True)
+    type_text = serializers.CharField(source='get_type_display', read_only=True)
+    difficulty_text = serializers.CharField(source='get_difficulty_display', read_only=True)
+
+    class Meta:
+        model = ExamQuestion
+        fields = '__all__'
+
+    def create(self, validated_data):
+        validated_data['create_user'] = self.context['request'].user
+        instance = super(ExamQuestionSerializer, self).create(validated_data)
+        return instance

+ 10 - 0
apps/examination/urls.py

@@ -0,0 +1,10 @@
+# coding=utf-8
+from django.conf.urls import url, include
+from rest_framework.routers import SimpleRouter
+
+urlpatterns = [
+    url(r'^examquestion/', include('apps.examination.examquestion.urls')),
+]
+
+router = SimpleRouter()
+urlpatterns += router.urls

+ 1 - 1
apps/foundation/serializers.py

@@ -52,4 +52,4 @@ class ChapterSimpleSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = Chapter
-        fields = ['id', 'name', ]
+        fields = ['id', 'name', 'subject_id' ]

+ 11 - 0
apps/practise/errorbook/models.py

@@ -1,8 +1,19 @@
 # coding=utf-8
 
 from django.db import models
+from django.utils import timezone
+from django.conf import settings
+
+from apps.examination.exam.models import ExamAnswerLog
+from apps.examination.examquestion.models import ExamQuestion
 
 class ErrorBook(models.Model):
+    question = models.ForeignKey(ExamQuestion, verbose_name=u"试题", on_delete=models.PROTECT)
+    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'答题人', editable=False, on_delete=models.PROTECT)
+    last_answer_log = models.ForeignKey(ExamAnswerLog, verbose_name=u"最后答题记录", on_delete=models.PROTECT)
+    last_time = models.DateTimeField(verbose_name=u"最后出错时间", default=timezone.now)
+    wrong_count = models.IntegerField(verbose_name=u'出错次数', default=0, editable=False)
+
     class Meta:
         db_table = "practise_error_book"
         ordering = ['-id']

+ 63 - 0
apps/practise/practiselog/models.py

@@ -1,10 +1,73 @@
 # coding=utf-8
 
 from django.db import models
+from django.utils import timezone
+from django.conf import settings
+
+from apps.examination.examquestion.models import ExamQuestion, ExamQuestionOption
 
 class PractiseLog(models.Model):
+    SUBJECT = 1
+    CHAPTER = 2
+    TYPE_CHOICES = (
+        (SUBJECT, u'科目'),
+        (CHAPTER, u'章节'),
+    )
+    TYPE_JSON = [{'id': item[0], 'value': item[1]} for item in TYPE_CHOICES]
+
+    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
+    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'练习人', editable=False, on_delete=models.PROTECT)
+    create_time = models.DateTimeField(verbose_name=u"开始时间", default=timezone.now, editable=False)
+    submit_time = models.DateTimeField(verbose_name=u"结束时间", null=True, blank=True)
+
+    begin_answer = models.ForeignKey('PractiseAnswerLog', verbose_name=u"开始习题", null=True, editable=False, on_delete=models.PROTECT)
+    end_answer = models.ForeignKey('PractiseAnswerLog', verbose_name=u"结束习题", null=True, editable=False, on_delete=models.PROTECT)
+    right_count = models.IntegerField(verbose_name=u'正确数量', default=0, editable=False)
+    wrong_count = models.IntegerField(verbose_name=u'错误数量', default=0, editable=False)
+    total_count = models.IntegerField(verbose_name=u'总数量', default=0, editable=False)
+
     class Meta:
         db_table = "practise_log"
         ordering = ['-id']
         verbose_name = u"练习记录"
+        default_permissions = ()
+
+class PractiseAnswerLog(models.Model):
+    RIGHT = 1
+    WRONG = 2
+    STATUS_CHOICES = (
+        (RIGHT, u'正确'),
+        (WRONG, u'错误'),
+    )
+    STATUS_JSON = [{'id': item[0], 'value': item[1]} for item in STATUS_CHOICES]
+
+    main = models.ForeignKey(PractiseLog, verbose_name=u"练习记录", on_delete=models.PROTECT)
+    question = models.ForeignKey(ExamQuestion, verbose_name=u"试题", on_delete=models.PROTECT)
+    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'回答状态')
+
+    class Meta:
+        db_table = "practise_answer_log"
+        ordering = ['id']
+        verbose_name = u"练习答题记录"
+        default_permissions = ()
+
+class PractiseAnswerOptionLog(models.Model):
+    main = models.ForeignKey(PractiseLog, verbose_name=u"练习答题记录", on_delete=models.PROTECT)
+    option = models.ForeignKey(ExamQuestionOption, verbose_name=u"选项", on_delete=models.PROTECT)
+
+    class Meta:
+        db_table = "practise_answer_option_log"
+        ordering = ['id']
+        verbose_name = u"选择题回答"
+        default_permissions = ()
+
+class PractiseAnswerFillLog(models.Model):
+    main = models.ForeignKey(PractiseLog, verbose_name=u"练习答题记录", on_delete=models.PROTECT)
+    content = models.TextField(verbose_name=u"内容")
+    order = models.IntegerField(verbose_name=u'排序')
+
+    class Meta:
+        db_table = "practise_answer_fill_log"
+        ordering = ['order', 'id']
+        verbose_name = u"填空题回答"
         default_permissions = ()

+ 1 - 1
ks/urls.py

@@ -26,4 +26,4 @@ urlpatterns = [
 ]
 
 urlpatterns += static(settings.UIS_URL, document_root=settings.UIS_ROOT)
-urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

+ 2 - 2
uis/admin/exam/index.html

@@ -2,7 +2,7 @@
 <html>
 <head>
   <meta charset="utf-8">
-  <title>修改密码</title>
+  <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">
@@ -115,4 +115,4 @@
   });
   </script>
 </body>
-</html>
+</html>

+ 2 - 2
uis/admin/examlog/index.html

@@ -2,7 +2,7 @@
 <html>
 <head>
   <meta charset="utf-8">
-  <title>修改密码</title>
+  <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">
@@ -115,4 +115,4 @@
   });
   </script>
 </body>
-</html>
+</html>

+ 2 - 2
uis/admin/exampaper/index.html

@@ -2,7 +2,7 @@
 <html>
 <head>
   <meta charset="utf-8">
-  <title>修改密码</title>
+  <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">
@@ -115,4 +115,4 @@
   });
   </script>
 </body>
-</html>
+</html>

+ 232 - 0
uis/admin/examquestion/edit.html

@@ -0,0 +1,232 @@
+<!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">
+                                <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">解析:</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', 'upload', 'layedit'], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            , upload = layui.upload
+            , layedit = layui.layedit
+            , form = layui.form;
+
+        var id = layui.view.getParameterByName('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 (id) {
+                var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+                form.val("component-form-element", editdata);
+                layedit.setContent(editIndex, editdata.title, false);
+                chapter_id = editdata.chapter;
+                subjectChange(editdata.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('');
+            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'
+            ],
+        });
+
+        // function compareStr(oldStr, newStr){
+        //     //如果字符串相同的话就不在比较
+        //     if(oldStr === newStr) return [];
+        //     //   比较旧的字符串中的src是否还包含在新的字符串中,如果没有表示需要删掉该file
+        //     let srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i // 匹配字符串中的src
+        //     let imgReg = /<img.*?(?:>|\/>)/gi //匹配img标签
+        //     let videoReg = /<video.*?(?:>|\/>)/gi //匹配video标签
+        //     let arrImg = oldStr.match(imgReg);
+        //     let arrVideo = oldStr.match(videoReg);
+        //     let tagArr = [...arrImg, ...arrVideo];
+        //     let srcArr = [];
+        //     //获取旧字符串中的所有src,push进srcArr数组。
+        //     if(tagArr && tagArr.length > 0){
+        //         tagArr.forEach(item=>{
+        //             let src = item.match(srcReg);
+        //             srcArr.push(src[1])
+        //         })
+        //     }
+        //     //遍历srcArr数组,并与新字符串对比,获取需要删除的src(新字符串中不包含旧的路径需要删除)
+        //     let delArr = [];
+        //     if(srcArr && srcArr.length > 0){
+        //         srcArr.forEach(item=>{
+        //             if(newStr.indexOf(item) === -1){
+        //                 delArr.push(item)
+        //             }
+        //         })
+        //     }
+        //     return delArr
+        // }
+
+        form.render(null, 'component-form-element');
+
+        var url = id ? '/admin/examquestion/' + id + "/" : '/admin/examquestion/',
+            method = id ? 'put' : 'post'
+
+        form.on('submit(component-form-element)', function (data) {
+            //layer.msg(JSON.stringify(data.field));
+            //富文本中的内容
+            data.field.title = layedit.getContent(editIndex);
+            // let newContent = data.field.content;
+            // let delArr = compareStr(oldContent, newContent);
+
+            admin.req({
+                url: url
+                , data: data.field
+                , type: method
+                , done: function (res) {
+                    if (res.code != 0) {
+                        layer.msg(res.msg);
+                    } else {
+                        layer.open({
+                            type: 1
+                            , content: '<div style="padding: 20px 100px;">保存成功</div>'
+                            , btn: '关闭'
+                            , btnAlign: 'c' //按钮居中
+                            , shade: 0 //不显示遮罩
+                            , yes: function () {
+                                parent.layer.closeAll('iframe');
+                                parent.layui.table.reload('exam_question_datagrid', {});
+                            }
+                        });
+                    }
+                }
+            });
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+    });
+</script>
+</body>
+</html>

+ 202 - 96
uis/admin/examquestion/index.html

@@ -1,118 +1,224 @@
 <!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_question_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="title" autocomplete="off" class="layui-input"
+                                       placeholder="名称"/>
+                            </div>
+                        </form>
+                        <div style="clear: both;"></div>
+                    </div>
+                    <table class="layui-hide" id="exam_question_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="exam_question_detail"
+                            >查看</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="exam_question_edit"
+                            >修改</a>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="exam_question_delete"
+                            >删除</a>
+                        </div>
+                    </script>
                 </div>
-              </div>
-              </div>
-            </form>
-          </div>
+            </div>
         </div>
-      </div>
+    </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;
 
-  <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');
+        table.render({
+            elem: '#exam_question_datagrid'
+            , url: '/admin/examquestion/'
+            , cols: [[
+                {title: '编号', type: 'numbers'}
+                , {field: 'type_text', title: '难度', width: 100}
+                , {field: 'title', title: '内容', width: 400}
+                , {field: 'difficulty_text', title: '题型', width: 100}
+                , {field: 'create_user_text', title: '录入人', width: 150}
+                , {field: 'create_time', title: '录入时间', width: 200}
+                , {title: '操作', width: 180, align: 'center', fixed: 'right', toolbar: '#exam_question-operate-bar'}
+            ]]
+            , page: true
+            , height: 'full-108'
+        });
 
-    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;
-                }
+        //监听工具条
+        table.on('tool(exam_question-operate)', function (obj) {
+            var data = obj.data;
+            table.editdata = data;
+            if (obj.event === 'exam_question_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_question_datagrid', {});
+                        };
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'edit.html?id=' + data.id
+                });
             }
-            form.val("component-form-element", edit_data);
-            form.render();
-        }
-    });
+            else if (obj.event === 'exam_question_delete') {
+                layer.confirm('确定要删除该试题吗?', function (index) {
+                    layer.close(index);
+                    admin.req({
+                        url: '/admin/examquestion/' + data.id + '/'
+                        , type: 'delete'
+                        , done: function (res) {
+                            table.reload('exam_question_datagrid', {});
+                        }
+                    });
+                });
+            } else if (obj.event === 'exam_question_detail') {
+                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_question_datagrid', {});
+                        };
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                        table.reload('exam_question_datagrid', {});
+                    },
+                    content: 'uploadDetailImg.html?id=' + data.id + '&type=' + obj.event
+                });
+            }
+        });
 
-    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();
-                }
+        form.on('submit(query-form-element)', function (data) {
+            table.reload('exam_question_datagrid', {
+                where: data.field
+                , page: {curr: 1}
             });
-        }
-      });
+            layer.closeAll();
+            return false
+        });
 
-      return false;
+        $('#exam_question_add').on('click', function () {
+            layer.open({
+                type: 2,
+                title: '添加试题',
+                area: ['80%', '80%'],
+                btn: ['保存', '取消'],
+                yes: function (index, dom) {
+                    layui.onSubmitChild = function (res) {
+                        layer.close(index);
+                        table.reload('exam_question_datagrid', {});
+                    };
+                    layui.submitChild();
+                },
+                btn2: function (index, layero) {
+                    layer.close(index);//关闭当前按钮
+                },
+                content: 'edit.html'
+            });
+        });
     });
 
-  });
-  </script>
+</script>
 </body>
-</html>
+</html>

+ 2 - 2
uis/admin/examquestion_feedback/index.html

@@ -2,7 +2,7 @@
 <html>
 <head>
   <meta charset="utf-8">
-  <title>修改密码</title>
+  <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">
@@ -115,4 +115,4 @@
   });
   </script>
 </body>
-</html>
+</html>

+ 7 - 22
uis/admin/index.html

@@ -68,16 +68,10 @@
               </a>
               <dl class="layui-nav-child">
                 <dd data-name="nav">
-                  <a lay-href="user/index.html">用户管理</a>
+                  <a lay-href="examquestion/index.html">试题管理</a>
                 </dd>
                 <dd data-name="nav">
-                  <a lay-href="tenant/index.html">租户管理</a>
-                </dd>
-                <dd data-name="nav">
-                  <a lay-href="applet/index.html">小程序管理</a>
-                </dd>
-                <dd data-name="nav">
-                  <a lay-href="third_party/index.html">第三方设置</a>
+                  <a lay-href="tenant/index.html">错误反馈</a>
                 </dd>
               </dl>
             </li>
@@ -88,16 +82,10 @@
               </a>
               <dl class="layui-nav-child">
                 <dd data-name="nav">
-                  <a lay-href="user/index.html">用户管理</a>
-                </dd>
-                <dd data-name="nav">
-                  <a lay-href="tenant/index.html">租户管理</a>
-                </dd>
-                <dd data-name="nav">
-                  <a lay-href="applet/index.html">小程序管理</a>
+                  <a lay-href="user/index.html">知识管理</a>
                 </dd>
                 <dd data-name="nav">
-                  <a lay-href="third_party/index.html">第三方设置</a>
+                  <a lay-href="tenant/index.html">错误反馈</a>
                 </dd>
               </dl>
             </li>
@@ -108,16 +96,13 @@
               </a>
               <dl class="layui-nav-child">
                 <dd data-name="nav">
-                  <a lay-href="user/index.html">用户管理</a>
-                </dd>
-                <dd data-name="nav">
-                  <a lay-href="tenant/index.html">租户管理</a>
+                  <a lay-href="user/index.html">试卷管理</a>
                 </dd>
                 <dd data-name="nav">
-                  <a lay-href="applet/index.html">小程序管理</a>
+                  <a lay-href="tenant/index.html">考试管理</a>
                 </dd>
                 <dd data-name="nav">
-                  <a lay-href="third_party/index.html">第三方设置</a>
+                  <a lay-href="applet/index.html">考试记录</a>
                 </dd>
               </dl>
             </li>

File diff suppressed because it is too large
+ 0 - 1
uis/layuiadmin/layui/lay/modules/layedit.js


+ 49 - 0
uis/layuiadmin/layui/qrcode.js

@@ -0,0 +1,49 @@
+/**
+ |----------------------------------------------------------------------
+ | __________ ____ _________________________________  ___ _____________
+ | \______   |    |   \_   _____\______   \______   \/   |   \______   \
+ |  |    |  _|    |   /|    __)_ |       _/|     ___/    ~    |     ___/
+ |  |    |   |    |  / |        \|    |   \|    |   \    Y    |    |
+ |  |______  |______/ /_______  /|____|_  /|____|    \___|_  /|____|
+ |         \/                 \/        \/                 \/
+ |----------------------------------------------------------------------
+ | 作者:杨鸿<yh15229262120@qq.com>
+ | 版本:1.0
+ | 日期:2020-04-01
+ |----------------------------------------------------------------------
+ */
+
+ layui.define(["jquery"], function(exports) {
+    var jQuery = layui.jquery;
+    (function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;d<a.length&&0==a[d];)d++;this.num=Array(a.length-d+c);for(var b=0;b<a.length-d;b++)this.num[b]=a[b+d]}function p(a,c){this.totalCount=a;this.dataCount=c}function t(){this.buffer=[];this.length=0}u.prototype={getLength:function(){return this.data.length},
+        write:function(a){for(var c=0;c<this.data.length;c++)a.put(this.data.charCodeAt(c),8)}};o.prototype={addData:function(a){this.dataList.push(new u(a));this.dataCache=null},isDark:function(a,c){if(0>a||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e<c.length;e++)b+=c[e].dataCount;
+        for(e=0;e<this.dataList.length;e++)c=this.dataList[e],d.put(c.mode,4),d.put(c.getLength(),j.getLengthInBits(c.mode,a)),c.write(d);if(d.getLengthInBits()<=8*b)break}this.typeNumber=a}this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17;this.modules=Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=Array(this.moduleCount);for(var b=0;b<this.moduleCount;b++)this.modules[d][b]=null}this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-
+        7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(a,c);7<=this.typeNumber&&this.setupTypeNumber(a);null==this.dataCache&&(this.dataCache=o.createData(this.typeNumber,this.errorCorrectLevel,this.dataList));this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,c){for(var d=-1;7>=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]=
+        0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c<this.modules.length;c++)for(var d=1*c,b=0;b<this.modules[c].length;b++){var e=1*b;this.modules[c][b]&&(a.beginFill(0,100),a.moveTo(e,d),a.lineTo(e+1,d),a.lineTo(e+1,d+1),a.lineTo(e,d+1),a.endFill())}return a},
+        setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(a=8;a<this.moduleCount-8;a++)null==this.modules[6][a]&&(this.modules[6][a]=0==a%2)},setupPositionAdjustPattern:function(){for(var a=j.getPatternPosition(this.typeNumber),c=0;c<a.length;c++)for(var d=0;d<a.length;d++){var b=a[c],e=a[d];if(null==this.modules[b][e])for(var f=-2;2>=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c=
+        j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount-
+        b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0<i;i-=2)for(6==i&&i--;;){for(var g=0;2>g;g++)if(null==this.modules[b][i-g]){var n=!1;f<a.length&&(n=1==(a[f]>>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a,
+        c),b=new t,e=0;e<d.length;e++){var f=d[e];b.put(f.mode,4);b.put(f.getLength(),j.getLengthInBits(f.mode,a));f.write(b)}for(e=a=0;e<c.length;e++)a+=c[e].dataCount;if(b.getLengthInBits()>8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d=
+        0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g<c.length;g++){var n=c[g].dataCount,h=c[g].totalCount-n,b=Math.max(b,n),e=Math.max(e,h);f[g]=Array(n);for(var k=0;k<f[g].length;k++)f[g][k]=255&a.buffer[k+d];d+=n;k=j.getErrorCorrectPolynomial(h);n=(new q(f[g],k.getLength()-1)).mod(k);i[g]=Array(k.getLength()-1);for(k=0;k<i[g].length;k++)h=k+n.getLength()-i[g].length,i[g][k]=0<=h?n.get(h):0}for(k=g=0;k<c.length;k++)g+=c[k].totalCount;d=Array(g);for(k=n=0;k<b;k++)for(g=0;g<c.length;g++)k<f[g].length&&
+        (d[n++]=f[g][k]);for(k=0;k<e;k++)for(g=0;g<c.length;g++)k<i[g].length&&(d[n++]=i[g][k]);return d};s=4;for(var j={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,
+        78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var c=a<<10;0<=j.getBCHDigit(c)-j.getBCHDigit(j.G15);)c^=j.G15<<j.getBCHDigit(c)-j.getBCHDigit(j.G15);return(a<<10|c)^j.G15_MASK},getBCHTypeNumber:function(a){for(var c=a<<12;0<=j.getBCHDigit(c)-
+        j.getBCHDigit(j.G18);)c^=j.G18<<j.getBCHDigit(c)-j.getBCHDigit(j.G18);return a<<12|c},getBCHDigit:function(a){for(var c=0;0!=a;)c++,a>>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+
+        a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;d<a;d++)c=c.multiply(new q([1,l.gexp(d)],0));return c},getLengthInBits:function(a,c){if(1<=c&&10>c)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+
+        a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b<c;b++)for(var e=0;e<c;e++){for(var f=0,i=a.isDark(b,e),g=-1;1>=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5<f&&(d+=3+f-5)}for(b=0;b<c-1;b++)for(e=0;e<c-1;e++)if(f=0,a.isDark(b,e)&&f++,a.isDark(b+1,e)&&f++,a.isDark(b,e+1)&&f++,a.isDark(b+1,e+1)&&f++,0==f||4==f)d+=3;for(b=0;b<c;b++)for(e=0;e<c-6;e++)a.isDark(b,e)&&!a.isDark(b,e+1)&&a.isDark(b,e+
+        2)&&a.isDark(b,e+3)&&a.isDark(b,e+4)&&!a.isDark(b,e+5)&&a.isDark(b,e+6)&&(d+=40);for(e=0;e<c;e++)for(b=0;b<c-6;b++)a.isDark(b,e)&&!a.isDark(b+1,e)&&a.isDark(b+2,e)&&a.isDark(b+3,e)&&a.isDark(b+4,e)&&!a.isDark(b+5,e)&&a.isDark(b+6,e)&&(d+=40);for(e=f=0;e<c;e++)for(b=0;b<c;b++)a.isDark(b,e)&&f++;a=Math.abs(100*f/c/c-50)/5;return d+10*a}},l={glog:function(a){if(1>a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256),
+        LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<<m;for(m=8;256>m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var b=0;b<a.getLength();b++)c[d+b]^=l.gexp(l.glog(this.get(d))+l.glog(a.get(b)));return new q(c,0)},mod:function(a){if(0>
+        this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b<this.getLength();b++)d[b]=this.get(b);for(b=0;b<a.getLength();b++)d[b]^=l.gexp(l.glog(a.get(b))+c);return(new q(d,0)).mod(a)}};p.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],
+        [4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,
+        116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,
+        43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,
+        3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,
+        55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,
+        45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];p.getRSBlocks=function(a,c){var d=p.getRsBlockTable(a,c);if(void 0==d)throw Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+c);for(var b=d.length/3,e=[],f=0;f<b;f++)for(var h=d[3*f+0],g=d[3*f+1],j=d[3*f+2],l=0;l<h;l++)e.push(new p(g,j));return e};p.getRsBlockTable=function(a,c){switch(c){case 1:return p.RS_BLOCK_TABLE[4*(a-1)+0];case 0:return p.RS_BLOCK_TABLE[4*(a-1)+1];case 3:return p.RS_BLOCK_TABLE[4*
+        (a-1)+2];case 2:return p.RS_BLOCK_TABLE[4*(a-1)+3]}};t.prototype={get:function(a){return 1==(this.buffer[Math.floor(a/8)]>>>7-a%8&1)},put:function(a,c){for(var d=0;d<c;d++)this.putBit(1==(a>>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,
+        correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f<a.getModuleCount();f++)for(var i=0;i<a.getModuleCount();i++){d.fillStyle=a.isDark(f,i)?h.foreground:h.background;var g=Math.ceil((i+1)*b)-Math.floor(i*b),
+        j=Math.ceil((f+1)*b)-Math.floor(f*b);d.fillRect(Math.round(i*b),Math.round(f*e),g,j)}}else{a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();c=r("<table></table>").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e<a.getModuleCount();e++){f=r("<tr></tr>").css("height",b+"px").appendTo(c);for(i=0;i<a.getModuleCount();i++)r("<td></td>").css("width",
+        d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}
+    })(jQuery);
+
+    exports('qrcode', null);
+});

Some files were not shown because too many files changed in this diff