Forráskód Böngészése

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	apps/examination/examquestion/models.py
wushaodong 3 éve
szülő
commit
026ed02c7e

+ 26 - 1
apps/api/admin/department/views.py

@@ -1,10 +1,15 @@
 # coding=utf-8
 
+from django.db import transaction
+
 from utils.permission import IsAdministrator
+from utils import response_error, response_ok
 from utils.custom_modelviewset import CustomModelViewSet
 from apps.staff.models import Department
 from apps.staff.serializers import DepartmentSerializer
 from apps.staff.filters import DepartmentFilter
+from apps.system.models import SysLog
+
 
 class DepartmentViewSet(CustomModelViewSet):
     permission_classes = [IsAdministrator, ]
@@ -13,4 +18,24 @@ class DepartmentViewSet(CustomModelViewSet):
 
     def filter_queryset(self, queryset):
         f = DepartmentFilter(self.request.GET, queryset=queryset)
-        return f.qs
+        return f.qs
+
+    def perform_create(self, serializer):
+        super(DepartmentViewSet, self).perform_create(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        SysLog.objects.addnew(self.request.user, SysLog.INSERT, u'添加部门[%s],id=%d' % (instance.name, instance.id), validated_data)
+
+    def destroy(self, request, *args, **kwargs):
+        with transaction.atomic():
+            instance = self.get_object()
+            instance.delete = True
+            instance.save()
+            SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除部门[%s],id=%d' % (instance.name, instance.id))
+        return response_ok()
+
+    def perform_update(self, serializer):
+        super(DepartmentViewSet, self).perform_update(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改部门[%s],id=%d' % (instance.name, instance.id), validated_data)

+ 15 - 0
apps/api/admin/subject/urls.py

@@ -0,0 +1,15 @@
+# coding=utf-8
+
+from django.conf.urls import url, include
+from rest_framework.routers import SimpleRouter
+
+from .views import *
+
+urlpatterns = [
+    url(r'^dict/$', DictView.as_view()),
+]
+
+router = SimpleRouter()
+router.register(r'chapter', ChapterViewSet)
+router.register(r'', SubjectViewSet)
+urlpatterns += router.urls

+ 82 - 0
apps/api/admin/subject/views.py

@@ -0,0 +1,82 @@
+# coding=utf-8
+
+from django.db import transaction
+from rest_framework.views import APIView
+from utils.permission import IsAdministrator
+from utils import response_error, response_ok
+from utils.custom_modelviewset import CustomModelViewSet
+from apps.system.models import SysLog
+from apps.foundation.models import Subject, Chapter
+from apps.foundation.filters import SubjectFilter, ChapterFilter
+from apps.foundation.serializers import SubjectSerializer, ChapterSerializer, SubjectSimpleSerializer, ChapterSimpleSerializer
+
+
+class SubjectViewSet(CustomModelViewSet):
+    permission_classes = [IsAdministrator, ]
+    queryset = Subject.objects.filter(delete=False)
+    serializer_class = SubjectSerializer
+
+    def filter_queryset(self, queryset):
+        f = SubjectFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def perform_create(self, serializer):
+        super(SubjectViewSet, self).perform_create(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        SysLog.objects.addnew(self.request.user, SysLog.INSERT, u'添加科目[%s],id=%d' % (instance.name, instance.id), validated_data)
+
+    def perform_update(self, serializer):
+        super(SubjectViewSet, self).perform_update(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改科目[%s],id=%d' % (instance.name, instance.id), validated_data)
+
+    def destroy(self, request, *args, **kwargs):
+        with transaction.atomic():
+            instance = self.get_object()
+            instance.delete = True
+            instance.save()
+            SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除科目[%s],id=%d' % (instance.name, instance.id))
+        return response_ok()
+
+
+class ChapterViewSet(CustomModelViewSet):
+    permission_classes = [IsAdministrator, ]
+    queryset = Chapter.objects.filter(delete=False, subject__delete=False)
+    serializer_class = ChapterSerializer
+
+    def filter_queryset(self, queryset):
+        f = ChapterFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def perform_create(self, serializer):
+        super(ChapterViewSet, self).perform_create(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        SysLog.objects.addnew(self.request.user, SysLog.INSERT, u'添加章节[%s],id=%d' % (instance.name, instance.id), validated_data)
+
+    def perform_update(self, serializer):
+        super(ChapterViewSet, self).perform_update(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改章节[%s],id=%d' % (instance.name, instance.id), validated_data)
+
+    def destroy(self, request, *args, **kwargs):
+        with transaction.atomic():
+            instance = self.get_object()
+            instance.delete = True
+            instance.save()
+            SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除章节[%s],id=%d' % (instance.name, instance.id))
+        return response_ok()
+
+
+class DictView(APIView):
+    permission_classes = [IsAdministrator, ]
+
+    def get(self, request):
+        ret = {
+            'subject': SubjectSimpleSerializer(Subject.objects.filter(delete=False), many=True).data,
+            'chapter': ChapterSimpleSerializer(Chapter.objects.filter(delete=False, subject__delete=False), many=True).data
+        }
+        return response_ok(ret)

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

@@ -9,4 +9,7 @@ urlpatterns = [
     url(r'^token/obtain/$', AdminUserLoginView.as_view()),
     url(r'^token_refresh/$', AdminUserRefreshTokenView.as_view()),
     url(r'^token_verify/$', AdminUserVerifyTokenView.as_view()),
+
+    url(r'^department/', include('apps.api.admin.department.urls')),
+    url(r'^subject/', include('apps.api.admin.subject.urls')),
 ]

+ 98 - 0
apps/examination/exam/models.py

@@ -1,8 +1,36 @@
 # coding=utf-8
 
 from django.db import models
+from django.utils import timezone
+from django.conf import settings
+
+from apps.foundation.models import Subject
+from apps.examination.exampaper.models import ExamPaper
+from apps.examination.examquestion.models import ExamQuestion, ExamQuestionOption
 
 class Exam(models.Model):
+    FIXED = 1
+    RANDOM = 2
+    TYPE_CHOICES = (
+        (FIXED, u'固定试卷'),
+        (RANDOM, u'随机试卷'),
+    )
+    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"试卷类型")
+    duration = models.IntegerField(verbose_name=u'时长')
+    exam_time = models.DateTimeField(verbose_name=u"考试时间")
+    exampaper = models.ForeignKey(ExamPaper, verbose_name=u"试卷", on_delete=models.PROTECT)
+    desc = models.TextField(verbose_name=u"备注", null=True, blank=True)
+
+    examinee_count = models.IntegerField(verbose_name=u'考试人数', default=0, editable=False)
+
+    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)
+    delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
+
     class Meta:
         db_table = "exam"
         ordering = ['-id']
@@ -10,8 +38,78 @@ class Exam(models.Model):
         default_permissions = ()
 
 class ExamLog(models.Model):
+    MOCK = 1
+    FORMAL = 2
+    TYPE_CHOICES = (
+        (MOCK, u'模拟考试'),
+        (FORMAL, u'正式考试'),
+    )
+    TYPE_JSON = [{'id': item[0], 'value': item[1]} for item in TYPE_CHOICES]
+
+    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
+    exam = models.ForeignKey(Exam, verbose_name=u"考试", null=True, blank=True, on_delete=models.PROTECT)
+    exampaper = models.ForeignKey(ExamPaper, verbose_name=u"试卷", on_delete=models.PROTECT)
+    user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'参加人员', on_delete=models.PROTECT)
+
+    scores = models.IntegerField(verbose_name=u'分数', null=True, blank=True)
+    rank = models.IntegerField(verbose_name=u'排名', null=True, blank=True)
+    use_time = models.IntegerField(verbose_name=u'用时', null=True, blank=True)
+    exam_time = models.DateTimeField(verbose_name=u"考试时间", null=True, blank=True)
+    submit_time = models.DateTimeField(verbose_name=u"交卷时间", null=True, blank=True)
+
+    single_answer_scores = models.IntegerField(verbose_name=u'单选题得分', default=0, editable=False)
+    multiple_answer_scores = models.IntegerField(verbose_name=u'多选题得分', default=0, editable=False)
+    fill_answer_scores = models.IntegerField(verbose_name=u'填空题得分', default=0, editable=False)
+    judgment_answer_scores = models.IntegerField(verbose_name=u'判断题得分', default=0, editable=False)
+    single_answer_count = models.IntegerField(verbose_name=u'单选题答对数', default=0, editable=False)
+    multiple_answer_count = models.IntegerField(verbose_name=u'多选题答对数', default=0, editable=False)
+    fill_answer_count = models.IntegerField(verbose_name=u'填空题答对数', default=0, editable=False)
+    judgment_answer_count = models.IntegerField(verbose_name=u'判断题答对数', default=0, editable=False)
+
     class Meta:
         db_table = "exam_log"
         ordering = ['-id']
         verbose_name = u"考试记录"
+        default_permissions = ()
+
+class ExamAnswerLog(models.Model):
+    RIGHT = 1
+    WRONG = 2
+    NOTDONE = 3
+    STATUS_CHOICES = (
+        (RIGHT, u'正确'),
+        (WRONG, u'错误'),
+        (NOTDONE, u'未做'),
+    )
+    STATUS_JSON = [{'id': item[0], 'value': item[1]} for item in STATUS_CHOICES]
+
+    main = models.ForeignKey(ExamLog, 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'回答状态', default=NOTDONE)
+
+    class Meta:
+        db_table = "exam_answer_log"
+        ordering = ['id']
+        verbose_name = u"考试答题记录"
+        default_permissions = ()
+
+class ExamAnswerOptionLog(models.Model):
+    main = models.ForeignKey(ExamAnswerLog, verbose_name=u"考试答题记录", on_delete=models.PROTECT)
+    option = models.ForeignKey(ExamQuestionOption, verbose_name=u"选项", on_delete=models.PROTECT)
+
+    class Meta:
+        db_table = "exam_answer_option_log"
+        ordering = ['id']
+        verbose_name = u"选择题回答"
+        default_permissions = ()
+
+class ExamAnswerFillLog(models.Model):
+    main = models.ForeignKey(ExamAnswerLog, verbose_name=u"考试答题记录", on_delete=models.PROTECT)
+    content = models.TextField(verbose_name=u"内容")
+    order = models.IntegerField(verbose_name=u'排序')
+
+    class Meta:
+        db_table = "exam_answer_fill_log"
+        ordering = ['order', 'id']
+        verbose_name = u"填空题回答"
         default_permissions = ()

+ 65 - 0
apps/examination/exampaper/models.py

@@ -1,10 +1,75 @@
 # coding=utf-8
 
 from django.db import models
+from django.utils import timezone
+from django.conf import settings
+
+from apps.foundation.models import Subject
+from apps.examination.examquestion.models import ExamQuestion
 
 class ExamPaper(models.Model):
+    MOCK = 1
+    FORMAL = 2
+    RANDOM = 3
+    TYPE_CHOICES = (
+        (MOCK, u'模拟试卷'),
+        (FORMAL, u'正式试卷'),
+        (RANDOM, u'随机试卷'),
+    )
+    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"类型")
+    passline = models.IntegerField(verbose_name=u'及格线')
+    desc = models.TextField(verbose_name=u"备注", null=True, blank=True)
+
+    single_simple_count = models.IntegerField(verbose_name=u'简单单选题数量', default=0)
+    multiple_simple_count = models.IntegerField(verbose_name=u'简单多选题数量', default=0)
+    fill_simple_count = models.IntegerField(verbose_name=u'简单填空题数量', default=0)
+    judgment_simple_count = models.IntegerField(verbose_name=u'简单判断题数量', default=0)
+    single_mid_count = models.IntegerField(verbose_name=u'中等单选题数量', default=0)
+    multiple_mid_count = models.IntegerField(verbose_name=u'中等多选题数量', default=0)
+    fill_mid_count = models.IntegerField(verbose_name=u'中等填空题数量', default=0)
+    judgment_mid_count = models.IntegerField(verbose_name=u'中等判断题数量', default=0)
+    single_hard_count = models.IntegerField(verbose_name=u'困难单选题数量', default=0)
+    multiple_hard_count = models.IntegerField(verbose_name=u'困难多选题数量', default=0)
+    fill_hard_count = models.IntegerField(verbose_name=u'困难填空题数量', default=0)
+    judgment_hard_count = models.IntegerField(verbose_name=u'困难判断题数量', default=0)
+    single_scores = models.IntegerField(verbose_name=u'单选题单题分数', default=0)
+    multiple_scores = models.IntegerField(verbose_name=u'多选题单题分数', default=0)
+    fill_scores = models.IntegerField(verbose_name=u'填空题单题分数', default=0)
+    judgment_scores = models.IntegerField(verbose_name=u'判断题单题分数', default=0)
+
+    single_total_count = models.IntegerField(verbose_name=u'单选题总数量', default=0, editable=False)
+    multiple_total_count = models.IntegerField(verbose_name=u'多选题总数量', default=0, editable=False)
+    fill_total_count = models.IntegerField(verbose_name=u'填空题总数量', default=0, editable=False)
+    judgment_total_count = models.IntegerField(verbose_name=u'判断题总数量', default=0, editable=False)
+    single_total_scores = models.IntegerField(verbose_name=u'单选题总分数', default=0, editable=False)
+    multiple_total_scores = models.IntegerField(verbose_name=u'多选题总分数', default=0, editable=False)
+    fill_total_scores = models.IntegerField(verbose_name=u'填空题总分数', default=0, editable=False)
+    judgment_total_scores = models.IntegerField(verbose_name=u'判断题总分数', default=0, editable=False)
+    question_total_count  = models.IntegerField(verbose_name=u'试题总数量', default=0, editable=False)
+    question_total_scores = models.IntegerField(verbose_name=u'试题总分数', default=0, editable=False)
+
+    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)
+    delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
+
+    did_count = models.IntegerField(verbose_name=u'做过人数', default=0, editable=False)
+
     class Meta:
         db_table = "exam_paper"
         ordering = ['-id']
         verbose_name = u"试卷管理"
         default_permissions = ()
+
+class ExamPaperDetail(models.Model):
+    main = models.ForeignKey(ExamPaper, verbose_name=u"试卷", on_delete=models.PROTECT)
+    question = models.ForeignKey(ExamQuestion, verbose_name=u"试题", on_delete=models.PROTECT)
+
+    class Meta:
+        db_table = "exam_paper_detail"
+        ordering = ['id']
+        verbose_name = u"试卷明细"
+        default_permissions = ()

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

@@ -95,7 +95,7 @@ class ExamQuestionFeedback(models.Model):
     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)
+    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")
     process_time = models.DateTimeField(verbose_name=u'处理时间', null=True)
 
     class Meta:

+ 21 - 0
apps/foundation/filters.py

@@ -0,0 +1,21 @@
+# coding=utf-8
+import django_filters
+
+from .models import Subject, Chapter
+
+
+class SubjectFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(field_name="name", lookup_expr="icontains")
+
+    class Meta:
+        model = Subject
+        fields = "__all__"
+
+
+class ChapterFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(field_name="name", lookup_expr="icontains")
+    subject_name = django_filters.CharFilter(field_name="subject__name", lookup_expr="icontains")
+
+    class Meta:
+        model = Chapter
+        fields = "__all__"

+ 12 - 1
apps/foundation/models.py

@@ -2,16 +2,27 @@
 
 from django.db import models
 
+
 class Subject(models.Model):
+    name = models.CharField(max_length=100, verbose_name=u"名称")
+    notes = models.CharField(max_length=500, verbose_name=u"备注", blank=True, null=True)
+    delete = models.BooleanField(verbose_name=u'删除', default=False)
+
     class Meta:
         db_table = "base_subject"
         ordering = ['-id']
         verbose_name = u"科目章节设置"
         default_permissions = ()
 
+
 class Chapter(models.Model):
+    subject = models.ForeignKey(Subject, verbose_name=u"科目", on_delete=models.PROTECT)
+    name = models.CharField(max_length=100, verbose_name=u"名称")
+    notes = models.CharField(max_length=500, verbose_name=u"备注", blank=True, null=True)
+    delete = models.BooleanField(verbose_name=u'删除', default=False)
+
     class Meta:
         db_table = "base_chapter"
         ordering = ['-id']
         verbose_name = u"章节"
-        default_permissions = ()
+        default_permissions = ()

+ 55 - 0
apps/foundation/serializers.py

@@ -0,0 +1,55 @@
+# coding=utf-8
+
+from rest_framework import serializers
+from .models import Subject, Chapter
+from utils.exceptions import CustomError
+
+
+class SubjectSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = Subject
+        fields = "__all__"
+
+    def create(self, validated_data):
+        instance = super(SubjectSerializer, self).create(validated_data)
+        return instance
+
+    def update(self, instance, validated_data):
+        instance = super(SubjectSerializer, self).update(instance, validated_data)
+        return instance
+
+
+class ChapterSerializer(serializers.ModelSerializer):
+    subject_name = serializers.CharField(source='subject.name', read_only=True)
+
+    class Meta:
+        model = Chapter
+        fields = "__all__"
+
+    def validate(self, attrs):
+        if 'subject' in attrs and attrs['subject'].delete:
+            raise CustomError(u'科目[%s]已被删除!' % attrs['subject'].name)
+        return attrs
+
+    def create(self, validated_data):
+        instance = super(ChapterSerializer, self).create(validated_data)
+        return instance
+
+    def update(self, instance, validated_data):
+        instance = super(ChapterSerializer, self).update(instance, validated_data)
+        return instance
+
+
+class SubjectSimpleSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = Subject
+        fields = ['id', 'name', ]
+
+
+class ChapterSimpleSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = Chapter
+        fields = ['id', 'name', ]

+ 1 - 0
apps/staff/models.py

@@ -15,6 +15,7 @@ class Department(models.Model):
     parent_id = models.IntegerField(verbose_name=u"父部门",null=True,blank=True)
     lft = models.IntegerField(verbose_name=u"左值")
     rgt = models.IntegerField(verbose_name=u"右值")
+    delete = models.BooleanField(verbose_name=u'删除', default=False)
 
     def __str__(self):
         return self.name

+ 9 - 1
apps/staff/serializers.py

@@ -94,4 +94,12 @@ class DepartmentSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = Department
-        fields = '__all__'
+        fields = '__all__'
+
+    def create(self, validated_data):
+        instance = super(DepartmentSerializer, self).create(validated_data)
+        return instance
+
+    def update(self, instance, validated_data):
+        instance = super(DepartmentSerializer, self).update(instance, validated_data)
+        return instance

+ 104 - 0
uis/admin/department/edit.html

@@ -0,0 +1,104 @@
+<!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" pad15>
+        <div class="layui-row layui-col-space15">
+          <div class="layui-col-md12">
+             <form class="layui-form" action="" lay-filter="component-form-element">
+                  <div class="layui-row layui-col-space10 layui-form-item">
+
+                      <div class="layui-col-md12">
+                          <label class="layui-form-label"><font color='red' size="4">*</font>名称:</label>
+                          <div class="layui-input-block">
+                              <input type="text" name="name" lay-verify="required" autocomplete="off" class="layui-input">
+                          </div>
+                      </div>
+                      <div class="layui-col-md12">
+                          <label class="layui-form-label">备注:</label>
+                          <div class="layui-input-block">
+                              <input type="text" name="notes" placeholder="" autocomplete="off" class="layui-input">
+                          </div>
+                      </div>
+                      <button id="submit_btn" style="display: none;" class="layui-btn" lay-submit lay-filter="component-form-element"></button>
+
+                  </div>
+              </form>
+          </div>
+        </div>
+        </div>
+    </div>
+</div>
+
+
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index' //主入口模块
+  }).use(['index', 'laydate', 'form'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,element = layui.element
+    ,form = layui.form
+    ,laydate  = layui.laydate;
+    var id = layui.view.getParameterByName('id');
+    var parent_id = layui.view.getParameterByName('parent_id');
+    var is_company = layui.view.getParameterByName('is_company');
+
+    form.render(null, 'component-form-element');
+    element.render('breadcrumb', 'breadcrumb');
+    var url = '';
+    if(is_company && is_company !== '0'){
+        $("#company_no").hide();
+    }
+    if(parent_id){
+        $("#company_no").hide();
+    }
+    if (id){
+        var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+        form.val("component-form-element", editdata);
+        url = '/account/department/save/?id='+id;
+    }else{
+      url = '/account/department/save/?parent_id='+ parent_id;
+    }
+
+    form.on('submit(component-form-element)', function(data){
+        var submitData = data.field;
+        if((id && is_company === '0') || (!id && !parent_id )){
+            if(!submitData['company_no']){
+                 layer.msg('请输入公司编号!');
+                return false;
+            }
+
+        }
+      admin.req({
+        url: url
+        ,data: JSON.stringify(submitData)
+        ,type: 'post'
+        ,done: function(res){
+            parent.layui.onSubmitChild(res.data);
+        }
+      });
+
+      return false;
+    });
+    parent.layui.submitChild = function () {
+      $("#submit_btn").click();
+    };
+  });
+  </script>
+</body>
+</html>

+ 146 - 82
uis/admin/department/index.html

@@ -2,117 +2,181 @@
 <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">
   <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;
-        }
-    </style>
 </head>
+<style type="text/css">
+    .LAY-btns .layui-nav {padding-left:0;padding-right:10px;top:-4px;border: 0;background-color: #009688;}
+    .LAY-btns .layui-nav .layui-nav-item{line-height: 30px;}
+    .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;}
+  </style>
 <body>
 
   <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;">
+              <button class="layui-nav">
+                <div class="layui-nav-item">
+                  <a href="javascript:;" style="color:#fff;" >添加</a>
+                  <dl class="layui-nav-child"> <!-- 二级菜单 -->
+                    <dd><a href="#" id="btn_add">部门</a></dd>
+                    <dd><a href="#" id="btn_add_child">子部门</a></dd>
+                  </dl>
                 </div>
+              </button>
+            </div>
+
+            <table  id="datagrid" lay-filter="datagrid-operate"></table>
+            <script type="text/html" id="datagrid-operate-bar">
+              <div class="layui-btn-group">
+                <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
+                <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
               </div>
-              </div>
-            </form>
+            </script>
           </div>
         </div>
-      </div>
-
+        </div>
+    </div>
+  </div>
 
-  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script src="../../layuiadmin/layui/layui.js?t=1"></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');
+  }).use(['index', 'table', 'treetable', 'utils'], function(){
+    var $ = layui.$;
+    var layer  = layui.layer ;
+    var table  = layui.table ;
+    var utils  = layui.utils ;
+    var treetable   = layui.treetable  ;
 
-    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;
-                }
+    var renderTable = function () {
+        layer.load(2);
+        treetable.render({
+            treeColIndex: 1,
+            treeSpid: "0",
+            treeIdName: 'id',
+            treePidName: 'parent_id',
+            treeDefaultClose: false,
+            treeLinkage: false,
+            elem: '#datagrid',
+            url: '/admin/department/',
+            page: false,
+            cols: [[
+                {type:'checkbox',width:50},
+                {field: 'name', title: '名称',width:170},
+                {field: 'notes', title: '备注', minWidth:150},
+                {width:100,align:'left', fixed: 'right',templet: '#datagrid-operate-bar'}
+            ]],
+            done: function () {
+               //layui.index.removeNoPermButtons();
+                layer.closeAll('loading');
             }
-            form.val("component-form-element", edit_data);
-            form.render();
-        }
-    });
+        });
+    };
+
+
+    renderTable();
+
+    //监听工具条
+    table.on('tool(datagrid-operate)', function(obj){
+      var data = obj.data;
+        if(obj.event === 'edit'){
+          table.editdata = data;
 
-    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();
-                }
+          layer.open({
+            type: 2,
+            title: '修改',
+            shadeClose: false,
+            area: ['500px', '300px'],
+            btn: ['保存', '取消'],
+            yes: function(index, dom){
+               layui.onSubmitChild = function (data) {
+              layer.close(index);
+              renderTable();
+            };
+            layui.submitChild();
+            },
+            btn2: function(index, layero){
+              layer.close(index);//关闭当前按钮
+            },
+            content: 'edit.html?id='+data.id + '&is_company=' + data.parent_id
+          });
+        }else if(obj.event === 'del'){
+          layer.confirm('确定要删除吗?', function(index){
+              layer.close(index);
+            layui.admin.req({
+              url: '/account/department/delete/?id='+data.id
+              ,done: function(res){
+                renderTable();
+              }
             });
+          });
         }
-      });
+    });
 
-      return false;
+    $('#btn_add').on('click', function(){
+        layer.open({
+          type: 2,
+          title: '添加',
+          shadeClose: false,
+          area: ['500px', '300px'],
+          btn: ['保存', '取消'],
+          yes: function(index, dom){
+             layui.onSubmitChild = function (data) {
+              layer.close(index);
+              renderTable();
+            };
+            layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'edit.html'
+        });
     });
 
+    $('#btn_add_child').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+         if(data == false){
+             return;
+         }
+         var parent_id = data.id;
+
+        layer.open({
+          type: 2,
+          title: '添加',
+          shadeClose: false,
+          area: ['500px', '270px'],
+          btn: ['保存', '取消'],
+          yes: function(index, dom){
+              layui.onSubmitChild = function (data) {
+              layer.close(index);
+              renderTable();
+            };
+            layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'edit.html?parent_id='+parent_id
+        });
+    });
   });
   </script>
 </body>
-</html>
+</html>
+

+ 7 - 4
uis/admin/index.html

@@ -112,17 +112,20 @@
                 <cite>系统管理</cite>
               </a>
               <dl class="layui-nav-child">
+               <dd data-name="nav">
+                  <a lay-href="subject/index.html">科目章节设置</a>
+                </dd>
                 <dd data-name="nav">
-                  <a lay-href="user/index.html">用户管理</a>
+                  <a lay-href="department/index.html">部门管理</a>
                 </dd>
                 <dd data-name="nav">
-                  <a lay-href="tenant/index.html">户管理</a>
+                  <a lay-href="tenant/index.html">户管理</a>
                 </dd>
                 <dd data-name="nav">
-                  <a lay-href="applet/index.html">小程序管理</a>
+                  <a lay-href="applet/index.html">权限管理</a>
                 </dd>
                 <dd data-name="nav">
-                  <a lay-href="third_party/index.html">第三方设置</a>
+                  <a lay-href="third_party/index.html">系统日志</a>
                 </dd>
               </dl>
             </li>

+ 113 - 0
uis/admin/subject/chapter_edit.html

@@ -0,0 +1,113 @@
+<!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">
+  <link rel="stylesheet" type="text/css" href="../../layuiadmin/style/formSelects-v4.css"/>
+</head>
+<body>
+
+  <div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+        <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 class="layui-form-label"><font color='red' size="4">*</font>科目:</label>
+                  <div class="layui-input-block">
+                    <select id="id_subject" name="subject" lay-verify="required">
+                    </select>
+                  </div>
+              </div>
+                <div>
+                  <label class="layui-form-label"><font color='red' size="4">*</font>名称:</label>
+                  <div class="layui-input-block">
+                    <input type="text" name="name" lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+                <div>
+                  <label class="layui-form-label">备注:</label>
+                  <div class="layui-input-block">
+                    <input type="text" name="notes" placeholder="请输入备注"  autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+                <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
+              </div>
+            </form>
+          </div>
+        </div>
+      </div>
+    </div>
+
+
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index',
+    formSelects: 'formSelects-v4'
+  }).use(['index', 'form', 'utils', 'upload'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,form = layui.form;
+    var id = layui.view.getParameterByName('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 value = subject[i].name;
+                subject_node.append("<option value='" + pid + "'>" + 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);
+        }
+    };
+     form.render(null, 'component-form-element');
+
+    form.on('submit(component-form-element)', function(data){
+      //layer.msg(JSON.stringify(data.field));
+     if (id){
+          var url = '/admin/subject/chapter/'+id + '/';
+          var type = 'put';
+      }else{
+          url =  '/admin/subject/chapter/';
+          type = 'post';
+      }
+
+    admin.req({
+        url: url
+        ,type:type
+        ,data: data.field
+        ,done: function(res){
+            parent.layui.onSubmitChild(res.data);
+        }
+      });
+
+      return false;
+    });
+
+    parent.layui.submitChild = function () {
+      $("#id_save").click();
+    };
+  });
+  </script>
+</body>
+</html>

+ 223 - 82
uis/admin/subject/index.html

@@ -2,117 +2,258 @@
 <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">
   <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;
-        }
+    <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>
-            <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 class="layui-row layui-col-space15">
+          <div class="layui-col-md5">
+            <div class="LAY-btns" style="margin-bottom: 10px;">
+                <div class="layui-col-xs2">
+                    <button class="layui-btn" id="subject_add"><i class="layui-icon layui-icon-add-circle"></i>添加</button>
                 </div>
-              <div class="layui-form-item">
-                <div class="layui-input-block">
-                  <button class="layui-btn" lay-submit lay-filter="component-form-element">保存</button>
+                    <form class="layui-form" lay-filter="query-form-element1">
+                        <div class="seach_items">
+                            <button class="layui-btn" lay-submit lay-filter="query-form-element1"><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>
+                    </form>
+                <div style="clear: both;"></div>
+            </div>
+            <table class="layui-hide" id="subject_datagrid" lay-filter="subject-operate"></table>
+
+            <script type="text/html" id="subject-operate-bar">
+                <div class="layui-btn-group">
+              <a class="layui-btn layui-btn-xs" lay-event="subject_edit">修改</a>
+              <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="subject_del">删除</a>
                 </div>
-              </div>
-              </div>
-            </form>
+            </script>
           </div>
-        </div>
-      </div>
 
+          <div class="layui-col-md7">
+            <div class="LAY-btns" style="margin-bottom: 10px;">
+              <div class="layui-col-xs2">
+                    <button class="layui-btn" id="chapter_add"><i class="layui-icon layui-icon-add-circle"></i>添加</button>
+                </div>
+
+                    <form class="layui-form" lay-filter="query-form-element2">
+                        <div class="seach_items">
+                            <button class="layui-btn" lay-submit lay-filter="query-form-element2"><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">
+                            <input type="text"  name="subject_name" autocomplete="off" class="layui-input" placeholder="科目名称"/>
+                        </div>
+                    </form>
+                <div style="clear: both;"></div>
+                </div>
+
+            <table class="layui-hide" id="chapter_datagrid" lay-filter="chapter-operate"></table>
 
-  <script src="../../layuiadmin/layui/layui.js"></script>
+            <script type="text/html" id="chapter-operate-bar">
+                <div class="layui-btn-group">
+              <a class="layui-btn layui-btn-xs" lay-event="chapter_edit">修改</a>
+              <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="chapter_del">删除</a>
+                </div>
+            </script>
+          </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', '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;
-                }
-            }
-            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']})
+  }).use(['index', 'table', 'form'], function(){
+    var $ = layui.$;
+    var table = layui.table
+        ,form = layui.form
+        ,admin = layui.admin;
+      //品牌
+    table.render({
+      elem: '#subject_datagrid'
+      ,url: '/admin/subject/'
+      ,cols: [[
+        {field:'name', title:'名称', width:150}
+        ,{field:'notes', title:'备注'}
+        ,{width:110, align:'center', title:'操作', fixed: 'right', toolbar: '#subject-operate-bar'}
+      ]]
+      ,page: true
+      ,height: 'full-108'
+      , done: function () {
+        layui.index.removeNoPermButtons()
       }
-      if (data.field['vehicle_percentage']){
-          save_data.push({key: 'vehicle_percentage', value: data.field['vehicle_percentage']})
+    });
+    //车系
+    table.render({
+      elem: '#chapter_datagrid'
+      ,url: '/admin/subject/chapter/'
+      ,cols: [[
+        {field:'name', title:'名称', width:150}
+        ,{field:'subject_name', title:'科目', width:150}
+        ,{field:'notes', title:'备注'}
+        ,{width:110, align:'center', title: '操作', fixed: 'right', toolbar: '#chapter-operate-bar'}
+      ]]
+      ,page: true
+      ,height: 'full-108'
+      , done: function () {
+        layui.index.removeNoPermButtons()
       }
-      admin.req({
-        url: '/tenant/config/'
-        ,data: {data: JSON.stringify(save_data)}
-        ,type: 'post'
-        ,done: function(res){
+    });
+
+    //监听品牌工具条
+    table.on('tool(subject-operate)', function(obj) {
+        var data = obj.data;
+        if (obj.event === 'subject_del') {
+            layer.confirm('确定要删除吗?', function (index) {
+                layer.close(index);
+                layui.admin.req({
+                    url: '/admin/subject/' + data.id + '/'
+                    ,type: 'delete'
+                    , done: function (res) {
+                        table.reload('subject_datagrid', {});
+                        layer.close(index);
+                    }
+                });
+            });
+        } else if (obj.event === 'subject_edit') {
+            table.editdata = data;
             layer.open({
-                 type: 1
-                ,content: '<div style="padding: 20px 100px;">保存成功</div>'
-                ,btn: '关闭'
-                ,btnAlign: 'c' //按钮居中
-                ,shade: 0 //不显示遮罩
-                ,yes: function(){
-                  layer.closeAll();
-                  //admin.exit();
-                }
+                type: 2,
+                title: '修改',
+                shadeClose: false,
+                area: ['450px', '300px'],
+                btn:['保存','取消'],
+                yes: function (index, dom) {
+                    layui.onSubmitChild = function (data) {
+                        layer.close(index);
+                        table.reload('subject_datagrid', {});
+                        table.reload('chapter_datagrid', {});
+                      };
+                      layui.submitChild();
+                  },
+                  btn2: function(index, layero){
+                    layer.close(index);//关闭当前按钮
+                  },
+                content: 'subject_edit.html?id=' + data.id
             });
         }
+    });
+    //监听车系工具条
+    table.on('tool(chapter-operate)', function(obj){
+      var data = obj.data;
+        if(obj.event === 'chapter_del'){
+        layer.confirm('确定要删除吗?', function(index){
+          layui.admin.req({
+            url: '/admin/subject/chapter/'+data.id + '/'
+            ,type: 'delete'
+            ,done: function(res){
+              table.reload('chapter_datagrid',{});
+              layer.close(index);
+            }
+          });
+        });
+      } else if(obj.event === 'chapter_edit'){
+        table.editdata = data;
+        layer.open({
+          type: 2,
+          title: '修改',
+         area: ['500px', '500px'],
+          btn:['保存','取消'],
+          yes: function (index, dom) {
+            layui.onSubmitChild = function (data) {
+                layer.close(index);
+                table.reload('subject_datagrid', {});
+                table.reload('chapter_datagrid', {});
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'chapter_edit.html?id='+data.id
+        });
+      }
+    });
+    form.on('submit(query-form-element1)', function(data){
+      table.reload('subject_datagrid', {
+          where: data.field
+          ,page:{curr:1}
       });
-
-      return false;
+      layer.closeAll();
+      return false
+    });
+    form.on('submit(query-form-element2)', function(data){
+      table.reload('chapter_datagrid', {
+          where: data.field
+          ,page:{curr:1}
+      });
+      layer.closeAll();
+      return false
     });
+    $('#subject_add').on('click', function(){
+        layer.open({
+          type: 2,
+          title: '添加',
+          area: ['450px', '300px'],
+          btn:['保存','取消'],
+          yes: function (index, dom) {
+            layui.onSubmitChild = function (data) {
+                layer.close(index);
+                table.reload('subject_datagrid', {});
+                table.reload('chapter_datagrid', {});
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'subject_edit.html'
+        });
+    });
+    $('#chapter_add').on('click', function(){
+        layer.open({
+          type: 2,
+          title: '添加',
+          area: ['500px', '500px'],
+          btn:['保存','取消'],
+          yes: function (index, dom) {
+            layui.onSubmitChild = function (data) {
+                layer.close(index);
+                table.reload('subject_datagrid', {});
+                table.reload('chapter_datagrid', {});
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'chapter_edit.html'
+        });
+    });
+});
+
+
 
-  });
   </script>
 </body>
-</html>
+</html>

+ 91 - 0
uis/admin/subject/subject_edit.html

@@ -0,0 +1,91 @@
+<!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">
+  <link rel="stylesheet" type="text/css" href="../../layuiadmin/style/formSelects-v4.css"/>
+</head>
+<body>
+
+  <div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+      <div class="layui-col-md6">
+        <div class="layui-card">
+
+          <div class="layui-card-body">
+            <form class="layui-form" action="" lay-filter="component-form-element">
+              <div class="layui-row layui-col-space10 layui-form-item">
+
+                <div class="layui-col-lg6">
+                  <label class="layui-form-label"><font color='red' size="4">*</font>名称:</label>
+                  <div class="layui-input-block">
+                    <input type="text" name="name" lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+                 <div class="layui-col-lg6">
+                  <label class="layui-form-label">备注:</label>
+                  <div class="layui-input-block">
+                    <input type="text" name="notes" placeholder="请输入备注"  autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+                <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
+              </div>
+            </form>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index',
+    formSelects: 'formSelects-v4'
+  }).use(['index', 'form', 'utils'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,form = layui.form;
+    var id = layui.view.getParameterByName('id');
+
+    if(id){
+        var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+        form.val("component-form-element", editdata);
+    }
+    form.on('submit(component-form-element)', function(data){
+
+      //layer.msg(JSON.stringify(data.field));
+        if (id){
+            var url =  '/admin/subject/' + id + '/';
+            var type = 'put';
+        }else{
+            url =  '/admin/subject/';
+            type = 'post'
+        }
+         admin.req({
+        url: url
+        ,data: data.field
+        ,type: type
+        ,done: function(res){
+            parent.layui.onSubmitChild(res.data);
+        }
+      });
+
+      return false;
+    });
+
+    parent.layui.submitChild = function () {
+      $("#id_save").click();
+    };
+  });
+  </script>
+</body>
+</html>