pzb пре 5 година
родитељ
комит
eee7535e7d
42 измењених фајлова са 4263 додато и 2 уклоњено
  1. 114 0
      controller/SkuConditionName.py
  2. 128 0
      controller/SkuRuleName.py
  3. 128 0
      controller/SkuSuitName.py
  4. 7 1
      langer/urls.py
  5. 34 0
      model/models.py
  6. 2 1
      object/TokenObject.py
  7. 37 0
      web/sku/.project
  8. 1339 0
      web/sku/css/bootstrap-grid.css
  9. 6 0
      web/sku/css/bootstrap.min.css
  10. 61 0
      web/sku/css/commonality.css
  11. 91 0
      web/sku/css/find_sku.css
  12. 254 0
      web/sku/css/htmleaf-demo.css
  13. 241 0
      web/sku/css/sku_index.css
  14. 105 0
      web/sku/find_sku.html
  15. BIN
      web/sku/img/Add@2x.png
  16. BIN
      web/sku/img/Add_select@2x.png
  17. BIN
      web/sku/img/SKUNaming_rules_select@2x.png
  18. BIN
      web/sku/img/SKUnaming_rule@2x.png
  19. BIN
      web/sku/img/ansjer@2x.png
  20. BIN
      web/sku/img/btn_close_h.png
  21. BIN
      web/sku/img/btn_close_n.png
  22. BIN
      web/sku/img/btn_close_p.png
  23. BIN
      web/sku/img/delete@2x.png
  24. BIN
      web/sku/img/drop_down_box@2x.png
  25. BIN
      web/sku/img/drop_down_box_Selected@2x.png
  26. BIN
      web/sku/img/findSKU@2x.png
  27. BIN
      web/sku/img/findSKU_select@2x.png
  28. BIN
      web/sku/img/modify@2x.png
  29. BIN
      web/sku/img/pack_up.png
  30. BIN
      web/sku/img/screen@2x.png
  31. BIN
      web/sku/img/seek@2x.png
  32. BIN
      web/sku/img/spread.png
  33. BIN
      web/sku/img/下拉框-选中@2x.png
  34. BIN
      web/sku/img/下拉框@2x.png
  35. 657 0
      web/sku/js/bootstrap-paginator.js
  36. 243 0
      web/sku/js/find_sku.js
  37. 6 0
      web/sku/js/ip.js
  38. 1 0
      web/sku/js/jquery-2.1.1.min.js
  39. 2 0
      web/sku/js/jquery_cookie_min.js
  40. 468 0
      web/sku/js/sku_index.js
  41. 217 0
      web/sku/login.html
  42. 122 0
      web/sku/sku_index.html

+ 114 - 0
controller/SkuConditionName.py

@@ -0,0 +1,114 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD019
+@NAME: langer
+@software: PyCharm
+@DATE: 2019/11/14 11:44
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: LangArea.py
+@Contact: pzb3076@163.com
+"""
+
+import json
+from django.views.generic import TemplateView
+from object.ResponseObject import ResponseObject
+from model.models import UserModel, LangSetModel, LangAreaModel, LangValModel, LangKeyModel,skuRuleModel,skuConditionModel
+import time
+from object.TokenObject import TokenObject
+
+
+class skuConditionView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict, operation)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        operation = kwargs.get('operation', None)
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        tko = TokenObject(token)
+        if tko.code == 0:
+            userID = tko.userID
+            user_qs = UserModel.objects.filter(id=userID)
+            if not user_qs.exists():
+                return response.json(403)
+            if operation == 'add':
+                return self.do_add(request_dict, response)
+            elif operation == 'update':
+                return self.do_update(request_dict, response)
+            elif operation == 'delete':
+                return self.do_delete(request_dict, response)
+            elif operation == 'query':
+                return self.do_query(request_dict, response, userID)
+            else:
+                return response.json(414)
+        else:
+            return response.json(tko.code)
+
+    def do_add(self, request_dict, response):
+        name = request_dict.get('name', None)
+        numName = request_dict.get('numName', None)
+        cr_id= request_dict.get('id', None)
+        if name:
+            nowTime = int(time.time())
+            create_dict = {
+                'cr_id': cr_id,
+                'numName':numName,
+                'conditionName': name,
+                'addTime': nowTime,
+                'updTime': nowTime
+            }
+            try:
+                skuConditionModel.objects.create(**create_dict)
+            except Exception as e:
+                return response.json(404, repr(e))
+            else:
+                sr_qs = skuConditionModel.objects.filter(cr_id=cr_id).values('conditionName','numName', 'id')
+                return response.json(0, list(sr_qs))
+
+        else:
+            return response.json(414)
+
+    def do_update(self, request_dict, response):
+
+        name = request_dict.get('name', None)
+        numName = request_dict.get('numName', None)
+        id = request_dict.get('id', None)
+        nowTime = int(time.time())
+        update_dict = {
+            'numName': numName,
+            'conditionName': name,
+            'updTime': nowTime
+        }
+        try:
+            skuConditionModel.objects.filter(id=id).update(**update_dict)
+        except Exception as e:
+            return response.json(404, repr(e))
+        else:
+            return response.json(0)
+
+    def do_delete(self, request_dict, response):
+        id = request_dict.get('id', None)
+        try:
+            skuConditionModel.objects.filter(id=id).delete()
+        except Exception as e:
+            return response.json(404, repr(e))
+        else:
+            return response.json(0)
+
+    def do_query(self, request_dict, response, userID):
+        user_qs = UserModel.objects.filter(id=userID)
+        if not user_qs.exists():
+            return response.json(403)
+        la_qs = skuConditionModel.objects.filter().values('conditionName','numName', 'id')
+        return response.json(0, list(la_qs))

+ 128 - 0
controller/SkuRuleName.py

@@ -0,0 +1,128 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD019
+@NAME: langer
+@software: PyCharm
+@DATE: 2019/11/14 11:44
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: LangArea.py
+@Contact: pzb3076@163.com
+"""
+
+import json
+from django.views.generic import TemplateView
+from object.ResponseObject import ResponseObject
+from model.models import UserModel,skuSuitModel,skuRuleModel,skuConditionModel
+import time
+from object.TokenObject import TokenObject
+
+
+class skuRuleView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict, operation)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        operation = kwargs.get('operation', None)
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        tko = TokenObject(token)
+        if tko.code == 0:
+            userID = tko.userID
+            user_qs = UserModel.objects.filter(id=userID)
+            if not user_qs.exists():
+                return response.json(403)
+            if operation == 'add':
+                return self.do_add(request_dict, response)
+            elif operation == 'update':
+                return self.do_update(request_dict, response)
+            elif operation == 'delete':
+                return self.do_delete(request_dict, response)
+            elif operation == 'query':
+                return self.do_query(request_dict, response, userID)
+            elif operation == 'query_all':
+                return self.do_query_all(request_dict, response, userID)
+
+
+            else:
+                return response.json(414)
+        else:
+            return response.json(tko.code)
+
+    def do_add(self, request_dict, response):
+        name = request_dict.get('name', None)
+        rs_id = request_dict.get('id', None)
+        if name:
+            nowTime = int(time.time())
+            create_dict = {
+                'rs_id': rs_id,
+                'ruleName': name,
+                'addTime': nowTime,
+                'updTime': nowTime
+            }
+            try:
+                skuRuleModel.objects.create(**create_dict)
+            except Exception as e:
+                return response.json(404, repr(e))
+            else:
+                sr_qs = skuRuleModel.objects.filter(ruleName=name).values('ruleName', 'id')
+                return response.json(0, list(sr_qs))
+        else:
+            return response.json(414)
+
+    def do_update(self, request_dict, response):
+        name = request_dict.get('name', None)
+        id = request_dict.get('id', None)
+        nowTime = int(time.time())
+        update_dict = {
+            'ruleName': name,
+            'updTime': nowTime
+        }
+        try:
+            skuRuleModel.objects.filter(id=id).update(**update_dict)
+        except Exception as e:
+            return response.json(404, repr(e))
+        else:
+            return response.json(0)
+
+    def do_delete(self, request_dict, response):
+        id = request_dict.get('id', None)
+        try:
+            skuConditionModel.objects.filter(cr__id=id).delete()
+            skuRuleModel.objects.filter(id=id).delete()
+        except Exception as e:
+            return response.json(404, repr(e))
+        else:
+            return response.json(0)
+
+    def do_query(self, request_dict, response, userID):
+        user_qs = UserModel.objects.filter(id=userID)
+        if not user_qs.exists():
+            return response.json(403)
+        la_qs = skuRuleModel.objects.filter().values('ruleName', 'id')
+        return response.json(0, list(la_qs))
+
+    def do_query_all(self, request_dict, response, userID):
+        user_qs = UserModel.objects.filter(id=userID)
+        id = request_dict.get('id', None)
+        if not user_qs.exists():
+            return response.json(403)
+        sr_qs = skuRuleModel.objects.filter(rs__id=id).values('ruleName', 'id').order_by("id")
+        for SR in sr_qs:
+            try:
+                cr_qs = skuConditionModel.objects.filter(cr_id=SR['id']).values('numName', 'conditionName',
+                                                                                'id').order_by("id")
+                SR['cr_qs'] = list(cr_qs)
+            except Exception:
+                pass
+        return response.json(0, list(sr_qs))

+ 128 - 0
controller/SkuSuitName.py

@@ -0,0 +1,128 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD019
+@NAME: langer
+@software: PyCharm
+@DATE: 2019/11/14 11:44
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: LangArea.py
+@Contact: pzb3076@163.com
+"""
+
+import json
+from django.views.generic import TemplateView
+from object.ResponseObject import ResponseObject
+from model.models import UserModel, skuConditionModel, skuRuleModel,skuSuitModel
+import time
+from object.TokenObject import TokenObject
+
+
+class skuSuitView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict, operation)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        operation = kwargs.get('operation', None)
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        tko = TokenObject(token)
+
+        if tko.code == 0:
+            userID = tko.userID
+            user_qs = UserModel.objects.filter(id=userID)
+            if not user_qs.exists():
+                return response.json(403)
+            if operation == 'add':
+                return self.do_add(request_dict, response)
+            elif operation == 'update':
+                return self.do_update(request_dict, response)
+            elif operation == 'delete':
+                return self.do_delete(request_dict, response)
+            elif operation == 'query':
+                return self.do_query(request_dict, response, userID)
+            elif operation == 'query_all':
+                return self.do_query_all(request_dict, response, userID)
+            else:
+                return response.json(414)
+        else:
+            return response.json(tko.code)
+
+    def do_add(self, request_dict, response):
+        name = request_dict.get('name', None)
+        if name:
+            nowTime = int(time.time())
+            create_dict = {
+                'suitName': name,
+                'addTime': nowTime,
+                'updTime': nowTime
+            }
+            try:
+                skuSuitModel.objects.create(**create_dict)
+            except Exception as e:
+                return response.json(404, repr(e))
+            else:
+                sr_qs = skuSuitModel.objects.filter(suitName=name).values('suitName', 'id')
+                return response.json(0, list(sr_qs))
+        else:
+            return response.json(414)
+
+    def do_update(self, request_dict, response):
+        name = request_dict.get('name', None)
+        id = request_dict.get('id', None)
+        nowTime = int(time.time())
+        update_dict = {
+            'suitName': name,
+            'updTime': nowTime
+        }
+        try:
+            skuSuitModel.objects.filter(id=id).update(**update_dict)
+        except Exception as e:
+            return response.json(404, repr(e))
+        else:
+            return response.json(0)
+
+    def do_delete(self, request_dict, response):
+        id = request_dict.get('id', None)
+        try:
+            skuSuitModel.objects.filter(id=id).delete()
+        except Exception as e:
+            return response.json(404, repr(e))
+        else:
+            return response.json(0)
+
+    def do_query(self, request_dict, response, userID):
+        user_qs = UserModel.objects.filter(id=userID)
+        if not user_qs.exists():
+            return response.json(403)
+        la_qs = skuSuitModel.objects.filter().values('suitName', 'id').order_by("id")
+        return response.json(0, list(la_qs))
+
+    def do_query_all(self, request_dict, response, userID):
+        user_qs = UserModel.objects.filter(id=userID)
+        if not user_qs.exists():
+            return response.json(403)
+        la_qs = skuSuitModel.objects.filter().values('suitName', 'id').order_by("id")
+        for lk in la_qs:
+            try:
+                sr_qs = skuRuleModel.objects.filter(rs_id=lk['id']).values('ruleName', 'id').order_by("id")
+                lk['sr_qs'] = list(sr_qs)
+                for SR in sr_qs:
+                    try:
+                        cr_qs = skuConditionModel.objects.filter(cr_id=SR['id']).values('numName','conditionName', 'id').order_by("id")
+                        SR['cr_qs'] = list(cr_qs)
+                    except Exception:
+                        pass
+            except Exception:
+                pass
+        return response.json(0, list(la_qs))

+ 7 - 1
langer/urls.py

@@ -1,6 +1,6 @@
 from django.contrib import admin
 from django.urls import path, re_path
-from controller import User, LangSet, LangWord, LangArea, WebHook, AsImg, SysSet, Lottery
+from controller import User, LangSet, LangWord, LangArea, WebHook, AsImg, SysSet, Lottery, SkuSuitName,SkuConditionName,SkuRuleName
 
 urlpatterns = [
     path('admin/', admin.site.urls),
@@ -33,4 +33,10 @@ urlpatterns = [
     path('lottery/draw', Lottery.drawView.as_view()),
     path('lottery/setAddr', Lottery.setAddrView.as_view()),
     path('lottery/index', Lottery.indexView.as_view()),
+
+    re_path('cku_suit/(?P<operation>.*)', SkuSuitName.skuSuitView.as_view()),
+    re_path('sku_condition/(?P<operation>.*)', SkuConditionName.skuConditionView.as_view()),
+    re_path('cku_rule/(?P<operation>.*)', SkuRuleName.skuRuleView.as_view()),
+
+
 ]

+ 34 - 0
model/models.py

@@ -114,3 +114,37 @@ class phoneNumModel(models.Model):
         ordering = ('-addTime',)
         verbose_name = '手机注册表'
         db_table = 'phoneNum'
+
+# sku套装名称表
+class skuSuitModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    suitName = models.CharField(default='', verbose_name='套装名称', max_length=64)
+    addTime = models.IntegerField(default=0, verbose_name='添加时间')
+    updTime = models.IntegerField(default=0, verbose_name='更新时间')
+    class Meta:
+        ordering = ('-id',)
+        verbose_name = 'sku套装名称表'
+        db_table = 'sku_suit_name'
+# sku规则名称表
+class skuRuleModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    rs = models.ForeignKey(skuSuitModel, verbose_name='关联套装名称表', to_field='id', on_delete=models.CASCADE)
+    ruleName = models.CharField(default='', verbose_name='规则名称', max_length=64)
+    addTime = models.IntegerField(default=0, verbose_name='添加时间')
+    updTime = models.IntegerField(default=0, verbose_name='更新时间')
+    class Meta:
+        ordering = ('-id',)
+        verbose_name = 'sku规则名称表'
+        db_table = 'sku_rule_name'
+#sku 条件表
+class skuConditionModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    cr = models.ForeignKey(skuRuleModel , verbose_name='关联规则名称表', to_field='id', on_delete=models.CASCADE)
+    numName = models.CharField(default='', verbose_name='字母表示', max_length=64)
+    conditionName = models.CharField(default='', verbose_name='条件名称', max_length=64)
+    addTime = models.IntegerField(default=0, verbose_name='添加时间')
+    updTime = models.IntegerField(default=0, verbose_name='更新时间')
+    class Meta:
+        ordering = ('-id',)
+        verbose_name = 'sku条件表'
+        db_table = 'sku_condition_name'

+ 2 - 1
object/TokenObject.py

@@ -32,8 +32,8 @@ class TokenObject:
         try:
             res = jwt.decode(self.token, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256')
             self.userID = res.get('userID', None)
+
         except jwt.ExpiredSignatureError as e:
-            print('过期')
             print(repr(e))
             self.code = 309
         except Exception as e:
@@ -42,6 +42,7 @@ class TokenObject:
             return res
 
     def generate(self, data={}):
+
         try:
             access_expire = int(OAUTH_ACCESS_TOKEN_TIME.total_seconds())
             refresh_expire = int(OAUTH_REFRESH_TOKEN_TIME.total_seconds())

+ 37 - 0
web/sku/.project

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>sku</name>
+	<comment>Create By HBuilder</comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.aptana.ide.core.unifiedBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.aptana.projects.webnature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1573722785228</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.orFilterMatcher</id>
+				<arguments>
+					<matcher>
+						<id>org.eclipse.ui.ide.multiFilter</id>
+						<arguments>1.0-projectRelativePath-matches-false-false-bin</arguments>
+					</matcher>
+					<matcher>
+						<id>org.eclipse.ui.ide.multiFilter</id>
+						<arguments>1.0-projectRelativePath-matches-false-false-setting</arguments>
+					</matcher>
+				</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>

+ 1339 - 0
web/sku/css/bootstrap-grid.css

@@ -0,0 +1,1339 @@
+@-ms-viewport {
+  width: device-width;
+}
+
+html {
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  -ms-overflow-style: scrollbar;
+}
+
+*,
+*::before,
+*::after {
+  -webkit-box-sizing: inherit;
+          box-sizing: inherit;
+}
+
+.container {
+  position: relative;
+  margin-left: auto;
+  margin-right: auto;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+  .container {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+@media (min-width: 768px) {
+  .container {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+@media (min-width: 992px) {
+  .container {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+@media (min-width: 1200px) {
+  .container {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+@media (min-width: 576px) {
+  .container {
+    width: 540px;
+    max-width: 100%;
+  }
+}
+
+@media (min-width: 768px) {
+  .container {
+    width: 720px;
+    max-width: 100%;
+  }
+}
+
+@media (min-width: 992px) {
+  .container {
+    width: 960px;
+    max-width: 100%;
+  }
+}
+
+@media (min-width: 1200px) {
+  .container {
+    width: 1140px;
+    max-width: 100%;
+  }
+}
+
+.container-fluid {
+  position: relative;
+  margin-left: auto;
+  margin-right: auto;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+  .container-fluid {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+@media (min-width: 768px) {
+  .container-fluid {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+@media (min-width: 992px) {
+  .container-fluid {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+@media (min-width: 1200px) {
+  .container-fluid {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+.row {
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-wrap: wrap;
+      -ms-flex-wrap: wrap;
+          flex-wrap: wrap;
+  margin-right: -15px;
+  margin-left: -15px;
+}
+
+@media (min-width: 576px) {
+  .row {
+    margin-right: -15px;
+    margin-left: -15px;
+  }
+}
+
+@media (min-width: 768px) {
+  .row {
+    margin-right: -15px;
+    margin-left: -15px;
+  }
+}
+
+@media (min-width: 992px) {
+  .row {
+    margin-right: -15px;
+    margin-left: -15px;
+  }
+}
+
+@media (min-width: 1200px) {
+  .row {
+    margin-right: -15px;
+    margin-left: -15px;
+  }
+}
+
+.no-gutters {
+  margin-right: 0;
+  margin-left: 0;
+}
+
+.no-gutters > .col,
+.no-gutters > [class*="col-"] {
+  padding-right: 0;
+  padding-left: 0;
+}
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
+  position: relative;
+  width: 100%;
+  min-height: 1px;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+  .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+@media (min-width: 768px) {
+  .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+@media (min-width: 992px) {
+  .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+@media (min-width: 1200px) {
+  .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
+    padding-right: 15px;
+    padding-left: 15px;
+  }
+}
+
+.col {
+  -webkit-flex-basis: 0;
+      -ms-flex-preferred-size: 0;
+          flex-basis: 0;
+  -webkit-box-flex: 1;
+  -webkit-flex-grow: 1;
+      -ms-flex-positive: 1;
+          flex-grow: 1;
+  max-width: 100%;
+}
+
+.col-auto {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 auto;
+      -ms-flex: 0 0 auto;
+          flex: 0 0 auto;
+  width: auto;
+}
+
+.col-1 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 8.333333%;
+      -ms-flex: 0 0 8.333333%;
+          flex: 0 0 8.333333%;
+  max-width: 8.333333%;
+}
+
+.col-2 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 16.666667%;
+      -ms-flex: 0 0 16.666667%;
+          flex: 0 0 16.666667%;
+  max-width: 16.666667%;
+}
+
+.col-3 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 25%;
+      -ms-flex: 0 0 25%;
+          flex: 0 0 25%;
+  max-width: 25%;
+}
+
+.col-4 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 33.333333%;
+      -ms-flex: 0 0 33.333333%;
+          flex: 0 0 33.333333%;
+  max-width: 33.333333%;
+}
+
+.col-5 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 41.666667%;
+      -ms-flex: 0 0 41.666667%;
+          flex: 0 0 41.666667%;
+  max-width: 41.666667%;
+}
+
+.col-6 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 50%;
+      -ms-flex: 0 0 50%;
+          flex: 0 0 50%;
+  max-width: 50%;
+}
+
+.col-7 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 58.333333%;
+      -ms-flex: 0 0 58.333333%;
+          flex: 0 0 58.333333%;
+  max-width: 58.333333%;
+}
+
+.col-8 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 66.666667%;
+      -ms-flex: 0 0 66.666667%;
+          flex: 0 0 66.666667%;
+  max-width: 66.666667%;
+}
+
+.col-9 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 75%;
+      -ms-flex: 0 0 75%;
+          flex: 0 0 75%;
+  max-width: 75%;
+}
+
+.col-10 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 83.333333%;
+      -ms-flex: 0 0 83.333333%;
+          flex: 0 0 83.333333%;
+  max-width: 83.333333%;
+}
+
+.col-11 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 91.666667%;
+      -ms-flex: 0 0 91.666667%;
+          flex: 0 0 91.666667%;
+  max-width: 91.666667%;
+}
+
+.col-12 {
+  -webkit-box-flex: 0;
+  -webkit-flex: 0 0 100%;
+      -ms-flex: 0 0 100%;
+          flex: 0 0 100%;
+  max-width: 100%;
+}
+
+.pull-0 {
+  right: auto;
+}
+
+.pull-1 {
+  right: 8.333333%;
+}
+
+.pull-2 {
+  right: 16.666667%;
+}
+
+.pull-3 {
+  right: 25%;
+}
+
+.pull-4 {
+  right: 33.333333%;
+}
+
+.pull-5 {
+  right: 41.666667%;
+}
+
+.pull-6 {
+  right: 50%;
+}
+
+.pull-7 {
+  right: 58.333333%;
+}
+
+.pull-8 {
+  right: 66.666667%;
+}
+
+.pull-9 {
+  right: 75%;
+}
+
+.pull-10 {
+  right: 83.333333%;
+}
+
+.pull-11 {
+  right: 91.666667%;
+}
+
+.pull-12 {
+  right: 100%;
+}
+
+.push-0 {
+  left: auto;
+}
+
+.push-1 {
+  left: 8.333333%;
+}
+
+.push-2 {
+  left: 16.666667%;
+}
+
+.push-3 {
+  left: 25%;
+}
+
+.push-4 {
+  left: 33.333333%;
+}
+
+.push-5 {
+  left: 41.666667%;
+}
+
+.push-6 {
+  left: 50%;
+}
+
+.push-7 {
+  left: 58.333333%;
+}
+
+.push-8 {
+  left: 66.666667%;
+}
+
+.push-9 {
+  left: 75%;
+}
+
+.push-10 {
+  left: 83.333333%;
+}
+
+.push-11 {
+  left: 91.666667%;
+}
+
+.push-12 {
+  left: 100%;
+}
+
+.offset-1 {
+  margin-left: 8.333333%;
+}
+
+.offset-2 {
+  margin-left: 16.666667%;
+}
+
+.offset-3 {
+  margin-left: 25%;
+}
+
+.offset-4 {
+  margin-left: 33.333333%;
+}
+
+.offset-5 {
+  margin-left: 41.666667%;
+}
+
+.offset-6 {
+  margin-left: 50%;
+}
+
+.offset-7 {
+  margin-left: 58.333333%;
+}
+
+.offset-8 {
+  margin-left: 66.666667%;
+}
+
+.offset-9 {
+  margin-left: 75%;
+}
+
+.offset-10 {
+  margin-left: 83.333333%;
+}
+
+.offset-11 {
+  margin-left: 91.666667%;
+}
+
+@media (min-width: 576px) {
+  .col-sm {
+    -webkit-flex-basis: 0;
+        -ms-flex-preferred-size: 0;
+            flex-basis: 0;
+    -webkit-box-flex: 1;
+    -webkit-flex-grow: 1;
+        -ms-flex-positive: 1;
+            flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-sm-auto {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 auto;
+        -ms-flex: 0 0 auto;
+            flex: 0 0 auto;
+    width: auto;
+  }
+  .col-sm-1 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 8.333333%;
+        -ms-flex: 0 0 8.333333%;
+            flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-sm-2 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 16.666667%;
+        -ms-flex: 0 0 16.666667%;
+            flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-sm-3 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 25%;
+        -ms-flex: 0 0 25%;
+            flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-sm-4 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 33.333333%;
+        -ms-flex: 0 0 33.333333%;
+            flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-sm-5 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 41.666667%;
+        -ms-flex: 0 0 41.666667%;
+            flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-sm-6 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 50%;
+        -ms-flex: 0 0 50%;
+            flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-sm-7 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 58.333333%;
+        -ms-flex: 0 0 58.333333%;
+            flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-sm-8 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 66.666667%;
+        -ms-flex: 0 0 66.666667%;
+            flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-sm-9 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 75%;
+        -ms-flex: 0 0 75%;
+            flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-sm-10 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 83.333333%;
+        -ms-flex: 0 0 83.333333%;
+            flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-sm-11 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 91.666667%;
+        -ms-flex: 0 0 91.666667%;
+            flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-sm-12 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 100%;
+        -ms-flex: 0 0 100%;
+            flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .pull-sm-0 {
+    right: auto;
+  }
+  .pull-sm-1 {
+    right: 8.333333%;
+  }
+  .pull-sm-2 {
+    right: 16.666667%;
+  }
+  .pull-sm-3 {
+    right: 25%;
+  }
+  .pull-sm-4 {
+    right: 33.333333%;
+  }
+  .pull-sm-5 {
+    right: 41.666667%;
+  }
+  .pull-sm-6 {
+    right: 50%;
+  }
+  .pull-sm-7 {
+    right: 58.333333%;
+  }
+  .pull-sm-8 {
+    right: 66.666667%;
+  }
+  .pull-sm-9 {
+    right: 75%;
+  }
+  .pull-sm-10 {
+    right: 83.333333%;
+  }
+  .pull-sm-11 {
+    right: 91.666667%;
+  }
+  .pull-sm-12 {
+    right: 100%;
+  }
+  .push-sm-0 {
+    left: auto;
+  }
+  .push-sm-1 {
+    left: 8.333333%;
+  }
+  .push-sm-2 {
+    left: 16.666667%;
+  }
+  .push-sm-3 {
+    left: 25%;
+  }
+  .push-sm-4 {
+    left: 33.333333%;
+  }
+  .push-sm-5 {
+    left: 41.666667%;
+  }
+  .push-sm-6 {
+    left: 50%;
+  }
+  .push-sm-7 {
+    left: 58.333333%;
+  }
+  .push-sm-8 {
+    left: 66.666667%;
+  }
+  .push-sm-9 {
+    left: 75%;
+  }
+  .push-sm-10 {
+    left: 83.333333%;
+  }
+  .push-sm-11 {
+    left: 91.666667%;
+  }
+  .push-sm-12 {
+    left: 100%;
+  }
+  .offset-sm-0 {
+    margin-left: 0%;
+  }
+  .offset-sm-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-sm-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-sm-3 {
+    margin-left: 25%;
+  }
+  .offset-sm-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-sm-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-sm-6 {
+    margin-left: 50%;
+  }
+  .offset-sm-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-sm-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-sm-9 {
+    margin-left: 75%;
+  }
+  .offset-sm-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-sm-11 {
+    margin-left: 91.666667%;
+  }
+}
+
+@media (min-width: 768px) {
+  .col-md {
+    -webkit-flex-basis: 0;
+        -ms-flex-preferred-size: 0;
+            flex-basis: 0;
+    -webkit-box-flex: 1;
+    -webkit-flex-grow: 1;
+        -ms-flex-positive: 1;
+            flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-md-auto {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 auto;
+        -ms-flex: 0 0 auto;
+            flex: 0 0 auto;
+    width: auto;
+  }
+  .col-md-1 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 8.333333%;
+        -ms-flex: 0 0 8.333333%;
+            flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-md-2 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 16.666667%;
+        -ms-flex: 0 0 16.666667%;
+            flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-md-3 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 25%;
+        -ms-flex: 0 0 25%;
+            flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-md-4 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 33.333333%;
+        -ms-flex: 0 0 33.333333%;
+            flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-md-5 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 41.666667%;
+        -ms-flex: 0 0 41.666667%;
+            flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-md-6 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 50%;
+        -ms-flex: 0 0 50%;
+            flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-md-7 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 58.333333%;
+        -ms-flex: 0 0 58.333333%;
+            flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-md-8 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 66.666667%;
+        -ms-flex: 0 0 66.666667%;
+            flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-md-9 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 75%;
+        -ms-flex: 0 0 75%;
+            flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-md-10 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 83.333333%;
+        -ms-flex: 0 0 83.333333%;
+            flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-md-11 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 91.666667%;
+        -ms-flex: 0 0 91.666667%;
+            flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-md-12 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 100%;
+        -ms-flex: 0 0 100%;
+            flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .pull-md-0 {
+    right: auto;
+  }
+  .pull-md-1 {
+    right: 8.333333%;
+  }
+  .pull-md-2 {
+    right: 16.666667%;
+  }
+  .pull-md-3 {
+    right: 25%;
+  }
+  .pull-md-4 {
+    right: 33.333333%;
+  }
+  .pull-md-5 {
+    right: 41.666667%;
+  }
+  .pull-md-6 {
+    right: 50%;
+  }
+  .pull-md-7 {
+    right: 58.333333%;
+  }
+  .pull-md-8 {
+    right: 66.666667%;
+  }
+  .pull-md-9 {
+    right: 75%;
+  }
+  .pull-md-10 {
+    right: 83.333333%;
+  }
+  .pull-md-11 {
+    right: 91.666667%;
+  }
+  .pull-md-12 {
+    right: 100%;
+  }
+  .push-md-0 {
+    left: auto;
+  }
+  .push-md-1 {
+    left: 8.333333%;
+  }
+  .push-md-2 {
+    left: 16.666667%;
+  }
+  .push-md-3 {
+    left: 25%;
+  }
+  .push-md-4 {
+    left: 33.333333%;
+  }
+  .push-md-5 {
+    left: 41.666667%;
+  }
+  .push-md-6 {
+    left: 50%;
+  }
+  .push-md-7 {
+    left: 58.333333%;
+  }
+  .push-md-8 {
+    left: 66.666667%;
+  }
+  .push-md-9 {
+    left: 75%;
+  }
+  .push-md-10 {
+    left: 83.333333%;
+  }
+  .push-md-11 {
+    left: 91.666667%;
+  }
+  .push-md-12 {
+    left: 100%;
+  }
+  .offset-md-0 {
+    margin-left: 0%;
+  }
+  .offset-md-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-md-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-md-3 {
+    margin-left: 25%;
+  }
+  .offset-md-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-md-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-md-6 {
+    margin-left: 50%;
+  }
+  .offset-md-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-md-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-md-9 {
+    margin-left: 75%;
+  }
+  .offset-md-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-md-11 {
+    margin-left: 91.666667%;
+  }
+}
+
+@media (min-width: 992px) {
+  .col-lg {
+    -webkit-flex-basis: 0;
+        -ms-flex-preferred-size: 0;
+            flex-basis: 0;
+    -webkit-box-flex: 1;
+    -webkit-flex-grow: 1;
+        -ms-flex-positive: 1;
+            flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-lg-auto {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 auto;
+        -ms-flex: 0 0 auto;
+            flex: 0 0 auto;
+    width: auto;
+  }
+  .col-lg-1 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 8.333333%;
+        -ms-flex: 0 0 8.333333%;
+            flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-lg-2 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 16.666667%;
+        -ms-flex: 0 0 16.666667%;
+            flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-lg-3 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 25%;
+        -ms-flex: 0 0 25%;
+            flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-lg-4 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 33.333333%;
+        -ms-flex: 0 0 33.333333%;
+            flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-lg-5 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 41.666667%;
+        -ms-flex: 0 0 41.666667%;
+            flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-lg-6 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 50%;
+        -ms-flex: 0 0 50%;
+            flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-lg-7 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 58.333333%;
+        -ms-flex: 0 0 58.333333%;
+            flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-lg-8 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 66.666667%;
+        -ms-flex: 0 0 66.666667%;
+            flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-lg-9 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 75%;
+        -ms-flex: 0 0 75%;
+            flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-lg-10 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 83.333333%;
+        -ms-flex: 0 0 83.333333%;
+            flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-lg-11 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 91.666667%;
+        -ms-flex: 0 0 91.666667%;
+            flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-lg-12 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 100%;
+        -ms-flex: 0 0 100%;
+            flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .pull-lg-0 {
+    right: auto;
+  }
+  .pull-lg-1 {
+    right: 8.333333%;
+  }
+  .pull-lg-2 {
+    right: 16.666667%;
+  }
+  .pull-lg-3 {
+    right: 25%;
+  }
+  .pull-lg-4 {
+    right: 33.333333%;
+  }
+  .pull-lg-5 {
+    right: 41.666667%;
+  }
+  .pull-lg-6 {
+    right: 50%;
+  }
+  .pull-lg-7 {
+    right: 58.333333%;
+  }
+  .pull-lg-8 {
+    right: 66.666667%;
+  }
+  .pull-lg-9 {
+    right: 75%;
+  }
+  .pull-lg-10 {
+    right: 83.333333%;
+  }
+  .pull-lg-11 {
+    right: 91.666667%;
+  }
+  .pull-lg-12 {
+    right: 100%;
+  }
+  .push-lg-0 {
+    left: auto;
+  }
+  .push-lg-1 {
+    left: 8.333333%;
+  }
+  .push-lg-2 {
+    left: 16.666667%;
+  }
+  .push-lg-3 {
+    left: 25%;
+  }
+  .push-lg-4 {
+    left: 33.333333%;
+  }
+  .push-lg-5 {
+    left: 41.666667%;
+  }
+  .push-lg-6 {
+    left: 50%;
+  }
+  .push-lg-7 {
+    left: 58.333333%;
+  }
+  .push-lg-8 {
+    left: 66.666667%;
+  }
+  .push-lg-9 {
+    left: 75%;
+  }
+  .push-lg-10 {
+    left: 83.333333%;
+  }
+  .push-lg-11 {
+    left: 91.666667%;
+  }
+  .push-lg-12 {
+    left: 100%;
+  }
+  .offset-lg-0 {
+    margin-left: 0%;
+  }
+  .offset-lg-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-lg-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-lg-3 {
+    margin-left: 25%;
+  }
+  .offset-lg-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-lg-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-lg-6 {
+    margin-left: 50%;
+  }
+  .offset-lg-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-lg-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-lg-9 {
+    margin-left: 75%;
+  }
+  .offset-lg-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-lg-11 {
+    margin-left: 91.666667%;
+  }
+}
+
+@media (min-width: 1200px) {
+  .col-xl {
+    -webkit-flex-basis: 0;
+        -ms-flex-preferred-size: 0;
+            flex-basis: 0;
+    -webkit-box-flex: 1;
+    -webkit-flex-grow: 1;
+        -ms-flex-positive: 1;
+            flex-grow: 1;
+    max-width: 100%;
+  }
+  .col-xl-auto {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 auto;
+        -ms-flex: 0 0 auto;
+            flex: 0 0 auto;
+    width: auto;
+  }
+  .col-xl-1 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 8.333333%;
+        -ms-flex: 0 0 8.333333%;
+            flex: 0 0 8.333333%;
+    max-width: 8.333333%;
+  }
+  .col-xl-2 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 16.666667%;
+        -ms-flex: 0 0 16.666667%;
+            flex: 0 0 16.666667%;
+    max-width: 16.666667%;
+  }
+  .col-xl-3 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 25%;
+        -ms-flex: 0 0 25%;
+            flex: 0 0 25%;
+    max-width: 25%;
+  }
+  .col-xl-4 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 33.333333%;
+        -ms-flex: 0 0 33.333333%;
+            flex: 0 0 33.333333%;
+    max-width: 33.333333%;
+  }
+  .col-xl-5 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 41.666667%;
+        -ms-flex: 0 0 41.666667%;
+            flex: 0 0 41.666667%;
+    max-width: 41.666667%;
+  }
+  .col-xl-6 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 50%;
+        -ms-flex: 0 0 50%;
+            flex: 0 0 50%;
+    max-width: 50%;
+  }
+  .col-xl-7 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 58.333333%;
+        -ms-flex: 0 0 58.333333%;
+            flex: 0 0 58.333333%;
+    max-width: 58.333333%;
+  }
+  .col-xl-8 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 66.666667%;
+        -ms-flex: 0 0 66.666667%;
+            flex: 0 0 66.666667%;
+    max-width: 66.666667%;
+  }
+  .col-xl-9 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 75%;
+        -ms-flex: 0 0 75%;
+            flex: 0 0 75%;
+    max-width: 75%;
+  }
+  .col-xl-10 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 83.333333%;
+        -ms-flex: 0 0 83.333333%;
+            flex: 0 0 83.333333%;
+    max-width: 83.333333%;
+  }
+  .col-xl-11 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 91.666667%;
+        -ms-flex: 0 0 91.666667%;
+            flex: 0 0 91.666667%;
+    max-width: 91.666667%;
+  }
+  .col-xl-12 {
+    -webkit-box-flex: 0;
+    -webkit-flex: 0 0 100%;
+        -ms-flex: 0 0 100%;
+            flex: 0 0 100%;
+    max-width: 100%;
+  }
+  .pull-xl-0 {
+    right: auto;
+  }
+  .pull-xl-1 {
+    right: 8.333333%;
+  }
+  .pull-xl-2 {
+    right: 16.666667%;
+  }
+  .pull-xl-3 {
+    right: 25%;
+  }
+  .pull-xl-4 {
+    right: 33.333333%;
+  }
+  .pull-xl-5 {
+    right: 41.666667%;
+  }
+  .pull-xl-6 {
+    right: 50%;
+  }
+  .pull-xl-7 {
+    right: 58.333333%;
+  }
+  .pull-xl-8 {
+    right: 66.666667%;
+  }
+  .pull-xl-9 {
+    right: 75%;
+  }
+  .pull-xl-10 {
+    right: 83.333333%;
+  }
+  .pull-xl-11 {
+    right: 91.666667%;
+  }
+  .pull-xl-12 {
+    right: 100%;
+  }
+  .push-xl-0 {
+    left: auto;
+  }
+  .push-xl-1 {
+    left: 8.333333%;
+  }
+  .push-xl-2 {
+    left: 16.666667%;
+  }
+  .push-xl-3 {
+    left: 25%;
+  }
+  .push-xl-4 {
+    left: 33.333333%;
+  }
+  .push-xl-5 {
+    left: 41.666667%;
+  }
+  .push-xl-6 {
+    left: 50%;
+  }
+  .push-xl-7 {
+    left: 58.333333%;
+  }
+  .push-xl-8 {
+    left: 66.666667%;
+  }
+  .push-xl-9 {
+    left: 75%;
+  }
+  .push-xl-10 {
+    left: 83.333333%;
+  }
+  .push-xl-11 {
+    left: 91.666667%;
+  }
+  .push-xl-12 {
+    left: 100%;
+  }
+  .offset-xl-0 {
+    margin-left: 0%;
+  }
+  .offset-xl-1 {
+    margin-left: 8.333333%;
+  }
+  .offset-xl-2 {
+    margin-left: 16.666667%;
+  }
+  .offset-xl-3 {
+    margin-left: 25%;
+  }
+  .offset-xl-4 {
+    margin-left: 33.333333%;
+  }
+  .offset-xl-5 {
+    margin-left: 41.666667%;
+  }
+  .offset-xl-6 {
+    margin-left: 50%;
+  }
+  .offset-xl-7 {
+    margin-left: 58.333333%;
+  }
+  .offset-xl-8 {
+    margin-left: 66.666667%;
+  }
+  .offset-xl-9 {
+    margin-left: 75%;
+  }
+  .offset-xl-10 {
+    margin-left: 83.333333%;
+  }
+  .offset-xl-11 {
+    margin-left: 91.666667%;
+  }
+}
+/*# sourceMappingURL=bootstrap-grid.css.map */

Разлика између датотеке није приказан због своје велике величине
+ 6 - 0
web/sku/css/bootstrap.min.css


+ 61 - 0
web/sku/css/commonality.css

@@ -0,0 +1,61 @@
+
+body {
+    display: block;
+    margin: 5px;
+}
+/*头部*/
+.head{
+	height: 65px;
+    background: linear-gradient(#f8f8f8,#efefef);
+    box-shadow: 0 0 2px rgba(0,0,0,.3);
+    line-height: 65px;
+}
+.head_left{
+	margin-left: 28px;
+	height: 65px;
+}
+.head_logo{
+	margin-top: 12px;
+}
+	/*菜单*/
+.menu{
+	float: left;
+	margin-top: 1px;
+	background: #EFEFEF;
+	/*height: 400px;*/
+	padding-right: 0px; 
+    padding-left: 0px;
+     
+}
+.menu_list{
+	height: 80px;
+	width: 100%;
+	line-height: 80px;
+	border-bottom: 1px solid #cec6c6;
+}
+.menu_ico{
+	float: left; 
+	width: 30%;
+	height: 100%;
+}
+.menu_img{
+	float: right;
+	margin-top: 26px;
+	margin-right: 20px;
+}
+
+.menu_text{
+	float: left;
+	width:70%;
+	height: 100%;
+	
+	font-size: 18px;
+}
+/*内容*/
+.content{
+	float: left;
+	margin-top: 1px;
+	background: white;
+	height: 800px;
+	padding-left: 40px;
+}

+ 91 - 0
web/sku/css/find_sku.css

@@ -0,0 +1,91 @@
+.ipt_find{
+	height: 40px; 
+	width: 100%;
+	border-radius: 3px;
+	border: solid 1px #d2d2d2;
+    box-shadow: inset 0 1px 0 #f8f8f8; 
+    padding-left: 10px;
+    /*border: 1px solid #40b5ed;*/
+    
+}
+ .ipt_find::-webkit-input-placeholder {
+    color: #bdc3c7;
+}
+      
+.find_img{
+	float: left; 
+	width: 90px; 
+	height: 40px; 
+	background: #d2d2d2; 
+	text-align: center;
+}
+.ipt_find:focus{
+	
+	outline: 0;
+    border-color: #40ace6;
+
+
+}
+.find_img_hover{
+	background: #40ace6;
+}
+
+	
+.select_div {
+	margin-top: 20px;
+	margin-right: 10px;
+ 	width: 200px;
+ 	height: 40px;
+ 	font-size: 14px;
+ 	color: #333;
+ 	padding: 10px;
+  /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/
+  border: solid 1px #d2d2d2;
+  /*很关键:将默认的select选择框样式清除*/
+  appearance:none;
+  -moz-appearance:none;
+  -webkit-appearance:none;
+ 
+  /*在选择框的最右侧中间显示小箭头图片*/
+  background: url("../img/下拉框@2x.png") no-repeat scroll right center transparent;
+ 
+  
+  /*为下拉小箭头留出一点位置,避免被文字覆盖*/
+  padding-right: 14px;
+}
+.select_div:hover{
+	/*在选择框的最右侧中间显示小箭头图片*/
+   background: url("../img/下拉框-选中@2x.png") no-repeat scroll right center transparent;
+}
+
+
+
+
+
+
+.button_{
+	float: left; 
+	margin-top: 20px; 
+	height: 32px; 
+	width: 60px; 
+	text-align: center; 
+	line-height: 32px;
+	border-radius: 5px;
+	border: 1px solid #e5e5e5;
+	background: #ecf0f3;
+}
+.button_:hover{
+	background: #3b99d8;
+}
+.table>thead>tr>th {
+    border: 2px solid #e4e7e9;
+    height: 50px;
+    font-size: 16px;
+    color: #333;
+}
+.table>tbody>tr>td {
+    border: 2px solid #e4e7e9;
+    height: 50px;
+    font-size: 16px;
+    color: #333;
+}

+ 254 - 0
web/sku/css/htmleaf-demo.css

@@ -0,0 +1,254 @@
+@font-face {
+	font-family: 'icomoon';
+	src:url('../fonts/icomoon.eot?rretjt');
+	src:url('../fonts/icomoon.eot?#iefixrretjt') format('embedded-opentype'),
+		url('../fonts/icomoon.woff?rretjt') format('woff'),
+		url('../fonts/icomoon.ttf?rretjt') format('truetype'),
+		url('../fonts/icomoon.svg?rretjt#icomoon') format('svg');
+	font-weight: normal;
+	font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+	font-family: 'icomoon';
+	speak: none;
+	font-style: normal;
+	font-weight: normal;
+	font-variant: normal;
+	text-transform: none;
+	line-height: 1;
+
+	/* Better Font Rendering =========== */
+	-webkit-font-smoothing: antialiased;
+	-moz-osx-font-smoothing: grayscale;
+}
+
+body, html { font-size: 100%; 	padding: 0; margin: 0;}
+
+/* Reset */
+*,
+*:after,
+*:before {
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+}
+
+/* Clearfix hack by Nicolas Gallagher: http://nicolasgallagher.com/micro-clearfix-hack/ */
+.clearfix:before,
+.clearfix:after {
+	content: " ";
+	display: table;
+}
+
+.clearfix:after {
+	clear: both;
+}
+
+body{
+	background: #494A5F;
+	font-weight: 500;
+	font-size: 1.05em;
+	font-family: "Microsoft YaHei","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif;
+}
+.htmleaf-links a{ color: rgba(255, 255, 255, 0.6);outline: none;text-decoration: none;-webkit-transition: 0.2s;transition: 0.2s;}
+.htmleaf-links a:hover,.htmleaf-links a:focus{color:#74777b;text-decoration: none;}
+.htmleaf-container{
+	margin: 0 auto;
+}
+
+.bgcolor-1 { background: #f0efee; }
+.bgcolor-2 { background: #f9f9f9; }
+.bgcolor-3 { background: #e8e8e8; }/*light grey*/
+.bgcolor-4 { background: #2f3238; color: #fff; }/*Dark grey*/
+.bgcolor-5 { background: #df6659; color: #521e18; }/*pink1*/
+.bgcolor-6 { background: #2fa8ec; }/*sky blue*/
+.bgcolor-7 { background: #d0d6d6; }/*White tea*/
+.bgcolor-8 { background: #3d4444; color: #fff; }/*Dark grey2*/
+.bgcolor-9 { background: #ef3f52; color: #fff;}/*pink2*/
+.bgcolor-10{ background: #64448f; color: #fff;}/*Violet*/
+.bgcolor-11{ background: #3755ad; color: #fff;}/*dark blue*/
+.bgcolor-12{ background: #3498DB; color: #fff;}/*light blue*/
+.bgcolor-20{ background: #494A5F;color: #D5D6E2;}
+/* Header */
+.htmleaf-header{
+	padding: 1em 190px 1em;
+	letter-spacing: -1px;
+	text-align: center;
+	background: #66677c;
+}
+.htmleaf-header h1 {
+	color: #D5D6E2;
+	font-weight: 600;
+	font-size: 2em;
+	line-height: 1;
+	margin-bottom: 0;
+}
+.htmleaf-header h1 span {
+	display: block;
+	font-size: 60%;
+	font-weight: 400;
+	padding: 0.8em 0 0.5em 0;
+	color: #c3c8cd;
+}
+/*nav*/
+.htmleaf-demo a{color: #fff;text-decoration: none;}
+.htmleaf-demo{width: 100%;padding-bottom: 1.2em;}
+.htmleaf-demo a{display: inline-block;margin: 0.5em;padding: 0.6em 1em;border: 3px solid #fff;font-weight: 700;}
+.htmleaf-demo a:hover{opacity: 0.6;}
+.htmleaf-demo a.current{background:#1d7db1;color: #fff; }
+/* Top Navigation Style */
+.htmleaf-links {
+	position: relative;
+	display: inline-block;
+	white-space: nowrap;
+	font-size: 1.5em;
+	text-align: center;
+}
+
+.htmleaf-links::after {
+	position: absolute;
+	top: 0;
+	left: 50%;
+	margin-left: -1px;
+	width: 2px;
+	height: 100%;
+	background: #dbdbdb;
+	content: '';
+	-webkit-transform: rotate3d(0,0,1,22.5deg);
+	transform: rotate3d(0,0,1,22.5deg);
+}
+
+.htmleaf-icon {
+	display: inline-block;
+	margin: 0.5em;
+	padding: 0em 0;
+	width: 1.5em;
+	text-decoration: none;
+}
+
+.htmleaf-icon span {
+	display: none;
+}
+
+.htmleaf-icon:before {
+	margin: 0 5px;
+	text-transform: none;
+	font-weight: normal;
+	font-style: normal;
+	font-variant: normal;
+	font-family: 'icomoon';
+	line-height: 1;
+	speak: none;
+	-webkit-font-smoothing: antialiased;
+}
+/* footer */
+.htmleaf-footer{width: 100%;padding-top: 10px;}
+.htmleaf-small{font-size: 0.8em;}
+.center{text-align: center;}
+/****/
+.related {
+	color: #fff;
+	background: #494A5F;
+	text-align: center;
+	font-size: 1.25em;
+	padding: 0.5em 0;
+	overflow: hidden;
+}
+
+.related > a {
+	vertical-align: top;
+	width: calc(100% - 20px);
+	max-width: 340px;
+	display: inline-block;
+	text-align: center;
+	margin: 20px 10px;
+	padding: 25px;
+	font-family: "Microsoft YaHei","宋体","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo;
+}
+.related a {
+	display: inline-block;
+	text-align: left;
+	margin: 20px auto;
+	padding: 10px 20px;
+	opacity: 0.8;
+	-webkit-transition: opacity 0.3s;
+	transition: opacity 0.3s;
+	-webkit-backface-visibility: hidden;
+	text-decoration: none;
+}
+
+.related a:hover,
+.related a:active {
+	opacity: 1;
+}
+
+.related a img {
+	max-width: 100%;
+	opacity: 0.8;
+	border-radius: 4px;
+}
+.related a:hover img,
+.related a:active img {
+	opacity: 1;
+}
+.related h3{font-family: "Microsoft YaHei", sans-serif;font-size: 1.2em}
+.related a h3 {
+	font-size: 0.85em;
+	font-weight: 300;
+	margin-top: 0.15em;
+	color: #fff;
+}
+/* icomoon */
+.icon-htmleaf-home-outline:before {
+	content: "\e5000";
+}
+
+.icon-htmleaf-arrow-forward-outline:before {
+	content: "\e5001";
+}
+
+@media screen and (max-width: 1024px) {
+	.htmleaf-header {
+		padding: 2em 10% 2em;
+	}
+	.htmleaf-header h1 {
+        font-size:1.4em;
+    }
+    .htmleaf-links{font-size: 1.4em}
+}
+
+@media screen and (max-width: 960px) {
+	.htmleaf-header {
+		padding: 2em 10% 2em;
+	}
+	.htmleaf-header h1 {
+        font-size:1.2em;
+    }
+    .htmleaf-links{font-size: 1.2em}
+    .related h3{font-size: 1em;}
+	.related a h3 {
+		font-size: 0.8em;
+	}
+}
+
+@media screen and (max-width: 766px) {
+	.htmleaf-header h1 {
+        font-size:1.3em;
+    }
+    .htmleaf-links{font-size: 1.3em}
+}
+
+@media screen and (max-width: 640px) {
+	.htmleaf-header {
+		padding: 2em 10% 2em;
+	}
+	.htmleaf-header h1 {
+        font-size:1em;
+    }
+    .htmleaf-links{font-size: 1em}
+    .related h3{font-size: 0.8em;}
+	.related a h3 {
+		font-size: 0.6em;
+	}
+}

+ 241 - 0
web/sku/css/sku_index.css

@@ -0,0 +1,241 @@
+
+
+/*添加套装*/
+.new_suit{
+	float: left;
+	width: 100%;
+	height: 50px;
+	line-height: 50px;
+	margin-top: 20px;
+}
+.new_suit_a{
+	height: 50px; 
+	text-align: center; 
+}
+.new_suit_b{
+	width: 120px;
+	height: 100%; 
+	background: white;
+	border-radius: 5px;
+	border: 1px solid #cecdd0;
+}
+.new_suit_img{
+	float: left; 
+	margin-left: 20px; 
+	margin-right: 5px;
+	margin-bottom: 30px;
+}
+
+.new_suit_b:hover{
+	background: #d3e0e6;
+}
+
+
+.suit_title{
+	float: left;
+	font-weight:bold;
+	height: 80px; 
+	text-align: center; 
+	line-height: 80px; 
+	font-size: 20px;
+	color: #34373c;
+}
+
+.suit_title_text{
+	float: left;
+}
+.suit_title_ico{
+	float: left;
+	margin-left: 20px;
+}
+
+
+/*新增规则*/
+.add_rule{
+	height: 100%;
+	text-align: right;
+}
+.add_rule_a{
+	border-radius: 5px; 
+	width: 100px; 
+	line-height: 32px; 
+	float: right; 
+	margin-top: 30px;    
+	border: 1px solid #cecdd0;
+}
+.add_rule_title{
+	float: left;
+	margin-right: 5px;
+}
+.rule_{
+	width: 10%; 
+	height: 50px; 
+	text-align: center; 
+	line-height: 50px;
+	border-left: 1px solid #e4e7e9;
+	float: left;
+	font-size: 90%;
+	border-bottom: 1px solid #e4e7e9;
+}
+.rule_one{
+	float: left;
+	width: 100%;
+    border-right: 1px solid #e4e7e9;
+}
+.rule_one:hover{
+	background: #f8f8f8;
+}
+.rule_one>.rule_>div>img{
+	display: none;
+}
+
+.rule_one:hover>.rule_>div>img{
+	display: block;
+}
+.rule_hr{
+	color: #333;
+	font-size: 14px;
+	font-weight:bold;
+}
+
+.add_rule_a:hover{
+	background: #3b99d8;
+	color: white;
+	
+}
+.add_rule_a:hover >.icon_img>img{
+	 content: url("../img/Add_select@2x.png");
+}
+
+.icon_img{
+	margin-right: 5px;
+	float: left; 
+	margin-left: 10px;
+}
+.rule_operate{
+	margin-top: 10px;
+	width:50%;
+	float: left;
+}
+
+/*.suit_title:hover>div>img{
+	content: url("../img/drop_down_box_Selected@2x.png");
+}*/
+.suit_{
+	float: left;
+	width: 100%;
+}
+
+.theme-popover-mask {
+    z-index: 9998;
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background: #000;
+    opacity: 0.4;
+    filter: alpha(opacity=40);
+    display: none;
+}
+
+.theme-popover {
+    z-index: 9999;
+    position: fixed;
+    top: 200px;
+    left: 50%;
+    width: 660px;
+    margin: -180px 0 0 -330px;
+    border-radius: 5px;
+    border: solid 2px #666;
+    background-color: #fff;
+    display: none;
+    box-shadow: 0 0 10px #666;
+}
+.theme-poptit {
+    border-bottom: 1px solid #ddd;
+    padding: 0 12px;
+    position: relative;
+}
+.theme-poptit .close {
+    float: right;
+    color: #999;
+    padding: 5px;
+    margin: -2px -5px -5px;
+    font: bold 14px/14px simsun;
+    text-shadow: 0 1px 0 #ddd;
+}
+.closes {
+    left: 190px;
+    background: white;
+    color: black;
+    border: solid 1px #dddddd;
+}
+.ipt {
+    border: solid 1px #d2d2d2;
+    border-radius: 2px;
+    box-shadow: inset 0 1px 0 #f8f8f8;
+    background-color: #fff;
+    padding: 4px 6px;
+    line-height: 21px;
+    color: #555;
+    width: 250px;
+    vertical-align: baseline;
+}
+.btn_form{
+    padding: 0 100px;
+}
+.theme-signin{
+	margin-top: 20px;
+}
+h3{
+	margin-bottom: 20px;
+	font-size: 19px;
+}
+.ipt_condition {
+    border: solid 1px #d2d2d2;
+    border-radius: 2px;
+    box-shadow: inset 0 1px 0 #f8f8f8;
+    background-color: #fff;
+    padding: 4px 6px;
+    line-height: 21px;
+    width: 220px;
+    color: #555;
+    vertical-align: baseline;
+}
+
+.condition_one{
+	float: left; 
+	width: 50%;
+	height: 40px;
+}
+.rule_input{
+	width: 90%;
+	height: 90%;
+	border: 1px solid #40ace6;
+	border-radius: 3px;
+	display: none;
+	text-align: center;
+}
+
+.rule_save_div{
+	width:100%;
+	height:100%;
+	display: none;
+}
+.rule_save{
+	
+	width: 60px;
+    margin: 0 auto;
+    margin-top: 5px;
+    line-height: 36px;
+    height: 36px;
+    border-radius: 3px;
+	border: solid 1px #dddddd;
+}
+
+.rule_save:hover{
+	background: #3b99d8;
+	color: white;
+}
+    

+ 105 - 0
web/sku/find_sku.html

@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset="utf-8" />
+		<title></title>
+	</head>
+	<style type="text/css">  
+		@import url("css/bootstrap.min.css");
+    	@import url("css/commonality.css");
+    	@import url("css/find_sku.css" );
+    	
+    </style>
+    <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>
+    <script type="text/javascript" src="js/bootstrap-paginator.js" ></script>
+    <script type="text/javascript" src="js/find_sku.js" ></script>
+    <script type="text/javascript" src="js/ip.js" ></script>
+    <script type="text/javascript" src="js/jquery_cookie_min.js"></script>
+	<body>
+		<!--头部-->
+		<div class='head'>
+			<div class="col-sm-2 col-xs-12 head_left"><img class="head_logo" src="img/ansjer@2x.png"></div>
+		</div>
+		<!--菜单-->
+		<div class="col-sm-2 col-xs-12 menu">
+			<div class="menu_list" onclick="javascript:window.location.href='sku_index.html'" style="    border-left: 3px solid #efefef;"> 
+				<div class="menu_ico"><img src="img/SKUnaming_rule@2x.png" class="menu_img"></div>
+				<div class="menu_text">SKU命名规则</div>
+			</div>
+			<div class="menu_list" style="background: white; color: #40ace6; border-left: 3px solid #40ace6;"> 
+				<div class="menu_ico"><img src="img/findSKU_select@2x.png" class="menu_img"></div>
+				<div class="menu_text" style="color: #40ace6;">查找SKU</div>
+			</div>
+		</div>
+		<!--内容-->
+		<div class="col-sm-10 col-xs-12 content" id="content" style="padding-left: 40px;">
+			
+			<!--<div  class="col-sm-12 col-xs-12"  style="margin-top: 25px; font-size: 20px; width: 100%; margin-bottom: 30px;">查找SKU</div>
+			<div  class="col-sm-12 col-xs-12 find_all" style="width: 100%;" >
+				<div style="float: left; width: 536px;">
+					<input type="text" placeholder="ZOSI 白色 摄像机单套装" class="ipt_find">
+				</div>
+				
+				
+				<div class="find_img">
+					<img src="img/seek@2x.png" style="margin-top: 7px;">
+				</div>
+				<div  style="float: left;">
+				
+					<img src="img/screen@2x.png" style="margin-left: 20px; margin-top: 10px;">
+				</div>
+				<div  style="float: left;">
+				
+					<span style="margin-left: 8px; line-height: 40px; font-size: 14px;color: #8a8a8a;">条件筛选</span>
+				</div>
+			</div>-->
+			<div class="col-sm-12 col-xs-12" style="margin-top: 40px; width: 100%; color: #34373C;font-size: 20px;">
+				条件筛选
+			</div>
+			<div class="col-sm-12 col-xs-12 " style=" width: 100%;" >
+				<div style="float: left;width: 200px;  padding-left: 0px;" class="col-sm-2 col-xs-12 ">
+					<select class="select_div select_combo_val ">
+					</select>
+				</div>
+				
+				<div class="col-sm-10 col-xs-12 select_all_val " style="float: left;">
+					
+				</div>
+			</div>
+			<div class="col-sm-12 col-xs-12" style="margin-left: 220px; width: 300px;">
+				<div class="button_" id="ok_button" style="display: none;">查找</div>
+				<!--<div class="button_" style="margin-left: 10px;">取消</div>-->
+			</div>
+			<div class="col-sm-12 col-xs-12" style="margin-top: 20px; width: 100%;margin-top: 40px;color: #34373C;font-size: 20px;">
+				SKU列表
+			</div>
+			<div class="col-sm-12 col-xs-12" style=" width: 100%;">
+				
+				 <table class="table table-striped table-hover "  style="margin-top: 20px; text-align: center;">
+                        <thead >
+                            <tr class="fedback_thall">
+                                <th  style="text-align: center;    border-top: 2px solid #e4e7e9; width: 10%;" >编号</th>
+                                <th  style="text-align: center;    border-top: 2px solid #e4e7e9; width: 40%">规格号</th>
+                                <th  style="text-align: center;    border-top: 2px solid #e4e7e9;width: 50%">名称</th>
+                            </tr>
+                        </thead>
+                        <tbody style="font-size: 13px;" id='Respond_to_feedback_tbody'>
+                        	 
+                        </tbody>
+                        <tfoot>
+                            <tr>
+                                <td colspan="15">
+                                    <ul class="pagination pull-left" style="font-size: 14px;">
+                                    	
+                                          <div id="example" style="float: left; text-align: center"> <ul id="pageLimit"></ul> </div>
+                                          <div style="width: 100px;float: left; margin: 29px 0; font-size: 12px;" id="all_num"></div>
+                                    </ul> 
+                                </td>
+                            </tr>
+                        </tfoot>
+                    </table>
+			</div>
+		</div>
+		
+	</body>
+</html>

BIN
web/sku/img/Add@2x.png


BIN
web/sku/img/Add_select@2x.png


BIN
web/sku/img/SKUNaming_rules_select@2x.png


BIN
web/sku/img/SKUnaming_rule@2x.png


BIN
web/sku/img/ansjer@2x.png


BIN
web/sku/img/btn_close_h.png


BIN
web/sku/img/btn_close_n.png


BIN
web/sku/img/btn_close_p.png


BIN
web/sku/img/delete@2x.png


BIN
web/sku/img/drop_down_box@2x.png


BIN
web/sku/img/drop_down_box_Selected@2x.png


BIN
web/sku/img/findSKU@2x.png


BIN
web/sku/img/findSKU_select@2x.png


BIN
web/sku/img/modify@2x.png


BIN
web/sku/img/pack_up.png


BIN
web/sku/img/screen@2x.png


BIN
web/sku/img/seek@2x.png


BIN
web/sku/img/spread.png


BIN
web/sku/img/下拉框-选中@2x.png


BIN
web/sku/img/下拉框@2x.png


+ 657 - 0
web/sku/js/bootstrap-paginator.js

@@ -0,0 +1,657 @@
+/**
+ * bootstrap-paginator.js v0.5
+ * --
+ * Copyright 2013 Yun Lai <lyonlai1984@gmail.com>
+ * --
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function ($) {
+
+    "use strict"; // jshint ;_;
+
+
+    /* Paginator PUBLIC CLASS DEFINITION
+     * ================================= */
+
+    /**
+     * Boostrap Paginator Constructor
+     *
+     * @param element element of the paginator
+     * @param options the options to config the paginator
+     *
+     * */
+    var BootstrapPaginator = function (element, options) {
+        this.init(element, options);
+    },
+        old = null;
+
+    BootstrapPaginator.prototype = {
+
+        /**
+         * Initialization function of the paginator, accepting an element and the options as parameters
+         *
+         * @param element element of the paginator
+         * @param options the options to config the paginator
+         *
+         * */
+        init: function (element, options) {
+
+            this.$element = $(element);
+
+            var version = (options && options.bootstrapMajorVersion) ? options.bootstrapMajorVersion : $.fn.bootstrapPaginator.defaults.bootstrapMajorVersion,
+                id = this.$element.attr("id");
+
+            if (version === 2 && !this.$element.is("div")) {
+
+                throw "in Bootstrap version 2 the pagination must be a div element. Or if you are using Bootstrap pagination 3. Please specify it in bootstrapMajorVersion in the option";
+            } else if (version > 2 && !this.$element.is("ul")) {
+                throw "in Bootstrap version 3 the pagination root item must be an ul element."
+            }
+
+
+
+            this.currentPage = 1;
+
+            this.lastPage = 1;
+
+            this.setOptions(options);
+
+            this.initialized = true;
+        },
+
+        /**
+         * Update the properties of the paginator element
+         *
+         * @param options options to config the paginator
+         * */
+        setOptions: function (options) {
+
+            this.options = $.extend({}, (this.options || $.fn.bootstrapPaginator.defaults), options);
+
+            this.totalPages = parseInt(this.options.totalPages, 10);  //setup the total pages property.
+            this.numberOfPages = parseInt(this.options.numberOfPages, 10); //setup the numberOfPages to be shown
+
+            //move the set current page after the setting of total pages. otherwise it will cause out of page exception.
+            if (options && typeof (options.currentPage)  !== 'undefined') {
+
+                this.setCurrentPage(options.currentPage);
+            }
+
+            this.listen();
+
+            //render the paginator
+            this.render();
+
+            if (!this.initialized && this.lastPage !== this.currentPage) {
+                this.$element.trigger("page-changed", [this.lastPage, this.currentPage]);
+            }
+
+        },
+
+        /**
+         * Sets up the events listeners. Currently the pageclicked and pagechanged events are linked if available.
+         *
+         * */
+        listen: function () {
+
+            this.$element.off("page-clicked");
+
+            this.$element.off("page-changed");// unload the events for the element
+
+            if (typeof (this.options.onPageClicked) === "function") {
+                this.$element.bind("page-clicked", this.options.onPageClicked);
+            }
+
+            if (typeof (this.options.onPageChanged) === "function") {
+                this.$element.on("page-changed", this.options.onPageChanged);
+            }
+
+            this.$element.bind("page-clicked", this.onPageClicked);
+        },
+
+
+        /**
+         *
+         *  Destroys the paginator element, it unload the event first, then empty the content inside.
+         *
+         * */
+        destroy: function () {
+
+            this.$element.off("page-clicked");
+
+            this.$element.off("page-changed");
+
+            this.$element.removeData('bootstrapPaginator');
+
+            this.$element.empty();
+
+        },
+
+        /**
+         * Shows the page
+         *
+         * */
+        show: function (page) {
+
+            this.setCurrentPage(page);
+
+            this.render();
+
+            if (this.lastPage !== this.currentPage) {
+                this.$element.trigger("page-changed", [this.lastPage, this.currentPage]);
+            }
+        },
+
+        /**
+         * Shows the next page
+         *
+         * */
+        showNext: function () {
+            var pages = this.getPages();
+
+            if (pages.next) {
+                this.show(pages.next);
+            }
+
+        },
+
+        /**
+         * Shows the previous page
+         *
+         * */
+        showPrevious: function () {
+            var pages = this.getPages();
+
+            if (pages.prev) {
+                this.show(pages.prev);
+            }
+
+        },
+
+        /**
+         * Shows the first page
+         *
+         * */
+        showFirst: function () {
+            var pages = this.getPages();
+
+            if (pages.first) {
+                this.show(pages.first);
+            }
+
+        },
+
+        /**
+         * Shows the last page
+         *
+         * */
+        showLast: function () {
+            var pages = this.getPages();
+
+            if (pages.last) {
+                this.show(pages.last);
+            }
+
+        },
+
+        /**
+         * Internal on page item click handler, when the page item is clicked, change the current page to the corresponding page and
+         * trigger the pageclick event for the listeners.
+         *
+         *
+         * */
+        onPageItemClicked: function (event) {
+
+            var type = event.data.type,
+                page = event.data.page;
+
+            this.$element.trigger("page-clicked", [event, type, page]);
+
+        },
+
+        onPageClicked: function (event, originalEvent, type, page) {
+
+            //show the corresponding page and retrieve the newly built item related to the page clicked before for the event return
+
+            var currentTarget = $(event.currentTarget);
+
+            switch (type) {
+            case "first":
+                currentTarget.bootstrapPaginator("showFirst");
+                break;
+            case "prev":
+                currentTarget.bootstrapPaginator("showPrevious");
+                break;
+            case "next":
+                currentTarget.bootstrapPaginator("showNext");
+                break;
+            case "last":
+                currentTarget.bootstrapPaginator("showLast");
+                break;
+            case "page":
+                currentTarget.bootstrapPaginator("show", page);
+                break;
+            }
+
+        },
+
+        /**
+         * Renders the paginator according to the internal properties and the settings.
+         *
+         *
+         * */
+        render: function () {
+
+            //fetch the container class and add them to the container
+            var containerClass = this.getValueFromOption(this.options.containerClass, this.$element),
+                size = this.options.size || "normal",
+                alignment = this.options.alignment || "left",
+                pages = this.getPages(),
+                listContainer = this.options.bootstrapMajorVersion === 2 ? $("<ul></ul>") : this.$element,
+                listContainerClass = this.options.bootstrapMajorVersion === 2 ? this.getValueFromOption(this.options.listContainerClass, listContainer) : null,
+                first = null,
+                prev = null,
+                next = null,
+                last = null,
+                p = null,
+                i = 0;
+
+
+            this.$element.prop("class", "");
+
+            this.$element.addClass("pagination");
+
+            switch (size.toLowerCase()) {
+            case "large":
+            case "small":
+            case "mini":
+                this.$element.addClass($.fn.bootstrapPaginator.sizeArray[this.options.bootstrapMajorVersion][size.toLowerCase()]);
+                break;
+            default:
+                break;
+            }
+
+            if (this.options.bootstrapMajorVersion === 2) {
+                switch (alignment.toLowerCase()) {
+                case "center":
+                    this.$element.addClass("pagination-centered");
+                    break;
+                case "right":
+                    this.$element.addClass("pagination-right");
+                    break;
+                default:
+                    break;
+                }
+            }
+
+
+            this.$element.addClass(containerClass);
+
+            //empty the outter most container then add the listContainer inside.
+            this.$element.empty();
+
+            if (this.options.bootstrapMajorVersion === 2) {
+                this.$element.append(listContainer);
+
+                listContainer.addClass(listContainerClass);
+            }
+
+            //update the page element reference
+            this.pageRef = [];
+
+            if (pages.first) {//if the there is first page element
+                first = this.buildPageItem("first", pages.first);
+
+                if (first) {
+                    listContainer.append(first);
+                }
+
+            }
+
+            if (pages.prev) {//if the there is previous page element
+
+                prev = this.buildPageItem("prev", pages.prev);
+
+                if (prev) {
+                    listContainer.append(prev);
+                }
+
+            }
+
+
+            for (i = 0; i < pages.length; i = i + 1) {//fill the numeric pages.
+
+                p = this.buildPageItem("page", pages[i]);
+
+                if (p) {
+                    listContainer.append(p);
+                }
+            }
+
+            if (pages.next) {//if there is next page
+
+                next = this.buildPageItem("next", pages.next);
+
+                if (next) {
+                    listContainer.append(next);
+                }
+            }
+
+            if (pages.last) {//if there is last page
+
+                last = this.buildPageItem("last", pages.last);
+
+                if (last) {
+                    listContainer.append(last);
+                }
+            }
+        },
+
+        /**
+         *
+         * Creates a page item base on the type and page number given.
+         *
+         * @param page page number
+         * @param type type of the page, whether it is the first, prev, page, next, last
+         *
+         * @return Object the constructed page element
+         * */
+        buildPageItem: function (type, page) {
+
+            var itemContainer = $("<li></li>"),//creates the item container
+                itemContent = $("<a></a>"),//creates the item content
+                text = "",
+                title = "",
+                itemContainerClass = this.options.itemContainerClass(type, page, this.currentPage),
+                itemContentClass = this.getValueFromOption(this.options.itemContentClass, type, page, this.currentPage),
+                tooltipOpts = null;
+
+
+            switch (type) {
+
+            case "first":
+                if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; }
+                text = this.options.itemTexts(type, page, this.currentPage);
+                title = this.options.tooltipTitles(type, page, this.currentPage);
+                break;
+            case "last":
+                if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; }
+                text = this.options.itemTexts(type, page, this.currentPage);
+                title = this.options.tooltipTitles(type, page, this.currentPage);
+                break;
+            case "prev":
+                if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; }
+                text = this.options.itemTexts(type, page, this.currentPage);
+                title = this.options.tooltipTitles(type, page, this.currentPage);
+                break;
+            case "next":
+                if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; }
+                text = this.options.itemTexts(type, page, this.currentPage);
+                title = this.options.tooltipTitles(type, page, this.currentPage);
+                break;
+            case "page":
+                if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; }
+                text = this.options.itemTexts(type, page, this.currentPage);
+                title = this.options.tooltipTitles(type, page, this.currentPage);
+                break;
+            }
+
+            itemContainer.addClass(itemContainerClass).append(itemContent);
+
+            itemContent.addClass(itemContentClass).html(text).on("click", null, {type: type, page: page}, $.proxy(this.onPageItemClicked, this));
+
+            if (this.options.pageUrl) {
+                itemContent.attr("href", this.getValueFromOption(this.options.pageUrl, type, page, this.currentPage));
+            }
+
+            if (this.options.useBootstrapTooltip) {
+                tooltipOpts = $.extend({}, this.options.bootstrapTooltipOptions, {title: title});
+
+                itemContent.tooltip(tooltipOpts);
+            } else {
+                itemContent.attr("title", title);
+            }
+
+            return itemContainer;
+
+        },
+
+        setCurrentPage: function (page) {
+            if (page > this.totalPages || page < 1) {// if the current page is out of range, throw exception.
+
+                throw "Page out of range";
+
+            }
+
+            this.lastPage = this.currentPage;
+
+            this.currentPage = parseInt(page, 10);
+
+        },
+
+        /**
+         * Gets an array that represents the current status of the page object. Numeric pages can be access via array mode. length attributes describes how many numeric pages are there. First, previous, next and last page can be accessed via attributes first, prev, next and last. Current attribute marks the current page within the pages.
+         *
+         * @return object output objects that has first, prev, next, last and also the number of pages in between.
+         * */
+        getPages: function () {
+
+            var totalPages = this.totalPages,// get or calculate the total pages via the total records
+                pageStart = (this.currentPage % this.numberOfPages === 0) ? (parseInt(this.currentPage / this.numberOfPages, 10) - 1) * this.numberOfPages + 1 : parseInt(this.currentPage / this.numberOfPages, 10) * this.numberOfPages + 1,//calculates the start page.
+                output = [],
+                i = 0,
+                counter = 0;
+
+            pageStart = pageStart < 1 ? 1 : pageStart;//check the range of the page start to see if its less than 1.
+
+            for (i = pageStart, counter = 0; counter < this.numberOfPages && i <= totalPages; i = i + 1, counter = counter + 1) {//fill the pages
+                output.push(i);
+            }
+
+            output.first = 1;//add the first when the current page leaves the 1st page.
+
+            if (this.currentPage > 1) {// add the previous when the current page leaves the 1st page
+                output.prev = this.currentPage - 1;
+            } else {
+                output.prev = 1;
+            }
+
+            if (this.currentPage < totalPages) {// add the next page when the current page doesn't reach the last page
+                output.next = this.currentPage + 1;
+            } else {
+                output.next = totalPages;
+            }
+
+            output.last = totalPages;// add the last page when the current page doesn't reach the last page
+
+            output.current = this.currentPage;//mark the current page.
+
+            output.total = totalPages;
+
+            output.numberOfPages = this.options.numberOfPages;
+
+            return output;
+
+        },
+
+        /**
+         * Gets the value from the options, this is made to handle the situation where value is the return value of a function.
+         *
+         * @return mixed value that depends on the type of parameters, if the given parameter is a function, then the evaluated result is returned. Otherwise the parameter itself will get returned.
+         * */
+        getValueFromOption: function (value) {
+
+            var output = null,
+                args = Array.prototype.slice.call(arguments, 1);
+
+            if (typeof value === 'function') {
+                output = value.apply(this, args);
+            } else {
+                output = value;
+            }
+
+            return output;
+
+        }
+
+    };
+
+
+    /* TYPEAHEAD PLUGIN DEFINITION
+     * =========================== */
+
+    old = $.fn.bootstrapPaginator;
+
+    $.fn.bootstrapPaginator = function (option) {
+
+        var args = arguments,
+            result = null;
+
+        $(this).each(function (index, item) {
+            var $this = $(item),
+                data = $this.data('bootstrapPaginator'),
+                options = (typeof option !== 'object') ? null : option;
+
+            if (!data) {
+                data = new BootstrapPaginator(this, options);
+
+                $this = $(data.$element);
+
+                $this.data('bootstrapPaginator', data);
+
+                return;
+            }
+
+            if (typeof option === 'string') {
+
+                if (data[option]) {
+                    result = data[option].apply(data, Array.prototype.slice.call(args, 1));
+                } else {
+                    throw "Method " + option + " does not exist";
+                }
+
+            } else {
+                result = data.setOptions(option);
+            }
+        });
+
+        return result;
+
+    };
+
+    $.fn.bootstrapPaginator.sizeArray = {
+
+        "2": {
+            "large": "pagination-large",
+            "small": "pagination-small",
+            "mini": "pagination-mini"
+        },
+        "3": {
+            "large": "pagination-lg",
+            "small": "pagination-sm",
+            "mini": ""
+        }
+
+    };
+
+    $.fn.bootstrapPaginator.defaults = {
+        containerClass: "",
+        size: "normal",
+        alignment: "left",
+        bootstrapMajorVersion: 2,
+        listContainerClass: "",
+        itemContainerClass: function (type, page, current) {
+            return (page === current) ? "active" : "";
+        },
+        itemContentClass: function (type, page, current) {
+            return "";
+        },
+        currentPage: 1,
+        numberOfPages: 5,
+        totalPages: 1,
+        pageUrl: function (type, page, current) {
+            return null;
+        },
+        onPageClicked: null,
+        onPageChanged: null,
+        useBootstrapTooltip: false,
+        shouldShowPage: function (type, page, current) {
+
+            var result = true;
+
+            switch (type) {
+            case "first":
+                result = (current !== 1);
+                break;
+            case "prev":
+                result = (current !== 1);
+                break;
+            case "next":
+                result = (current !== this.totalPages);
+                break;
+            case "last":
+                result = (current !== this.totalPages);
+                break;
+            case "page":
+                result = true;
+                break;
+            }
+
+            return result;
+
+        },
+        itemTexts: function (type, page, current) {
+            switch (type) {
+            case "first":
+                return "&lt;&lt;";
+            case "prev":
+                return "&lt;";
+            case "next":
+                return "&gt;";
+            case "last":
+                return "&gt;&gt;";
+            case "page":
+                return page;
+            }
+        },
+        tooltipTitles: function (type, page, current) {
+
+            switch (type) {
+            case "first":
+                return "Go to first page";
+            case "prev":
+                return "Go to previous page";
+            case "next":
+                return "Go to next page";
+            case "last":
+                return "Go to last page";
+            case "page":
+                return (page === current) ? "Current page is " + page : "Go to page " + page;
+            }
+        },
+        bootstrapTooltipOptions: {
+            animation: true,
+            html: true,
+            placement: 'top',
+            selector: false,
+            title: "",
+            container: false
+        }
+    };
+
+    $.fn.bootstrapPaginator.Constructor = BootstrapPaginator;
+
+
+
+}(window.jQuery));

+ 243 - 0
web/sku/js/find_sku.js

@@ -0,0 +1,243 @@
+$(function () { 
+	var token=$.cookie('access_token');
+	if(token==undefined){
+		window.location.href = "login.html";
+	}
+	console.log(token)
+	
+	var data_list=[];
+	var res_leng=0;
+	var totalPages=1;
+	
+	
+	var url=http+"cku_suit/query"; 
+    var data_string = JSON.stringify({token:token});
+//  首次获取
+    $.ajax({
+        url: url,
+        type: "post",
+        dataType:"JSON",
+        data: data_string,
+        success: function (data)
+        {
+        	if(data.code==0){
+        	 	var html_='<option>请选择套装名称</option>';
+    	 		for(var k=0;k<data.res.length;k++){
+	 				html_=html_+'<option value="'+data.res[k].id+'">'+data.res[k].suitName+'</option>'
+    	 		}
+    	 		$(".select_combo_val").html(html_);
+        	}
+        },
+        error:function (XMLHttpRequest) {
+            console.log("失败!");
+    	}
+	}); 
+	
+//	选择就触发
+	$(document).on('change','.select_combo_val', function() {
+		$(".select_all_val").html('');
+		$("#Respond_to_feedback_tbody").html('');
+        var id = $(".select_combo_val option:selected").attr("value");
+//      console.log(id);
+        var url=http+"cku_rule/query_all"; 
+	    var data_string = JSON.stringify({token:token,id:id});
+	//  首次获取
+	    $.ajax({
+	        url: url,
+	        type: "post",
+	        dataType:"JSON",
+	        data: data_string,
+	        success: function (data)
+	        {
+	        	console.log(data)
+	        	if(data.code==0){
+	    	 		for(var k=0;k<data.res.length;k++){
+		 				var html_='<select class="select_div rule_name">'
+		        	 	+'<option value="'+data.res[k].cr_qs.length+'">请选择'+data.res[k].ruleName+'</option>';
+		    	 		for(var j=0;j<data.res[k].cr_qs.length;j++){
+			 				html_=html_+'<option  value="'+j+'">'+data.res[k].cr_qs[j].numName+':'+data.res[k].cr_qs[j].conditionName+'</option>'
+		    	 		}
+		    	 		html_=html_+'</select> '
+		    	 		$(".select_all_val").append(html_);
+	    	 		}
+	    	 		if(data.res.length>0){
+	    	 			$("#ok_button").show();
+	    	 			$('#pageLimit').show();
+	    	 			$(".pagination").show();
+	    	 		}else{
+	    	 			$('#pageLimit').hide();
+	    	 			$("#ok_button").hide();
+	    	 			$(".pagination").hide();
+	    	 		}
+	        	}
+	        },
+	        error:function (XMLHttpRequest) {
+	            console.log("失败!");
+	            
+	    	}
+		}); 
+    });
+	
+	//  递归
+	var i;
+	function recursion(data_,num,num_,tj_,val_1,val_2){
+		if(tj_==""){
+			i=1;
+		}
+		var xa=num-1;//记录是否继续
+		for (var a=0;a<data_.res[res_leng-xa].cr_qs.length;a++) {
+			if(xa==0){
+				var num_all=num_;
+				var tj_all=tj_;
+				num_all=num_all+data_.res[res_leng-xa].cr_qs[a].numName;
+				tj_all=tj_all+data_.res[res_leng-xa].cr_qs[a].conditionName;
+//				console.log(num_all);
+				data_list.push({'num':i,'all_num':num_all,'all_tj':tj_all});
+				i=i+1;
+			}else{
+				var num_all=num_;
+				var tj_all=tj_;
+				if(val_1=="玲"){
+					if(res_leng-(xa+1)==0){
+						num_all=num_all+"-"
+					}
+				}
+				num_all=num_all+data_.res[res_leng-xa].cr_qs[a].numName;
+				tj_all=tj_all+data_.res[res_leng-xa].cr_qs[a].conditionName;
+				if(val_1!=""){
+					if(res_leng-xa==val_1){
+						num_all=num_all+"-"
+					}
+				}
+				
+				if(val_2!=""){
+					if(res_leng-xa==val_2){
+						num_all=num_all+"-"
+					}
+				}
+				
+				recursion(data_,xa,num_all,tj_all,val_1,val_2);
+			}
+		}
+	}
+//	循环判断
+	function cr_qs(data_,num){
+		i=1;
+		data_list=[];
+		$('#pageLimit').html("");
+		$("#Respond_to_feedback_tbody").html("");
+		if(num==7){ //摄像机单机
+			recursion(data_,num,"","",1,4);
+		}else if(num==8){ //摄像机套装
+			recursion(data_,num,"","",1,4);
+		}else if(num==5){ //电源
+			recursion(data_,num,"","","玲",3);
+		}else{
+			recursion(data_,num,"","","","");
+		}
+		
+		console.log('一共有');
+		console.log(data_list.length); 
+	 	$("#all_num").html('共'+data_list.length+'条记录');
+		if(totalPages==0){
+			totalPages=1;
+		}else{
+			totalPages=parseInt((data_list.length+line-1)/line); //计算页 
+		}
+		$("#Respond_to_feedback_tbody").html('');
+        for(var i=0;i<data_list.length;i++){
+        	if(i<line){
+    			$("#Respond_to_feedback_tbody").append('<tr>'
+                    +'<td  style="text-align: center;    border-top: 2px solid #e4e7e9; width: 10%;" >'+data_list[i].num+'</td>'
+                    +'<td  style="text-align: center;    border-top: 2px solid #e4e7e9; width: 40%">'+data_list[i].all_num+'</td>'
+                    +'<td  style="text-align: center;    border-top: 2px solid #e4e7e9;width: 50%">'+data_list[i].all_tj+'</td>'
+                +'</tr>');
+        	}
+        } 
+		$('#pageLimit').bootstrapPaginator({
+            currentPage: 1,//当前的请求页面。
+            totalPages: totalPages,//一共多少页。
+            size: "normal",//应该是页眉的大小。
+            bootstrapMajorVersion: 3,//bootstrap的版本要求。
+            alignment: "right",
+            numberOfPages: 7,//一页列出多少数据。
+            itemTexts: function (type, page, current) {//如下的代码是将页眉显示的中文显示我们自定义的中文。
+                 switch (type) {
+                    case "first":
+                        return "首页";
+                    case "prev":
+                        return "上一页";
+                    case "next":
+                        return "下一页";
+                    case "last":
+                        return "末页";
+                    case "page":
+                        return page;
+                }
+            },
+            onPageClicked: function (event, originalEvent, type, page) {//给每个页眉绑定一个事件,其实就是ajax请求,其中page变量为当前点击的页上的数字。
+                $("#Respond_to_feedback_tbody").html('');
+                for(var i=0;i<data_list.length;i++){
+                	if(line*(page-1)<=i && i<line*page){
+            			$("#Respond_to_feedback_tbody").append('<tr>'
+			                                +'<td  style="text-align: center;    border-top: 2px solid #e4e7e9; width: 10%;" >'+data_list[i].num+'</td>'
+			                                +'<td  style="text-align: center;    border-top: 2px solid #e4e7e9; width: 40%">'+data_list[i].all_num+'</td>'
+			                                +'<td  style="text-align: center;    border-top: 2px solid #e4e7e9;width: 50%">'+data_list[i].all_tj+'</td>'
+			                            +'</tr>');
+                	}
+                } 
+                console.log('ok');
+			           
+            }
+        }); 
+	}
+	
+	
+	
+//	点击确认
+	$("#ok_button").on('click',function(){
+		var id = $(".select_combo_val option:selected").attr("value");
+//      console.log(id);
+        var url=http+"cku_rule/query_all"; 
+	    var data_string = JSON.stringify({token:token,id:id});
+		 $.ajax({
+	        url: url,
+	        type: "post",
+	        dataType:"JSON",
+	        data: data_string,
+	        success: function (data)
+	        {
+	        	if(data.code==0){
+//	        		console.log(data);
+					for (var i=0;i<$(".select_all_val").children().length;i++) {
+						var ff=$(".select_all_val").children().eq(i).val();
+					    if(ff<data.res[i].cr_qs.length){
+					    	data.res[i].cr_qs= [data.res[i].cr_qs[ff]]
+					    }
+					}
+					try{
+						res_leng=data.res.length-1;
+						cr_qs(data,data.res.length);
+					}catch(e){
+						//TODO handle the exception
+					}
+	        	}
+	        },
+	        error:function (XMLHttpRequest) {
+	            console.log("失败!");
+	            
+	    	}
+		}); 
+		
+		
+		
+		
+	});
+
+	$(".ipt_find").on('focus',function(){
+		$(".find_img").addClass("find_img_hover");
+	});
+	$(".ipt_find").on('blur',function(){
+		$(".find_img").removeClass("find_img_hover");
+	});
+});

+ 6 - 0
web/sku/js/ip.js

@@ -0,0 +1,6 @@
+var http="http://192.168.136.39:8000/";
+
+var http = 'http://47.107.129.126:7724/';
+var line=5;  //分页的条数
+
+

Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
web/sku/js/jquery-2.1.1.min.js


+ 2 - 0
web/sku/js/jquery_cookie_min.js

@@ -0,0 +1,2 @@
+/*! jquery.cookie v1.4.1 | MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}});

+ 468 - 0
web/sku/js/sku_index.js

@@ -0,0 +1,468 @@
+$(function () {
+	var token=$.cookie('access_token');
+	 
+	if(token==undefined){
+		window.location.href = "login.html";
+	}
+	
+    var url=http+"cku_suit/query_all"; 
+    var data_string = JSON.stringify({token:token});
+//  首次获取
+    $.ajax({
+        url: url,
+        type: "post",
+        dataType:"JSON",
+        data: data_string,
+        success: function (data)
+        {
+            console.log(data);
+            if(data.code==0){
+         		for(var k=0;k<data.res.length;k++){
+					var suit_html='<div class="suit_" >'
+										+   '<div style="height: 80px;width: 100%;">'
+					suit_html=suit_html +		 '<div class="suit_title ">'
+					suit_html=suit_html +		 '<div class="suit_title_text">'+data.res[k].suitName+'</div>'
+					suit_html=suit_html +		 '<div class="suit_title_ico"><img src="img/spread.png"></div>'
+					suit_html=suit_html +		 '</div>'
+					
+					suit_html=suit_html +		 '<div class="add_rule" >'
+										+		 	'<div class="add_rule_a" rid="'+data.res[k].id+'">'
+										+		 		'<div class="icon_img">'
+										+		 			'<img src="img/Add@2x.png">'
+										+				'</div>'
+										+				'<div class="add_rule_title">新增规则</div>'
+										+			'</div>'
+										+		'</div>'
+										+	'</div>';
+					suit_html=suit_html +	'<div class="rule_all_list" style="border-bottom: 1px solid #e4e7e9;">'
+					var num=8;
+					for(var i=0;i<data.res[k].sr_qs.length;i++){
+						suit_html=suit_html +	'<div class="rule_one">'
+						suit_html=suit_html+		'<div class="rule_ rule_hr" rid="'+data.res[k].sr_qs[i].id+'">'+data.res[k].sr_qs[i].ruleName+'</div>'
+//					 
+						if(data.res[k].sr_qs[i].cr_qs.length<8){
+							num=8
+						}
+						if(data.res[k].sr_qs[i].cr_qs.length>8){
+							num=17
+						}
+						if(data.res[k].sr_qs[i].cr_qs.length>18){
+							num=26
+						}
+						for(var j=0;j<num;j++){
+							
+							if(j==9){
+								suit_html=suit_html+		'<div class="rule_ rule_hr"></div>';
+								try{
+									suit_html=suit_html+		'<div class="rule_"><span class="rule_term">'+data.res[k].sr_qs[i].cr_qs[j].numName+':'+data.res[k].sr_qs[i].cr_qs[j].conditionName+'</span> <input class="rule_input" rid="'+data.res[k].sr_qs[i].cr_qs[j].id+'" value="'+data.res[k].sr_qs[i].cr_qs[j].numName+':'+data.res[k].sr_qs[i].cr_qs[j].conditionName+'"></div>'
+								}catch(e){
+									//TODO handle the exception
+									suit_html=suit_html+		'<div class="rule_ rule_hr"></div>';
+								}
+								 
+								
+							}else if(j==18){
+								suit_html=suit_html+		'<div class="rule_ rule_hr"></div>';
+								suit_html=suit_html+		'<div class="rule_"><span class="rule_term">'+data.res[k].sr_qs[i].cr_qs[j].numName+':'+data.res[k].sr_qs[i].cr_qs[j].conditionName+'</span> <input class="rule_input" rid="'+data.res[k].sr_qs[i].cr_qs[j].id+'" value="'+data.res[k].sr_qs[i].cr_qs[j].numName+':'+data.res[k].sr_qs[i].cr_qs[j].conditionName+'"></div>'
+							}else{
+								if(j<data.res[k].sr_qs[i].cr_qs.length){
+									suit_html=suit_html+		'<div class="rule_"><span class="rule_term">'+data.res[k].sr_qs[i].cr_qs[j].numName+':'+data.res[k].sr_qs[i].cr_qs[j].conditionName+'</span> <input class="rule_input" rid="'+data.res[k].sr_qs[i].cr_qs[j].id+'" value="'+data.res[k].sr_qs[i].cr_qs[j].numName+':'+data.res[k].sr_qs[i].cr_qs[j].conditionName+'"></div>'
+								}else{
+									suit_html=suit_html+		'<div class="rule_"></div>'
+								}
+							}
+						}
+						suit_html=suit_html+		'<div class="rule_" style="float: right;">'
+								 				+		'<div class="rule_operate"><img style="margin-left: 50%; "src="img/modify@2x.png" class="compile" title="编辑"></div>'
+								 				+		'<div class="rule_operate"><img style="margin-left: 10%; " src="img/delete@2x.png" class="remove" title="删除"></div>'
+								 				
+								 				+		'<div class="rule_save_div"><div class="rule_save">保存</div></div>'
+								 				+	'</div>'
+						suit_html=suit_html+'</div>';
+					}
+				  
+				    suit_html=suit_html+	'</div>';
+					$("#suit_html").append(suit_html);
+				}
+            }else{
+             
+            }
+        },
+        error:function (XMLHttpRequest) {
+            console.log("失败!");
+            
+    	}
+	}); 
+	
+	
+	
+	
+
+	
+	var suit_exit_value;
+//	添加套装
+	$(document).on('click','.new_suit_b', function() {
+		console.log('添加套装');
+		$('#suit_add_id').fadeIn(100);
+		$('#suit_add').slideDown(200);
+		suit_exit_value=$(this);
+	});
+	
+//	保存套装
+	$(document).on('click','#suit_exit_value', function() {
+		var suit_name = $("#suit_name").val();	
+		var url=http+"cku_suit/add"; 
+	    var data_string = JSON.stringify({token:token,name:suit_name});
+	    $.ajax({
+	        url: url,
+	        type: "post",
+	        dataType:"JSON",
+	        data: data_string,
+	        async: true,//同步
+	        success: function (data)
+	        {
+	            if(data.code==0){
+	             	console.log(data);
+	             	var id = data.res[0].id;
+				              var suit_html='					<div class="suit_" >'
+						suit_html=suit_html +		 	'<div style="height: 80px;width: 100%;">'
+						suit_html=suit_html +		 	'<div class="suit_title ">'
+						suit_html=suit_html +		  		'<div class="suit_title_text">'+suit_name+'</div>'
+						suit_html=suit_html +		 		'<div class="suit_title_ico"><img src="img/spread.png"></div>'
+						suit_html=suit_html +		 	'</div>'
+					 
+					suit_html=suit_html+		 '<div class="add_rule">'
+					+		 	'<div class="add_rule_a" rid="'+id+'">'
+					+		 		'<div class="icon_img">'
+					+		 			'<img src="img/Add@2x.png">'
+					+				'</div>'
+					+				'<div class="add_rule_title">新增规则</div>'
+					+			'</div>'
+					+		'</div>'
+					+	'</div>';
+					suit_html=suit_html +	'<div class="rule_all_list" style="border-bottom: 1px solid #e4e7e9;">'
+					suit_html=suit_html +	'</div>'
+					suit_html=suit_html+'</div>';
+					console.log(suit_exit_value.parent());	
+					suit_exit_value.parent().parent().parent().children().eq(0).append(suit_html);
+	            }else{
+	             	return;
+	            }
+	        },
+	        error:function (XMLHttpRequest) {
+	            console.log("失败!");
+	            
+	    	}
+		});
+		
+		
+		$('#suit_add_id').fadeOut(100);
+		$('#suit_add').slideUp(200);
+	});
+	
+	
+	var add_rule;
+	var add_i=0;
+	var suit_rid;
+//	添加规则和添加条件
+	$(document).on('click','.add_rule_a', function() {
+		suit_rid = $(this).attr("rid");
+		add_i=0;
+		add_rule = $(this).parent().parent().parent().children().eq(1);
+		$(".add_role_div").parent().children().eq(0).html('');
+		var html_ = '<div>'
+	            +'        		 <div class="condition_one">'
+	            +'       		 	 <input class="ipt_condition" id="condition_number_'+add_i+'" type="text" placeholder="输入条件编号,例如:1"> :'
+		        +'           	 </div>'
+		        +'           	 <div class="condition_one">'
+		        +'           		<input class="ipt_condition" id="condition_that_'+add_i+'" type="text" placeholder="输入条件说明,例如:红色">'
+		        +'          	 </div>'
+	            +'      	</div>'
+	    $(".add_role_div").parent().children().eq(0).append(html_);
+		 
+		add_i=add_i+1;
+		$('#rule_add_id').fadeIn(100);
+		$('#rule_add').slideDown(200);
+	});
+	
+	
+//	编辑
+	$(document).on('click','.compile', function() {
+		console.log('编辑');
+		var a = $(this).parent().parent().parent().children().length;
+		$(this).parent().parent().children().eq(0).hide();
+		$(this).parent().parent().children().eq(1).hide();
+		$(this).parent().parent().children().eq(2).show();
+		console.log(a);
+		for(var i=0;i<a-1;i++){
+			if(i.toString().indexOf('10') !=-1 || i==0){
+				$(this).parent().parent().parent().children().eq(i).children().eq(0).show();
+				$(this).parent().parent().parent().children().eq(i).children().eq(1).hide();
+			}else{
+				$(this).parent().parent().parent().children().eq(i).children().eq(1).show();
+				$(this).parent().parent().parent().children().eq(i).children().eq(0).hide();
+			}
+		}
+		
+	});
+		
+//	保存
+	$(document).on('click','.rule_save', function() {
+		console.log('编辑');
+		var a = $(this).parent().parent().parent().children().length;
+		$(this).parent().parent().children().eq(0).show();
+		$(this).parent().parent().children().eq(1).show();
+		$(this).parent().parent().children().eq(2).hide();
+		console.log(a);
+		for(var i=0;i<a-1;i++){
+			if(i.toString().indexOf('10') !=-1 || i==0){
+				$(this).parent().parent().parent().children().eq(i).children().eq(0).hide();
+				$(this).parent().parent().parent().children().eq(i).children().eq(1).show();
+			}else{
+				if($(this).parent().parent().parent().children().eq(i).children().eq(1).val()==undefined){
+					
+				}else{
+					var id=$(this).parent().parent().parent().children().eq(i).children().eq(1).attr("rid");
+					var num_name=$(this).parent().parent().parent().children().eq(i).children().eq(1).val().split(/:/);
+					if(num_name.length!=2){
+						num_name=$(this).parent().parent().parent().children().eq(i).children().eq(1).val().split(/:/);
+					}
+					$(this).parent().parent().parent().children().eq(i).children().eq(0).html(num_name[0]+":"+num_name[1]);
+//					console.log(id);
+//					console.log(num_name);
+					var url=http+"sku_condition/update"; 
+				    var data_string = JSON.stringify({token:token,numName:num_name[0],name:num_name[1],id:id});
+				    $.ajax({
+				        url: url,
+				        type: "post",
+				        dataType:"JSON",
+				        data: data_string,
+				        async: true,//同步
+				        success: function (data)
+				        {
+				            if(data.code==0){
+//				             	console.log(data);
+				            }else{
+				             	return;
+				            }
+				        },
+				        error:function (XMLHttpRequest) {
+				            console.log("失败!");
+				    	}
+					});
+						
+				}
+				
+				$(this).parent().parent().parent().children().eq(i).children().eq(1).hide();
+				$(this).parent().parent().parent().children().eq(i).children().eq(0).show();
+				 
+			}
+			
+		}
+		
+		
+	});
+	
+	
+	
+	
+//	添加一行的条件
+	$(document).on('click','.add_role_div', function() {
+		
+		var html_ = '<div>'
+	            +'        		 <div class="condition_one">'
+	            +'       		 	 <input class="ipt_condition" id="condition_number_'+add_i+'" type="text" placeholder="输入条件编号,例如:1"> :'
+		        +'           	 </div>'
+		        +'           	 <div class="condition_one">'
+		        +'           		<input class="ipt_condition" id="condition_that_'+add_i+'" type="text" placeholder="输入条件说明,例如:红色">'
+		        +'          	 </div>'
+	            +'      	</div>'
+	    $(this).parent().children().eq(0).append(html_);
+	    add_i=add_i+1;
+	});
+	
+//	保存添加的规则和条件
+	$(document).on('click','#role_add_value', function() {
+		
+		console.log(suit_rid);
+		 
+		var role_edit_name = $("#role_edit_name").val();
+		
+		var condition_number=[];
+		var condition_that=[];
+		var condition_id=[];
+		if(role_edit_name==""){
+			add_i=0;
+			add_i=add_i+1;
+			alert("规则名称不可以为空!")
+			return;
+		}else{
+			$('#rule_add_id').fadeOut(100);
+			$('#rule_add').slideUp(200);
+		}
+		var url=http+"cku_rule/add"; 
+		var rule_id="";
+	    var data_string = JSON.stringify({token:token,name:role_edit_name,id:suit_rid});
+	    $.ajax({
+	        url: url,
+	        type: "post",
+	        dataType:"JSON",
+	        data: data_string,
+	        async: false,//同步
+	        success: function (data)
+	        {
+//	        	console.log(data);
+	            if(data.code==0){
+//	             	console.log(data);
+					rule_id = data.res[0].id;
+	            }else{
+	             	return;
+	            }
+	        },
+	        error:function (XMLHttpRequest) {
+	            console.log("失败!");
+	            
+	    	}
+		});
+		
+		for(var i=0;i<add_i;i++){
+			var number = $("#condition_number_"+i).val();
+			if(number!="" && number!=undefined){
+				condition_number.push([number]); 
+			}
+			var that = $("#condition_that_"+i).val();
+			if(that!="" && that!=undefined){
+				condition_that.push([that]);
+			}
+			var url=http+"sku_condition/add"; 
+		    var data_string = JSON.stringify({token:token,numName:number,name:that,id:rule_id});
+		    $.ajax({
+		        url: url,
+		        type: "post",
+		        dataType:"JSON",
+		        data: data_string,
+		        async: false,//同步
+		        success: function (data)
+		        {
+		            if(data.code==0){
+//		             	console.log(data);
+		             	condition_id.push(data.res[0].id);
+		            }else{
+		             	return;
+		            }
+		        },
+		        error:function (XMLHttpRequest) {
+		            console.log("失败!");
+		            
+		    	}
+			});
+				
+			
+		}
+		console.log(condition_number);
+		console.log(condition_that)
+		var suit_html='';
+		var num=8;
+		for(var i=0;i<1;i++){
+			suit_html=suit_html +	'<div class="rule_one">'
+			suit_html=suit_html+		'<div class="rule_ rule_hr" rid="'+rule_id+'">'+role_edit_name+'</div>'
+			if (condition_that.length>8){
+				num=17
+			}
+			if (condition_that.length>18){
+				num=26
+			}
+			for(var j=0;j<num;j++){
+				if(j==9){
+					suit_html=suit_html+		'<div class="rule_ rule_hr"></div>';
+					
+					try{
+						suit_html=suit_html+		'<div class="rule_"><span class="rule_term">'+condition_number[j]+':'+condition_that[j]+'</span> <input class="rule_input" rid="'+condition_id[j]+'" value="'+condition_number[j]+':'+condition_that[j]+'"></div>'
+					}catch(e){
+						//TODO handle the exception
+						suit_html=suit_html+		'<div class="rule_ rule_hr"></div>';
+					}
+				}else{
+					if(j<condition_number.length){
+						suit_html=suit_html+		'<div class="rule_"><span class="rule_term">'+condition_number[j]+':'+condition_that[j]+'</span> <input class="rule_input"  rid="'+condition_id[j]+'"  value="'+condition_number[j]+':'+condition_that[j]+'"></div>'
+					}else{
+						suit_html=suit_html+		'<div class="rule_"></div>'
+					}
+				}
+			}
+			suit_html=suit_html+		'<div class="rule_" style="float: right;">'
+			 				+		'<div class="rule_operate"><img style="margin-left: 50%; "src="img/modify@2x.png" class="compile" title="编辑"></div>'
+			 				+		'<div class="rule_operate"><img style="margin-left: 10%; " src="img/delete@2x.png" class="remove" title="删除"></div>'
+			 				+		'<div class="rule_save_div"><div class="rule_save">保存</div></div>'
+			 				+		'</div>'
+			 				+	'</div>';
+		}
+		add_rule.append(suit_html);
+		add_i=0;
+		
+	});
+	
+//	套装的显示隐藏
+	$(document).on('click','.suit_title', function() {
+		console.log($(this).parent().parent().children().eq(1).is(':hidden'))
+		if($(this).parent().parent().children().eq(1).is(':hidden')){
+			$(this).parent().parent().children().eq(1).show();
+			$(this).parent().children().eq(1).children().show();
+			
+			$(this).children().eq(1).children().attr('src','img/spread.png')
+			
+		}else{
+			$(this).parent().parent().children().eq(1).hide();
+			$(this).parent().children().eq(1).children().hide();
+			$(this).children().eq(1).children().attr('src','img/pack_up.png')
+			
+		}
+	});
+//	删除
+	$(document).on('click','.remove', function() {
+	var html__=$(this).parent().parent().parent().children().eq(0).html();
+		var r = confirm("你确定删除"+html__+"吗?");
+		if (r == true) {
+		   var id=$(this).parent().parent().parent().children().eq(0).attr("rid");
+			console.log(id)
+			var url=http+"cku_rule/delete"; 
+		    var data_string = JSON.stringify({token:token,id:id});
+		    $.ajax({
+		        url: url,
+		        type: "post",
+		        dataType:"JSON",
+		        data: data_string,
+		        async: true,//同步
+		        success: function (data)
+		        {
+		            if(data.code==0){
+	//				   console.log(data);
+		            }else{
+		             	return;
+		            }
+		        },
+		        error:function (XMLHttpRequest) {
+		            console.log("失败!");
+		    	}
+			});
+			$(this).parent().parent().parent().hide()
+		} else {
+		   return;
+		}
+		
+	});
+	
+
+	//取消
+	$('.closes').click(function(){
+		$('#suit_add_id').fadeOut(100);
+		$('#suit_add').slideUp(200);
+		
+		$('#rule_add_id').fadeOut(100);
+		$('#rule_add').slideUp(200);
+	});
+});
+
+
+
+

+ 217 - 0
web/sku/login.html

@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>login</title>
+    <link rel="stylesheet" type="text/css" href="css/bootstrap-grid.css"/><!--CSS RESET-->
+    <link href="http://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
+    <link rel="stylesheet" type="text/css" href="css/htmleaf-demo.css"><!--演示页面样式,使用时可以不引用-->
+    <script src="js/jquery-2.1.1.min.js"></script>
+    <script src="js/jquery_cookie_min.js"></script>
+    <script src="js/ip.js"></script>
+    <style>
+        .demo {
+            padding: 20px 0;
+            background: linear-gradient(to right, #7AB6B6 50%, #E5CFAA 50%);
+        }
+
+        .form-horizontal {
+            background-color: #fff;
+            font-family: 'Arimo', sans-serif;
+            text-align: center;
+            padding: 50px 30px 50px;
+            box-shadow: 12px 12px 0 0 rgba(0, 0, 0, 0.3);
+        }
+
+        .form-horizontal .heading {
+            color: #555;
+            font-size: 30px;
+            font-weight: 600;
+            letter-spacing: 1px;
+            text-transform: capitalize;
+            margin: 0 0 50px 0;
+        }
+
+        .form-horizontal .form-group {
+            margin: 0 auto 30px;
+            position: relative;
+        }
+
+        .form-horizontal .form-group:nth-last-child(2) {
+            margin-bottom: 20px;
+        }
+
+        .form-horizontal .form-group:last-child {
+            margin: 0;
+        }
+
+        .form-horizontal .form-group > i {
+            color: #999;
+            transform: translateY(-50%);
+            position: absolute;
+            left: 5px;
+            top: 50%;
+        }
+
+        .form-horizontal .form-control {
+            color: #7AB6B6;
+            background-color: #fff;
+            font-size: 17px;
+            letter-spacing: 1px;
+            height: 40px;
+            padding: 5px 10px 2px 25px;
+            box-shadow: 0 0 0 0 transparent;
+            border: none;
+            border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+            border-radius: 0;
+            display: inline-block;
+        }
+
+        .form-control::placeholder {
+            color: rgba(0, 0, 0, 0.2);
+            font-size: 16px;
+        }
+
+        .form-horizontal .form-control:focus {
+            border-bottom: 1px solid #7AB6B6;
+            box-shadow: none;
+        }
+
+        .form-horizontal .btn {
+            color: #7AB6B6;
+            background-color: #EDF6F5;
+            font-size: 18px;
+            font-weight: 700;
+            letter-spacing: 1px;
+            border-radius: 5px;
+            width: 50%;
+            height: 45px;
+            padding: 7px 30px;
+            margin: 0 auto 25px;
+            border: none;
+            display: block;
+            position: relative;
+            transition: all 0.3s ease;
+        }
+
+        .form-horizontal .btn:focus,
+        .form-horizontal .btn:hover {
+            color: #fff;
+            background-color: #7AB6B6;
+        }
+
+        .form-horizontal .btn:before,
+        .form-horizontal .btn:after {
+            content: '';
+            background-color: #7AB6B6;
+            height: 50%;
+            width: 2px;
+            position: absolute;
+            left: 0;
+            bottom: 0;
+            z-index: 1;
+            transition: all 0.3s;
+        }
+
+        .form-horizontal .btn:after {
+            bottom: auto;
+            top: 0;
+            left: auto;
+            right: 0;
+        }
+
+        .form-horizontal .btn:hover:before,
+        .form-horizontal .btn:hover:after {
+            height: 100%;
+            width: 50%;
+            opacity: 0;
+        }
+
+        .form-horizontal .create_account {
+            color: #D6BC8B;
+            font-size: 16px;
+            font-weight: 600;
+            display: inline-block;
+        }
+
+        .form-horizontal .create_account:hover {
+            color: #7AB6B6;
+            text-decoration: none;
+        }
+    </style>
+</head>
+<body>
+<div class="htmleaf-container">
+    <header class="htmleaf-header" style="height: 200px;">
+        <div class="htmleaf-links">
+        </div>
+    </header>
+    <div class="demo form-bg">
+        <div class="container">
+
+            <div class="row">
+                <div class="col-md-4"></div>
+                <div class="col-md-4">
+                    <form class="form-horizontal">
+                        <div class="heading">Login form</div>
+                        <div class="form-group">
+                            <i class="fa fa-user"></i><input required name="login[username]" type="text"
+                                                             class="form-control" placeholder="Username"
+                                                             id="InputUsername">
+                        </div>
+                        <div class="form-group">
+                            <i class="fa fa-lock"></i><input required name="login[password]" type="password"
+                                                             class="form-control" placeholder="Password"
+                                                             id="InputPassword"/>
+                        </div>
+                        <div class="form-group">
+                            <button type="submit" class="btn btn-default" onClick="subLoginAction();return false;"><i
+                                    class="fa fa-arrow-right"></i></button>
+                            <!--<span>Don't have an account? <a href="" class="create_account">Sign up</a></span>-->
+                        </div>
+                    </form>
+                </div>
+                <div class="col-md-4"></div>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<script type="text/javascript">
+    function subLoginAction() {
+        let username = $("#InputUsername").val();
+        let password = $("#InputPassword").val();
+        let post_data = {
+            'username': username,
+            'password': password
+        };
+        
+        var url= http+"user/login"; 
+    	var data_string = JSON.stringify(post_data);
+//  首次获取
+    $.ajax({
+        url: url,
+        type: "post",
+        dataType:"JSON",
+        data: data_string,
+        success: function (data)
+        {
+            if (data['code'] == 0) {
+                $.cookie('access_token', data.res.access_token, data.res.access_expire)
+                $.cookie('refresh_token', data.res.refresh_token, data.res.refresh_expire)
+                window.location.href = "sku_index.html";
+
+            } else {
+                alert(data['msg'])
+            }
+        },
+        error:function (XMLHttpRequest) {
+            console.log("失败!");
+            
+    	}
+	}); 
+	}
+</script>
+</html>

+ 122 - 0
web/sku/sku_index.html

@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset="utf-8" />
+		<title></title>
+	</head>
+	
+	<style type="text/css">  
+		@import url("css/bootstrap.min.css");
+		@import url("css/commonality.css");
+    	@import url("css/sku_index.css");
+    </style>
+    <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>
+    <script type="text/javascript" src="js/sku_index.js" ></script>
+    <script type="text/javascript" src="js/ip.js" ></script>
+    <script type="text/javascript" src="js/jquery_cookie_min.js"></script>
+	<body>
+		<!--头部-->
+		<div class='head'>
+			<div class="col-sm-2 col-xs-12 head_left"><img class="head_logo" src="img/ansjer@2x.png"></div>
+		</div>
+		<!--菜单-->
+		<div class="col-sm-2 col-xs-12 menu">
+			<div class="menu_list" style="background: white; color: #40ace6; border-left: 3px solid #40ace6;"> 
+				<div class="menu_ico"><img src="img/SKUNaming_rules_select@2x.png" class="menu_img"></div>
+				<div class="menu_text" style="color: #40ace6;">SKU命名规则</div>
+			</div>
+			<div class="menu_list" onclick="javascript:window.location.href='find_sku.html'" style=" border-left: 3px solid #efefef;"> 
+				<div class="menu_ico"><img src="img/findSKU@2x.png" class="menu_img"></div>
+				<div class="menu_text">查找SKU</div>
+			</div>
+		</div>
+		<!--内容-->
+		<div class="col-sm-10 col-xs-12 content" id="content">
+			<div id="suit_html">
+				
+			</div>
+			<!--新增套装-->
+			<div class="new_suit">
+				<div class="col-sm-2 col-xs-12 new_suit_a">
+					<div class="new_suit_b" title="新增套装">
+						<div class="new_suit_img">
+							<img src="img/Add@2x.png">
+						</div>
+						<div style="float: left;">新增套装</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		
+		
+		
+		<!--新增套装-->
+		<div class="theme-popover" style="display: none;" id="suit_add"> 
+             <div class="theme-poptit">
+                <a href="javascript:;" title="关闭" class="close closes" style="color: black;"><img width="25px;" src="img/btn_close_h.png"></a>
+                <h3>新增套装</h3>
+             </div>
+             <div id="error" class="error"></div>
+             <div class="theme-popbod dform">
+               <form class="theme-signin" action="" method="post">
+                    <div class="btn_form">
+                    	<div style="float: left; width: 35%;">
+                    		套装名称:
+                    	</div>
+                    	 <div style="float: left; width: 65%;">
+                    		<input class="ipt" style="border-color: #ecdddd;" id="suit_name" type="text" name="suit_name" value=""></li>
+                    	</div>
+                    	</div>
+            		<div>
+            		 	<div style="float: left;margin-bottom: 50px;margin-left: 250px;  margin-top: 50px;">
+            		 		<input class="btn btn-primary" type="button" name="suit_exit_value" id="suit_exit_value" title="保存" value=" 保存 " style="left:50px ">
+                        </div>
+                        <div style="float: left;margin-bottom: 50px;margin-left: 60px;  margin-top: 50px;">
+                        	<input class="btn btn-primary closes" type="button" title="取消" value=" 取消 ">
+            		 	</div>
+            		</div>
+               </form>
+            </div>
+	    </div>
+		<div class="theme-popover-mask" id="suit_add_id" style="display: none;"></div>
+		
+		<!--新增规则-->
+		<div class="theme-popover" style="display: none;" id="rule_add"> 
+             <div class="theme-poptit">
+                <a href="javascript:;" title="关闭" class="close closes" style="color: black;"><img width="25px;" src="img/btn_close_h.png"></a>
+                <h3>新增规则</h3>
+             </div>
+             <div id="error" class="error"></div>
+             <div class="theme-popbod dform">
+               <form class="theme-signin" action="" method="post">
+                    <div class="btn_form">
+                    	<div style="float: left; width: 35%;    height: 40px;">
+                    		<div style="float: right; line-height: 30px;">规则名称:</div>
+                    	</div>
+                    	<div style="float: left; width: 65%;    height: 40px;">
+                    		<input class="ipt" style="border-color: #ecdddd;margin-left: 10px;" id="role_edit_name" type="text" name="role_edit_name" placeholder="输入规则名称,例如:颜色" value="">
+                    	</div>
+                    	<div style="height:400px;width:110%;overflow-y:auto">
+                    		<div class="condition_list" >
+	                    		
+	                    	</div>
+                    	
+                    		<div class="add_role_div"><a style="height: 30px;width: 50px; margin-bottom: 20px; height: 40px;">添加一行</a></div>
+                    	</div>
+                    </div>
+                    <div>
+	        		 	<div style="float: left;margin-bottom: 50px;  margin-left: 250px;  margin-top: 50px;">
+	        		 		<input class="btn btn-primary" type="button" name="role_add_value" id="role_add_value" title="保存" value=" 保存 " style="left:50px ">
+	                    </div>
+	                    <div style="float: left;margin-bottom: 50px;  margin-left: 60px;    margin-top: 50px;">
+	                    	<input class="btn btn-primary closes" name="role_exit" type="button" title="取消" value=" 取消 ">
+	        		 	</div> 
+        		 	</div>
+               </form>
+            </div>
+	    </div>
+		<div class="theme-popover-mask" id="rule_add_id" style="display: none;"></div>
+		
+		
+	</body>
+</html>

Неке датотеке нису приказане због велике количине промена