From 8f5ed07d3121557d7e1e4e5f1c09e1cacb73fe65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=BB=BA=E7=94=9F?= Date: Tue, 6 Nov 2018 00:52:41 +0800 Subject: [PATCH 01/19] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=A2=E6=9C=8D?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +- WebIM/settings.py | 11 +++ WebIM/urls.py | 1 + agent/urls.py | 7 ++ chat/email.py | 18 +++++ .../img/7fde8b93jw1e8qgp5bmzyj2050050aa8.jpg | Bin 0 -> 10442 bytes statics/js/utils.js | 11 +++ templates/agent/kefu.html | 67 ++++++++++++++++++ templates/chat/chat.html | 2 +- 9 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 agent/urls.py create mode 100644 chat/email.py create mode 100644 statics/img/7fde8b93jw1e8qgp5bmzyj2050050aa8.jpg create mode 100644 templates/agent/kefu.html diff --git a/README.md b/README.md index 4a547e8..6aba6bf 100644 --- a/README.md +++ b/README.md @@ -24,4 +24,9 @@ ### 前端 1. LayIM(已获得授权) -2. LayUI(开源) \ No newline at end of file +2. LayUI(开源) + +##待实现功能 + +1. 客服 +2. 聊天机器人 \ No newline at end of file diff --git a/WebIM/settings.py b/WebIM/settings.py index 030ed6d..1219616 100644 --- a/WebIM/settings.py +++ b/WebIM/settings.py @@ -29,6 +29,7 @@ # Application definition INSTALLED_APPS = [ + 'agent', 'channels', 'login', 'chat', @@ -154,3 +155,13 @@ def mysql_settings(): STATICFILES_DIRS = [ os.path.join(BASE_DIR, "statics"), ] + +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +EMAIL_USE_SSL = True +# 如果是 163 改成 smtp.163.com +EMAIL_HOST = 'smtp.163.com' +EMAIL_PORT = 465 +# 帐号 +EMAIL_HOST_USER = 'js_huang2018@163.com' +EMAIL_HOST_PASSWORD = 'a13342404594@' # 密码 +DEFAULT_FROM_EMAIL = EMAIL_HOST_USER \ No newline at end of file diff --git a/WebIM/urls.py b/WebIM/urls.py index 4d613a2..1940a4d 100644 --- a/WebIM/urls.py +++ b/WebIM/urls.py @@ -19,6 +19,7 @@ urlpatterns = [ url(r'^$', login_views.do_login, name='index'), + url(r'^agent/', include('agent.urls')), url(r'^login/', include('login.urls')), url(r'^chat/', include('chat.urls')), url(r'^admin/', admin.site.urls), diff --git a/agent/urls.py b/agent/urls.py new file mode 100644 index 0000000..0e35568 --- /dev/null +++ b/agent/urls.py @@ -0,0 +1,7 @@ +from . import views +from django.conf.urls import url + + +urlpatterns = [ + url(r'^$', views.agent), +] \ No newline at end of file diff --git a/chat/email.py b/chat/email.py new file mode 100644 index 0000000..bbb7b22 --- /dev/null +++ b/chat/email.py @@ -0,0 +1,18 @@ +from django.conf import settings +from django.core.mail import EmailMultiAlternatives + +from_email = settings.DEFAULT_FROM_EMAIL + + +def send(): + subject = '来自自强学堂的问候' + + text_content = '这是一封重要的邮件.' + + html_content = '

这是一封重要的邮件.

' + + msg = EmailMultiAlternatives(subject, text_content, from_email, ['528609844@qq.com']) + + msg.attach_alternative(html_content, "text/html") + + msg.send() \ No newline at end of file diff --git a/statics/img/7fde8b93jw1e8qgp5bmzyj2050050aa8.jpg b/statics/img/7fde8b93jw1e8qgp5bmzyj2050050aa8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..564b5bef31aeb2d93d05c3ef6e3b74f50af39a70 GIT binary patch literal 10442 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 literal 0 HcmV?d00001 diff --git a/statics/js/utils.js b/statics/js/utils.js index ac19f79..7cd8dc5 100644 --- a/statics/js/utils.js +++ b/statics/js/utils.js @@ -25,4 +25,15 @@ function get_query_param(para) { }else{ return arrVal; } +} + +// 生成全局唯一标识符 +function generateUUID() { + var d = new Date().getTime(); + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = (d + Math.random()*16)%16 | 0; + d = Math.floor(d/16); + return (c=='x' ? r : (r&0x3|0x8)).toString(16); + }); + return uuid; } \ No newline at end of file diff --git a/templates/agent/kefu.html b/templates/agent/kefu.html new file mode 100644 index 0000000..66b037f --- /dev/null +++ b/templates/agent/kefu.html @@ -0,0 +1,67 @@ +{% load staticfiles %} + + + + + 客服 + {% block css %} + + {% endblock %} + +{% block script %} + + +{% endblock %} + + + + \ No newline at end of file diff --git a/templates/chat/chat.html b/templates/chat/chat.html index 7b7b654..69ac8ec 100644 --- a/templates/chat/chat.html +++ b/templates/chat/chat.html @@ -179,7 +179,7 @@ // 数字即为你通过websocket或者Ajax实时获取到的最新消息数量 // 它将在主面板的消息盒子icon上不断显隐提示,直到点击后自动消失 - layim.msgbox(5); + // layim.msgbox(5); u = layim.cache(); $('#user').find('img').attr('src', u.mine.avatar); From 1059af5a35719926fdb9e827de8f347190c42d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=BB=BA=E7=94=9F?= Date: Tue, 6 Nov 2018 00:53:28 +0800 Subject: [PATCH 02/19] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=A2=E6=9C=8D?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent/__init__.py | 0 agent/admin.py | 3 ++ agent/apps.py | 5 ++ agent/migrations/0001_initial.py | 54 +++++++++++++++++++++ agent/migrations/0002_statement_dialogue.py | 19 ++++++++ agent/migrations/__init__.py | 0 agent/models.py | 41 ++++++++++++++++ agent/tests.py | 3 ++ agent/views.py | 5 ++ 9 files changed, 130 insertions(+) create mode 100644 agent/__init__.py create mode 100644 agent/admin.py create mode 100644 agent/apps.py create mode 100644 agent/migrations/0001_initial.py create mode 100644 agent/migrations/0002_statement_dialogue.py create mode 100644 agent/migrations/__init__.py create mode 100644 agent/models.py create mode 100644 agent/tests.py create mode 100644 agent/views.py diff --git a/agent/__init__.py b/agent/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/agent/admin.py b/agent/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/agent/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/agent/apps.py b/agent/apps.py new file mode 100644 index 0000000..cda62fa --- /dev/null +++ b/agent/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AgentConfig(AppConfig): + name = 'agent' diff --git a/agent/migrations/0001_initial.py b/agent/migrations/0001_initial.py new file mode 100644 index 0000000..4ee151b --- /dev/null +++ b/agent/migrations/0001_initial.py @@ -0,0 +1,54 @@ +# Generated by Django 2.1.2 on 2018-11-05 16:49 + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Agent', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100, verbose_name='客服名称')), + ('password', models.CharField(max_length=100, verbose_name='密码')), + ('avatar', models.CharField(default='/statics/img/default_avatar_male_180.gif', max_length=128, verbose_name='客服头像')), + ], + ), + migrations.CreateModel( + name='Client', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100, verbose_name='客户昵称')), + ('avatar', models.CharField(default='/statics/img/default_avatar_male_180.gif', max_length=128, verbose_name='客户头像')), + ('ip', models.CharField(default='0.0.0.0', max_length=64, verbose_name='客户IP')), + ], + ), + migrations.CreateModel( + name='Dialogue', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('name', models.CharField(max_length=128, verbose_name='对话名称')), + ('agent', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='agent', to='agent.Agent')), + ('client', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='client', to='agent.Client')), + ], + ), + migrations.CreateModel( + name='Statement', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('from_id', models.CharField(max_length=255)), + ('to_id', models.CharField(max_length=255)), + ('msg_type', models.IntegerField(default=0)), + ('content', models.CharField(max_length=255)), + ('timestamp', models.BigIntegerField()), + ], + ), + ] diff --git a/agent/migrations/0002_statement_dialogue.py b/agent/migrations/0002_statement_dialogue.py new file mode 100644 index 0000000..aee647e --- /dev/null +++ b/agent/migrations/0002_statement_dialogue.py @@ -0,0 +1,19 @@ +# Generated by Django 2.1.2 on 2018-11-05 16:51 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('agent', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='statement', + name='dialogue', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dialogue', to='agent.Dialogue'), + ), + ] diff --git a/agent/migrations/__init__.py b/agent/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/agent/models.py b/agent/models.py new file mode 100644 index 0000000..b52db79 --- /dev/null +++ b/agent/models.py @@ -0,0 +1,41 @@ +import uuid +from django.db import models + + +class Agent(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + name = models.CharField(max_length=100, verbose_name="客服名称") + password = models.CharField(max_length=100, verbose_name="密码") + # 客服头像 + avatar = models.CharField(max_length=128, default='/statics/img/default_avatar_male_180.gif', verbose_name="客服头像") + + +class Client(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + name = models.CharField(max_length=100, verbose_name="客户昵称") + # 客户头像 + avatar = models.CharField(max_length=128, default='/statics/img/default_avatar_male_180.gif', verbose_name="客户头像") + # 客户的IP地址 + ip = models.CharField(max_length=64, default='0.0.0.0', verbose_name='客户IP') + + +class Dialogue(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + name = models.CharField(max_length=128, verbose_name='对话名称') + agent = models.ForeignKey('Agent', on_delete=models.CASCADE, null=True, related_name='agent') + client = models.ForeignKey('Client', on_delete=models.CASCADE, null=True, related_name='client') + + +class Statement(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + dialogue = models.ForeignKey('Dialogue', on_delete=models.CASCADE, null=True, related_name='dialogue') + from_id = models.CharField(max_length=255) + # from_user_name = models.CharField(max_length=255) + # from_user_avatar = models.CharField(max_length=255) + to_id = models.CharField(max_length=255) + # from_user = models.ForeignKey('User', on_delete=models.CASCADE, null=True, related_name='msg_from_user') + # to_user = models.ForeignKey('User', on_delete=models.CASCADE, null=True, related_name='msg_to_user') + # 0 文本; 1 图片; 2 视频; 3语音 + msg_type = models.IntegerField(default=0) + content = models.CharField(max_length=255) + timestamp = models.BigIntegerField() \ No newline at end of file diff --git a/agent/tests.py b/agent/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/agent/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/agent/views.py b/agent/views.py new file mode 100644 index 0000000..93beed7 --- /dev/null +++ b/agent/views.py @@ -0,0 +1,5 @@ +from django.shortcuts import render + + +def agent(request): + return render(request, 'agent/kefu.html') \ No newline at end of file From bd9677a9da79a8a660b0479f26e3617009d31ec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=BB=BA=E7=94=9F?= Date: Tue, 6 Nov 2018 23:57:23 +0800 Subject: [PATCH 03/19] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=A2=E6=9C=8D?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebIM/settings.py | 2 +- agent/migrations/0003_auto_20181106_2214.py | 18 ++++++ agent/models.py | 2 +- agent/urls.py | 1 + agent/views.py | 17 ++++- chat/views.py | 11 ++-- login/views.py | 2 +- templates/agent/kefu.html | 70 +++++++++++---------- 8 files changed, 82 insertions(+), 41 deletions(-) create mode 100644 agent/migrations/0003_auto_20181106_2214.py diff --git a/WebIM/settings.py b/WebIM/settings.py index 1219616..25b1a1a 100644 --- a/WebIM/settings.py +++ b/WebIM/settings.py @@ -22,7 +22,7 @@ SECRET_KEY = '3zt8c)88lmp_8kif4&y*#oy=myhsdh5do)xjixb3$$b+i-2+vt' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True +DEBUG = False ALLOWED_HOSTS = ['*'] diff --git a/agent/migrations/0003_auto_20181106_2214.py b/agent/migrations/0003_auto_20181106_2214.py new file mode 100644 index 0000000..4bea033 --- /dev/null +++ b/agent/migrations/0003_auto_20181106_2214.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.2 on 2018-11-06 14:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('agent', '0002_statement_dialogue'), + ] + + operations = [ + migrations.AlterField( + model_name='client', + name='name', + field=models.CharField(default='访客', max_length=100, verbose_name='客户昵称'), + ), + ] diff --git a/agent/models.py b/agent/models.py index b52db79..172cac2 100644 --- a/agent/models.py +++ b/agent/models.py @@ -12,7 +12,7 @@ class Agent(models.Model): class Client(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) - name = models.CharField(max_length=100, verbose_name="客户昵称") + name = models.CharField(max_length=100, verbose_name="客户昵称", default='访客') # 客户头像 avatar = models.CharField(max_length=128, default='/statics/img/default_avatar_male_180.gif', verbose_name="客户头像") # 客户的IP地址 diff --git a/agent/urls.py b/agent/urls.py index 0e35568..2300316 100644 --- a/agent/urls.py +++ b/agent/urls.py @@ -4,4 +4,5 @@ urlpatterns = [ url(r'^$', views.agent), + url(r'^create_user/$', views.create_user, name='create_user'), ] \ No newline at end of file diff --git a/agent/views.py b/agent/views.py index 93beed7..7c39507 100644 --- a/agent/views.py +++ b/agent/views.py @@ -1,5 +1,20 @@ from django.shortcuts import render +from django.http import JsonResponse +from .models import Client +from django.views.decorators.csrf import csrf_exempt +import sys +import codecs +sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) def agent(request): - return render(request, 'agent/kefu.html') \ No newline at end of file + return render(request, 'agent/kefu.html') + + +@csrf_exempt +def create_user(request): + client_id = request.POST.get('client_id', None) + if client_id is None: + return JsonResponse({'code': 1, 'msg': 'invalid client_id'}) + client = Client.objects.create(id=client_id) + return JsonResponse({'code': 0, 'msg': '', 'data': {'username': client.name, 'id': client.id, 'avatar': client.avatar}}) diff --git a/chat/views.py b/chat/views.py index e97c701..223cce2 100644 --- a/chat/views.py +++ b/chat/views.py @@ -1,16 +1,17 @@ # chat/views.py import time import uuid +import html import datetime from django.shortcuts import render from django.views.decorators.csrf import csrf_exempt from django.http import JsonResponse from chat.models import User, Group, GroupChat, ImageModel, FileModel, Message from chat.consumers import channel_publish -from WebIM.settings import Domain +from django.conf import settings import sys import codecs -# sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) +sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) def home(request): @@ -425,7 +426,7 @@ def upload_image(request): # print(image.model_pic.name) res['code'] = 0 date = datetime.datetime.now().strftime("%y%m%d") - res['data']['src'] = '%s/statics/upload/%s/%s' % (Domain, date, pic.name) + res['data']['src'] = '%s/statics/upload/%s/%s' % (settings.Domain, date, pic.name) # print(res) return JsonResponse(res) res['msg'] = '上传文件失败' @@ -452,7 +453,7 @@ def upload_avatar(request): image = ImageModel.objects.create(model_pic=pic) res['code'] = 0 date = datetime.datetime.now().strftime("%y%m%d") - res['data']['src'] = '%s/statics/upload/%s/%s' % (Domain, date, pic.name) + res['data']['src'] = '%s/statics/upload/%s/%s' % (settings.Domain, date, pic.name) user = User.objects.get(pk=user_id) user.avatar = res['data']['src'] user.save() @@ -483,7 +484,7 @@ def upload_file(request): # print(file_model.model_file.name) res['code'] = 0 date = datetime.datetime.now().strftime("%y%m%d") - res['data']['src'] = '%s/statics/upload/%s/%s' % (Domain, date, file_.name) + res['data']['src'] = '%s/statics/upload/%s/%s' % (settings.Domain, date, file_.name) # print(res) return JsonResponse(res) res['msg'] = '上传文件失败' diff --git a/login/views.py b/login/views.py index a933784..6fc8759 100644 --- a/login/views.py +++ b/login/views.py @@ -4,7 +4,7 @@ from django.views.decorators.csrf import csrf_exempt import sys import codecs -# sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) +sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) @csrf_exempt diff --git a/templates/agent/kefu.html b/templates/agent/kefu.html index 66b037f..f61a6e4 100644 --- a/templates/agent/kefu.html +++ b/templates/agent/kefu.html @@ -19,49 +19,55 @@ var layim = layui.layim ,layer = layui.layer ,$ = layui.jquery; - let user_id = localStorage.getItem('layim-user-id'); - if (user_id === null) { - user_id = generateUUID(); - localStorage.setItem('layim-user-id', user_id); + let client_id = localStorage.getItem('layim-client-id'); + let username = localStorage.getItem('layim-username'); + let avatar = localStorage.getItem('layui-avatar'); + console.log(client_id); + if (client_id === null) { + client_id = generateUUID(); + localStorage.setItem('layim-client-id', client_id); $.ajax({ - url: '', + url: '/agent/create_user/', type: 'post', data: { - user_id: user_id, + client_id: client_id, }, success: function (res) { + console.log(typeof res); if (res.code !== 0) return; - // 配置客服界面 - layim.config({ - init: { - //配置客户信息 - mine: { - "username": "访客" //我的昵称 - ,"id": "100000123" //我的ID - ,"status": "online" //在线状态 online:在线、hide:隐身 - ,"remark": "在深邃的编码世界,做一枚轻盈的纸飞机" //我的签名 - ,"avatar": "//res.layui.com/images/fly/avatar/00.jpg" //我的头像 - } - } - //开启客服模式 - ,brief: true - }); - - //打开一个客服面板 - layim.chat({ - name: '在线客服' //名称 - ,type: 'kefu' //聊天类型 - ,avatar: "{% static 'img/7fde8b93jw1e8qgp5bmzyj2050050aa8.jpg' %}" //头像 - ,id: 1111111 //定义唯一的id方便你处理信息 - }); - - layim.setChatMin(); //收缩聊天面板 + username = res.data.username; + avatar = res.data.avatar; } }) - } + + // 配置客服界面 + layim.config({ + init: { + //配置客户信息 + mine: { + "username": username //我的昵称 + ,"id": client_id //我的ID + ,"status": "online" //在线状态 online:在线、hide:隐身 + ,"remark": "在深邃的编码世界,做一枚轻盈的纸飞机" //我的签名 + ,"avatar": avatar //我的头像 + } + } + //开启客服模式 + ,brief: true + }); + + //打开一个客服面板 + layim.chat({ + name: '在线客服' //名称 + ,type: 'kefu' //聊天类型 + ,avatar: "{% static 'img/7fde8b93jw1e8qgp5bmzyj2050050aa8.jpg' %}" //头像 + ,id: 1111111 //定义唯一的id方便你处理信息 + }); + + layim.setChatMin(); //收缩聊天面板 }); \ No newline at end of file From a50f7e15bdd1d3abd023e34ca042e8cb63f78e97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=BB=BA=E7=94=9F?= Date: Wed, 7 Nov 2018 00:27:02 +0800 Subject: [PATCH 04/19] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=99=BD=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebIM/settings.py | 13 +++++---- chat/views.py | 70 +++++++++++++++++++++++++++-------------------- login/views.py | 7 +++++ 3 files changed, 54 insertions(+), 36 deletions(-) diff --git a/WebIM/settings.py b/WebIM/settings.py index 25b1a1a..1bec759 100644 --- a/WebIM/settings.py +++ b/WebIM/settings.py @@ -107,11 +107,8 @@ def mysql_settings(): DATABASES = { 'default': mysql_settings() } - -if DEBUG: - Domain = 'http://127.0.0.1:8000' -else: - Domain = 'https://iwantme.cn' +# Domain = 'http://127.0.0.1:8000' +Domain = 'https://iwantme.cn' # Password validation # https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators @@ -164,4 +161,8 @@ def mysql_settings(): # 帐号 EMAIL_HOST_USER = 'js_huang2018@163.com' EMAIL_HOST_PASSWORD = 'a13342404594@' # 密码 -DEFAULT_FROM_EMAIL = EMAIL_HOST_USER \ No newline at end of file +DEFAULT_FROM_EMAIL = EMAIL_HOST_USER + + +# 上传文件白名单 +ALLOWED_EXTENSIONS = ('txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif') \ No newline at end of file diff --git a/chat/views.py b/chat/views.py index 223cce2..bbe5c14 100644 --- a/chat/views.py +++ b/chat/views.py @@ -1,14 +1,13 @@ # chat/views.py import time import uuid -import html import datetime from django.shortcuts import render from django.views.decorators.csrf import csrf_exempt from django.http import JsonResponse from chat.models import User, Group, GroupChat, ImageModel, FileModel, Message from chat.consumers import channel_publish -from django.conf import settings +from WebIM.settings import Domain, ALLOWED_EXTENSIONS import sys import codecs sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) @@ -405,6 +404,10 @@ def search_friend(request): return JsonResponse(res) +def allowed_file(filename): + return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS + + @csrf_exempt def upload_image(request): ''' @@ -420,15 +423,16 @@ def upload_image(request): } if request.method == 'POST': pic = request.FILES.get('file') - pic.name = str(uuid.uuid4()) + '.' + pic.name.rsplit('.', 1)[1] - image = ImageModel.objects.create(model_pic=pic) - # qiniu_upload(pic) - # print(image.model_pic.name) - res['code'] = 0 - date = datetime.datetime.now().strftime("%y%m%d") - res['data']['src'] = '%s/statics/upload/%s/%s' % (settings.Domain, date, pic.name) - # print(res) - return JsonResponse(res) + if pic and allowed_file(pic.name): + pic.name = str(uuid.uuid4()) + '.' + pic.name.rsplit('.', 1)[1] + ImageModel.objects.create(model_pic=pic) + res['code'] = 0 + date = datetime.datetime.now().strftime("%y%m%d") + res['data']['src'] = '%s/statics/upload/%s/%s' % (Domain, date, pic.name) + return JsonResponse(res) + else: + res['msg'] = '文件类型不被允许' + return JsonResponse(res) res['msg'] = '上传文件失败' return JsonResponse(res) @@ -449,16 +453,20 @@ def upload_avatar(request): if request.method == 'POST': user_id = request.GET.get('user_id', None) pic = request.FILES.get('file') - pic.name = str(uuid.uuid4()) + '.' + pic.name.rsplit('.', 1)[1] - image = ImageModel.objects.create(model_pic=pic) - res['code'] = 0 - date = datetime.datetime.now().strftime("%y%m%d") - res['data']['src'] = '%s/statics/upload/%s/%s' % (settings.Domain, date, pic.name) - user = User.objects.get(pk=user_id) - user.avatar = res['data']['src'] - user.save() - # print(res) - return JsonResponse(res) + if pic and allowed_file(pic.name): + pic.name = str(uuid.uuid4()) + '.' + pic.name.rsplit('.', 1)[1] + ImageModel.objects.create(model_pic=pic) + res['code'] = 0 + date = datetime.datetime.now().strftime("%y%m%d") + res['data']['src'] = '%s/statics/upload/%s/%s' % (Domain, date, pic.name) + user = User.objects.get(pk=user_id) + user.avatar = res['data']['src'] + user.save() + # print(res) + return JsonResponse(res) + else: + res['msg'] = '文件类型不被允许' + return JsonResponse(res) res['msg'] = '上传文件失败' return JsonResponse(res) @@ -478,15 +486,17 @@ def upload_file(request): } if request.method == 'POST': file_ = request.FILES.get('file') - file_.name = str(uuid.uuid4()) + '.' + file_.name.rsplit('.', 1)[1] - file_model = FileModel.objects.create(model_file=file_) - # qiniu_upload(pic) - # print(file_model.model_file.name) - res['code'] = 0 - date = datetime.datetime.now().strftime("%y%m%d") - res['data']['src'] = '%s/statics/upload/%s/%s' % (settings.Domain, date, file_.name) - # print(res) - return JsonResponse(res) + if file_ and allowed_file(file_.name): + file_.name = str(uuid.uuid4()) + '.' + file_.name.rsplit('.', 1)[1] + FileModel.objects.create(model_file=file_) + res['code'] = 0 + date = datetime.datetime.now().strftime("%y%m%d") + res['data']['src'] = '%s/statics/upload/%s/%s' % (Domain, date, file_.name) + # print(res) + return JsonResponse(res) + else: + res['msg'] = '文件类型不被允许' + return JsonResponse(res) res['msg'] = '上传文件失败' return JsonResponse(res) diff --git a/login/views.py b/login/views.py index 6fc8759..0741ded 100644 --- a/login/views.py +++ b/login/views.py @@ -2,6 +2,7 @@ from django.http import JsonResponse from chat.models import User, Group from django.views.decorators.csrf import csrf_exempt +import html import sys import codecs sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) @@ -17,7 +18,9 @@ def do_login(request): if request.method == 'POST': # print('do_login post') username = request.POST.get('username', None) + username = html.escape(username) password = request.POST.get('password', None) + password = html.escape(password) # print('username', username) # print('password', password) # user = authenticate(request, username=username, password=password) @@ -53,10 +56,14 @@ def signin(request): # form = SignInForm(request.POST) # if form.is_valid(): # 如果提交的数据合法 username = request.POST.get('username', None) + username = html.escape(username) password = request.POST.get('password', None) + password = html.escape(password) sex = request.POST.get('sex', None) signature = request.POST.get('signature', None) + signature = html.escape(signature) email = request.POST.get('email', None) + email = html.escape(email) city = request.POST.get('city', None) birthday = request.POST.get('birthday', None) phone = request.POST.get('phone') From 515e8fa642b2736648bf87912b0e39eae9d3bc44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=BB=BA=E7=94=9F?= Date: Wed, 7 Nov 2018 00:29:07 +0800 Subject: [PATCH 05/19] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=8F=91=E9=80=81?= =?UTF-8?q?=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebIM/settings.py | 10 ---------- chat/email.py | 18 ------------------ 2 files changed, 28 deletions(-) delete mode 100644 chat/email.py diff --git a/WebIM/settings.py b/WebIM/settings.py index 1bec759..c8eff1e 100644 --- a/WebIM/settings.py +++ b/WebIM/settings.py @@ -153,16 +153,6 @@ def mysql_settings(): os.path.join(BASE_DIR, "statics"), ] -EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' -EMAIL_USE_SSL = True -# 如果是 163 改成 smtp.163.com -EMAIL_HOST = 'smtp.163.com' -EMAIL_PORT = 465 -# 帐号 -EMAIL_HOST_USER = 'js_huang2018@163.com' -EMAIL_HOST_PASSWORD = 'a13342404594@' # 密码 -DEFAULT_FROM_EMAIL = EMAIL_HOST_USER - # 上传文件白名单 ALLOWED_EXTENSIONS = ('txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif') \ No newline at end of file diff --git a/chat/email.py b/chat/email.py deleted file mode 100644 index bbb7b22..0000000 --- a/chat/email.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.conf import settings -from django.core.mail import EmailMultiAlternatives - -from_email = settings.DEFAULT_FROM_EMAIL - - -def send(): - subject = '来自自强学堂的问候' - - text_content = '这是一封重要的邮件.' - - html_content = '

这是一封重要的邮件.

' - - msg = EmailMultiAlternatives(subject, text_content, from_email, ['528609844@qq.com']) - - msg.attach_alternative(html_content, "text/html") - - msg.send() \ No newline at end of file From 9dbc45d00b4bee7c016e0592f2abdc9eabd497f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=BB=BA=E7=94=9F?= Date: Wed, 7 Nov 2018 00:33:37 +0800 Subject: [PATCH 06/19] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent/views.py | 2 +- chat/views.py | 2 +- login/views.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/agent/views.py b/agent/views.py index 7c39507..bc77fc5 100644 --- a/agent/views.py +++ b/agent/views.py @@ -4,7 +4,7 @@ from django.views.decorators.csrf import csrf_exempt import sys import codecs -sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) +# sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) def agent(request): diff --git a/chat/views.py b/chat/views.py index bbe5c14..da21bf4 100644 --- a/chat/views.py +++ b/chat/views.py @@ -10,7 +10,7 @@ from WebIM.settings import Domain, ALLOWED_EXTENSIONS import sys import codecs -sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) +# sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) def home(request): diff --git a/login/views.py b/login/views.py index 0741ded..cfa426e 100644 --- a/login/views.py +++ b/login/views.py @@ -5,7 +5,7 @@ import html import sys import codecs -sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) +# sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) @csrf_exempt From 9248809b1b524957db2126079d0a8331a1457973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=BB=BA=E7=94=9F?= Date: Wed, 7 Nov 2018 00:47:29 +0800 Subject: [PATCH 07/19] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E9=9F=B3=E9=A2=91=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebIM/settings.py | 2 +- chat/views.py | 1 + templates/chat/chat.html | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/WebIM/settings.py b/WebIM/settings.py index c8eff1e..2982a95 100644 --- a/WebIM/settings.py +++ b/WebIM/settings.py @@ -22,7 +22,7 @@ SECRET_KEY = '3zt8c)88lmp_8kif4&y*#oy=myhsdh5do)xjixb3$$b+i-2+vt' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False +DEBUG = True ALLOWED_HOSTS = ['*'] diff --git a/chat/views.py b/chat/views.py index da21bf4..dfa9908 100644 --- a/chat/views.py +++ b/chat/views.py @@ -34,6 +34,7 @@ def msg_gateway(request): from_user_avatar = request.POST.get('mine[avatar]', None) from_user_id = request.POST.get('mine[id]', None) content = request.POST.get('mine[content]', None) + print(content) # 消息接收方 to_user = request.POST.get('to[name]', None) diff --git a/templates/chat/chat.html b/templates/chat/chat.html index 69ac8ec..c148328 100644 --- a/templates/chat/chat.html +++ b/templates/chat/chat.html @@ -118,8 +118,8 @@ url: '/chat/upload_file/' } - ,isAudio: true //开启聊天工具栏音频 - ,isVideo: true //开启聊天工具栏视频 + // ,isAudio: true //开启聊天工具栏音频 + // ,isVideo: true //开启聊天工具栏视频 //扩展工具栏(如果无需扩展,剔除该项即可) ,tool: [{ From 751bc21e9e44b9e877f44cb510ab809ce8fa9d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=BB=BA=E7=94=9F?= Date: Fri, 9 Nov 2018 00:04:49 +0800 Subject: [PATCH 08/19] =?UTF-8?q?=E9=83=A8=E7=BD=B2=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=AB=AF=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebIM/settings.py | 45 +- chat/urls.py | 3 +- chat/views.py | 17 +- login/views.py | 13 +- requirements.txt | 2 - statics/js/utils.js | 19 + statics/src/css/layui.css | 1310 ++ statics/src/css/layui.mobile.css | 191 + statics/src/css/modules/code.css | 23 + .../src/css/modules/laydate/default/font.css | 16 + .../css/modules/laydate/default/laydate.css | 155 + .../css/modules/layer/default/icon-ext.png | Bin 0 -> 5911 bytes .../src/css/modules/layer/default/icon.png | Bin 0 -> 11493 bytes .../src/css/modules/layer/default/layer.css | 181 + .../css/modules/layer/default/loading-0.gif | Bin 0 -> 5793 bytes .../css/modules/layer/default/loading-1.gif | Bin 0 -> 701 bytes .../css/modules/layer/default/loading-2.gif | Bin 0 -> 1787 bytes .../css/modules/layim/html/chatlog.html | 144 +- .../css/modules/layim/html/find.html | 356 +- .../css/modules/layim/html/getmsg.json | 172 +- .../css/modules/layim/html/msgbox.html | 418 +- statics/src/css/modules/layim/layim.css | 253 + .../src/css/modules/layim/mobile/layim.css | 136 + statics/src/css/modules/layim/skin/1.jpg | Bin 0 -> 18386 bytes statics/src/css/modules/layim/skin/2.jpg | Bin 0 -> 11883 bytes statics/src/css/modules/layim/skin/3.jpg | Bin 0 -> 18610 bytes statics/src/css/modules/layim/skin/4.jpg | Bin 0 -> 39279 bytes statics/src/css/modules/layim/skin/5.jpg | Bin 0 -> 33379 bytes statics/src/css/modules/layim/skin/logo.jpg | Bin 0 -> 3284 bytes .../src/css/modules/layim/voice/default.mp3 | Bin 0 -> 9341 bytes statics/src/font/iconfont.eot | Bin 0 -> 40844 bytes statics/src/font/iconfont.svg | 473 + statics/src/font/iconfont.ttf | Bin 0 -> 40668 bytes statics/src/font/iconfont.woff | Bin 0 -> 26744 bytes statics/src/images/face/0.gif | Bin 0 -> 2689 bytes statics/src/images/face/1.gif | Bin 0 -> 5514 bytes statics/src/images/face/10.gif | Bin 0 -> 2797 bytes statics/src/images/face/11.gif | Bin 0 -> 4121 bytes statics/src/images/face/12.gif | Bin 0 -> 3361 bytes statics/src/images/face/13.gif | Bin 0 -> 7425 bytes statics/src/images/face/14.gif | Bin 0 -> 2375 bytes statics/src/images/face/15.gif | Bin 0 -> 1793 bytes statics/src/images/face/16.gif | Bin 0 -> 6721 bytes statics/src/images/face/17.gif | Bin 0 -> 4439 bytes statics/src/images/face/18.gif | Bin 0 -> 3017 bytes statics/src/images/face/19.gif | Bin 0 -> 3040 bytes statics/src/images/face/2.gif | Bin 0 -> 3222 bytes statics/src/images/face/20.gif | Bin 0 -> 5144 bytes statics/src/images/face/21.gif | Bin 0 -> 5191 bytes statics/src/images/face/22.gif | Bin 0 -> 9823 bytes statics/src/images/face/23.gif | Bin 0 -> 3792 bytes statics/src/images/face/24.gif | Bin 0 -> 8096 bytes statics/src/images/face/25.gif | Bin 0 -> 3127 bytes statics/src/images/face/26.gif | Bin 0 -> 3291 bytes statics/src/images/face/27.gif | Bin 0 -> 4377 bytes statics/src/images/face/28.gif | Bin 0 -> 2793 bytes statics/src/images/face/29.gif | Bin 0 -> 4854 bytes statics/src/images/face/3.gif | Bin 0 -> 4017 bytes statics/src/images/face/30.gif | Bin 0 -> 2555 bytes statics/src/images/face/31.gif | Bin 0 -> 2002 bytes statics/src/images/face/32.gif | Bin 0 -> 3481 bytes statics/src/images/face/33.gif | Bin 0 -> 2454 bytes statics/src/images/face/34.gif | Bin 0 -> 3700 bytes statics/src/images/face/35.gif | Bin 0 -> 1800 bytes statics/src/images/face/36.gif | Bin 0 -> 2331 bytes statics/src/images/face/37.gif | Bin 0 -> 1513 bytes statics/src/images/face/38.gif | Bin 0 -> 3615 bytes statics/src/images/face/39.gif | Bin 0 -> 6495 bytes statics/src/images/face/4.gif | Bin 0 -> 5689 bytes statics/src/images/face/40.gif | Bin 0 -> 3154 bytes statics/src/images/face/41.gif | Bin 0 -> 3644 bytes statics/src/images/face/42.gif | Bin 0 -> 5305 bytes statics/src/images/face/43.gif | Bin 0 -> 2674 bytes statics/src/images/face/44.gif | Bin 0 -> 4126 bytes statics/src/images/face/45.gif | Bin 0 -> 3417 bytes statics/src/images/face/46.gif | Bin 0 -> 3007 bytes statics/src/images/face/47.gif | Bin 0 -> 2333 bytes statics/src/images/face/48.gif | Bin 0 -> 2689 bytes statics/src/images/face/49.gif | Bin 0 -> 2315 bytes statics/src/images/face/5.gif | Bin 0 -> 4567 bytes statics/src/images/face/50.gif | Bin 0 -> 5866 bytes statics/src/images/face/51.gif | Bin 0 -> 2785 bytes statics/src/images/face/52.gif | Bin 0 -> 777 bytes statics/src/images/face/53.gif | Bin 0 -> 2127 bytes statics/src/images/face/54.gif | Bin 0 -> 2196 bytes statics/src/images/face/55.gif | Bin 0 -> 1971 bytes statics/src/images/face/56.gif | Bin 0 -> 2034 bytes statics/src/images/face/57.gif | Bin 0 -> 2705 bytes statics/src/images/face/58.gif | Bin 0 -> 2258 bytes statics/src/images/face/59.gif | Bin 0 -> 10311 bytes statics/src/images/face/6.gif | Bin 0 -> 2213 bytes statics/src/images/face/60.gif | Bin 0 -> 3245 bytes statics/src/images/face/61.gif | Bin 0 -> 2495 bytes statics/src/images/face/62.gif | Bin 0 -> 2017 bytes statics/src/images/face/63.gif | Bin 0 -> 5871 bytes statics/src/images/face/64.gif | Bin 0 -> 6448 bytes statics/src/images/face/65.gif | Bin 0 -> 3576 bytes statics/src/images/face/66.gif | Bin 0 -> 3029 bytes statics/src/images/face/67.gif | Bin 0 -> 2701 bytes statics/src/images/face/68.gif | Bin 0 -> 1424 bytes statics/src/images/face/69.gif | Bin 0 -> 2431 bytes statics/src/images/face/7.gif | Bin 0 -> 3398 bytes statics/src/images/face/70.gif | Bin 0 -> 4590 bytes statics/src/images/face/71.gif | Bin 0 -> 5304 bytes statics/src/images/face/8.gif | Bin 0 -> 4050 bytes statics/src/images/face/9.gif | Bin 0 -> 4221 bytes statics/src/lay/all-mobile.js | 11 + statics/src/lay/all.js | 15 + statics/src/lay/modules/carousel.js | 314 + statics/src/lay/modules/code.js | 61 + statics/src/lay/modules/colorpicker.js | 721 + statics/src/lay/modules/element.js | 472 + statics/src/lay/modules/flow.js | 176 + statics/src/lay/modules/form.js | 682 + statics/src/lay/modules/jquery.js | 10987 ++++++++++++++++ statics/src/lay/modules/laydate.js | 1869 +++ statics/src/lay/modules/layedit.js | 649 + statics/src/lay/modules/layer.js | 1304 ++ statics/src/lay/modules/layim.js | 1865 +++ statics/src/lay/modules/laypage.js | 310 + statics/src/lay/modules/laytpl.js | 123 + statics/src/lay/modules/mobile.js | 30 + .../src/lay/modules/mobile/layer-mobile.js | 189 + .../lay/modules/mobile/layim-mobile-open.js | 11 + .../src/lay/modules/mobile/layim-mobile.js | 1167 ++ .../src/lay/modules/mobile/upload-mobile.js | 166 + statics/src/lay/modules/mobile/zepto.js | 1646 +++ statics/src/lay/modules/rate.js | 214 + statics/src/lay/modules/slider.js | 393 + statics/src/lay/modules/table.js | 1923 +++ statics/src/lay/modules/tree.js | 215 + statics/src/lay/modules/upload.js | 527 + statics/src/lay/modules/util.js | 181 + statics/src/layui.js | 547 + templates/agent/kefu.html | 4 +- templates/chat/chat_mobile.html | 214 + templates/chat/{chat.html => chat_pc.html} | 11 +- templates/chat/user_info.html | 4 +- templates/login/login.html | 22 +- templates/login/signup.html | 4 +- 140 files changed, 30367 insertions(+), 587 deletions(-) create mode 100755 statics/src/css/layui.css create mode 100755 statics/src/css/layui.mobile.css create mode 100755 statics/src/css/modules/code.css create mode 100755 statics/src/css/modules/laydate/default/font.css create mode 100755 statics/src/css/modules/laydate/default/laydate.css create mode 100755 statics/src/css/modules/layer/default/icon-ext.png create mode 100755 statics/src/css/modules/layer/default/icon.png create mode 100755 statics/src/css/modules/layer/default/layer.css create mode 100755 statics/src/css/modules/layer/default/loading-0.gif create mode 100755 statics/src/css/modules/layer/default/loading-1.gif create mode 100755 statics/src/css/modules/layer/default/loading-2.gif rename statics/{dist => src}/css/modules/layim/html/chatlog.html (97%) rename statics/{dist => src}/css/modules/layim/html/find.html (94%) rename statics/{dist => src}/css/modules/layim/html/getmsg.json (96%) rename statics/{dist => src}/css/modules/layim/html/msgbox.html (96%) create mode 100755 statics/src/css/modules/layim/layim.css create mode 100755 statics/src/css/modules/layim/mobile/layim.css create mode 100755 statics/src/css/modules/layim/skin/1.jpg create mode 100755 statics/src/css/modules/layim/skin/2.jpg create mode 100755 statics/src/css/modules/layim/skin/3.jpg create mode 100755 statics/src/css/modules/layim/skin/4.jpg create mode 100755 statics/src/css/modules/layim/skin/5.jpg create mode 100755 statics/src/css/modules/layim/skin/logo.jpg create mode 100755 statics/src/css/modules/layim/voice/default.mp3 create mode 100755 statics/src/font/iconfont.eot create mode 100755 statics/src/font/iconfont.svg create mode 100755 statics/src/font/iconfont.ttf create mode 100755 statics/src/font/iconfont.woff create mode 100755 statics/src/images/face/0.gif create mode 100755 statics/src/images/face/1.gif create mode 100755 statics/src/images/face/10.gif create mode 100755 statics/src/images/face/11.gif create mode 100755 statics/src/images/face/12.gif create mode 100755 statics/src/images/face/13.gif create mode 100755 statics/src/images/face/14.gif create mode 100755 statics/src/images/face/15.gif create mode 100755 statics/src/images/face/16.gif create mode 100755 statics/src/images/face/17.gif create mode 100755 statics/src/images/face/18.gif create mode 100755 statics/src/images/face/19.gif create mode 100755 statics/src/images/face/2.gif create mode 100755 statics/src/images/face/20.gif create mode 100755 statics/src/images/face/21.gif create mode 100755 statics/src/images/face/22.gif create mode 100755 statics/src/images/face/23.gif create mode 100755 statics/src/images/face/24.gif create mode 100755 statics/src/images/face/25.gif create mode 100755 statics/src/images/face/26.gif create mode 100755 statics/src/images/face/27.gif create mode 100755 statics/src/images/face/28.gif create mode 100755 statics/src/images/face/29.gif create mode 100755 statics/src/images/face/3.gif create mode 100755 statics/src/images/face/30.gif create mode 100755 statics/src/images/face/31.gif create mode 100755 statics/src/images/face/32.gif create mode 100755 statics/src/images/face/33.gif create mode 100755 statics/src/images/face/34.gif create mode 100755 statics/src/images/face/35.gif create mode 100755 statics/src/images/face/36.gif create mode 100755 statics/src/images/face/37.gif create mode 100755 statics/src/images/face/38.gif create mode 100755 statics/src/images/face/39.gif create mode 100755 statics/src/images/face/4.gif create mode 100755 statics/src/images/face/40.gif create mode 100755 statics/src/images/face/41.gif create mode 100755 statics/src/images/face/42.gif create mode 100755 statics/src/images/face/43.gif create mode 100755 statics/src/images/face/44.gif create mode 100755 statics/src/images/face/45.gif create mode 100755 statics/src/images/face/46.gif create mode 100755 statics/src/images/face/47.gif create mode 100755 statics/src/images/face/48.gif create mode 100755 statics/src/images/face/49.gif create mode 100755 statics/src/images/face/5.gif create mode 100755 statics/src/images/face/50.gif create mode 100755 statics/src/images/face/51.gif create mode 100755 statics/src/images/face/52.gif create mode 100755 statics/src/images/face/53.gif create mode 100755 statics/src/images/face/54.gif create mode 100755 statics/src/images/face/55.gif create mode 100755 statics/src/images/face/56.gif create mode 100755 statics/src/images/face/57.gif create mode 100755 statics/src/images/face/58.gif create mode 100755 statics/src/images/face/59.gif create mode 100755 statics/src/images/face/6.gif create mode 100755 statics/src/images/face/60.gif create mode 100755 statics/src/images/face/61.gif create mode 100755 statics/src/images/face/62.gif create mode 100755 statics/src/images/face/63.gif create mode 100755 statics/src/images/face/64.gif create mode 100755 statics/src/images/face/65.gif create mode 100755 statics/src/images/face/66.gif create mode 100755 statics/src/images/face/67.gif create mode 100755 statics/src/images/face/68.gif create mode 100755 statics/src/images/face/69.gif create mode 100755 statics/src/images/face/7.gif create mode 100755 statics/src/images/face/70.gif create mode 100755 statics/src/images/face/71.gif create mode 100755 statics/src/images/face/8.gif create mode 100755 statics/src/images/face/9.gif create mode 100755 statics/src/lay/all-mobile.js create mode 100755 statics/src/lay/all.js create mode 100755 statics/src/lay/modules/carousel.js create mode 100755 statics/src/lay/modules/code.js create mode 100755 statics/src/lay/modules/colorpicker.js create mode 100755 statics/src/lay/modules/element.js create mode 100755 statics/src/lay/modules/flow.js create mode 100755 statics/src/lay/modules/form.js create mode 100755 statics/src/lay/modules/jquery.js create mode 100755 statics/src/lay/modules/laydate.js create mode 100755 statics/src/lay/modules/layedit.js create mode 100755 statics/src/lay/modules/layer.js create mode 100755 statics/src/lay/modules/layim.js create mode 100755 statics/src/lay/modules/laypage.js create mode 100755 statics/src/lay/modules/laytpl.js create mode 100755 statics/src/lay/modules/mobile.js create mode 100755 statics/src/lay/modules/mobile/layer-mobile.js create mode 100755 statics/src/lay/modules/mobile/layim-mobile-open.js create mode 100755 statics/src/lay/modules/mobile/layim-mobile.js create mode 100755 statics/src/lay/modules/mobile/upload-mobile.js create mode 100755 statics/src/lay/modules/mobile/zepto.js create mode 100755 statics/src/lay/modules/rate.js create mode 100755 statics/src/lay/modules/slider.js create mode 100755 statics/src/lay/modules/table.js create mode 100755 statics/src/lay/modules/tree.js create mode 100755 statics/src/lay/modules/upload.js create mode 100755 statics/src/lay/modules/util.js create mode 100755 statics/src/layui.js create mode 100644 templates/chat/chat_mobile.html rename templates/chat/{chat.html => chat_pc.html} (95%) diff --git a/WebIM/settings.py b/WebIM/settings.py index 2982a95..c66832e 100644 --- a/WebIM/settings.py +++ b/WebIM/settings.py @@ -11,6 +11,8 @@ """ import os +from urllib.parse import urlparse + # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -22,7 +24,7 @@ SECRET_KEY = '3zt8c)88lmp_8kif4&y*#oy=myhsdh5do)xjixb3$$b+i-2+vt' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True +DEBUG = False ALLOWED_HOSTS = ['*'] @@ -84,6 +86,32 @@ }, } +# cache +CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': 'redis://127.0.0.1:6379/1', + 'OPTIONS': { + # 'PASSWORD': redis_url.password, + 'CLIENT_CLASS': 'django_redis.client.DefaultClient', + 'PICKLE_VERSION': -1, # Use the latest protocol version 默认使用最新的 pickle. + 'SOCKET_CONNECT_TIMEOUT': 5, # in seconds socket 建立连接超时设置 + 'SOCKET_TIMEOUT': 60, # in seconds 连接建立后的读写操作超时设置 + "CONNECTION_POOL_KWARGS": {"max_connections": 100}, # 配置默认连接池 + 'IGNORE_EXCEPTIONS': True, + } + } +} + +REDIS_TIMEOUT = 7*24*60*60 +CUBES_REDIS_TIMEOUT = 60*60 +NEVER_REDIS_TIMEOUT = 365*24*60*60 + +# Django 默认可以使用任何 cache backend 作为 session backend, +# 将 django-redis 作为 session 储存后端不用安装任何额外的 backend +SESSION_ENGINE = 'django.contrib.sessions.backends.cache' +SESSION_CACHE_ALIAS = 'default' + # Database # https://docs.djangoproject.com/en/2.1/ref/settings/#databases @@ -155,4 +183,17 @@ def mysql_settings(): # 上传文件白名单 -ALLOWED_EXTENSIONS = ('txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif') \ No newline at end of file +ALLOWED_EXTENSIONS = ('txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif') + + +# 本地开发配置放在local_settings.py中 +# try: +# from .local_settings import * +# except ImportError: +# pass + + +### +# 部署上线需要修改的地方 +# Domain = 'https://iwantme.cn' +# DEBUG = False \ No newline at end of file diff --git a/chat/urls.py b/chat/urls.py index a12d317..40f8cae 100644 --- a/chat/urls.py +++ b/chat/urls.py @@ -5,7 +5,8 @@ urlpatterns = [ url(r'^msg_gateway/$', views.msg_gateway), - url(r'^chat_home/$', views.home, name='chat_home'), + url(r'^chat_pc/$', views.chat_pc, name='chat_pc'), + url(r'^chat_mobile/$', views.chat_mobile, name='chat_mobile'), url(r'^init/$', views.init_user, name='init'), url(r'^init_group_chat/$', views.init_group_chat, name='init_group_chat'), url(r'^upload_image/$', views.upload_image, name='upload_image'), diff --git a/chat/views.py b/chat/views.py index dfa9908..c8b6abe 100644 --- a/chat/views.py +++ b/chat/views.py @@ -8,17 +8,16 @@ from chat.models import User, Group, GroupChat, ImageModel, FileModel, Message from chat.consumers import channel_publish from WebIM.settings import Domain, ALLOWED_EXTENSIONS -import sys -import codecs -# sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) -def home(request): - user_id = request.GET.get('user_id', None) - if user_id is not None: - user = User.objects.get(id=user_id) - return render(request, 'chat/chat.html', {'id': user_id}) - return render(request, 'chat/chat.html', {'user_id': user_id}) +def chat_pc(request): + print('pc') + return render(request, 'chat/chat_pc.html') + + +def chat_mobile(request): + print('mobile') + return render(request, 'chat/chat_mobile.html') @csrf_exempt diff --git a/login/views.py b/login/views.py index cfa426e..33e5005 100644 --- a/login/views.py +++ b/login/views.py @@ -1,11 +1,8 @@ -from django.shortcuts import render +import html from django.http import JsonResponse -from chat.models import User, Group +from django.shortcuts import render, HttpResponseRedirect, reverse from django.views.decorators.csrf import csrf_exempt -import html -import sys -import codecs -# sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) +from chat.models import User, Group @csrf_exempt @@ -36,8 +33,8 @@ def do_login(request): # print(user[0].status) user[0].save() return JsonResponse({'code': 0, 'status': True, 'info': '登录成功', 'user_id': user[0].id}) - # return render(request, 'chat.html', context={'user_id': user[0].id}) - # return HttpResponseRedirect(reverse('chat_home')) + # return render(request, 'chat/chat_pc.html', context={'user_id': user[0].id}) + # return HttpResponseRedirect(reverse('chat_pc')) else: # print('用户不存在') return render(request, 'login/login.html', {'username': username, 'password': password}) diff --git a/requirements.txt b/requirements.txt index 9755e03..2e7a84d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,6 @@ cryptography==2.3.1 daphne==2.2.2 decorator==4.3.0 Django==2.1.2 -django-tornado-websockets==0.2.2 hiredis==0.2.0 hyperlink==18.0.0 idna==2.7 @@ -37,7 +36,6 @@ Pygments==2.2.0 PyHamcrest==1.9.0 PyMySQL==0.9.2 pytz==2018.5 -qiniu==7.2.2 requests==2.19.1 simplegeneric==0.8.1 six==1.11.0 diff --git a/statics/js/utils.js b/statics/js/utils.js index 7cd8dc5..ddd5843 100644 --- a/statics/js/utils.js +++ b/statics/js/utils.js @@ -36,4 +36,23 @@ function generateUUID() { return (c=='x' ? r : (r&0x3|0x8)).toString(16); }); return uuid; +} + + +// 设备检测 +// 移动端返回true,否则返回false +function detectmob() { + if( navigator.userAgent.match(/Android/i) + || navigator.userAgent.match(/webOS/i) + || navigator.userAgent.match(/iPhone/i) + || navigator.userAgent.match(/iPad/i) + || navigator.userAgent.match(/iPod/i) + || navigator.userAgent.match(/BlackBerry/i) + || navigator.userAgent.match(/Windows Phone/i) + ){ + return true; + } + else { + return false; + } } \ No newline at end of file diff --git a/statics/src/css/layui.css b/statics/src/css/layui.css new file mode 100755 index 0000000..58d3722 --- /dev/null +++ b/statics/src/css/layui.css @@ -0,0 +1,1310 @@ +/** + + @Name: layui + @Author: 贤心 + @Site: www.layui.com + + */ + + +/** 初始化 **/ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,input,button,textarea,p,blockquote,th,td,form,pre{margin: 0; padding: 0; -webkit-tap-highlight-color:rgba(0,0,0,0);} +a:active,a:hover{outline:0} +img{display: inline-block; border: none; vertical-align: middle;} +li{list-style:none;} +table{border-collapse: collapse; border-spacing: 0;} +h1,h2,h3{font-weight: 400;} +h4, h5, h6{font-size: 100%; font-weight: 400;} +button,input,select,textarea{font-size: 100%; } +input,button,textarea,select,optgroup,option{font-family: inherit; font-size: inherit; font-style: inherit; font-weight: inherit; outline: 0;} +pre{white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;} + +/** 初始化全局标签 **/ +body{line-height: 24px; font: 14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif;} +hr{height: 1px; margin: 10px 0; border: 0; clear: both;} +a{color: #333; text-decoration:none; } +a:hover{color: #777;} +a cite{font-style: normal; *cursor:pointer;} + +/** 基础通用 **/ +.layui-border-box, .layui-border-box *{box-sizing: border-box;} +/* 消除第三方ui可能造成的冲突 */.layui-box, .layui-box *{box-sizing: content-box;} +.layui-clear{clear: both; *zoom: 1;} +.layui-clear:after{content:'\20'; clear:both; *zoom:1; display:block; height:0;} +.layui-inline{position: relative; display: inline-block; *display:inline; *zoom:1; vertical-align: middle;} +/* 三角形 */.layui-edge{position: relative; display: inline-block; vertical-align: middle; width: 0; height: 0; border-width: 6px; border-style: dashed; border-color: transparent; overflow: hidden;} +.layui-edge-top{top: -4px; border-bottom-color: #999; border-bottom-style: solid;} +.layui-edge-right{border-left-color: #999; border-left-style: solid;} +.layui-edge-bottom{top: 2px; border-top-color: #999; border-top-style: solid;} +.layui-edge-left{border-right-color: #999; border-right-style: solid;} +/* 单行溢出省略 */.layui-elip{text-overflow: ellipsis; overflow: hidden; white-space: nowrap;} +/* 屏蔽选中 */.layui-unselect,.layui-icon, .layui-disabled{-moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;} +/* 禁用 */.layui-disabled,.layui-disabled:hover{color: #d2d2d2 !important; cursor: not-allowed !important;} +/* 纯圆角 */.layui-circle{border-radius: 100%;} +.layui-show{display: block !important;} +.layui-hide{display: none !important;} + +/** 图标字体 **/ +@font-face {font-family: 'layui-icon'; + src: url('../font/iconfont.eot?v=240'); + src: url('../font/iconfont.eot?v=240#iefix') format('embedded-opentype'), + url('../font/iconfont.svg?v=240#iconfont') format('svg'), + url('../font/iconfont.woff?v=240') format('woff'), + url('../font/iconfont.ttf?v=240') format('truetype'); +} + +.layui-icon{ + font-family:"layui-icon" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* font-class */ +.layui-icon-reply-fill:before{content:"\e611"} +.layui-icon-set-fill:before{content:"\e614"} +.layui-icon-menu-fill:before{content:"\e60f"} +.layui-icon-search:before{content:"\e615"} +.layui-icon-share:before{content:"\e641"} +.layui-icon-set-sm:before{content:"\e620"} +.layui-icon-engine:before{content:"\e628"} +.layui-icon-close:before{content:"\1006"} +.layui-icon-close-fill:before{content:"\1007"} +.layui-icon-chart-screen:before{content:"\e629"} +.layui-icon-star:before{content:"\e600"} +.layui-icon-circle-dot:before{content:"\e617"} +.layui-icon-chat:before{content:"\e606"} +.layui-icon-release:before{content:"\e609"} +.layui-icon-list:before{content:"\e60a"} +.layui-icon-chart:before{content:"\e62c"} +.layui-icon-ok-circle:before{content:"\1005"} +.layui-icon-layim-theme:before{content:"\e61b"} +.layui-icon-table:before{content:"\e62d"} +.layui-icon-right:before{content:"\e602"} +.layui-icon-left:before{content:"\e603"} +.layui-icon-cart-simple:before{content:"\e698"} +.layui-icon-face-cry:before{content:"\e69c"} +.layui-icon-face-smile:before{content:"\e6af"} +.layui-icon-survey:before{content:"\e6b2"} +.layui-icon-tree:before{content:"\e62e"} +.layui-icon-upload-circle:before{content:"\e62f"} +.layui-icon-add-circle:before{content:"\e61f"} +.layui-icon-download-circle:before{content:"\e601"} +.layui-icon-templeate-1:before{content:"\e630"} +.layui-icon-util:before{content:"\e631"} +.layui-icon-face-surprised:before{content:"\e664"} +.layui-icon-edit:before{content:"\e642"} +.layui-icon-speaker:before{content:"\e645"} +.layui-icon-down:before{content:"\e61a"} +.layui-icon-file:before{content:"\e621"} +.layui-icon-layouts:before{content:"\e632"} +.layui-icon-rate-half:before{content:"\e6c9"} +.layui-icon-add-circle-fine:before{content:"\e608"} +.layui-icon-prev-circle:before{content:"\e633"} +.layui-icon-read:before{content:"\e705"} +.layui-icon-404:before{content:"\e61c"} +.layui-icon-carousel:before{content:"\e634"} +.layui-icon-help:before{content:"\e607"} +.layui-icon-code-circle:before{content:"\e635"} +.layui-icon-water:before{content:"\e636"} +.layui-icon-username:before{content:"\e66f"} +.layui-icon-find-fill:before{content:"\e670"} +.layui-icon-about:before{content:"\e60b"} +.layui-icon-location:before{content:"\e715"} +.layui-icon-up:before{content:"\e619"} +.layui-icon-pause:before{content:"\e651"} +.layui-icon-date:before{content:"\e637"} +.layui-icon-layim-uploadfile:before{content:"\e61d"} +.layui-icon-delete:before{content:"\e640"} +.layui-icon-play:before{content:"\e652"} +.layui-icon-top:before{content:"\e604"} +.layui-icon-friends:before{content:"\e612"} +.layui-icon-refresh-3:before{content:"\e9aa"} +.layui-icon-ok:before{content:"\e605"} +.layui-icon-layer:before{content:"\e638"} +.layui-icon-face-smile-fine:before{content:"\e60c"} +.layui-icon-dollar:before{content:"\e659"} +.layui-icon-group:before{content:"\e613"} +.layui-icon-layim-download:before{content:"\e61e"} +.layui-icon-picture-fine:before{content:"\e60d"} +.layui-icon-link:before{content:"\e64c"} +.layui-icon-diamond:before{content:"\e735"} +.layui-icon-log:before{content:"\e60e"} +.layui-icon-rate-solid:before{content:"\e67a"} +.layui-icon-fonts-del:before{content:"\e64f"} +.layui-icon-unlink:before{content:"\e64d"} +.layui-icon-fonts-clear:before{content:"\e639"} +.layui-icon-triangle-r:before{content:"\e623"} +.layui-icon-circle:before{content:"\e63f"} +.layui-icon-radio:before{content:"\e643"} +.layui-icon-align-center:before{content:"\e647"} +.layui-icon-align-right:before{content:"\e648"} +.layui-icon-align-left:before{content:"\e649"} +.layui-icon-loading-1:before{content:"\e63e"} +.layui-icon-return:before{content:"\e65c"} +.layui-icon-fonts-strong:before{content:"\e62b"} +.layui-icon-upload:before{content:"\e67c"} +.layui-icon-dialogue:before{content:"\e63a"} +.layui-icon-video:before{content:"\e6ed"} +.layui-icon-headset:before{content:"\e6fc"} +.layui-icon-cellphone-fine:before{content:"\e63b"} +.layui-icon-add-1:before{content:"\e654"} +.layui-icon-face-smile-b:before{content:"\e650"} +.layui-icon-fonts-html:before{content:"\e64b"} +.layui-icon-form:before{content:"\e63c"} +.layui-icon-cart:before{content:"\e657"} +.layui-icon-camera-fill:before{content:"\e65d"} +.layui-icon-tabs:before{content:"\e62a"} +.layui-icon-fonts-code:before{content:"\e64e"} +.layui-icon-fire:before{content:"\e756"} +.layui-icon-set:before{content:"\e716"} +.layui-icon-fonts-u:before{content:"\e646"} +.layui-icon-triangle-d:before{content:"\e625"} +.layui-icon-tips:before{content:"\e702"} +.layui-icon-picture:before{content:"\e64a"} +.layui-icon-more-vertical:before{content:"\e671"} +.layui-icon-flag:before{content:"\e66c"} +.layui-icon-loading:before{content:"\e63d"} +.layui-icon-fonts-i:before{content:"\e644"} +.layui-icon-refresh-1:before{content:"\e666"} +.layui-icon-rmb:before{content:"\e65e"} +.layui-icon-home:before{content:"\e68e"} +.layui-icon-user:before{content:"\e770"} +.layui-icon-notice:before{content:"\e667"} +.layui-icon-login-weibo:before{content:"\e675"} +.layui-icon-voice:before{content:"\e688"} +.layui-icon-upload-drag:before{content:"\e681"} +.layui-icon-login-qq:before{content:"\e676"} +.layui-icon-snowflake:before{content:"\e6b1"} +.layui-icon-file-b:before{content:"\e655"} +.layui-icon-template:before{content:"\e663"} +.layui-icon-auz:before{content:"\e672"} +.layui-icon-console:before{content:"\e665"} +.layui-icon-app:before{content:"\e653"} +.layui-icon-prev:before{content:"\e65a"} +.layui-icon-website:before{content:"\e7ae"} +.layui-icon-next:before{content:"\e65b"} +.layui-icon-component:before{content:"\e857"} +.layui-icon-more:before{content:"\e65f"} +.layui-icon-login-wechat:before{content:"\e677"} +.layui-icon-shrink-right:before{content:"\e668"} +.layui-icon-spread-left:before{content:"\e66b"} +.layui-icon-camera:before{content:"\e660"} +.layui-icon-note:before{content:"\e66e"} +.layui-icon-refresh:before{content:"\e669"} +.layui-icon-female:before{content:"\e661"} +.layui-icon-male:before{content:"\e662"} +.layui-icon-password:before{content:"\e673"} +.layui-icon-senior:before{content:"\e674"} +.layui-icon-theme:before{content:"\e66a"} +.layui-icon-tread:before{content:"\e6c5"} +.layui-icon-praise:before{content:"\e6c6"} +.layui-icon-star-fill:before{content:"\e658"} +.layui-icon-rate:before{content:"\e67b"} +.layui-icon-template-1:before{content:"\e656"} +.layui-icon-vercode:before{content:"\e679"} +.layui-icon-cellphone:before{content:"\e678"} +.layui-icon-screen-full:before{content:"\e622";} +.layui-icon-screen-restore:before{content:"\e758";} +.layui-icon-cols:before{content:"\e610";} +.layui-icon-export:before{content:"\e67d";} +.layui-icon-print:before {content:"\e66d";} +.layui-icon-slider:before {content: "\e714";} + +/* 基本布局 */ +.layui-main{position: relative; width: 1140px; margin: 0 auto;} +.layui-header{position: relative; z-index: 1000; height: 60px;} +.layui-header a:hover{transition: all .5s; -webkit-transition: all .5s;} +.layui-side{position: fixed; left: 0; top: 0; bottom: 0; z-index: 999; width: 200px; overflow-x: hidden;} +.layui-side-scroll{position: relative; width: 220px; height: 100%; overflow-x: hidden;} +.layui-body{position: absolute; left: 200px; right: 0; top: 0; bottom: 0; z-index: 998; width: auto; overflow: hidden; overflow-y: auto; box-sizing: border-box;} + +/* 后台框架大布局 */.layui-layout-body{overflow: hidden;} +.layui-layout-admin .layui-header{background-color: #23262E;} +.layui-layout-admin .layui-side{top: 60px; width: 200px; overflow-x: hidden;} +.layui-layout-admin .layui-body{top: 60px; bottom: 44px;} +.layui-layout-admin .layui-main{width: auto; margin: 0 15px;} +.layui-layout-admin .layui-footer{position: fixed; left: 200px; right: 0; bottom: 0; height: 44px; line-height: 44px; padding: 0 15px; background-color: #eee;} +.layui-layout-admin .layui-logo{position: absolute; left: 0; top: 0; width: 200px; height: 100%; line-height: 60px; text-align: center; color: #009688; font-size: 16px;} +.layui-layout-admin .layui-header .layui-nav{background: none;} +.layui-layout-left{position: absolute !important; left: 200px; top: 0;} +.layui-layout-right{position: absolute !important; right: 0; top: 0;} + +/* 栅格布局 */ +.layui-container{position: relative; margin: 0 auto; padding: 0 15px; box-sizing: border-box;} +.layui-fluid{position: relative; margin: 0 auto; padding: 0 15px;} + +.layui-row:before, .layui-row:after{content: ''; display: block; clear: both;} +.layui-col-xs1, .layui-col-xs2, .layui-col-xs3, .layui-col-xs4, .layui-col-xs5, .layui-col-xs6, .layui-col-xs7, .layui-col-xs8, .layui-col-xs9, .layui-col-xs10, .layui-col-xs11, .layui-col-xs12 +,.layui-col-sm1, .layui-col-sm2, .layui-col-sm3, .layui-col-sm4, .layui-col-sm5, .layui-col-sm6, .layui-col-sm7, .layui-col-sm8, .layui-col-sm9, .layui-col-sm10, .layui-col-sm11, .layui-col-sm12 +,.layui-col-md1, .layui-col-md2, .layui-col-md3, .layui-col-md4, .layui-col-md5, .layui-col-md6, .layui-col-md7, .layui-col-md8, .layui-col-md9, .layui-col-md10, .layui-col-md11, .layui-col-md12 +,.layui-col-lg1, .layui-col-lg2, .layui-col-lg3, .layui-col-lg4, .layui-col-lg5, .layui-col-lg6, .layui-col-lg7, .layui-col-lg8, .layui-col-lg9, .layui-col-lg10, .layui-col-lg11, .layui-col-lg12 +{position: relative; display: block; box-sizing: border-box;} + +.layui-col-xs1, .layui-col-xs2, .layui-col-xs3, .layui-col-xs4, .layui-col-xs5, .layui-col-xs6, .layui-col-xs7, .layui-col-xs8, .layui-col-xs9, .layui-col-xs10, .layui-col-xs11, .layui-col-xs12{float: left;} +.layui-col-xs1{width: 8.33333333%;} +.layui-col-xs2{width: 16.66666667%;} +.layui-col-xs3{width: 25%;} +.layui-col-xs4{width: 33.33333333%;} +.layui-col-xs5{width: 41.66666667%;} +.layui-col-xs6{width: 50%;} +.layui-col-xs7{width: 58.33333333%;} +.layui-col-xs8{width: 66.66666667%;} +.layui-col-xs9{width: 75%;} +.layui-col-xs10{width: 83.33333333%;} +.layui-col-xs11{width: 91.66666667%;} +.layui-col-xs12{width: 100%;} + +.layui-col-xs-offset1{margin-left: 8.33333333%;} +.layui-col-xs-offset2{margin-left: 16.66666667%;} +.layui-col-xs-offset3{margin-left: 25%;} +.layui-col-xs-offset4{margin-left: 33.33333333%;} +.layui-col-xs-offset5{margin-left: 41.66666667%;} +.layui-col-xs-offset6{margin-left: 50%;} +.layui-col-xs-offset7{margin-left: 58.33333333%;} +.layui-col-xs-offset8{margin-left: 66.66666667%;} +.layui-col-xs-offset9{margin-left: 75%;} +.layui-col-xs-offset10{margin-left: 83.33333333%;} +.layui-col-xs-offset11{margin-left: 91.66666667%;} +.layui-col-xs-offset12{margin-left: 100%;} + +/* 超小屏幕(手机) */ +@media screen and (max-width: 768px) { + .layui-hide-xs{display: none!important;} + .layui-show-xs-block{display: block!important;} + .layui-show-xs-inline{display: inline!important;} + .layui-show-xs-inline-block{display: inline-block!important;} +} + +/* 小型屏幕(平板) */ +@media screen and (min-width: 768px) { + .layui-container{width: 750px;} + .layui-hide-sm{display: none!important;} + .layui-show-sm-block{display: block!important;} + .layui-show-sm-inline{display: inline!important;} + .layui-show-sm-inline-block{display: inline-block!important;} + + .layui-col-sm1, .layui-col-sm2, .layui-col-sm3, .layui-col-sm4, .layui-col-sm5, .layui-col-sm6, .layui-col-sm7, .layui-col-sm8, .layui-col-sm9, .layui-col-sm10, .layui-col-sm11, .layui-col-sm12{float: left;} + .layui-col-sm1{width: 8.33333333%;} + .layui-col-sm2{width: 16.66666667%;} + .layui-col-sm3{width: 25%;} + .layui-col-sm4{width: 33.33333333%;} + .layui-col-sm5{width: 41.66666667%;} + .layui-col-sm6{width: 50%;} + .layui-col-sm7{width: 58.33333333%;} + .layui-col-sm8{width: 66.66666667%;} + .layui-col-sm9{width: 75%;} + .layui-col-sm10{width: 83.33333333%;} + .layui-col-sm11{width: 91.66666667%;} + .layui-col-sm12{width: 100%;} + /* 列偏移 */ + .layui-col-sm-offset1{margin-left: 8.33333333%;} + .layui-col-sm-offset2{margin-left: 16.66666667%;} + .layui-col-sm-offset3{margin-left: 25%;} + .layui-col-sm-offset4{margin-left: 33.33333333%;} + .layui-col-sm-offset5{margin-left: 41.66666667%;} + .layui-col-sm-offset6{margin-left: 50%;} + .layui-col-sm-offset7{margin-left: 58.33333333%;} + .layui-col-sm-offset8{margin-left: 66.66666667%;} + .layui-col-sm-offset9{margin-left: 75%;} + .layui-col-sm-offset10{margin-left: 83.33333333%;} + .layui-col-sm-offset11{margin-left: 91.66666667%;} + .layui-col-sm-offset12{margin-left: 100%;} +} +/* 中型屏幕(桌面) */ +@media screen and (min-width: 992px) { + .layui-container{width: 970px;} + .layui-hide-md{display: none!important;} + .layui-show-md-block{display: block!important;} + .layui-show-md-inline{display: inline!important;} + .layui-show-md-inline-block{display: inline-block!important;} + + .layui-col-md1, .layui-col-md2, .layui-col-md3, .layui-col-md4, .layui-col-md5, .layui-col-md6, .layui-col-md7, .layui-col-md8, .layui-col-md9, .layui-col-md10, .layui-col-md11, .layui-col-md12{float: left;} + .layui-col-md1{width: 8.33333333%;} + .layui-col-md2{width: 16.66666667%;} + .layui-col-md3{width: 25%;} + .layui-col-md4{width: 33.33333333%;} + .layui-col-md5{width: 41.66666667%;} + .layui-col-md6{width: 50%;} + .layui-col-md7{width: 58.33333333%;} + .layui-col-md8{width: 66.66666667%;} + .layui-col-md9{width: 75%;} + .layui-col-md10{width: 83.33333333%;} + .layui-col-md11{width: 91.66666667%;} + .layui-col-md12{width: 100%;} + /* 列偏移 */ + .layui-col-md-offset1{margin-left: 8.33333333%;} + .layui-col-md-offset2{margin-left: 16.66666667%;} + .layui-col-md-offset3{margin-left: 25%;} + .layui-col-md-offset4{margin-left: 33.33333333%;} + .layui-col-md-offset5{margin-left: 41.66666667%;} + .layui-col-md-offset6{margin-left: 50%;} + .layui-col-md-offset7{margin-left: 58.33333333%;} + .layui-col-md-offset8{margin-left: 66.66666667%;} + .layui-col-md-offset9{margin-left: 75%;} + .layui-col-md-offset10{margin-left: 83.33333333%;} + .layui-col-md-offset11{margin-left: 91.66666667%;} + .layui-col-md-offset12{margin-left: 100%;} +} +/* 大型屏幕(桌面) */ +@media screen and (min-width: 1200px) { + .layui-container{width: 1170px;} + .layui-hide-lg{display: none!important;} + .layui-show-lg-block{display: block!important;} + .layui-show-lg-inline{display: inline!important;} + .layui-show-lg-inline-block{display: inline-block!important;} + + .layui-col-lg1, .layui-col-lg2, .layui-col-lg3, .layui-col-lg4, .layui-col-lg5, .layui-col-lg6, .layui-col-lg7, .layui-col-lg8, .layui-col-lg9, .layui-col-lg10, .layui-col-lg11, .layui-col-lg12{float: left;} + .layui-col-lg1{width: 8.33333333%;} + .layui-col-lg2{width: 16.66666667%;} + .layui-col-lg3{width: 25%;} + .layui-col-lg4{width: 33.33333333%;} + .layui-col-lg5{width: 41.66666667%;} + .layui-col-lg6{width: 50%;} + .layui-col-lg7{width: 58.33333333%;} + .layui-col-lg8{width: 66.66666667%;} + .layui-col-lg9{width: 75%;} + .layui-col-lg10{width: 83.33333333%;} + .layui-col-lg11{width: 91.66666667%;} + .layui-col-lg12{width: 100%;} + /* 列偏移 */ + .layui-col-lg-offset1{margin-left: 8.33333333%;} + .layui-col-lg-offset2{margin-left: 16.66666667%;} + .layui-col-lg-offset3{margin-left: 25%;} + .layui-col-lg-offset4{margin-left: 33.33333333%;} + .layui-col-lg-offset5{margin-left: 41.66666667%;} + .layui-col-lg-offset6{margin-left: 50%;} + .layui-col-lg-offset7{margin-left: 58.33333333%;} + .layui-col-lg-offset8{margin-left: 66.66666667%;} + .layui-col-lg-offset9{margin-left: 75%;} + .layui-col-lg-offset10{margin-left: 83.33333333%;} + .layui-col-lg-offset11{margin-left: 91.66666667%;} + .layui-col-lg-offset12{margin-left: 100%;} +} + +/* 列间隔 */.layui-col-space1{margin: -0.5px;} +.layui-col-space1>*{padding: 0.5px;} +.layui-col-space3{margin: -1.5px;} +.layui-col-space3>*{padding: 1.5px;} +.layui-col-space5{margin: -2.5px;} +.layui-col-space5>*{padding: 2.5px;} +.layui-col-space8{margin: -3.5px;} +.layui-col-space8>*{padding: 3.5px;} +.layui-col-space10{margin: -5px;} +.layui-col-space10>*{padding: 5px;} +.layui-col-space12{margin: -6px;} +.layui-col-space12>*{padding: 6px;} +.layui-col-space15{margin: -7.5px;} +.layui-col-space15>*{padding: 7.5px;} +.layui-col-space18{margin: -9px;} +.layui-col-space18>*{padding: 9px;} +.layui-col-space20{margin: -10px;} +.layui-col-space20>*{padding: 10px;} +.layui-col-space22{margin: -11px;} +.layui-col-space22>*{padding: 11px;} +.layui-col-space25{margin: -12.5px;} +.layui-col-space25>*{padding: 12.5px;} +.layui-col-space30{margin: -15px;} +.layui-col-space30>*{padding: 15px;} + + +/** 页面元素 **/ +.layui-btn, .layui-input, .layui-textarea, .layui-upload-button, .layui-select{outline: none; -webkit-appearance: none; transition: all .3s; -webkit-transition: all .3s; box-sizing: border-box;} + +/* 引用 */.layui-elem-quote{margin-bottom: 10px; padding: 15px; line-height: 22px; border-left: 5px solid #009688; border-radius: 0 2px 2px 0; background-color: #f2f2f2;} +.layui-quote-nm{border-style: solid; border-width: 1px; border-left-width: 5px; background: none;} +/* 字段集合 */.layui-elem-field{margin-bottom: 10px; padding: 0; border-width: 1px; border-style: solid;} +.layui-elem-field legend{margin-left: 20px; padding: 0 10px; font-size: 20px; font-weight: 300;} +.layui-field-title{margin: 10px 0 20px; border-width: 0; border-top-width: 1px;} +.layui-field-box{padding: 10px 15px;} +.layui-field-title .layui-field-box{padding: 10px 0;} + +/* 进度条 */ +.layui-progress{position: relative; height: 6px; border-radius: 20px; background-color: #e2e2e2;} +.layui-progress-bar{position: absolute; left: 0; top: 0; width: 0; max-width: 100%; height: 6px; border-radius: 20px; text-align: right; background-color: #5FB878; transition: all .3s; -webkit-transition: all .3s;} +.layui-progress-big, +.layui-progress-big .layui-progress-bar{height: 18px; line-height: 18px;} +.layui-progress-text{position: relative; top: -20px; line-height: 18px; font-size: 12px; color: #666} +.layui-progress-big .layui-progress-text{position: static; padding: 0 10px; color: #fff;} + + +/* + + 面板 + +*/ + + +/* 折叠面板 */ +.layui-collapse{border-width: 1px; border-style: solid; border-radius: 2px;} +.layui-colla-item, +.layui-colla-content{border-top-width: 1px; border-top-style: solid;} +.layui-colla-item:first-child{border-top: none;} +.layui-colla-title{position: relative; height: 42px; line-height: 42px; padding: 0 15px 0 35px; color: #333; background-color: #f2f2f2; cursor: pointer; font-size: 14px; overflow: hidden;} +.layui-colla-content{display: none; padding: 10px 15px; line-height: 22px; color: #666;} +.layui-colla-icon{position: absolute; left: 15px; top: 0; font-size: 14px;} + +/* 卡片面板 */ +.layui-card{margin-bottom: 15px; border-radius: 2px; background-color: #fff; box-shadow: 0 1px 2px 0 rgba(0,0,0,.05);} +.layui-card:last-child{margin-bottom: 0;} +.layui-card-header{position: relative; height: 42px; line-height: 42px; padding: 0 15px; border-bottom: 1px solid #f6f6f6; color: #333; border-radius: 2px 2px 0 0; font-size: 14px;} +.layui-card-body{position: relative; padding: 10px 15px; line-height: 24px;} +.layui-card-body[pad15]{padding: 15px;} +.layui-card-body[pad20]{padding: 20px;} +.layui-card-body .layui-table{margin: 5px 0;} +.layui-card .layui-tab{margin: 0;} + +/* 常规面板 */ +.layui-panel{} + +/* 窗口面板 */ +.layui-panel-window{position: relative; padding: 15px; border-radius: 0; border-top: 5px solid #E6E6E6; background-color: #fff;} + +/* 其它辅助 */ +.layui-auxiliar-moving{position: fixed; left: 0; right: 0; top: 0; bottom: 0; width: 100%; height: 100%; background: none; z-index: 9999999999;} + + +/* + + 默认主题 + +*/ + + +/* 背景颜色 */ +.layui-bg-red{background-color: #FF5722 !important; color: #fff!important;} /*赤*/ +.layui-bg-orange{background-color: #FFB800!important; color: #fff!important;} /*橙*/ +.layui-bg-green{background-color: #009688!important; color: #fff!important;} /*绿*/ +.layui-bg-cyan{background-color: #2F4056!important; color: #fff!important;} /*青*/ +.layui-bg-blue{background-color: #1E9FFF!important; color: #fff!important;} /*蓝*/ +.layui-bg-black{background-color: #393D49!important; color: #fff!important;} /*黑*/ +.layui-bg-gray{background-color: #eee!important; color: #666!important;} /*灰*/ + +/* 边框 */ +.layui-quote-nm, +.layui-elem-field, +.layui-collapse, +.layui-colla-item, +.layui-colla-content, +.layui-badge-rim, +.layui-tab-title, +.layui-tab-title .layui-this:after, +.layui-tab-bar, +.layui-tab-card, + +.layui-input, .layui-textarea, .layui-select, +.layui-form-pane .layui-form-label, +.layui-form-pane .layui-form-item[pane], +.layui-layedit, .layui-layedit-tool{border-color: #e6e6e6} + +/* 背景边框 */ +hr, .layui-timeline-item:before{background-color: #e6e6e6;} + +/* 文本区域 */ +.layui-text{line-height: 22px; font-size: 14px; color: #666;} +.layui-text h1, +.layui-text h2, +.layui-text h3{font-weight: 500; color: #333;} +.layui-text h1{font-size: 30px;} +.layui-text h2{font-size: 24px;} +.layui-text h3{font-size: 18px;} +.layui-text a:not(.layui-btn){color: #01AAED;} +.layui-text a:not(.layui-btn):hover{text-decoration: underline;} +.layui-text ul{padding: 5px 0 5px 15px;} +.layui-text ul li{margin-top: 5px; list-style-type: disc;} +.layui-text em, +.layui-word-aux{color: #999 !important; padding: 0 5px !important;} + +/* + + 按钮 + +*/ + +.layui-btn{display: inline-block; vertical-align: middle; height: 38px; line-height: 38px; padding: 0 18px; background-color: #009688; color: #fff; white-space: nowrap; text-align: center; font-size: 14px; border: none; border-radius: 2px; cursor: pointer; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;} +.layui-btn:hover{opacity: 0.8; filter:alpha(opacity=80); color: #fff;} +.layui-btn:active{opacity: 1; filter:alpha(opacity=100);} +.layui-btn+.layui-btn{margin-left: 10px;} + +/* 按钮容器 */ +.layui-btn-container{font-size: 0;} +.layui-btn-container .layui-btn{margin-right: 10px; margin-bottom: 10px;} +.layui-btn-container .layui-btn+.layui-btn{margin-left: 0;} +.layui-table .layui-btn-container .layui-btn{margin-bottom: 9px;} + + +/* 圆角 */.layui-btn-radius{border-radius: 100px;} +.layui-btn .layui-icon{margin-right: 3px; font-size: 18px; vertical-align: bottom; vertical-align: middle\0;} + +/* 原始 */.layui-btn-primary{border: 1px solid #C9C9C9; background-color: #fff; color: #555;} +.layui-btn-primary:hover{border-color: #009688; color: #333} +/* 百搭 */.layui-btn-normal{background-color: #1E9FFF;} +/* 暖色 */.layui-btn-warm{background-color: #FFB800;} +/* 警告 */.layui-btn-danger{background-color: #FF5722;} +/* 禁用 */.layui-btn-disabled,.layui-btn-disabled:hover,.layui-btn-disabled:active{border: 1px solid #e6e6e6; background-color: #FBFBFB; color: #C9C9C9; cursor: not-allowed; opacity: 1;} + +/* 大型 */.layui-btn-lg{height: 44px; line-height: 44px; padding: 0 25px; font-size: 16px;} +/* 小型 */.layui-btn-sm{height: 30px; line-height: 30px; padding: 0 10px; font-size: 12px;} +.layui-btn-sm i{font-size: 16px !important;} +/* 超小 */.layui-btn-xs{height: 22px; line-height: 22px; padding: 0 5px; font-size: 12px;} +.layui-btn-xs i{font-size: 14px !important;} +/* 按钮组 */.layui-btn-group{display: inline-block; vertical-align: middle; font-size: 0;} +.layui-btn-group .layui-btn{margin-left: 0!important; margin-right: 0!important; border-left: 1px solid rgba(255,255,255,.5); border-radius: 0;} +.layui-btn-group .layui-btn-primary{border-left: none;} +.layui-btn-group .layui-btn-primary:hover{border-color: #C9C9C9; color: #009688;} +.layui-btn-group .layui-btn:first-child{border-left: none; border-radius: 2px 0 0 2px;} +.layui-btn-group .layui-btn-primary:first-child{border-left: 1px solid #c9c9c9;} +.layui-btn-group .layui-btn:last-child{border-radius: 0 2px 2px 0;} +.layui-btn-group .layui-btn+.layui-btn{margin-left: 0;} +.layui-btn-group+.layui-btn-group{margin-left: 10px;} +/* 流体 */.layui-btn-fluid{width: 100%;} + +/** 表单 **/ +.layui-input, .layui-textarea, .layui-select{height: 38px; line-height: 1.3; line-height: 38px\9; border-width: 1px; border-style: solid; background-color: #fff; border-radius: 2px;} +.layui-input::-webkit-input-placeholder, +.layui-textarea::-webkit-input-placeholder, +.layui-select::-webkit-input-placeholder{line-height: 1.3;} +.layui-input, .layui-textarea{display: block; width: 100%; padding-left: 10px;} +.layui-input:hover, .layui-textarea:hover{border-color: #D2D2D2 !important;} +.layui-input:focus, .layui-textarea:focus{border-color: #C9C9C9 !important;} +.layui-textarea{position: relative; min-height: 100px; height: auto; line-height: 20px; padding: 6px 10px; resize: vertical;} +.layui-select{padding: 0 10px;} +.layui-form select, +.layui-form input[type=checkbox], +.layui-form input[type=radio]{display: none;} +.layui-form *[lay-ignore]{display: initial;} + +.layui-form-item{margin-bottom: 15px; clear: both; *zoom: 1;} +.layui-form-item:after{content:'\20'; clear: both; *zoom: 1; display: block; height:0;} +.layui-form-label{position: relative; float: left; display: block; padding: 9px 15px; width: 80px; font-weight: 400; line-height: 20px; text-align: right;} +.layui-form-label-col{display: block; float: none; padding: 9px 0; line-height: 20px; text-align: left;} +.layui-form-item .layui-inline{margin-bottom: 5px; margin-right: 10px;} +.layui-input-block, .layui-input-inline{position: relative;} +.layui-input-block{margin-left: 110px; min-height: 36px;} +.layui-input-inline{display: inline-block; vertical-align: middle;} +.layui-form-item .layui-input-inline{float: left; width: 190px; margin-right: 10px;} +.layui-form-text .layui-input-inline{width: auto;} + +/* 分割块 */.layui-form-mid{position: relative; float: left; display: block; padding: 9px 0 !important; line-height: 20px; margin-right: 10px;} +/* 警告域 */.layui-form-danger:focus +,.layui-form-danger+.layui-form-select .layui-input{border-color: #FF5722 !important;} + + +/* 下拉选择 */.layui-form-select{position: relative;} +.layui-form-select .layui-input{padding-right: 30px; cursor: pointer;} +.layui-form-select .layui-edge{position: absolute; right: 10px; top: 50%; margin-top: -3px; cursor: pointer; border-width: 6px; border-top-color: #c2c2c2; border-top-style: solid; transition: all .3s; -webkit-transition: all .3s;} +.layui-form-select dl{display: none; position: absolute; left: 0; top: 42px; padding: 5px 0; z-index: 899; min-width: 100%; border: 1px solid #d2d2d2; max-height: 300px; overflow-y: auto; background-color: #fff; border-radius: 2px; box-shadow: 0 2px 4px rgba(0,0,0,.12); box-sizing: border-box;} +.layui-form-select dl dt, +.layui-form-select dl dd{padding: 0 10px; line-height: 36px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;} +.layui-form-select dl dt{font-size: 12px; color: #999;} +.layui-form-select dl dd{cursor: pointer;} +.layui-form-select dl dd:hover{background-color: #f2f2f2; -webkit-transition: .5s all; transition: .5s all;} +.layui-form-select .layui-select-group dd{padding-left: 20px;} +.layui-form-select dl dd.layui-select-tips{padding-left: 10px !important; color: #999;} +.layui-form-select dl dd.layui-this{background-color: #5FB878; color: #fff;} +.layui-form-select dl dd.layui-disabled{background-color: #fff;} +.layui-form-selected dl{display: block;} +.layui-form-selected .layui-edge{margin-top: -9px; -webkit-transform:rotate(180deg); transform: rotate(180deg);} +.layui-form-selected .layui-edge{margin-top: -3px\0; } +:root .layui-form-selected .layui-edge{margin-top: -9px\0/IE9;} +.layui-form-selectup dl{top: auto; bottom: 42px;} +.layui-select-none{margin: 5px 0; text-align: center; color: #999;} + +.layui-select-disabled .layui-disabled{border-color: #eee !important;} +.layui-select-disabled .layui-edge{border-top-color: #d2d2d2} + +/* 复选框 */.layui-form-checkbox{position: relative; display: inline-block; vertical-align: middle; height: 30px; line-height: 30px; margin-right: 10px; padding-right: 30px; background-color: #fff; cursor: pointer; font-size: 0; -webkit-transition: .1s linear; transition: .1s linear; box-sizing: border-box;} +.layui-form-checkbox:hover{} +.layui-form-checkbox *{display: inline-block; vertical-align: middle;} +.layui-form-checkbox span{padding: 0 10px; height: 100%; font-size: 14px; border-radius: 2px 0 0 2px; background-color: #d2d2d2; color: #fff; overflow: hidden; white-space: nowrap; text-overflow: ellipsis;} +.layui-form-checkbox:hover span{background-color: #c2c2c2;} +.layui-form-checkbox i{position: absolute; right: 0; top: 0; width: 30px; height: 28px; border: 1px solid #d2d2d2; border-left: none; border-radius: 0 2px 2px 0; color: #fff; font-size: 20px; text-align: center;} +.layui-form-checkbox:hover i{border-color: #c2c2c2; color: #c2c2c2;} +.layui-form-checked, .layui-form-checked:hover{border-color: #5FB878;} +.layui-form-checked span, .layui-form-checked:hover span{background-color: #5FB878;} +.layui-form-checked i, .layui-form-checked:hover i{color: #5FB878;} +.layui-form-item .layui-form-checkbox{margin-top: 4px;} + +/* 复选框-原始风格 */.layui-form-checkbox[lay-skin="primary"]{height: auto!important; line-height: normal!important; min-width: 18px; min-height: 18px; border: none!important; margin-right: 0; padding-left: 28px; padding-right: 0; background: none;} +.layui-form-checkbox[lay-skin="primary"] span{padding-left: 0; padding-right: 15px; line-height: 18px; background: none; color: #666;} +.layui-form-checkbox[lay-skin="primary"] i{right: auto; left: 0; width: 16px; height: 16px; line-height: 16px; border: 1px solid #d2d2d2; font-size: 12px; border-radius: 2px; background-color: #fff; -webkit-transition: .1s linear; transition: .1s linear;} +.layui-form-checkbox[lay-skin="primary"]:hover i{border-color: #5FB878; color: #fff;} +.layui-form-checked[lay-skin="primary"] i{border-color: #5FB878; background-color: #5FB878; color: #fff;} +.layui-checkbox-disbaled[lay-skin="primary"] span{background: none!important; color: #c2c2c2;} +.layui-checkbox-disbaled[lay-skin="primary"]:hover i{border-color: #d2d2d2;} +.layui-form-item .layui-form-checkbox[lay-skin="primary"]{margin-top: 10px;} + +/* 复选框-开关风格 */.layui-form-switch{position: relative; display: inline-block; vertical-align: middle; height: 22px; line-height: 22px; min-width: 35px; padding: 0 5px; margin-top: 8px; border: 1px solid #d2d2d2; border-radius: 20px; cursor: pointer; background-color: #fff; -webkit-transition: .1s linear; transition: .1s linear;} +.layui-form-switch i{position: absolute; left: 5px; top: 3px; width: 16px; height: 16px; border-radius: 20px; background-color: #d2d2d2; -webkit-transition: .1s linear; transition: .1s linear;} +.layui-form-switch em{position: relative; top: 0; width: 25px; margin-left: 21px; padding: 0!important; text-align: center!important; color: #999!important; font-style: normal!important; font-size: 12px;} +.layui-form-onswitch{border-color: #5FB878; background-color: #5FB878;} +.layui-form-onswitch i{left: 100%; margin-left: -21px; background-color: #fff;} +.layui-form-onswitch em{margin-left: 5px; margin-right: 21px; color: #fff!important;} + +.layui-checkbox-disbaled{border-color: #e2e2e2 !important;} +.layui-checkbox-disbaled span{background-color: #e2e2e2 !important;} +.layui-checkbox-disbaled i{border-color: #e2e2e2 !important;} +.layui-checkbox-disbaled:hover i{color: #fff !important;} + +/* 单选框 */ +*[lay-radio]{display: none;} +.layui-form-radio{display: inline-block; vertical-align: middle; line-height: 28px; margin: 6px 10px 0 0; padding-right: 10px; cursor: pointer; font-size: 0;} +.layui-form-radio *{display: inline-block; vertical-align: middle; font-size: 14px;} +.layui-form-radio>i{margin-right: 8px; font-size: 22px; color: #c2c2c2;} +.layui-form-radioed>i,.layui-form-radio>i:hover{color: #5FB878;} +.layui-radio-disbaled>i{color: #e2e2e2 !important;} + +/* 表单方框风格 */.layui-form-pane .layui-form-label{width: 110px; padding: 8px 15px; height: 38px; line-height: 20px; border-width: 1px; border-style: solid; border-radius: 2px 0 0 2px; text-align: center; background-color: #FBFBFB; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; box-sizing: border-box;} +.layui-form-pane .layui-input-inline{margin-left: -1px;} +.layui-form-pane .layui-input-block{margin-left: 110px; left: -1px;} +.layui-form-pane .layui-input{border-radius: 0 2px 2px 0;} +.layui-form-pane .layui-form-text .layui-form-label{float: none; width: 100%; border-radius: 2px; box-sizing: border-box; text-align: left;} +.layui-form-pane .layui-form-text .layui-input-inline{display: block; margin: 0; top: -1px; clear: both;} +.layui-form-pane .layui-form-text .layui-input-block{margin: 0; left: 0; top: -1px;} +.layui-form-pane .layui-form-text .layui-textarea{min-height: 100px; border-radius: 0 0 2px 2px;} +.layui-form-pane .layui-form-checkbox{margin: 4px 0 4px 10px;} +.layui-form-pane .layui-form-switch, +.layui-form-pane .layui-form-radio{margin-top: 6px; margin-left: 10px; } +.layui-form-pane .layui-form-item[pane]{position: relative; border-width: 1px; border-style: solid;} +.layui-form-pane .layui-form-item[pane] .layui-form-label{position: absolute; left: 0; top: 0; height: 100%; border-width: 0px; border-right-width: 1px;} +.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left: 110px;} + +/** 表单响应式 **/ +@media screen and (max-width: 450px) { + .layui-form-item .layui-form-label{text-overflow: ellipsis; overflow: hidden; white-space: nowrap;} + .layui-form-item .layui-inline{display: block; margin-right: 0; margin-bottom: 20px; clear: both;} + .layui-form-item .layui-inline:after{content:'\20'; clear:both; display:block; height:0;} + .layui-form-item .layui-input-inline{display: block; float: none; left: -3px; width: auto; margin: 0 0 10px 112px; } + .layui-form-item .layui-input-inline+.layui-form-mid{margin-left: 110px; top: -5px; padding: 0;} + .layui-form-item .layui-form-checkbox{margin-right: 5px; margin-bottom: 5px;} +} + +/** 富文本编辑器 **/ +.layui-layedit{border-width: 1px; border-style: solid; border-radius: 2px;} +.layui-layedit-tool{padding: 3px 5px; border-bottom-width: 1px; border-bottom-style: solid; font-size: 0;} +.layedit-tool-fixed{position: fixed; top: 0; border-top: 1px solid #e2e2e2;} +.layui-layedit-tool .layedit-tool-mid, +.layui-layedit-tool .layui-icon{display: inline-block; vertical-align: middle; text-align: center; font-size: 14px;} +.layui-layedit-tool .layui-icon{position: relative; width: 32px; height: 30px; line-height: 30px; margin: 3px 5px; border-radius: 2px; color: #777; cursor: pointer; border-radius: 2px;} +.layui-layedit-tool .layui-icon:hover{color: #393D49;} +.layui-layedit-tool .layui-icon:active{color: #000;} +.layui-layedit-tool .layedit-tool-active{background-color: #e2e2e2; color: #000;} +.layui-layedit-tool .layui-disabled, +.layui-layedit-tool .layui-disabled:hover{color: #d2d2d2; cursor: not-allowed;} +.layui-layedit-tool .layedit-tool-mid{width: 1px; height: 18px; margin: 0 10px; background-color: #d2d2d2;} + +.layedit-tool-html{width: 50px !important; font-size: 30px !important;} +.layedit-tool-b, +.layedit-tool-code, +.layedit-tool-help{font-size: 16px !important;} +.layedit-tool-d, +.layedit-tool-unlink, +.layedit-tool-face, +.layedit-tool-image{font-size: 18px !important;} +.layedit-tool-image input{position: absolute; font-size: 0; left: 0; top: 0; width: 100%; height: 100%; opacity: 0.01; filter: Alpha(opacity=1); cursor: pointer;} + +.layui-layedit-iframe iframe{display: block; width: 100%;} +#LAY_layedit_code{overflow: hidden;} + +/** 分页 **/ +.layui-laypage{display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; margin: 10px 0; font-size: 0;} +.layui-laypage>a:first-child, +.layui-laypage>a:first-child em{border-radius: 2px 0 0 2px;} +.layui-laypage>a:last-child, +.layui-laypage>a:last-child em{border-radius: 0 2px 2px 0;} +.layui-laypage>*:first-child{margin-left: 0!important;} +.layui-laypage>*:last-child{margin-right: 0!important;} +.layui-laypage a, +.layui-laypage span, +.layui-laypage input, +.layui-laypage button, +.layui-laypage select{border: 1px solid #e2e2e2;} +.layui-laypage a, +.layui-laypage span{display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; padding: 0 15px; height: 28px; line-height: 28px; margin: 0 -1px 5px 0; background-color: #fff; color: #333; font-size: 12px;} +.layui-laypage a:hover{color: #009688;} +.layui-laypage em{font-style: normal;} +.layui-laypage .layui-laypage-spr{color:#999; font-weight: 700;} +.layui-laypage a{ text-decoration: none;} +.layui-laypage .layui-laypage-curr{position: relative;} +.layui-laypage .layui-laypage-curr em{position: relative; color: #fff;} +.layui-laypage .layui-laypage-curr .layui-laypage-em{position: absolute; left: -1px; top: -1px; padding: 1px; width: 100%; height: 100%; background-color: #009688; } +.layui-laypage-em{border-radius: 2px;} +.layui-laypage-prev em, +.layui-laypage-next em{font-family: Sim sun; font-size: 16px;} + +.layui-laypage .layui-laypage-count, +.layui-laypage .layui-laypage-limits, +.layui-laypage .layui-laypage-refresh, +.layui-laypage .layui-laypage-skip{margin-left: 10px; margin-right: 10px; padding: 0; border: none;} +.layui-laypage .layui-laypage-limits, +.layui-laypage .layui-laypage-refresh{vertical-align: top;} +.layui-laypage .layui-laypage-refresh i{font-size: 18px; cursor: pointer;} +.layui-laypage select{height: 22px; padding: 3px; border-radius: 2px; cursor: pointer;} +.layui-laypage .layui-laypage-skip{height: 30px; line-height: 30px; color: #999;} +.layui-laypage input, .layui-laypage button{height: 30px; line-height: 30px; border-radius: 2px; vertical-align: top; background-color: #fff; box-sizing: border-box;} +.layui-laypage input{display: inline-block; width: 40px; margin: 0 10px; padding: 0 3px; text-align: center;} +.layui-laypage input:focus, +.layui-laypage select:focus{border-color: #009688!important;} +.layui-laypage button{margin-left: 10px; padding: 0 10px; cursor: pointer;} + +/** 流加载 **/ +.layui-flow-more{margin: 10px 0; text-align: center; color: #999; font-size: 14px;} +.layui-flow-more a{ height: 32px; line-height: 32px; } +.layui-flow-more a *{display: inline-block; vertical-align: top;} +.layui-flow-more a cite{padding: 0 20px; border-radius: 3px; background-color: #eee; color: #333; font-style: normal;} +.layui-flow-more a cite:hover{opacity: 0.8;} +.layui-flow-more a i{font-size: 30px; color: #737383;} + +/** 表格 **/ +.layui-table{width: 100%; margin: 10px 0; background-color: #fff; color: #666;} +.layui-table tr{transition: all .3s; -webkit-transition: all .3s;} +.layui-table th{text-align: left; font-weight: 400;} + +.layui-table thead tr, +.layui-table-header, +.layui-table-tool, +.layui-table-total, +.layui-table-total tr, +.layui-table-patch, +.layui-table-mend, +.layui-table[lay-even] tr:nth-child(even), +.layui-table tbody tr:hover, +.layui-table-hover, +.layui-table-click{background-color: #f2f2f2;} + +.layui-table th, +.layui-table td, +.layui-table[lay-skin="line"], +.layui-table[lay-skin="row"], +.layui-table-view, +.layui-table-tool, +.layui-table-header, +.layui-table-col-set, +.layui-table-total, +.layui-table-page, +.layui-table-fixed-r, +.layui-table-tips-main, +.layui-table-grid-down{border-width: 1px; border-style: solid; border-color: #e6e6e6;} + +.layui-table th, .layui-table td{position: relative; padding: 9px 15px; min-height: 20px; line-height: 20px; font-size: 14px;} + +.layui-table[lay-skin="line"] th, .layui-table[lay-skin="line"] td{border-width: 0; border-bottom-width: 1px;} +.layui-table[lay-skin="row"] th, .layui-table[lay-skin="row"] td{border-width: 0;border-right-width: 1px;} +.layui-table[lay-skin="nob"] th, .layui-table[lay-skin="nob"] td{border: none;} + +.layui-table img{max-width:100px;} + +/* 大表格 */.layui-table[lay-size="lg"] th, +.layui-table[lay-size="lg"] td{padding-top: 15px; padding-right: 30px; padding-bottom: 15px; padding-left: 30px;} +.layui-table-view .layui-table[lay-size="lg"] .layui-table-cell{height: 40px; line-height: 40px;} +/* 小表格 */.layui-table[lay-size="sm"] th, +.layui-table[lay-size="sm"] td{padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; font-size: 12px;} +.layui-table-view .layui-table[lay-size="sm"] .layui-table-cell{height: 20px; line-height: 20px;} + +/* 数据表格 */ +.layui-table[lay-data]{display: none;} +.layui-table-box{position: relative; overflow: hidden;} +.layui-table-view{margin: 10px 0;} +.layui-table-view .layui-table{position: relative; width: auto; margin: 0;} +.layui-table-view .layui-table[lay-skin="line"]{border-width: 0; border-right-width: 1px;} +.layui-table-view .layui-table[lay-skin="row"]{border-width: 0; border-bottom-width: 1px;} +.layui-table-view .layui-table th, +.layui-table-view .layui-table td{padding: 5px 0; border-top: none; border-left: none;} +.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor: pointer;} +.layui-table-view .layui-table td{cursor: default;} +.layui-table-view .layui-form-checkbox[lay-skin="primary"] i{width: 18px; height: 18px;} +.layui-table-view .layui-form-radio{line-height: 0; padding: 0;} +.layui-table-view .layui-form-radio>i{margin: 0; font-size: 20px;} +.layui-table-init{position: absolute; left: 0; top: 0; width: 100%; height: 100%; text-align: center; z-index: 110;} +.layui-table-init .layui-icon{position: absolute; left: 50%; top: 50%; margin: -15px 0 0 -15px; font-size: 30px; color: #c2c2c2;} +.layui-table-header{border-width: 0; border-bottom-width: 1px; overflow: hidden;} +.layui-table-header .layui-table{margin-bottom: -1px;} + +.layui-table-tool .layui-inline[lay-event]{position: relative; width: 26px; height: 26px; padding: 5px; line-height: 16px; margin-right: 10px; text-align: center; color: #333; border: 1px solid #ccc; cursor: pointer; -webkit-transition: .5s all; transition: .5s all;} +.layui-table-tool .layui-inline[lay-event]:hover{border: 1px solid #999;} +.layui-table-tool-temp{padding-right: 120px;} +.layui-table-tool-self{position: absolute; right: 17px; top: 10px;} +.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin: 0 0 0 10px;} +.layui-table-tool-panel{position: absolute; top: 29px; left: -1px; padding: 5px 0; min-width: 150px; min-height: 40px; border: 1px solid #d2d2d2; text-align: left; overflow-y: auto; background-color: #fff; box-shadow: 0 2px 4px rgba(0,0,0,.12);} +.layui-table-tool-panel li{padding: 0 10px; line-height: 30px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; -webkit-transition: .5s all; transition: .5s all;} +.layui-table-tool-panel li .layui-form-checkbox[lay-skin="primary"]{width: 100%;} +.layui-table-tool-panel li:hover{background-color: #f2f2f2;} +.layui-table-tool-panel li .layui-form-checkbox[lay-skin="primary"]{padding-left: 28px;} +.layui-table-tool-panel li .layui-form-checkbox[lay-skin="primary"] i{position: absolute; left: 0; top: 0;} +.layui-table-tool-panel li .layui-form-checkbox[lay-skin="primary"] span{padding: 0;} +.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left: auto; right: -1px;} + +.layui-table-col-set{position: absolute; right: 0; top: 0; width: 20px; height: 100%; border-width: 0; border-left-width: 1px; background-color: #fff;} + +.layui-table-sort{width: 10px; height: 20px; margin-left: 5px; cursor: pointer!important;} +.layui-table-sort .layui-edge{position: absolute; left: 5px; border-width: 5px;} +.layui-table-sort .layui-table-sort-asc{top: 3px; border-top: none; border-bottom-style: solid; border-bottom-color: #b2b2b2;} +.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color: #666;} +.layui-table-sort .layui-table-sort-desc{bottom: 5px; border-bottom: none; border-top-style: solid; border-top-color: #b2b2b2;} +.layui-table-sort .layui-table-sort-desc:hover{border-top-color: #666;} +.layui-table-sort[lay-sort="asc"] .layui-table-sort-asc{border-bottom-color: #000;} +.layui-table-sort[lay-sort="desc"] .layui-table-sort-desc{border-top-color: #000;} + +.layui-table-cell{height: 28px; line-height: 28px; padding: 0 15px; position: relative; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; box-sizing: border-box;} +.layui-table-cell .layui-form-checkbox[lay-skin="primary"]{top: -1px; padding: 0;} +.layui-table-cell .layui-table-link{color: #01AAED;} + +.laytable-cell-checkbox, +.laytable-cell-radio, +.laytable-cell-space, +.laytable-cell-numbers{padding: 0; text-align: center;} + +.layui-table-body{position: relative; overflow: auto; margin-right: -1px; margin-bottom: -1px;} +.layui-table-body .layui-none{line-height: 26px; padding: 15px; text-align: center; color: #999;} +.layui-table-fixed{position: absolute; left: 0; top: 0; z-index: 101;} +.layui-table-fixed .layui-table-body{overflow: hidden;} +.layui-table-fixed-l{box-shadow: 0 -1px 8px rgba(0,0,0,.08);} +.layui-table-fixed-r{left: auto; right: -1px; border-width: 0; border-left-width: 1px; box-shadow: -1px 0 8px rgba(0,0,0,.08);} +.layui-table-fixed-r .layui-table-header{position: relative; overflow: visible;} +.layui-table-mend{position: absolute; right: -49px; top: 0; height: 100%; width: 50px;} + +.layui-table-tool{position: relative; z-index: 890; width: 100%; min-height: 50px; line-height: 30px; padding: 10px 15px; border-width: 0; border-bottom-width: 1px;} +.layui-table-tool .layui-btn-container{margin-bottom: -10px;} + +.layui-table-total{margin-bottom: -1px; border-width: 0; border-top-width: 1px; overflow: hidden;} + + +.layui-table-page{position: relative; width: 100%; padding: 7px 7px 0; border-width: 0; border-top-width: 1px; height: 41px; margin-bottom: -1px; font-size: 12px; white-space: nowrap; overflow: hidden;} +.layui-table-page>div{height: 26px;} +.layui-table-page .layui-laypage{margin: 0;} +.layui-table-page .layui-laypage a, +.layui-table-page .layui-laypage span{height: 26px; line-height: 26px; margin-bottom: 10px; border: none; background: none;} +.layui-table-page .layui-laypage a, +.layui-table-page .layui-laypage span.layui-laypage-curr{padding: 0 12px;} +.layui-table-page .layui-laypage span{margin-left: 0; padding: 0;} +.layui-table-page .layui-laypage .layui-laypage-prev{margin-left: -7px!important;} +.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left: 0; top: 0; padding: 0;} +.layui-table-page .layui-laypage input, +.layui-table-page .layui-laypage button{height: 26px; line-height: 26px; } +.layui-table-page .layui-laypage input{width: 40px;} +.layui-table-page .layui-laypage button{padding: 0 10px;} +.layui-table-page select{height: 18px;} +.layui-table-view select[lay-ignore]{display: inline-block;} + +.layui-table-patch .layui-table-cell{padding: 0; width: 30px;} + +.layui-table-edit{position: absolute; left: 0; top: 0; width: 100%; height: 100%; padding: 0 14px 1px; border-radius: 0; box-shadow: 1px 1px 20px rgba(0,0,0,.15)} +.layui-table-edit:focus{border-color: #5FB878!important;} +select.layui-table-edit{padding: 0 0 0 10px; border-color: #C9C9C9;} +.layui-table-view .layui-form-switch, +.layui-table-view .layui-form-checkbox, +.layui-table-view .layui-form-radio{top: 0; margin: 0; box-sizing: content-box;} +.layui-table-view .layui-form-checkbox{top: -1px; height: 26px; line-height: 26px;} +.layui-table-view .layui-form-checkbox i{height: 26px;} + +/* 展开溢出的单元格 */ +.layui-table-grid .layui-table-cell{overflow: visible;} +.layui-table-grid-down{position: absolute; top: 0; right: 0; width: 26px; height: 100%; padding: 5px 0; border-width: 0; border-left-width: 1px; text-align: center; background-color: #fff; color: #999; cursor: pointer;} +.layui-table-grid-down .layui-icon{position: absolute; top: 50%; left: 50%; margin: -8px 0 0 -8px;} +.layui-table-grid-down:hover{background-color: #fbfbfb;} + +body .layui-table-tips .layui-layer-content{background: none; padding: 0; box-shadow: 0 1px 6px rgba(0,0,0,.12);} +.layui-table-tips-main{margin: -44px 0 0 -1px; max-height: 150px; padding: 8px 15px; font-size: 14px; overflow-y: scroll; background-color: #fff; color: #666;} +.layui-table-tips-c{position: absolute; right: -3px; top: -13px; width: 20px; height: 20px; padding: 3px; cursor: pointer; background-color: #666; border-radius: 50%; color: #fff;} +.layui-table-tips-c:hover{background-color: #777;} +.layui-table-tips-c:before{position: relative; right: -2px;} + +/** 文件上传 **/ +.layui-upload-file{display: none!important; opacity: .01; filter: Alpha(opacity=1);} +.layui-upload-list{margin: 10px 0;} +.layui-upload-choose{padding: 0 10px; color: #999;} +.layui-upload-drag{position: relative; display: inline-block; padding: 30px; border: 1px dashed #e2e2e2; background-color: #fff; text-align: center; cursor: pointer; color: #999;} +.layui-upload-drag .layui-icon{font-size: 50px; color: #009688;} +.layui-upload-drag[lay-over]{border-color: #009688} +.layui-upload-form{display: inline-block;} +.layui-upload-iframe{position: absolute; width: 0; height: 0; border: 0; visibility: hidden} +.layui-upload-wrap{position: relative; display: inline-block; vertical-align: middle;} +.layui-upload-wrap .layui-upload-file{display: block!important; position: absolute; left: 0; top: 0; z-index: 10; font-size: 100px; width: 100%; height: 100%; opacity: .01; filter: Alpha(opacity=1); cursor: pointer;} + +/** 树组件(重写中) **/ +.layui-tree{line-height: 26px;} +.layui-tree li{text-overflow: ellipsis; overflow:hidden; white-space: nowrap;} +.layui-tree li a, +.layui-tree li .layui-tree-spread{display: inline-block; vertical-align: top; height: 26px; *display: inline; *zoom:1; cursor: pointer;} +.layui-tree li a{font-size: 0;} +.layui-tree li a i{font-size: 16px;} +.layui-tree li a cite{padding: 0 6px; font-size: 14px; font-style: normal;} +.layui-tree li i{padding-left: 6px; color: #333; -moz-user-select: none;} +.layui-tree li .layui-tree-check{font-size: 13px;} +.layui-tree li .layui-tree-check:hover{color: #009E94;} +.layui-tree li ul{display: none; margin-left: 20px;} +.layui-tree li .layui-tree-enter{line-height: 24px; border: 1px dotted #000;} +.layui-tree-drag{display: none; position: absolute; left: -666px; top: -666px; background-color: #f2f2f2; padding: 5px 10px; border: 1px dotted #000; white-space: nowrap} +.layui-tree-drag i{padding-right: 5px;} + +/** 导航菜单 **/ +.layui-nav{position: relative; padding: 0 20px; background-color: #393D49; color: #fff; border-radius: 2px; font-size: 0; box-sizing: border-box;} +.layui-nav *{font-size: 14px;} +.layui-nav .layui-nav-item{position: relative; display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; line-height: 60px;} +.layui-nav .layui-nav-item a{display: block; padding: 0 20px; color: #fff; color: rgba(255,255,255,.7); transition: all .3s; -webkit-transition: all .3s;} +.layui-nav-bar, +.layui-nav .layui-this:after, +.layui-nav-tree .layui-nav-itemed:after{position: absolute; left: 0; top: 0; width: 0; height: 5px; background-color: #5FB878; transition: all .2s; -webkit-transition: all .2s;} +.layui-nav-bar{z-index: 1000;} +.layui-nav .layui-this a +,.layui-nav .layui-nav-item a:hover{color: #fff;} +.layui-nav .layui-this:after{content: ''; top: auto; bottom: 0; width: 100%;} +.layui-nav-img{width: 30px; height: 30px; margin-right: 10px; border-radius: 50%;} + +.layui-nav .layui-nav-more{content:''; width: 0; height: 0; border-style: dashed; border-color: transparent; overflow: hidden; cursor: pointer; transition: all .2s; -webkit-transition: all .2s;} +.layui-nav .layui-nav-more{position: absolute; top: 50%; right: 3px; margin-top: -3px; border-width: 6px; border-top-style: solid; border-top-color: #fff; border-top-color: rgba(255,255,255,.7);} +.layui-nav .layui-nav-mored, +.layui-nav-itemed > a .layui-nav-more{margin-top: -9px; border-style: dashed; border-color: transparent; border-bottom-style: solid; border-bottom-color: #fff;} + + +.layui-nav-child{display: none; position: absolute; left: 0; top: 65px; min-width: 100%; line-height: 36px; padding: 5px 0; box-shadow: 0 2px 4px rgba(0,0,0,.12); border: 1px solid #d2d2d2; background-color: #fff; z-index: 100; border-radius: 2px; white-space: nowrap;} +.layui-nav .layui-nav-child a{color: #333;} +.layui-nav .layui-nav-child a:hover{background-color: #f2f2f2; color: #000;} +.layui-nav-child dd{position: relative;} +.layui-nav-child dd.layui-this{background-color: #5FB878; color: #fff;} +.layui-nav .layui-nav-child dd.layui-this a{background-color: #5FB878; color: #fff;} +.layui-nav-child dd.layui-this:after{display: none;} + +/* 垂直导航菜单 */.layui-nav-tree{width: 200px; padding: 0;} +.layui-nav-tree .layui-nav-item{display: block; width: 100%; line-height: 45px;} +.layui-nav-tree .layui-nav-item a{position: relative; height: 45px; line-height: 45px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;} +.layui-nav-tree .layui-nav-item a:hover{background-color: #4E5465;} +.layui-nav-tree .layui-nav-bar{width: 5px; height: 0;} +.layui-nav-tree .layui-this, +.layui-nav-tree .layui-this>a, +.layui-nav-tree .layui-this>a:hover, +.layui-nav-tree .layui-nav-child dd.layui-this, +.layui-nav-tree .layui-nav-child dd.layui-this a{background-color: #009688; color: #fff;} +.layui-nav-tree .layui-this:after{display: none;} +.layui-nav-tree .layui-nav-title a, +.layui-nav-tree .layui-nav-title a:hover, +.layui-nav-itemed>a{color: #fff !important;} +.layui-nav-tree .layui-nav-bar{background-color: #009688;} + +.layui-nav-tree .layui-nav-child{position: relative; z-index: 0; top: 0; border: none; box-shadow: none;} +.layui-nav-tree .layui-nav-child a{height: 40px; line-height: 40px;} +.layui-nav-tree .layui-nav-child a{color: #fff; color: rgba(255,255,255,.7);} +.layui-nav-tree .layui-nav-child a:hover, +.layui-nav-tree .layui-nav-child{background: none; color: #fff;} +.layui-nav-tree .layui-nav-more{right: 10px;} + +.layui-nav-itemed>.layui-nav-child{display: block; padding: 0; background-color: rgba(0,0,0,.3) !important;} +.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display: block;} + +/* 侧边 */.layui-nav-side{position: fixed; top: 0; bottom: 0; left: 0; overflow-x: hidden; z-index: 999;} + +/* 导航主题色 */.layui-bg-blue .layui-nav-bar, +.layui-bg-blue .layui-this:after, +.layui-bg-blue .layui-nav-itemed:after{background-color: #93D1FF;} +.layui-bg-blue .layui-nav-child dd.layui-this{background-color: #1E9FFF;} +.layui-nav-tree.layui-bg-blue .layui-nav-title a, +.layui-nav-tree.layui-bg-blue .layui-nav-title a:hover, +.layui-bg-blue .layui-nav-itemed>a{background-color: #007DDB !important;} + + +/** 面包屑 **/ +.layui-breadcrumb{visibility: hidden; font-size: 0;} +.layui-breadcrumb>*{font-size: 14px;} +.layui-breadcrumb a{color: #999 !important;} +.layui-breadcrumb a:hover{color: #5FB878 !important;} +.layui-breadcrumb a cite{color: #666; font-style: normal;} +.layui-breadcrumb span[lay-separator]{margin: 0 10px; color: #999;} + +/** Tab选项卡 **/ +.layui-tab{margin: 10px 0; text-align: left !important;} +.layui-tab[overflow]>.layui-tab-title{overflow: hidden;} +.layui-tab-title{position: relative; left: 0; height: 40px; white-space: nowrap; font-size: 0; border-bottom-width: 1px; border-bottom-style: solid; transition: all .2s; -webkit-transition: all .2s;} +.layui-tab-title li{display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; font-size: 14px; transition: all .2s; -webkit-transition: all .2s;} +.layui-tab-title li{position: relative; line-height: 40px; min-width: 65px; padding: 0 15px; text-align: center; cursor: pointer;} +.layui-tab-title li a{display: block;} +.layui-tab-title .layui-this{color: #000;} + +.layui-tab-title .layui-this:after{position: absolute; left:0; top: 0; content: ''; width:100%; height: 41px; border-width: 1px; border-style: solid; border-bottom-color: #fff; border-radius: 2px 2px 0 0; box-sizing: border-box; pointer-events: none;} +.layui-tab-bar{position: absolute; right: 0; top: 0; z-index: 10; width: 30px; height: 39px; line-height: 39px; border-width: 1px; border-style: solid; border-radius: 2px; text-align: center; background-color: #fff; cursor: pointer;} +.layui-tab-bar .layui-icon{position: relative; display: inline-block; top: 3px; transition: all .3s; -webkit-transition: all .3s;} +.layui-tab-item{display: none;} +.layui-tab-more{padding-right: 30px; height: auto !important; white-space: normal !important;} +.layui-tab-more li.layui-this:after{border-bottom-color: #e2e2e2; border-radius: 2px;} +.layui-tab-more .layui-tab-bar .layui-icon{top: -2px; top: 3px\0; -webkit-transform: rotate(180deg); transform: rotate(180deg);} +:root .layui-tab-more .layui-tab-bar .layui-icon{top: -2px\0/IE9;} + +.layui-tab-content{padding: 10px;} + +/* Tab关闭 */.layui-tab-title li .layui-tab-close{position: relative; display: inline-block; width: 18px; height: 18px; line-height: 20px; margin-left: 8px; top: 1px; text-align: center; font-size: 14px; color: #c2c2c2; transition: all .2s; -webkit-transition: all .2s;} +.layui-tab-title li .layui-tab-close:hover{border-radius: 2px; background-color: #FF5722; color: #fff;} + +/* Tab简洁风格 */.layui-tab-brief > .layui-tab-title .layui-this{color: #009688;} +.layui-tab-brief > .layui-tab-title .layui-this:after +,.layui-tab-brief > .layui-tab-more li.layui-this:after{border: none; border-radius: 0; border-bottom: 2px solid #5FB878;} +.layui-tab-brief[overflow] > .layui-tab-title .layui-this:after{top: -1px;} + +/* Tab卡片风格 */.layui-tab-card{border-width: 1px; border-style: solid; border-radius: 2px; box-shadow: 0 2px 5px 0 rgba(0,0,0,.1);} +.layui-tab-card > .layui-tab-title{ background-color: #f2f2f2;} +.layui-tab-card > .layui-tab-title li{margin-right: -1px; margin-left: -1px;} +.layui-tab-card > .layui-tab-title .layui-this{background-color: #fff; } +.layui-tab-card > .layui-tab-title .layui-this:after{border-top: none; border-width: 1px; border-bottom-color: #fff;} +.layui-tab-card > .layui-tab-title .layui-tab-bar{height: 40px; line-height: 40px; border-radius: 0; border-top: none; border-right: none;} +.layui-tab-card > .layui-tab-more .layui-this{background: none; color: #5FB878;} +.layui-tab-card > .layui-tab-more .layui-this:after{border: none;} + +/* 时间线 */ +.layui-timeline{padding-left: 5px;} +.layui-timeline-item{position: relative; padding-bottom: 20px;} +.layui-timeline-axis{position: absolute; left: -5px; top: 0; z-index: 10; width: 20px; height: 20px; line-height: 20px; background-color: #fff; color: #5FB878; border-radius: 50%; text-align: center; cursor: pointer;} +.layui-timeline-axis:hover{color: #FF5722;} +.layui-timeline-item:before{content: ''; position: absolute; left: 5px; top: 0; z-index: 0; width: 1px; height: 100%;} +.layui-timeline-item:last-child:before{display: none;} +.layui-timeline-item:first-child:before{display: block;} +.layui-timeline-content{padding-left: 25px;;} +.layui-timeline-title{position: relative; margin-bottom: 10px;} + +/* 小徽章 */ +.layui-badge, +.layui-badge-dot, +.layui-badge-rim{position:relative; display: inline-block; padding: 0 6px; font-size: 12px; text-align: center; background-color: #FF5722; color: #fff; border-radius: 2px;} +.layui-badge{height: 18px; line-height: 18px;} +.layui-badge-dot{width: 8px; height: 8px; padding: 0; border-radius: 50%;} +.layui-badge-rim{height: 18px; line-height: 18px; border-width: 1px; border-style: solid; background-color: #fff; color: #666;} + +.layui-btn .layui-badge, +.layui-btn .layui-badge-dot{margin-left: 5px;} +.layui-nav .layui-badge, +.layui-nav .layui-badge-dot{position: absolute; top: 50%; margin: -8px 6px 0;} +.layui-tab-title .layui-badge, +.layui-tab-title .layui-badge-dot{left: 5px; top: -2px;} + +/* carousel 轮播 */ +.layui-carousel{position: relative; left: 0; top: 0; background-color: #f8f8f8;} +.layui-carousel>*[carousel-item]{position: relative; width: 100%; height: 100%; overflow: hidden;} +.layui-carousel>*[carousel-item]:before{position: absolute; content: '\e63d'; left: 50%; top: 50%; width: 100px; line-height: 20px; margin: -10px 0 0 -50px; text-align: center; color: #c2c2c2; font-family:"layui-icon" !important; font-size: 30px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;} +.layui-carousel>*[carousel-item] > *{display: none; position: absolute; left: 0; top: 0; width: 100%; height: 100%; background-color: #f8f8f8; transition-duration: .3s; -webkit-transition-duration: .3s;} +.layui-carousel-updown > *{-webkit-transition: .3s ease-in-out up; transition: .3s ease-in-out up;} +.layui-carousel-arrow{display: none\0; opacity: 0; position: absolute; left: 10px; top: 50%; margin-top: -18px; width: 36px; height: 36px; line-height: 36px; text-align: center; font-size: 20px; border: none 0; border-radius: 50%; background-color: rgba(0,0,0,.2); color: #fff; -webkit-transition-duration: .3s; transition-duration: .3s; cursor: pointer;} +.layui-carousel-arrow[lay-type="add"]{left: auto!important; right: 10px;} +.layui-carousel[lay-arrow="always"] .layui-carousel-arrow{opacity: 1; left: 20px;} +.layui-carousel[lay-arrow="always"] .layui-carousel-arrow[lay-type="add"]{right: 20px;} +.layui-carousel[lay-arrow="none"] .layui-carousel-arrow{display: none;} +.layui-carousel-arrow:hover, +.layui-carousel-ind ul:hover{background-color: rgba(0,0,0,.35);} +.layui-carousel:hover .layui-carousel-arrow{display: block\0; opacity: 1; left: 20px;} +.layui-carousel:hover .layui-carousel-arrow[lay-type="add"]{right: 20px;} +.layui-carousel-ind{position: relative; top: -35px; width: 100%; line-height: 0!important; text-align: center; font-size: 0;} +.layui-carousel[lay-indicator="outside"]{margin-bottom: 30px;} +.layui-carousel[lay-indicator="outside"] .layui-carousel-ind{top: 10px;} +.layui-carousel[lay-indicator="outside"] .layui-carousel-ind ul{background-color: rgba(0,0,0,.5);} +.layui-carousel[lay-indicator="none"] .layui-carousel-ind{display: none;} +.layui-carousel-ind ul{display: inline-block; padding: 5px; background-color: rgba(0,0,0,.2); border-radius: 10px; -webkit-transition-duration: .3s; transition-duration: .3s;} +.layui-carousel-ind li{display: inline-block; width: 10px; height: 10px; margin: 0 3px; font-size: 14px; background-color: #e2e2e2; background-color: rgba(255,255,255,.5); border-radius: 50%; cursor: pointer; -webkit-transition-duration: .3s; transition-duration: .3s;} +.layui-carousel-ind li:hover{background-color: rgba(255,255,255,.7);} +.layui-carousel-ind li.layui-this{background-color: #fff;} +.layui-carousel>*[carousel-item]>.layui-this, +.layui-carousel>*[carousel-item]>.layui-carousel-prev, +.layui-carousel>*[carousel-item]>.layui-carousel-next{display: block} +.layui-carousel>*[carousel-item]>.layui-this{left: 0;} +.layui-carousel>*[carousel-item]>.layui-carousel-prev{left: -100%;} +.layui-carousel>*[carousel-item]>.layui-carousel-next{left: 100%;} +.layui-carousel>*[carousel-item]>.layui-carousel-prev.layui-carousel-right, +.layui-carousel>*[carousel-item]>.layui-carousel-next.layui-carousel-left{left: 0;} +.layui-carousel>*[carousel-item]>.layui-this.layui-carousel-left{left: -100%;} +.layui-carousel>*[carousel-item]>.layui-this.layui-carousel-right{left: 100%;} + +/* 上下切换 */.layui-carousel[lay-anim="updown"] .layui-carousel-arrow{left: 50%!important; top: 20px; margin: 0 0 0 -18px;} +.layui-carousel[lay-anim="updown"] .layui-carousel-arrow[lay-type="add"]{top: auto!important; bottom: 20px;} +.layui-carousel[lay-anim="updown"] .layui-carousel-ind{position: absolute; top: 50%; right: 20px; width: auto; height: auto;} +.layui-carousel[lay-anim="updown"] .layui-carousel-ind ul{padding: 3px 5px;} +.layui-carousel[lay-anim="updown"] .layui-carousel-ind li{display: block; margin: 6px 0;} + +.layui-carousel[lay-anim="updown"]>*[carousel-item]>*{left: 0!important;} +.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-this{top: 0;} +.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-prev{top: -100%;} +.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-next{top: 100%;} +.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-prev.layui-carousel-right, +.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-next.layui-carousel-left{top: 0;} +.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-this.layui-carousel-left{top: -100%;} +.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-this.layui-carousel-right{top: 100%;} + +/* 渐显切换 */.layui-carousel[lay-anim="fade"]>*[carousel-item]>*{left: 0!important;} +.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-prev, +.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-next{opacity: 0;} +.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-prev.layui-carousel-right, +.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-next.layui-carousel-left{opacity: 1;} +.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-this.layui-carousel-left, +.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-this.layui-carousel-right{opacity: 0} + +/** fixbar **/ +.layui-fixbar{position: fixed; right: 15px; bottom: 15px; z-index: 999999;} +.layui-fixbar li{width: 50px; height: 50px; line-height: 50px; margin-bottom: 1px; text-align:center; cursor: pointer; font-size:30px; background-color: #9F9F9F; color:#fff; border-radius: 2px; opacity: 0.95;} +.layui-fixbar li:hover{opacity: 0.85;} +.layui-fixbar li:active{opacity: 1;} +.layui-fixbar .layui-fixbar-top{display: none; font-size: 40px;} + +/** 表情面板 **/ +body .layui-util-face{border: none; background: none;} +body .layui-util-face .layui-layer-content{padding:0; background-color:#fff; color:#666; box-shadow:none} +.layui-util-face .layui-layer-TipsG{display:none;} +.layui-util-face ul{position:relative; width:372px; padding:10px; border:1px solid #D9D9D9; background-color:#fff; box-shadow: 0 0 20px rgba(0,0,0,.2);} +.layui-util-face ul li{cursor: pointer; float: left; border: 1px solid #e8e8e8; height: 22px; width: 26px; overflow: hidden; margin: -1px 0 0 -1px; padding: 4px 2px; text-align: center;} +.layui-util-face ul li:hover{position: relative; z-index: 2; border: 1px solid #eb7350; background: #fff9ec;} + +/** 代码修饰器 **/ +.layui-code{position: relative; margin: 10px 0; padding: 15px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;} + +/** 评分组件 By star1029 **/ +.layui-rate, +.layui-rate *{display: inline-block; vertical-align: middle;} +.layui-rate{padding: 10px 5px 10px 0; font-size: 0;} +.layui-rate li i.layui-icon{ font-size: 20px; color: #FFB800;} +.layui-rate li i.layui-icon{margin-right: 5px; transition: all .3s; -webkit-transition: all .3s;} +.layui-rate li i:hover{cursor: pointer; transform: scale(1.12); -webkit-transform: scale(1.12);} +.layui-rate[readonly] li i:hover{cursor: default; transform: scale(1);} + +/** 颜色选择器 By star1029 **/ +.layui-colorpicker{width: 26px; height: 26px; border: 1px solid #e6e6e6; padding: 5px; border-radius: 2px; line-height: 24px; display: inline-block; cursor: pointer; transition: all .3s; -webkit-transition: all .3s;} +.layui-colorpicker:hover{border-color: #d2d2d2;} +.layui-colorpicker.layui-colorpicker-lg{width: 34px; height: 34px; line-height: 32px;} +.layui-colorpicker.layui-colorpicker-sm{width: 24px; height: 24px; line-height: 22px;} +.layui-colorpicker.layui-colorpicker-xs{width: 22px; height: 22px; line-height: 20px;} + +.layui-colorpicker-trigger-bgcolor{display: block; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); border-radius: 2px;} +.layui-colorpicker-trigger-span{display: block; height: 100%; box-sizing: border-box; border: 1px solid rgba(0,0,0,.15); border-radius: 2px; text-align: center;} +.layui-colorpicker-trigger-i{display: inline-block; color: #FFF; font-size: 12px;} +.layui-colorpicker-trigger-i.layui-icon-close{color: #999;} + +.layui-colorpicker-main{position: absolute; z-index: 66666666; width: 280px; padding: 7px; background: #FFF; border: 1px solid #d2d2d2; border-radius: 2px; box-shadow: 0 2px 4px rgba(0,0,0,.12);} +.layui-colorpicker-main-wrapper{height: 180px; position: relative;} +.layui-colorpicker-basis{width: 260px; height: 100%; position: relative;} +.layui-colorpicker-basis-white{width: 100%; height: 100%; position: absolute; top: 0; left: 0; background: linear-gradient(90deg, #FFF, hsla(0,0%,100%,0));} +.layui-colorpicker-basis-black{width: 100%; height: 100%; position: absolute; top: 0; left: 0; background: linear-gradient(0deg, #000, transparent);} +.layui-colorpicker-basis-cursor{width: 10px; height: 10px; border: 1px solid #FFF; border-radius: 50%; position: absolute; top: -3px; right: -3px; cursor: pointer;} +.layui-colorpicker-side{position: absolute; top: 0; right: 0; width: 12px; height: 100%; background: linear-gradient(#F00, #FF0, #0F0, #0FF, #00F, #F0F, #F00);} +.layui-colorpicker-side-slider{width: 100%; height: 5px; box-shadow: 0 0 1px #888888; box-sizing: border-box; background: #FFF; border-radius: 1px; border: 1px solid #f0f0f0; cursor: pointer; position: absolute; left: 0;} +.layui-colorpicker-main-alpha{display: none; height: 12px; margin-top: 7px; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)} +.layui-colorpicker-alpha-bgcolor{height: 100%; position: relative;} +.layui-colorpicker-alpha-slider{width: 5px; height: 100%; box-shadow: 0 0 1px #888888; box-sizing: border-box; background: #FFF; border-radius: 1px; border: 1px solid #f0f0f0; cursor: pointer; position: absolute; top: 0;} +.layui-colorpicker-main-pre{padding-top: 7px; font-size: 0;} +.layui-colorpicker-pre{width: 20px; height: 20px; border-radius: 2px; display: inline-block; margin-left: 6px; margin-bottom: 7px; cursor: pointer;} +.layui-colorpicker-pre:nth-child(11n+1){margin-left: 0;} +.layui-colorpicker-pre-isalpha{background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)} +.layui-colorpicker-pre.layui-this{box-shadow: 0 0 3px 2px rgba(0,0,0,.15);} +.layui-colorpicker-pre > div{height: 100%; border-radius: 2px;} +.layui-colorpicker-main-input{text-align: right; padding-top: 7px;} +.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin: 0 0 0 10px;} +.layui-colorpicker-main-input div.layui-inline{float: left; margin-right: 10px; font-size: 14px;} +.layui-colorpicker-main-input input.layui-input{width: 150px; height: 30px; color: #666;} + +/** 滑块 By star1029 **/ +.layui-slider{height: 4px; background: #e2e2e2; border-radius: 3px; position: relative; cursor: pointer;} +.layui-slider-bar{border-radius: 3px; position: absolute; height: 100%;} +.layui-slider-step{position: absolute; top: 0; width: 4px; height: 4px; border-radius: 50%; background: #FFF; -webkit-transform: translateX(-50%); transform: translateX(-50%);} +.layui-slider-wrap{width: 36px; height: 36px; position: absolute; top: -16px; -webkit-transform: translateX(-50%); transform: translateX(-50%); z-index: 10; text-align: center;} +.layui-slider-wrap-btn{width: 12px; height: 12px; border-radius: 50%; background: #FFF; display: inline-block; vertical-align: middle; cursor: pointer; transition: 0.3s;} +.layui-slider-wrap:after{content: ""; height: 100%; display: inline-block; vertical-align: middle;} +.layui-slider-wrap-btn:hover, +.layui-slider-wrap-btn.layui-slider-hover{transform: scale(1.2);} +.layui-slider-wrap-btn.layui-disabled:hover{transform: scale(1) !important;} +.layui-slider-tips{position: absolute; top: -42px; z-index: 66666666; white-space:nowrap; display: none; -webkit-transform: translateX(-50%); transform: translateX(-50%); color: #FFF; background: #000; border-radius: 3px; height: 25px; line-height: 25px; padding: 0 10px;} +.layui-slider-tips:after{content: ''; position: absolute; bottom: -12px; left: 50%; margin-left: -6px; width: 0; height: 0; border-width: 6px; border-style: solid; border-color: #000 transparent transparent transparent;} +.layui-slider-input{width: 70px; height: 32px; border: 1px solid #e6e6e6; border-radius: 3px; font-size: 16px; line-height: 32px; position: absolute; right: 0; top: -15px;} +.layui-slider-input-btn{display: none; position: absolute; top: 0; right: 0; width: 20px; height: 100%; border-left: 1px solid #d2d2d2;} +.layui-slider-input-btn i{cursor: pointer; position: absolute; right: 0; bottom: 0; width: 20px; height: 50%; font-size: 12px; line-height: 16px; text-align: center; color: #999;} +.layui-slider-input-btn i:first-child{top: 0; border-bottom: 1px solid #d2d2d2;} +.layui-slider-input-txt{height: 100%; font-size: 14px;} +.layui-slider-input-txt input{height: 100%; border: none;} +.layui-slider-input-btn i:hover{color: #009688;} +/*垂直滑块*/ +.layui-slider-vertical{width: 4px; margin-left: 34px;} +.layui-slider-vertical .layui-slider-bar{width: 4px;} +.layui-slider-vertical .layui-slider-step{top: auto; left: 0px; -webkit-transform: translateY(50%); transform: translateY(50%);} +.layui-slider-vertical .layui-slider-wrap{top: auto; left: -16px; -webkit-transform: translateY(50%); transform: translateY(50%);} +.layui-slider-vertical .layui-slider-tips{top: auto; left: 2px;} +@media \0screen{ + .layui-slider-wrap-btn{margin-left: -20px;} + .layui-slider-vertical .layui-slider-wrap-btn{margin-left: 0; margin-bottom: -20px;} + .layui-slider-vertical .layui-slider-tips{margin-left: -8px;} + .layui-slider > span{margin-left: 8px;} +} + + +/** 动画 **/ +.layui-anim{-webkit-animation-duration: 0.3s; animation-duration: 0.3s; -webkit-animation-fill-mode: both; animation-fill-mode: both;} +.layui-anim.layui-icon{display: inline-block;} +.layui-anim-loop{-webkit-animation-iteration-count: infinite; animation-iteration-count: infinite;} +.layui-trans, +.layui-trans a{transition: all .3s; -webkit-transition: all .3s;} /* 过度变换 */ + +@-webkit-keyframes layui-rotate{ /* 循环旋转 */ + from {-webkit-transform: rotate(0deg);} + to {-webkit-transform: rotate(360deg);} +} +@keyframes layui-rotate{ + from {transform: rotate(0deg);} + to {transform: rotate(360deg);} +} +.layui-anim-rotate{-webkit-animation-name: layui-rotate; animation-name: layui-rotate; -webkit-animation-duration: 1s; animation-duration: 1s; -webkit-animation-timing-function: linear; animation-timing-function: linear;} + +@-webkit-keyframes layui-up{ /* 从最底部往上滑入 */ + from {-webkit-transform: translate3d(0, 100%, 0); opacity: 0.3;} + to {-webkit-transform: translate3d(0, 0, 0); opacity: 1;} +} +@keyframes layui-up{ + from {transform: translate3d(0, 100%, 0); opacity: 0.3;} + to {transform: translate3d(0, 0, 0); opacity: 1;} +} +.layui-anim-up{-webkit-animation-name: layui-up; animation-name: layui-up;} + +@-webkit-keyframes layui-upbit{ /* 微微往上滑入 */ + from {-webkit-transform: translate3d(0, 30px, 0); opacity: 0.3;} + to {-webkit-transform: translate3d(0, 0, 0); opacity: 1;} +} +@keyframes layui-upbit{ + from {transform: translate3d(0, 30px, 0); opacity: 0.3;} + to {transform: translate3d(0, 0, 0); opacity: 1;} +} +.layui-anim-upbit{-webkit-animation-name: layui-upbit; animation-name: layui-upbit;} + + +@-webkit-keyframes layui-scale { /* 放大 */ + 0% {opacity: 0.3; -webkit-transform: scale(.5);} + 100% {opacity: 1; -webkit-transform: scale(1);} +} +@keyframes layui-scale { + 0% {opacity: 0.3; -ms-transform: scale(.5); transform: scale(.5);} + 100% {opacity: 1; -ms-transform: scale(1); transform: scale(1);} +} +.layui-anim-scale{-webkit-animation-name: layui-scale; animation-name: layui-scale} + +@-webkit-keyframes layui-scale-spring { /* 弹簧式放大 */ + 0% {opacity: 0.5; -webkit-transform: scale(.5);} + 80% {opacity: 0.8; -webkit-transform: scale(1.1);} + 100% {opacity: 1; -webkit-transform: scale(1);} +} +@keyframes layui-scale-spring { + 0% {opacity: 0.5; transform: scale(.5);} + 80% {opacity: 0.8; transform: scale(1.1);} + 100% {opacity: 1; transform: scale(1);} +} +.layui-anim-scaleSpring{-webkit-animation-name: layui-scale-spring; animation-name: layui-scale-spring} + +@-webkit-keyframes layui-fadein { /* 渐现 */ + 0% {opacity: 0;} + 100% {opacity: 1;} +} +@keyframes layui-fadein { + 0% {opacity: 0;} + 100% {opacity: 1;} +} +.layui-anim-fadein{-webkit-animation-name: layui-fadein; animation-name: layui-fadein} + +@-webkit-keyframes layui-fadeout { /* 渐隐 */ + 0% {opacity: 1;} + 100% {opacity: 0;} +} +@keyframes layui-fadeout { + 0% {opacity: 1;} + 100% {opacity: 0;} +} +.layui-anim-fadeout{-webkit-animation-name: layui-fadeout; animation-name: layui-fadeout} + + + diff --git a/statics/src/css/layui.mobile.css b/statics/src/css/layui.mobile.css new file mode 100755 index 0000000..a58b294 --- /dev/null +++ b/statics/src/css/layui.mobile.css @@ -0,0 +1,191 @@ +/** + + @Name: layui mobile + @Author: 贤心 + @Site: http://www.layui.com/mobile/ + + */ + +/* reset */ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,input,button,textarea,p,blockquote,th,td,form,legend{margin:0; padding:0; -webkit-tap-highlight-color:rgba(0,0,0,0)} +html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif; -ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;} +a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0);} +a{text-decoration: none; background:transparent} +a:active,a:hover{outline:0} +table{border-collapse:collapse;border-spacing:0} +li{list-style:none;} +b,strong{font-weight:700;} +h1, h2, h3, h4, h5, h6{font-weight:500;} +address,cite,dfn,em,var{font-style:normal;} +dfn{font-style:italic} +sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +img{border:0; vertical-align: bottom} +button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0; outline: 0;} +button,select{text-transform:none} +select{-webkit-appearance: none; border:none;} +input{line-height:normal; } +input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0} +input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto} +input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box} +input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none} +label,input{vertical-align: middle;} + + +/** 图标字体 **/ +@font-face {font-family: 'layui-icon'; + src: url('../font/iconfont.eot?v=1.0.7'); + src: url('../font/iconfont.eot?v=1.0.7#iefix') format('embedded-opentype'), + url('../font/iconfont.woff?v=1.0.7') format('woff'), + url('../font/iconfont.ttf?v=1.0.7') format('truetype'), + url('../font/iconfont.svg?v=1.0.7#iconfont') format('svg'); +} + +.layui-icon{ + font-family:"layui-icon" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + + +/** 基础通用 **/ +/* 消除第三方ui可能造成的冲突 */.layui-box, .layui-box *{-webkit-box-sizing: content-box !important; -moz-box-sizing: content-box !important; box-sizing: content-box !important;} +.layui-border-box, .layui-border-box *{-webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;} +.layui-inline{position: relative; display: inline-block; *display:inline; *zoom:1; vertical-align: middle;} +/* 三角形 */.layui-edge{position: absolute; width: 0; height: 0; border-style: dashed; border-color: transparent; overflow: hidden;} +/* 单行溢出省略 */.layui-elip{text-overflow: ellipsis; overflow: hidden; white-space: nowrap;} +/* 屏蔽选中 */.layui-unselect{-moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;} +.layui-disabled,.layui-disabled:active{background-color: #d2d2d2 !important; color: #fff !important; cursor: not-allowed !important;} +/* 纯圆角 */.layui-circle{border-radius: 100%;} +.layui-show{display: block !important;} +.layui-hide{display: none !important;} + + +.layui-upload-iframe{position: absolute; width: 0px; height: 0px; border: 0px; visibility: hidden;} +.layui-upload-enter{border: 1px solid #009E94; background-color: #009E94; color: #fff; -webkit-transform: scale(1.1); transform: scale(1.1);} + + +/* 弹出动画 */ +@-webkit-keyframes layui-m-anim-scale { /* 默认 */ + 0% {opacity: 0; -webkit-transform: scale(.5); transform: scale(.5)} + 100% {opacity: 1; -webkit-transform: scale(1); transform: scale(1)} +} +@keyframes layui-m-anim-scale { /* 由小到大 */ + 0% {opacity: 0; -webkit-transform: scale(.5); transform: scale(.5)} + 100% {opacity: 1; -webkit-transform: scale(1); transform: scale(1)} +} +.layui-m-anim-scale{animation-name: layui-m-anim-scale; -webkit-animation-name: layui-m-anim-scale;} + +@-webkit-keyframes layui-m-anim-up{ /* 从下往上 */ + 0%{opacity: 0; -webkit-transform: translateY(800px); transform: translateY(800px)} + 100%{opacity: 1; -webkit-transform: translateY(0); transform: translateY(0)} +} +@keyframes layui-m-anim-up{ + 0%{opacity: 0; -webkit-transform: translateY(800px); transform: translateY(800px)} + 100%{opacity: 1; -webkit-transform: translateY(0); transform: translateY(0)} +} +.layui-m-anim-up{-webkit-animation-name: layui-m-anim-up; animation-name: layui-m-anim-up} + +@-webkit-keyframes layui-m-anim-left{ /* 从右往左 */ + 0%{-webkit-transform: translateX(100%); transform: translateX(100%)} + 100%{-webkit-transform: translateX(0); transform: translateX(0)} +} +@keyframes layui-m-anim-left{ + 0%{-webkit-transform: translateX(100%); transform: translateX(100%)} + 100%{-webkit-transform: translateX(0); transform: translateX(0)} +} +.layui-m-anim-left{-webkit-animation-name: layui-m-anim-left; animation-name: layui-m-anim-left} + +@-webkit-keyframes layui-m-anim-right{ /* 从左往右 */ + 0%{-webkit-transform: translateX(-100%); transform: translateX(-100%)} + 100%{-webkit-transform: translateX(0); transform: translateX(0)} +} +@keyframes layui-m-anim-right{ + 0%{-webkit-transform: translateX(-100%); transform: translateX(-100%)} + 100%{-webkit-transform: translateX(0); transform: translateX(0)} +} +.layui-m-anim-right{-webkit-animation-name: layui-m-anim-right; animation-name: layui-m-anim-right} + +@-webkit-keyframes layui-m-anim-lout{ /* 往左收缩 */ + 0%{-webkit-transform: translateX(0); transform: translateX(0)} + 100%{-webkit-transform: translateX(-100%); transform: translateX(-100%)} +} +@keyframes layui-m-anim-lout{ + 0%{-webkit-transform: translateX(0); transform: translateX(0)} + 100%{-webkit-transform: translateX(-100%); transform: translateX(-100%)} +} +.layui-m-anim-lout{-webkit-animation-name: layui-m-anim-lout; animation-name: layui-m-anim-lout} + +@-webkit-keyframes layui-m-anim-rout{ /* 往右收缩 */ + 0%{-webkit-transform: translateX(0); transform: translateX(0)} + 100%{-webkit-transform: translateX(100%); transform: translateX(100%)} +} +@keyframes layui-m-anim-rout{ + 0%{-webkit-transform: translateX(0); transform: translateX(0)} + 100%{-webkit-transform: translateX(100%); transform: translateX(100%)} +} +.layui-m-anim-rout{-webkit-animation-name: layui-m-anim-rout; animation-name: layui-m-anim-rout} + + +/** layer mobile */ +.layui-m-layer{position:relative; z-index: 19891014;} +.layui-m-layer *{-webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box;} +.layui-m-layershade, +.layui-m-layermain{position:fixed; left:0; top:0; width:100%; height:100%;} +.layui-m-layershade{background-color:rgba(0,0,0, .7); pointer-events:auto;} +.layui-m-layermain{display:table; font-family: Helvetica, arial, sans-serif; pointer-events: none;} +.layui-m-layermain .layui-m-layersection{display:table-cell; vertical-align:middle; text-align:center;} +.layui-m-layerchild{position:relative; display:inline-block; text-align:left; background-color:#fff; font-size:14px; border-radius: 5px; box-shadow: 0 0 8px rgba(0, 0, 0, 0.1); pointer-events:auto; -webkit-overflow-scrolling: touch;} +.layui-m-layerchild{-webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration: .2s; animation-duration: .2s;} + +.layui-m-layer0 .layui-m-layerchild{width: 90%; max-width: 640px;} +.layui-m-layer1 .layui-m-layerchild{border:none; border-radius:0;} +.layui-m-layer2 .layui-m-layerchild{width:auto; max-width:260px; min-width:40px; border:none; background: none; box-shadow: none; color:#fff;} +.layui-m-layerchild h3{padding: 0 10px; height: 60px; line-height: 60px; font-size:16px; font-weight: 400; border-radius: 5px 5px 0 0; text-align: center;} +.layui-m-layerchild h3, +.layui-m-layerbtn span{ text-overflow:ellipsis; overflow:hidden; white-space:nowrap;} +.layui-m-layercont{padding: 50px 30px; line-height: 22px; text-align:center;} +.layui-m-layer1 .layui-m-layercont{padding:0; text-align:left;} +.layui-m-layer2 .layui-m-layercont{text-align:center; padding: 0; line-height: 0;} +.layui-m-layer2 .layui-m-layercont i{width:25px; height:25px; margin-left:8px; display:inline-block; background-color:#fff; border-radius:100%;} +.layui-m-layer2 .layui-m-layercont p{margin-top: 20px;} + +/* loading */ +@-webkit-keyframes layui-m-anim-loading{ + 0%,80%,100%{transform:scale(0); -webkit-transform:scale(0)} + 40%{transform:scale(1); -webkit-transform:scale(1)} +} +@keyframes layui-m-anim-loading{ + 0%,80%,100%{transform:scale(0); -webkit-transform:scale(0)} + 40%{transform:scale(1); -webkit-transform:scale(1)} +} +.layui-m-layer2 .layui-m-layercont i{-webkit-animation: layui-m-anim-loading 1.4s infinite ease-in-out; animation: layui-m-anim-loading 1.4s infinite ease-in-out; -webkit-animation-fill-mode: both; animation-fill-mode: both;} + +.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0; -webkit-animation-delay: -.32s; animation-delay: -.32s;} +.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay: -.16s; animation-delay: -.16s;} +.layui-m-layer2 .layui-m-layercont>div{line-height:22px; padding-top:7px; margin-bottom:20px; font-size: 14px;} +.layui-m-layerbtn{display: box; display: -moz-box; display: -webkit-box; width: 100%; position:relative; height: 50px; line-height: 50px; font-size: 0; text-align:center; border-top:1px solid #D0D0D0; background-color: #F2F2F2; border-radius: 0 0 5px 5px;} +.layui-m-layerbtn span{position:relative; display: block; -moz-box-flex: 1; box-flex: 1; -webkit-box-flex: 1; text-align:center; font-size:14px; border-radius: 0 0 5px 5px; cursor:pointer;} +.layui-m-layerbtn span[yes]{color: #40AFFE;} +.layui-m-layerbtn span[no]{border-right: 1px solid #D0D0D0; border-radius: 0 0 0 5px;} +.layui-m-layerbtn span:active{background-color: #F6F6F6;} +.layui-m-layerend{position:absolute; right:7px; top:10px; width:30px; height:30px; border: 0; font-weight:400; background: transparent; cursor: pointer; -webkit-appearance: none; font-size:30px;} +.layui-m-layerend::before, .layui-m-layerend::after{position:absolute; left:5px; top:15px; content:''; width:18px; height:1px; background-color:#999; transform:rotate(45deg); -webkit-transform:rotate(45deg); border-radius: 3px;} +.layui-m-layerend::after{transform:rotate(-45deg); -webkit-transform:rotate(-45deg);} + +/* 底部对话框风格 */ +body .layui-m-layer .layui-m-layer-footer{position: fixed; width: 95%; max-width: 100%; margin: 0 auto; left:0; right: 0; bottom: 10px; background: none;} +.layui-m-layer-footer .layui-m-layercont{padding: 20px; border-radius: 5px 5px 0 0; background-color: rgba(255,255,255,.8);} +.layui-m-layer-footer .layui-m-layerbtn{display: block; height: auto; background: none; border-top: none;} +.layui-m-layer-footer .layui-m-layerbtn span{background-color: rgba(255,255,255,.8);} +.layui-m-layer-footer .layui-m-layerbtn span[no]{color: #FD482C; border-top: 1px solid #c2c2c2; border-radius: 0 0 5px 5px;} +.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top: 10px; border-radius: 5px;} + +/* 通用提示 */ +body .layui-m-layer .layui-m-layer-msg{width: auto; max-width: 90%; margin: 0 auto; bottom: -150px; background-color: rgba(0,0,0,.7); color: #fff;} +.layui-m-layer-msg .layui-m-layercont{padding: 10px 20px;} + + + + diff --git a/statics/src/css/modules/code.css b/statics/src/css/modules/code.css new file mode 100755 index 0000000..6278f1b --- /dev/null +++ b/statics/src/css/modules/code.css @@ -0,0 +1,23 @@ +/** + + @Name: layui.code + @Author: 贤心 + @Site: http://www.layui.com + + */ + +/* 加载就绪标志 */ +html #layuicss-skincodecss{display:none; position: absolute; width:1989px;} + +/* 默认风格 */ +.layui-code-view{display: block; position: relative; margin: 10px 0; padding: 0; border: 1px solid #e2e2e2; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;} +.layui-code-h3{position: relative; padding: 0 10px; height: 32px; line-height: 32px; border-bottom: 1px solid #e2e2e2; font-size: 12px;} +.layui-code-h3 a{position: absolute; right: 10px; top: 0; color: #999;} +.layui-code-view .layui-code-ol{position: relative; overflow: auto;} +.layui-code-view .layui-code-ol li{position: relative; margin-left: 45px; line-height: 20px; padding: 0 5px; border-left: 1px solid #e2e2e2; list-style-type: decimal-leading-zero; *list-style-type: decimal; background-color: #fff;} +.layui-code-view pre{margin: 0;} + +/* notepadd++风格 */ +.layui-code-notepad{border: 1px solid #0C0C0C; border-left-color: #3F3F3F; background-color: #0C0C0C; color: #C2BE9E} +.layui-code-notepad .layui-code-h3{border-bottom: none;} +.layui-code-notepad .layui-code-ol li{background-color: #3F3F3F; border-left: none;} \ No newline at end of file diff --git a/statics/src/css/modules/laydate/default/font.css b/statics/src/css/modules/laydate/default/font.css new file mode 100755 index 0000000..f429656 --- /dev/null +++ b/statics/src/css/modules/laydate/default/font.css @@ -0,0 +1,16 @@ +/** 图标字体 **/ +@font-face {font-family: 'laydate-icon'; + src: url('./font/iconfont.eot'); + src: url('./font/iconfont.eot#iefix') format('embedded-opentype'), + url('./font/iconfont.svg#iconfont') format('svg'), + url('./font/iconfont.woff') format('woff'), + url('./font/iconfont.ttf') format('truetype'); +} + +.laydate-icon{ + font-family:"laydate-icon" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} \ No newline at end of file diff --git a/statics/src/css/modules/laydate/default/laydate.css b/statics/src/css/modules/laydate/default/laydate.css new file mode 100755 index 0000000..c4a2a84 --- /dev/null +++ b/statics/src/css/modules/laydate/default/laydate.css @@ -0,0 +1,155 @@ +/** + + @Name: laydata + @Author: 贤心 + + **/ + + +html #layuicss-laydate{display: none; position: absolute; width: 1989px;} + +/* 初始化 */ +.layui-laydate *{margin: 0; padding: 0;} + +/* 主体结构 */ +.layui-laydate, .layui-laydate *{box-sizing: border-box;} +.layui-laydate{position: absolute; z-index: 66666666; margin: 5px 0; border-radius: 2px; font-size: 14px; -webkit-animation-duration: 0.3s; animation-duration: 0.3s; -webkit-animation-fill-mode: both; animation-fill-mode: both;} +.layui-laydate-main{width: 272px;} +.layui-laydate-header *, +.layui-laydate-content td, +.layui-laydate-list li{transition-duration: .3s; -webkit-transition-duration: .3s;} + +@-webkit-keyframes laydate-upbit{ /* 微微往上滑入 */ + from {-webkit-transform: translate3d(0, 20px, 0); opacity: 0.3;} + to {-webkit-transform: translate3d(0, 0, 0); opacity: 1;} +} +@keyframes laydate-upbit{ + from {transform: translate3d(0, 20px, 0); opacity: 0.3;} + to {transform: translate3d(0, 0, 0); opacity: 1;} +} +.layui-laydate{-webkit-animation-name: laydate-upbit; animation-name: laydate-upbit;} +.layui-laydate-static{ position: relative; z-index: 0; display: inline-block; margin: 0; -webkit-animation: none; animation: none;} + +/* 展开年月列表时 */ +.laydate-ym-show .laydate-prev-m, +.laydate-ym-show .laydate-next-m{display: none !important;} +.laydate-ym-show .laydate-prev-y, +.laydate-ym-show .laydate-next-y{display: inline-block !important;} +.laydate-ym-show .laydate-set-ym span[lay-type="month"]{display: none !important;} + +/* 展开时间列表时 */ +.laydate-time-show .layui-laydate-header .layui-icon, +.laydate-time-show .laydate-set-ym span[lay-type="year"], +.laydate-time-show .laydate-set-ym span[lay-type="month"]{display: none !important;} + +/* 头部结构 */ +.layui-laydate-header{position: relative; line-height:30px; padding: 10px 70px 5px;} +.layui-laydate-header *{display: inline-block; vertical-align: bottom;} +.layui-laydate-header i{position: absolute; top: 10px; padding: 0 5px; color: #999; font-size: 18px; cursor: pointer;} +.layui-laydate-header i.laydate-prev-y{left: 15px;} +.layui-laydate-header i.laydate-prev-m{left: 45px;} +.layui-laydate-header i.laydate-next-y{right: 15px;} +.layui-laydate-header i.laydate-next-m{right: 45px;} +.laydate-set-ym{width: 100%; text-align: center; box-sizing: border-box; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;} +.laydate-set-ym span{padding: 0 5px; cursor: pointer;} +.laydate-time-text{cursor: default !important;} + +/* 主体结构 */ +.layui-laydate-content{position: relative; padding: 10px; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;} +.layui-laydate-content table{border-collapse: collapse; border-spacing: 0;} +.layui-laydate-content th, +.layui-laydate-content td{width: 36px; height: 30px; padding: 5px; text-align: center;} +.layui-laydate-content th{font-weight: 400;} +.layui-laydate-content td{position: relative; cursor: pointer;} +.laydate-day-mark{position: absolute; left: 0; top: 0; width: 100%; height: 100%; line-height: 30px; font-size: 12px; overflow: hidden;} +.laydate-day-mark::after{position: absolute; content:''; right: 2px; top: 2px; width: 5px; height: 5px; border-radius: 50%;} + +/* 底部结构 */ +.layui-laydate-footer{position: relative; height: 46px; line-height: 26px; padding: 10px 20px;} +.layui-laydate-footer span{margin-right: 15px; display: inline-block; cursor: pointer; font-size: 12px;} +.layui-laydate-footer span:hover{color: #5FB878;} +.laydate-footer-btns{position: absolute; right: 10px; top: 10px;} +.laydate-footer-btns span{height: 26px; line-height: 26px; margin: 0 0 0 -1px; padding: 0 10px; border: 1px solid #C9C9C9; background-color: #fff; white-space: nowrap; vertical-align: top; border-radius: 2px;} + +/* 年月列表 */ +.layui-laydate-list{position: absolute; left: 0; top: 0; width: 100%; height: 100%; padding: 10px; box-sizing: border-box; background-color: #fff;} +.layui-laydate-list>li{position: relative; display: inline-block; width: 33.3%; height: 36px; line-height: 36px; margin: 3px 0; vertical-align: middle; text-align: center; cursor: pointer;} +.laydate-month-list>li{width: 25%; margin: 17px 0;} +.laydate-time-list{} +.laydate-time-list>li{height: 100%; margin: 0; line-height: normal; cursor: default;} +.laydate-time-list p{position: relative; top: -4px; line-height: 29px;} +.laydate-time-list ol{height: 181px; overflow: hidden;} +.laydate-time-list>li:hover ol{overflow-y: auto;} +.laydate-time-list ol li{width: 130%; padding-left: 33px; line-height: 30px; text-align: left; cursor: pointer;} + +/* 提示 */ +.layui-laydate-hint{position: absolute; top: 115px; left: 50%; width: 250px; margin-left: -125px; line-height: 20px; padding: 15px; text-align: center; font-size: 12px; color: #FF5722;} + + +/* 双日历 */ +.layui-laydate-range{width: 546px;} +.layui-laydate-range .layui-laydate-main{display: inline-block; vertical-align: middle;} +.layui-laydate-range .laydate-main-list-0 .laydate-next-m, +.layui-laydate-range .laydate-main-list-0 .laydate-next-y, +.layui-laydate-range .laydate-main-list-1 .laydate-prev-y, +.layui-laydate-range .laydate-main-list-1 .laydate-prev-m{display: none;} +.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left: 1px solid #e2e2e2;} + + +/* 默认简约主题 */ +.layui-laydate, .layui-laydate-hint{border: 1px solid #d2d2d2; box-shadow: 0 2px 4px rgba(0,0,0,.12); background-color: #fff; color: #666;} +.layui-laydate-header{border-bottom: 1px solid #e2e2e2;} +.layui-laydate-header i:hover, +.layui-laydate-header span:hover{color: #5FB878;} +.layui-laydate-content{border-top: none 0; border-bottom: none 0;} +.layui-laydate-content th{color: #333;} +.layui-laydate-content td{color: #666;} +.layui-laydate-content td.laydate-selected{background-color: #00F7DE;} +.laydate-selected:hover{background-color: #00F7DE !important;} +.layui-laydate-content td:hover, +.layui-laydate-list li:hover{background-color: #eaeaea; color: #333;} +.laydate-time-list li ol{margin: 0; padding: 0; border: 1px solid #e2e2e2; border-left-width: 0;} +.laydate-time-list li:first-child ol{border-left-width: 1px;} +.laydate-time-list>li:hover{background: none;} +.layui-laydate-content .laydate-day-prev, +.layui-laydate-content .laydate-day-next{color: #d2d2d2;} +.laydate-selected.laydate-day-prev, +.laydate-selected.laydate-day-next{background-color: #f8f8f8 !important;} +.layui-laydate-footer{border-top: 1px solid #e2e2e2;} +.layui-laydate-hint{color: #FF5722;} +.laydate-day-mark::after{background-color: #5FB878;} +.layui-laydate-content td.layui-this .laydate-day-mark::after{display: none;} +.layui-laydate-footer span[lay-type="date"]{color: #5FB878;} +.layui-laydate .layui-this{background-color: #009688 !important; color: #fff !important;} +.layui-laydate .laydate-disabled, +.layui-laydate .laydate-disabled:hover{background:none !important; color: #d2d2d2 !important; cursor: not-allowed !important; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;} + +/* 墨绿/自定义背景色主题 */ +.laydate-theme-molv{border: none;} +.laydate-theme-molv.layui-laydate-range{width: 548px} +.laydate-theme-molv .layui-laydate-main{width: 274px;} +.laydate-theme-molv .layui-laydate-header{border: none; background-color: #009688;} +.laydate-theme-molv .layui-laydate-header i, +.laydate-theme-molv .layui-laydate-header span{color: #f6f6f6;} +.laydate-theme-molv .layui-laydate-header i:hover, +.laydate-theme-molv .layui-laydate-header span:hover{color: #fff;} +.laydate-theme-molv .layui-laydate-content{border: 1px solid #e2e2e2; border-top: none; border-bottom: none;} +.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left: none;} +.laydate-theme-molv .layui-laydate-footer{border: 1px solid #e2e2e2;} + +/* 格子主题 */ +.laydate-theme-grid .layui-laydate-content td, +.laydate-theme-grid .layui-laydate-content thead, +.laydate-theme-grid .laydate-year-list>li, +.laydate-theme-grid .laydate-month-list>li{border: 1px solid #e2e2e2;} +.laydate-theme-grid .laydate-selected, +.laydate-theme-grid .laydate-selected:hover{background-color: #f2f2f2 !important; color: #009688 !important;} +.laydate-theme-grid .laydate-selected.laydate-day-prev, +.laydate-theme-grid .laydate-selected.laydate-day-next{color: #d2d2d2 !important;} +.laydate-theme-grid .laydate-year-list, +.laydate-theme-grid .laydate-month-list{margin: 1px 0 0 1px;} +.laydate-theme-grid .laydate-year-list>li, +.laydate-theme-grid .laydate-month-list>li{margin: 0 -1px -1px 0;} +.laydate-theme-grid .laydate-year-list>li{height: 43px; line-height: 43px;} +.laydate-theme-grid .laydate-month-list>li{height: 71px; line-height: 71px;} + diff --git a/statics/src/css/modules/layer/default/icon-ext.png b/statics/src/css/modules/layer/default/icon-ext.png new file mode 100755 index 0000000000000000000000000000000000000000..bbbb669bb311514baa5db3a6a00b4644d0e280f1 GIT binary patch literal 5911 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 bWW^%>x7XlHV^#Q1uOX^B?ki3(VEg|7!QHuF literal 0 HcmV?d00001 diff --git a/statics/src/css/modules/layer/default/loading-1.gif b/statics/src/css/modules/layer/default/loading-1.gif new file mode 100755 index 0000000000000000000000000000000000000000..db3a483e4b74971fbfb1cc0fb6499852cedfe650 GIT binary patch literal 701 zcmZ?wbhEHbRAo?Qn8?Ji_w)@mZNLBj|1&T!DE{a6a}5c0b_{Se(lcOY1PT3QVdY|A zV$cDyff`g97?`@J^shYqmS1s(LX_+4yGox$4el*+Jm?ved2^25GBru=T^dGm#<906 za&AQCZ08H8P;Bd&{NT;vl&}c_^L4%p?g_hjBu{YB29{c>Ob}p@z~Ks3xCw+@!HClp xtZ<(QPf3`00FNu+VbOvoEE+h73k#4LIKl$IE8t;)<_eUs!0QU6uz&iJhvXcHF*h)T1OnEW1i^?zgDfop1p?usL*#PMGT;HQkSO{q6FlJyb$PWkPf|h*eTST}7h8z$}MF(XD(aQ)ZLZ zM?v0rT<1C4XHn<6PbNA{XL@>1^)apdD_@tcYDrW#m`k#MmslI7p^P;Az74wGs`!SI zLs$GEZHsafXsu1i-WleMzAL(yw$-LK{0hv;6hrx8kx!!4$``dAyBnY9Jz&DqJo2$A z!(L$H=KqBeY~CF_viHPz^tTglc?D97CqEBjzUwH}7GI zapg8YZM~>2Wk%E$d&r@9ly9b4Q zJpM7T@}r63I(OExUlG%Xcjz3MU+9U^r!SkpjNThDtaP)7>j6L5z%o5|^hlVOyI*uY zt^UU6NTuY?(Lb4ZIU2Zb5Vz}Pb7KF%ivf&j^CL>$cDz?rMNTQQ|NqDVD7mhghUp%h zhIA{gi{S8y9YhIIbSv$`B!JiPi!0#4#Jge0)p&YVPHchWcyAn zQhvb8ggXGXs9;k`u9Uq*YB>O+Q3Rq=2hlLFcG{Q3ORH_}JnY8C+r%@}6|%ySP%bWG zV~mA;?P`Q2L_Ss})nrJ{$TmeA9Tt*4=}X5x%RioM@_?ZsKSEST-f+GBv~Ya)xX3O{ z8!d=YthI-13OI;RN~`>|6u5L{z20oBp%9MIj)n$!Aw{Wpq&Rtr4~*_74Gjo@3el>B zz(Rk;;>2lp73<2;d=r*8z%WkdsG=vRuG_fvxO#uN^El|+5Qoz^X!2MfxJ3m}vyi?> zMLLDi8+${Z6YbUg?8GNR>-+SwHKdFyr%HqWcs|X_l*-DAC^bG&KCqWg7-_`UlwQ`EdOp_LJkr`L$mHHs75uP?fSgVfsDjuE#ft2b8HDt0yFt!+;C zEgL=)G9ZFt4wa+N3Xg7FGc0~`&EEt6_%7tyzmnb9B_h1~7~GD4V-Bhx7~QKRkF>&aT>(-!Us@aJxAY@8E?HW$G8g zSz@7Jcp>iCp;lU1ieF6n7!oAa-1E!rS0 zF1lBFVS%G#ZO}b@*+bIk+7@Q|iG60vIDVpV%4tW8rKyzwRo_<25;8*Ky@n z-sX>W*b;M){5lB_Edc@m1`VHy0@dg$PTR9uE$O2&a?KAe?xRlCj&Z$iZYw - - - - -聊天记录 - - - - - - - -
-
    -
    - -
    - - - - - - - - - - - - - + + + + + +聊天记录 + + + + + + + +
    +
      +
      + +
      + + + + + + + + + + + + + diff --git a/statics/dist/css/modules/layim/html/find.html b/statics/src/css/modules/layim/html/find.html similarity index 94% rename from statics/dist/css/modules/layim/html/find.html rename to statics/src/css/modules/layim/html/find.html index adcd51d..76d0392 100755 --- a/statics/dist/css/modules/layim/html/find.html +++ b/statics/src/css/modules/layim/html/find.html @@ -1,178 +1,178 @@ - - - - - -发现 - - - - - -
      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      - - - + + + + + +发现 + + + + + +
      +
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      + + + diff --git a/statics/dist/css/modules/layim/html/getmsg.json b/statics/src/css/modules/layim/html/getmsg.json similarity index 96% rename from statics/dist/css/modules/layim/html/getmsg.json rename to statics/src/css/modules/layim/html/getmsg.json index ebb4ea3..3d9b9d4 100755 --- a/statics/dist/css/modules/layim/html/getmsg.json +++ b/statics/src/css/modules/layim/html/getmsg.json @@ -1,87 +1,87 @@ -{ - "code": 0, - "pages": 1, - "data": [ - { - "id": 76, - "content": "申请添加你为好友", - "uid": 168, - "from": 166488, - "from_group": 0, - "type": 1, - "remark": "有问题要问", - "href": null, - "read": 1, - "time": "刚刚", - "user": { - "id": 166488, - "avatar": "http://q.qlogo.cn/qqapp/101235792/B704597964F9BD0DB648292D1B09F7E8/100", - "username": "李彦宏", - "sign": null - } - }, - { - "id": 75, - "content": "申请添加你为好友", - "uid": 168, - "from": 347592, - "from_group": 0, - "type": 1, - "remark": "你好啊!", - "href": null, - "read": 1, - "time": "刚刚", - "user": { - "id": 347592, - "avatar": "http://q.qlogo.cn/qqapp/101235792/B78751375E0531675B1272AD994BA875/100", - "username": "麻花疼", - "sign": null - } - }, - { - "id": 62, - "content": "雷军 拒绝了你的好友申请", - "uid": 168, - "from": null, - "from_group": null, - "type": 1, - "remark": null, - "href": null, - "read": 1, - "time": "10天前", - "user": { - "id": null - } - }, - { - "id": 60, - "content": "马小云 已经同意你的好友申请", - "uid": 168, - "from": null, - "from_group": null, - "type": 1, - "remark": null, - "href": null, - "read": 1, - "time": "10天前", - "user": { - "id": null - } - }, - { - "id": 61, - "content": "贤心 已经同意你的好友申请", - "uid": 168, - "from": null, - "from_group": null, - "type": 1, - "remark": null, - "href": null, - "read": 1, - "time": "10天前", - "user": { - "id": null - } - } - ] +{ + "code": 0, + "pages": 1, + "data": [ + { + "id": 76, + "content": "申请添加你为好友", + "uid": 168, + "from": 166488, + "from_group": 0, + "type": 1, + "remark": "有问题要问", + "href": null, + "read": 1, + "time": "刚刚", + "user": { + "id": 166488, + "avatar": "http://q.qlogo.cn/qqapp/101235792/B704597964F9BD0DB648292D1B09F7E8/100", + "username": "李彦宏", + "sign": null + } + }, + { + "id": 75, + "content": "申请添加你为好友", + "uid": 168, + "from": 347592, + "from_group": 0, + "type": 1, + "remark": "你好啊!", + "href": null, + "read": 1, + "time": "刚刚", + "user": { + "id": 347592, + "avatar": "http://q.qlogo.cn/qqapp/101235792/B78751375E0531675B1272AD994BA875/100", + "username": "麻花疼", + "sign": null + } + }, + { + "id": 62, + "content": "雷军 拒绝了你的好友申请", + "uid": 168, + "from": null, + "from_group": null, + "type": 1, + "remark": null, + "href": null, + "read": 1, + "time": "10天前", + "user": { + "id": null + } + }, + { + "id": 60, + "content": "马小云 已经同意你的好友申请", + "uid": 168, + "from": null, + "from_group": null, + "type": 1, + "remark": null, + "href": null, + "read": 1, + "time": "10天前", + "user": { + "id": null + } + }, + { + "id": 61, + "content": "贤心 已经同意你的好友申请", + "uid": 168, + "from": null, + "from_group": null, + "type": 1, + "remark": null, + "href": null, + "read": 1, + "time": "10天前", + "user": { + "id": null + } + } + ] } \ No newline at end of file diff --git a/statics/dist/css/modules/layim/html/msgbox.html b/statics/src/css/modules/layim/html/msgbox.html similarity index 96% rename from statics/dist/css/modules/layim/html/msgbox.html rename to statics/src/css/modules/layim/html/msgbox.html index d4696e8..c14d5b2 100755 --- a/statics/dist/css/modules/layim/html/msgbox.html +++ b/statics/src/css/modules/layim/html/msgbox.html @@ -1,209 +1,209 @@ - - - - - - -消息盒子 - - - - - -
        - -
        -
        注意:这些都是模拟数据,实际使用时,需将其中的模拟接口改为你的项目真实接口。 -
        该模版文件所在目录(相对于layui.js):/css/modules/layim/html/msgbox.html
        -
        - - - - - - - - - - - - - + + + + + + +消息盒子 + + + + + +
          + +
          +
          注意:这些都是模拟数据,实际使用时,需将其中的模拟接口改为你的项目真实接口。 +
          该模版文件所在目录(相对于layui.js):/css/modules/layim/html/msgbox.html
          +
          + + + + + + + + + + + + + diff --git a/statics/src/css/modules/layim/layim.css b/statics/src/css/modules/layim/layim.css new file mode 100755 index 0000000..d8f4404 --- /dev/null +++ b/statics/src/css/modules/layim/layim.css @@ -0,0 +1,253 @@ +/** + + @Name: layim + @Author: 贤心 + @Site: http://layim.layui.com + + */ + +/* 加载就绪标志 */ +html #layuicss-skinlayimcss{display:none; position: absolute; width:1989px;} + +body .layui-layim, +body .layui-layim-chat{border: 1px solid #D9D9D9; border-color: rgba(0,0,0,.05); background-repeat: no-repeat; background-color: #F6F6F6; color: #333; font-family: \5FAE\8F6F\96C5\9ED1;} +body .layui-layim-chat{background-size: cover;} +body .layui-layim .layui-layer-title{height: 110px; border-bottom: none; background: none;} +.layui-layim-main{position: relative; top: -98px; left:0;} +body .layui-layim .layui-layer-content, +body .layui-layim-chat .layui-layer-content{overflow: visible;} +.layui-layim cite, +.layui-layim em, +.layui-layim-chat cite, +.layui-layim-chat em{font-style: normal;} +.layui-layim-info{height: 50px; font-size: 0; padding: 0 15px;} +.layui-layim-info *{font-size: 14px;} +.layui-layim-info div, +.layui-layim-tab li, +.layim-tab-content li h5 *, +.layui-layim-tool li, +.layui-layim-skin li{display: inline-block; vertical-align: top; *zoom: 1; *display: inline;} +.layui-layim-info .layui-layim-user, +.layui-layim-remark, +.layui-layim-list li p, +.layim-tab-content li h5 span, +.layui-layim-list li span{overflow: hidden; text-overflow: ellipsis; white-space: nowrap;} +.layui-layim-info .layui-layim-user{max-width: 150px; margin-right: 5px; font-size: 16px;} +.layui-layim-status{position: relative; top: 2px; line-height: 19px; cursor: pointer;} +.layim-status-online{color: #3FDD86;} +.layim-status-hide{color: #DD691D;} +.layim-menu-box{display: none; position: absolute; z-index: 100; top: 24px; left: -31px; padding: 5px 0; width: 85px; border: 1px solid #E2E2E2; border-radius: 2px; background-color: #fff; box-shadow: 1px 1px 20px rgba(0,0,0,.1);} +.layim-menu-box li{position: relative; line-height: 22px; padding-left: 30px; font-size: 12px;} +.layim-menu-box li cite{padding-right: 5px; font-size: 14px;} +.layim-menu-box li i{display: none; position: absolute; left: 8px; top: 0; font-weight: 700; color: #5FB878;} +.layim-menu-box .layim-this i{display: block;} +.layim-menu-box li:hover{background-color: #eee;} +.layui-layim-remark{position: relative; left: -6px; display: block; width: 100%; border: 1px solid transparent; margin-top: 8px; padding: 0 5px; height: 26px; line-height: 26px; background: none; border-radius: 2px;} +.layui-layim-remark:hover, +.layui-layim-remark:focus{border: 1px solid #d2d2d2; border-color: rgba(0,0,0,.15)} +.layui-layim-remark:focus{background-color: #fff;} + +.layui-layim-tab{margin-top: 10px; padding: 9px 0; font-size: 0;} +.layui-layim-tab li{position: relative; width: 33.33%; height: 24px; line-height:24px; font-size: 22px; text-align: center; color: #666; color: rgba(0,0,0,.6); cursor: pointer;} +.layim-tab-two li{width: 50%;} +.layui-layim-tab li.layim-this:after{content: ''; position: absolute; left: 0; bottom: -9px; width: 100%; height: 3px; background-color: #3FDD86;} +.layui-layim-tab li.layim-hide{display: none;} +.layui-layim-tab li:hover{opacity: 0.8; filter: Alpha(opacity=80);} +.layim-tab-content{display: none; padding: 10px 0; height: 349px; overflow: hidden; background-color: #fff; background-color: rgba(255,255,255,0.9);} +.layim-tab-content:hover{overflow-y: auto;} +.layim-tab-content li h5{position:relative; margin-right: 15px; padding-left: 30px; height: 28px; line-height: 28px; cursor:pointer; font-size:0; white-space: nowrap; overflow: hidden;} +.layim-tab-content li h5 *{font-size: 14px;} +.layim-tab-content li h5 span{max-width: 125px;} +.layim-tab-content li h5 i{position: absolute; left: 12px; top: 0; color: #C9BDBB;} +.layim-tab-content li h5 em{padding-left: 5px; color: #999;} +.layim-tab-content li h5[lay-type="true"] i{top: 2px;} +.layim-tab-content li ul{display: none; margin-bottom: 10px;} +.layui-layim-list li{position:relative; height: 42px; padding: 5px 15px 5px 60px; font-size:0; cursor:pointer;} +.layui-layim-list li:hover{background-color: #F2F2F2; background-color: rgba(0,0,0,0.05);} +.layui-layim-list li.layim-null{height: 20px; line-height: 20px; padding: 0; font-size: 14px; color: #999; text-align: center; cursor: default;} +.layui-layim-list li.layim-null:hover{background: none;} +.layui-layim-list li *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; font-size: 14px;} +.layui-layim-list li span{margin-top: 4px; max-width: 155px;} +.layui-layim-list li img{position: absolute; left: 15px; top: 8px; width: 36px; height: 36px; border-radius: 100%;} +.layui-layim-list li p{display: block; padding-right: 30px; line-height: 18px; font-size: 12px; color: #999;} +.layui-layim-list li .layim-msg-status{display: none; position: absolute; right: 10px; bottom: 7px; padding: 0 5px; height: 16px; line-height: 16px; border-radius: 16px; text-align: center; font-size: 10px; background-color: #F74C31; color: #fff;} +.layim-list-gray{-webkit-filter: grayscale(100%); -ms-filter: grayscale(100%); filter: grayscale(100%); filter: gray;} + +.layui-layim-tool{padding: 0 10px; font-size: 0; background-color: #F6F6F6; border-radius:0 0 2px 2px;} +.layui-layim-tool li{position: relative; width: 48px; height: 37px; line-height: 40px; text-align: center; font-size: 22px; cursor: pointer;} +.layui-layim-tool li:active{background-color: #e2e2e2;} +.layui-layim-tool .layim-tool-msgbox{line-height: 37px;} +.layui-layim-tool .layim-tool-find{line-height: 38px;} +.layui-layim-tool .layim-tool-skin{font-size: 26px;} +.layim-tool-msgbox span{display: none; position: absolute; left: 12px; top: -12px; height: 20px; line-height: 20px; padding: 0 10px; border-radius: 2px; background-color: #33DF83; color: #fff; font-size: 12px; -webkit-animation-duration: 1s; animation-duration: 1s;} +.layim-tool-msgbox .layer-anim-05{display: block;} + +.layui-layim-search{display: none; position: absolute; bottom: 5px; left: 5px; height: 28px; line-height: 28px;} +.layui-layim-search input{width: 210px; padding: 0 30px 0 10px; height: 30px; line-height: 30px; border: none; border-radius: 3px; background-color: #ddd;} +.layui-layim-search label{position: absolute; right: 6px; top: 4px; font-size: 20px; cursor: pointer; color: #333; font-weight: 400;} + +/* 换肤 */ +.layui-layim-skin{margin: 10px 0 0 10px; font-size: 0;} +.layui-layim-skin li{margin: 0 10px 10px 0; line-height: 60px; text-align: center; background-color: #f6f6f6;} +.layui-layim-skin li, +.layui-layim-skin li img{width: 86px; height: 60px; cursor: pointer;} +.layui-layim-skin li img:hover{opacity: 0.8; filter: Alpha(opacity=80)} +.layui-layim-skin li cite{font-size: 14px; font-style: normal;} + +/* 聊天面板 */ +body .layui-layim-chat{background-color: #fff;} +body .layui-layim-chat-list{width: 760px;} +body .layui-layim-chat .layui-layer-title{height: 80px; border-bottom: none; background-color: #F8F8F8; + background-color: rgba(245,245,245,.7);} +body .layui-layim-chat .layui-layer-content{background: none;} + +.layim-chat-list li * +,.layui-layim-min .layui-layer-content *{display: inline-block; *display:inline; *zoom:1; vertical-align:top; font-size: 14px;} +.layim-chat-list{display: none; position: absolute; z-index: 1000; top: -80px; width: 200px; height: 100%; background-color: #D9D9D9; overflow: hidden; font-size: 0;} +.layim-chat-list:hover{overflow-y: auto;} +.layim-chat-list li, +.layui-layim-min .layui-layer-content{position: relative; margin: 5px; padding: 5px 30px 5px 5px; line-height: 40px; cursor: pointer; border-radius: 3px;} +.layim-chat-list li img, +.layui-layim-min .layui-layer-content img{width: 40px; height: 40px; border-radius: 100%;} +.layui-layim-photos{cursor: crosshair;} +.layim-chat-list li{white-space: nowrap;} +.layim-chat-list li span, +.layui-layim-min .layui-layer-content span{width: 100px; padding-left: 10px; font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;} +.layim-chat-list li span cite{color: #999; padding-left: 10px;} +.layim-chat-list li:hover{background-color: #E2E2E2;} +.layim-chat-list li.layim-this{background-color: #F3F3F3;} +.layim-chat-list li .layui-icon{display: none; position: absolute; right: 5px; top: 7px; color: #555; font-size: 22px;} +.layim-chat-list li .layui-icon:hover{color: #c00;} +.layim-chat-list li:hover .layui-icon{display: inline-block;} + +.layim-chat-system{margin: 10px 0; text-align: center;} +.layim-chat-system span{display: inline-block; line-height: 30px; padding: 0 15px; border-radius: 3px; background-color: #e2e2e2; cursor: default; font-size: 14px;} + +.layim-chat{display: none; position: relative; background-color: #fff; background-color: rgba(255,255,255,.9);} +.layim-chat-title{position: absolute; top: -80px; height: 80px;} +.layim-chat-other{position: relative; top: 15px; left: 15px; padding-left: 60px; cursor: default;} +.layim-chat-other img{position: absolute; left: 0; top: 0; width: 50px; height: 50px; border-radius: 100%;} +.layim-chat-username{position: relative; top: 5px; font-size: 18px;} +.layim-chat-status{margin-top: 6px; font-size: 14px; color: #999;} +.layim-chat-group .layim-chat-other .layim-chat-username{cursor: pointer;} +.layim-chat-group .layim-chat-other .layim-chat-username em{padding: 0 10px; color: #999;} + +.layim-chat-main{height: 262px; padding: 15px 15px 5px 15px; overflow-x: hidden; overflow-y: auto;} +.layim-chat-main ul li{position: relative; font-size: 0; margin-bottom: 10px; padding-left: 60px; min-height: 68px;} +.layim-chat-user, +.layim-chat-text{display: inline-block; *display:inline; *zoom:1; vertical-align:top; font-size: 14px;} +.layim-chat-user{position: absolute; left: 3px;} +.layim-chat-user img{width: 40px; height: 40px; border-radius: 100%;} +.layim-chat-user cite{position: absolute; left: 60px; top: -2px; width: 500px; line-height: 24px; font-size: 12px; white-space: nowrap; color: #999; text-align: left; font-style: normal;} +.layim-chat-user cite i{padding-left: 15px; font-style: normal;} +.layim-chat-text{position: relative; line-height: 22px; margin-top: 25px; padding: 8px 15px; background-color: #e2e2e2; border-radius: 3px; color: #333; word-break: break-all;} +.layim-chat-text:after{content: ''; position: absolute; left: -10px; top: 13px; width: 0; height: 0; border-style: dashed; border-color:transparent; overflow:hidden; border-width: 10px; border-top-style: solid; border-top-color: #e2e2e2;} +.layim-chat-text{max-width: 462px\0;} +.layim-chat-text a{color: #33DF83;} +.layim-chat-text img{ max-width: 100%; vertical-align: middle;} +.layui-layim-file, +.layim-chat-text .layui-layim-file{display: block; text-align: center; } +.layim-chat-text .layui-layim-file{color: #333;} +.layui-layim-file:hover{opacity: 0.9} +.layui-layim-file i{font-size: 80px; line-height: 80px;} +.layui-layim-file cite{display: block; line-height: 20px; font-size: 14px;} +.layui-layim-audio{text-align: center; cursor: pointer;} +.layui-layim-audio .layui-icon{position: relative; top: 5px; font-size: 24px;} +.layui-layim-audio p{margin-top: 3px;} +.layui-layim-video{width: 120px; height: 80px; line-height: 80px; background-color: #333; text-align: center; border-radius: 3px;} +.layui-layim-video .layui-icon{font-size: 36px; cursor: pointer; color: #fff;} +.layim-chat-main ul .layim-chat-system{min-height: 0; padding: 0;} + +.layim-chat-main ul .layim-chat-mine{text-align: right; padding-left: 0; padding-right: 60px;} +.layim-chat-mine .layim-chat-user{left: auto; right: 3px;} +.layim-chat-mine .layim-chat-user cite{left: auto; right: 60px; text-align: right;} +.layim-chat-mine .layim-chat-user cite i{padding-left: 0; padding-right: 15px;} +.layim-chat-mine .layim-chat-text{margin-left: 0; text-align: left; background-color: #5FB878; color: #fff;} +.layim-chat-mine .layim-chat-text:after{left: auto; right: -10px; border-top-color: #5FB878;} +.layim-chat-mine .layim-chat-text a{color: #fff;} + +.layim-chat-footer{border-top: 1px solid #F1F1F1;} +.layim-chat-tool{position: relative; padding: 0 8px; height: 38px; line-height: 38px; font-size: 0;} +.layim-chat-tool span{position: relative; margin: 0 10px; display: inline-block; *display:inline; *zoom:1; vertical-align:top; font-size: 24px; cursor: pointer;} +.layim-chat-tool .layim-tool-log{position: absolute; right: 5px; font-size: 14px; } +.layim-tool-log i{position: relative; top: 2px; margin-right: 5px; font-size: 20px; color: #999} +.layim-tool-image input{position: absolute; font-size: 0; left: 0; top: 0; width: 100%; height: 100%; opacity: 0.01; filter: Alpha(opacity=1); cursor: pointer;} + +/* 表情 */ +body .layui-layim-face{margin: 10px 0 0 -18px; border: none; background: none;} +body .layui-layim-face .layui-layer-content{padding:0; background-color:#fff; color:#666; box-shadow:none} +.layui-layim-face .layui-layer-TipsG{display:none;} +.layui-layim-face ul{position:relative; width:372px; padding:10px; border:1px solid #D9D9D9; background-color:#fff; box-shadow: 0 0 20px rgba(0,0,0,.2);} +.layui-layim-face ul li{cursor: pointer; float: left; border: 1px solid #e8e8e8; height: 22px; width: 26px; overflow: hidden; margin: -1px 0 0 -1px; padding: 4px 2px; text-align: center;} +.layui-layim-face ul li:hover{position: relative; z-index: 2; border: 1px solid #eb7350; background: #fff9ec;} + +/* 输入框 */ +.layim-chat-textarea{margin-left: 10px;} +.layim-chat-textarea textarea{display: block; width: 100%; padding: 5px 0 0 0; height: 68px; line-height: 20px; border: none; overflow: auto; resize: none; background: none;} +.layim-chat-textarea textarea:focus{outline: 0;} + +.layim-chat-bottom{position: relative; height: 46px;} +.layim-chat-send{position: absolute; right: 15px; top: 3px; height: 32px; line-height: 32px; font-size: 0; cursor: pointer;} +.layim-chat-send span{display: inline-block; *display:inline; *zoom:1; vertical-align:top; font-size: 14px;} +.layim-chat-send span{line-height: 32px; margin-left: 5px; padding: 0 20px; background-color: #5FB878; color: #fff; border-radius: 3px;} +.layim-chat-send span:hover{background-color: #69BC80;} +.layim-chat-send span:active{background-color: #59B573} +.layim-chat-send .layim-send-btn{border-radius: 3px 0 0 3px;} +.layim-chat-send .layim-send-set{position: relative; width: 30px; height: 32px; margin-left: 0; padding: 0; border-left: 1px solid #85C998; border-radius: 0 3px 3px 0;} +.layim-send-set .layui-edge{position: absolute; top: 14px; left: 9px; border-width: 6px; border-top-style: solid; border-top-color: #fff;} +.layim-chat-send .layim-menu-box{left: auto; right: 0; top: 33px; width: 180px; padding: 10px 0;} +.layim-chat-send .layim-menu-box li{padding-right: 15px; line-height: 28px;} + +/* 最小化 */ +body .layui-layim-min{border: 1px solid #D9D9D9;} +.layui-layim-min .layui-layer-content{margin: 0 5px; padding: 5px 10px; white-space: nowrap;} +.layui-layim-close .layui-layer-content span {width: auto; max-width: 120px;} + + +/* 查看群员 */ +body .layui-layim-members{ margin: 25px 0 0 -75px; border: none; background: none;} +body .layui-layim-members .layui-layer-content{padding:0; background: none; color:#666; box-shadow:none} +.layui-layim-members .layui-layer-TipsG{display:none;} +.layui-layim-members ul{position:relative; width: 578px; height: 200px; padding: 10px 10px 0 10px; border:1px solid #D9D9D9; background-color:#fff; background-color: rgba(255,255,255,.9); box-shadow: none; overflow: hidden;} +.layui-layim-members ul:hover{overflow: auto;} +.layui-layim-members ul{font-size: 0;} +.layui-layim-members li, +.layim-add-img, +.layim-add-remark{display: inline-block; *display:inline; *zoom:1; vertical-align: top; font-size: 14px;} +.layui-layim-members li{width: 112px; margin: 10px 0; text-align: center} +.layui-layim-members li a{position: relative; display: inline-block; max-width: 100%;} +.layui-layim-members li a:after{content: ''; position: absolute; width: 46px; height: 46px; left: 50%; margin-left: -23px; top: 0; border: 1px solid #eee; border-color: rgba(0,0,0,.1); border-radius: 100%;} +.layui-layim-members li img{width: 48px; height: 48px; border-radius: 100%;} +.layui-layim-members li:hover{opacity: 0.9;} +.layui-layim-members li a cite{display: block; padding: 0 3px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;} + +/* 右键面板 */ +body .layui-layim-contextmenu{margin: 70px 0 0 30px; width: 200px; padding: 5px 0; border: 1px solid #ccc; background: #fff; border-radius: 0; box-shadow: 0 0 5px rgba(0,0,0,.2);} +body .layui-layim-contextmenu .layui-layer-content{padding:0; background-color:#fff; color: #333; font-size: 14px; box-shadow: none} +.layui-layim-contextmenu .layui-layer-TipsG{display:none;} +.layui-layim-contextmenu li{padding: 0 15px 0 35px; cursor: pointer; line-height: 30px;} +.layui-layim-contextmenu li:hover{background-color: #F2F2F2;} + +/* 添加面板 */ +.layim-add-box{margin: 15px; font-size: 0;} +.layim-add-img{width: 100px; margin-right: 20px; text-align: center;} +.layim-add-img img{width: 100px; height: 100px; margin-bottom: 10px;} +.layim-add-remark{width: 280px;} +.layim-add-remark p{margin-bottom: 10px;} +.layim-add-remark .layui-select{width: 100%; margin-bottom: 10px;} +.layim-add-remark .layui-textarea{height: 80px; min-height: 80px; resize: none;} + +/* 排除与bootstrap的冲突 */ +.layui-layim-tab, +.layim-tab-content, +.layui-layim-face ul{margin-bottom: 0;} +.layim-tab-content li h5{margin-top: 0; margin-bottom: 0;} +,.layui-layim-face img{vertical-align: bottom;} +.layim-chat-other span{color: #444;} +.layim-chat-other span cite{padding: 0 15px; color: #999;} +.layim-chat-other:hover{text-decoration: none;} + + + + + diff --git a/statics/src/css/modules/layim/mobile/layim.css b/statics/src/css/modules/layim/mobile/layim.css new file mode 100755 index 0000000..18941ce --- /dev/null +++ b/statics/src/css/modules/layim/mobile/layim.css @@ -0,0 +1,136 @@ +/** + + @Name: layim + @Author: 贤心 + @Site: http://layim.layui.com + + */ + +/* 加载就绪标志 */ +html #layuicss-skinlayim-mobilecss{display: none; position: absolute; width: 1989px;} + +/* 主界面 */ +.layui-layim-tab li, +.layim-tab-content li h5 *, +.layui-layim-tool li, +.layui-layim-skin li{display: inline-block; vertical-align: top; *zoom: 1; *display: inline;} +.layui-layim-list li p, +.layim-tab-content li h5 span, +.layui-layim-list li span{overflow: hidden; text-overflow: ellipsis; white-space: nowrap;} + +.layui-layim-tab{position: absolute; bottom: 0; left: 0; right: 0; height: 50px; border-top: 1px solid #f2f2f2; background-color: #fff;} +.layui-layim-tab li{position: relative; width: 33.33%; height: 50px; text-align: center; color: #666; color: rgba(0,0,0,.6); cursor: pointer;} +.layui-layim-tab li .layui-icon{position: relative; top: 7px; font-size: 25px;} +.layui-layim-tab li span{position: relative; bottom: -3px; display: block; font-size: 12px;} +.layui-layim-tab li[lay-type="more"] .layui-icon{top: 4px; font-size: 22px;} +.layui-layim-tab li.layim-this{color: #3FDD86;} +.layim-new{display: none; position: absolute; top: 5px; left: 50%; margin-left: 15px; width: 10px; height: 10px; border-radius: 10px; background-color: #F74C31; color: #fff;} +.layim-list-top .layim-new{position: relative; vertical-align: top; top: 10px; left: initial; margin-left: 5px;} +.layim-list-top i.layui-show{display: inline-block!important;} + +.layui-layim{position: fixed; left: 0; right: 0; top: 50px; bottom: 50px; overflow-y: auto; overflow-x: hidden; -webkit-overflow-scrolling : touch; } + +.layim-tab-content{display: none;} +.layim-tab-content li h5{position:relative; padding-left: 35px; height: 45px; line-height: 45px; cursor:pointer; font-size:0; border-bottom: 1px solid #f2f2f2; white-space: nowrap; overflow: hidden;} +.layim-tab-content li h5 *{font-size: 17px;} +.layim-tab-content li h5 span{max-width: 80%;} +.layim-tab-content li h5 i{position: absolute; left: 12px; top: 0; color: #C9BDBB;} +.layim-tab-content li h5 em{padding-left: 5px; color: #999;} +.layim-tab-content li ul{display: none;} +.layim-list-friend, .layim-list-group{background-color: #fff;} +.layui-layim-list li{position:relative; height: 42px; border-bottom: 1px solid #f2f2f2; padding: 5px 15px 5px 60px; font-size:0; cursor:pointer;} +.layui-layim-list li:active{background-color: #F2F2F2; background-color: rgba(0,0,0,0.05);} +.layui-layim-list li.layim-null{height: 20px; line-height: 20px; padding: 10px 0; font-size: 17px; color: #999; text-align: center; cursor: default; font-size: 14px;} +.layim-list-history li.layim-null{padding: 30px 0; border-bottom: none; background-color: #eee;} +.layui-layim-list li *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; font-size: 17px;} +.layui-layim-list li span{margin-top: 2px; max-width: 155px; font-size: 17px;} +.layui-layim-list li img{position: absolute; left: 12px; top: 8px; width: 36px; height: 36px; border-radius: 100%;} +.layui-layim-list li p{display: block; padding-right: 30px; line-height: 18px; font-size: 13px; color: #999;} +.layui-layim-list li .layim-msg-status{display: none; position: absolute; right: 10px; bottom: 7px; padding: 0 5px; height: 17px; line-height: 17px; border-radius: 17px; text-align: center; font-size: 10px; background-color: #F74C31; color: #fff;} +.layim-list-group{} + +.layim-list-gray{-webkit-filter: grayscale(100%); -ms-filter: grayscale(100%); filter: grayscale(100%); filter: gray;} + +.layim-list-top{background-color: #fff; font-size: 17px;} +.layim-list-top li{position: relative; padding: 0 15px 0 50px; line-height: 45px; border-bottom: 1px solid #f2f2f2; cursor: pointer;} +.layim-list-top li:last-child{margin-bottom: 10px; border-bottom: none;} +.layim-list-top li .layui-icon{position: absolute; left: 12px; top: 0; margin-right: 10px; color: #36373C; font-size: 24px;} +.layim-list-top li[layim-event="newFriend"] .layui-icon{left: 15px;} +.layim-list-top li[layim-event="group"] .layui-icon{font-size: 20px;} +.layim-list-top li[layim-event="about"] .layui-icon{font-size: 25px;} + +/* 通用面板 */ +.layim-panel{position: fixed; bottom: 0; top: 0; left: 0; right: 0; background-color: #eee;} +.layim-panel{-webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration: .2s; animation-duration: .2s;} +.layim-title{position: fixed; top: 0; left: 0; right: 0; height: 50px; line-height: 50px; padding: 0 15px; background-color: #36373C; color: #fff; font-size: 18px;} +.layim-chat-status{padding-left: 15px; font-size: 14px; opacity: 0.7;} +.layim-title .layim-chat-back{display: inline-block; vertical-align: middle; position: relative; padding: 0 15px; margin-left: -10px; top: 0; font-size: 24px; cursor: pointer;} +.layim-chat-detail{position: absolute; right: 0; top: 0; padding: 0 15px; font-size: 18px; cursor: pointer;} +.layim-title .layim-chat-back:active, +.layim-chat-detail:active{opacity: 0.8} +.layui-layim .layim-title{text-align: left;} +.layui-layim .layim-title p{padding: 0 15px;} +.layim-content{position: fixed; top: 50px; bottom: 0; left: 0; right: 0; overflow-x: hidden; overflow-y: auto;} + +/* 聊天面板 */ +.layim-chat-main{position: fixed; width: 100%; bottom: 85px; top: 50px; left: 0; right: 0; padding: 15px; overflow-y: auto; overflow-x: hidden; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;} +.layim-chat-main ul{overflow-x: hidden;} +.layim-chat-main ul li{position: relative; font-size: 0; margin-bottom: 10px; padding-left: 60px; min-height: 68px;} +.layim-chat-user, +.layim-chat-text{display: inline-block; *display:inline; *zoom:1; vertical-align:top; font-size: 15px;} +.layim-chat-user{position: absolute; left: 3px;} +.layim-chat-user img{width: 40px; height: 40px; border-radius: 100%;} +.layim-chat-user cite{position: absolute; left: 60px; top: -2px; width: 500px; line-height: 24px; font-size: 12px; white-space: nowrap; color: #999; text-align: left; font-style: normal;} +.layim-chat-user cite i{padding-left: 15px; font-style: normal;} +.layim-chat-text{position: relative; min-height: 22px; line-height: 22px; margin-top: 25px; padding: 8px 15px; background-color: #fff; border-radius: 3px; color: #333; word-break: break-all;} +.layim-chat-text:after{content: ''; position: absolute; left: -10px; top: 13px; width: 0; height: 0; border-style: dashed; border-color:transparent; overflow:hidden; border-width: 10px; border-top-style: solid; border-top-color: #fff;} +.layim-chat-text a{color: #33DF83;} +.layim-chat-text img{ max-width: 100%; vertical-align: middle;} +.layui-layim-file, +.layim-chat-text .layui-layim-file{display: block; text-align: center; } +.layim-chat-text .layui-layim-file{color: #333;} +.layui-layim-file:active{opacity: 0.9} +.layui-layim-file i{font-size: 80px; line-height: 80px;} +.layui-layim-file cite{display: block; line-height: 20px; font-size: 17px;} +.layui-layim-audio {text-align: center; cursor: pointer} +.layui-layim-audio .layui-icon {position: relative; top: 5px; font-size: 24px} +.layui-layim-audio p {margin-top: 3px} +.layui-layim-video {width: 120px; height: 80px; line-height: 80px; background-color: #333; text-align: center; border-radius: 3px} +.layui-layim-video .layui-icon {font-size: 36px; cursor: pointer; color: #fff} +.layim-chat-main ul .layim-chat-system{min-height: 0; padding: 0;} + +.layim-chat-main ul .layim-chat-mine{text-align: right; padding-left: 0; padding-right: 60px;} +.layim-chat-mine .layim-chat-user{left: auto; right: 3px;} +.layim-chat-mine .layim-chat-user cite{left: auto; right: 60px; text-align: right;} +.layim-chat-mine .layim-chat-user cite i{padding-left: 0; padding-right: 15px;} +.layim-chat-mine .layim-chat-text{margin-left: 0; text-align: left; background-color: #5FB878; color: #fff;} +.layim-chat-mine .layim-chat-text:after{left: auto; right: -10px; border-top-color: #5FB878;} +.layim-chat-mine .layim-chat-text a{color: #fff;} + +.layim-chat-main ul .layim-chat-system{min-height: 0; margin: 20px 0 5px; padding: 0;} +.layim-chat-system{margin: 10px 0; text-align: center;} +.layim-chat-system span{display: inline-block; line-height: 30px; padding: 0 15px; border-radius: 3px; background-color: #ddd; color: #fff; font-size: 14px; cursor: pointer;} + +.layim-chat-footer{ position: fixed; bottom: 0; left: 10px; right: 10px; height: 80px;} +.layim-chat-send{display: -webkit-box; display: -webkit-flex; display: flex;} +.layim-chat-send input{-webkit-box-flex: 1; -webkit-flex: 1; flex: 1; height: 40px; padding-left: 5px; border: none 0; background-color: #fff; border-radius: 3px;} +.layim-chat-send button{border-radius: 3px; height: 40px; padding: 0 20px; border: none 0; margin-left: 10px; background-color: #5FB878; color: #fff;} + +.layim-chat-tool{position: relative; width: 100%; overflow-x: auto; padding: 0; height: 38px; line-height: 38px; margin-top: 3px; font-size: 0; white-space: nowrap;} +.layim-chat-tool span{position: relative; margin: 0 15px; display: inline-block; *display:inline; *zoom:1; vertical-align:top; font-size: 28px; cursor: pointer;} +.layim-chat-tool .layim-tool-log{position: absolute; right: 5px; font-size: 14px; } +.layim-tool-log i{position: relative; top: 2px; margin-right: 5px; font-size: 20px; color: #999} +.layim-tool-image input{position: absolute; font-size: 0; left: 0; top: 0; width: 100%; height: 100%; opacity: 0.01; filter: Alpha(opacity=1); cursor: pointer;} + + +.layim-layer{position: fixed; bottom: 85px; left: 10px; right: 10px; margin: 0 auto;} + +.layui-layim-face{position:relative; max-height: 180px; overflow: auto; padding: 10px; font-size: 0;} +.layui-layim-face li{cursor: pointer; display: inline-block; vertical-align: bottom; padding: 5px 2px; text-align: center; width: 10%; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;} +.layui-layim-face li img{width: 22px; height: 22px;} + +/* 其它 */ +.layim-about{font-size: 17px;} +.layim-about .layui-m-layercont{text-align: left;} +.layim-about .layui-m-layercont p{line-height: 30px;} +.layim-about .layui-m-layercont a{color: #01AAED;} diff --git a/statics/src/css/modules/layim/skin/1.jpg b/statics/src/css/modules/layim/skin/1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..d9f99263d65a31247c966813d155b83f1ebbd1ba GIT binary patch literal 18386 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 literal 0 HcmV?d00001 diff --git a/statics/src/css/modules/layim/skin/3.jpg b/statics/src/css/modules/layim/skin/3.jpg new file mode 100755 index 0000000000000000000000000000000000000000..53ba9216283a962b6d325965a4a11c7504056e54 GIT binary patch literal 18610 zcmeIZcUY6@wkVEWu>u0pN0DAak={n7NK2$f2n3}XAVhkH85NN}3L$hxAoLeXx4uCZLd&T{A0jazqk*;!cFdGB)lk?#J$#e15#e)vI1 zL{voR2N{_M4`gJ1{KxbMkTWc|Zn3hlaEf9Se}l_% z?iA|zhxbg_UdVag{`nN{hfkIEUR7V_s3((5*Up^|VL8Xbq{X!I+rQ!Ze|7FmIdP=` z!3yzO-#vb7)GlRhJ=-ZCKbf2xJ=1I4Oee-R9{34{0QM9#b2sZ;mZ%Kh;FcoK1N3$8|?-AtGEI1{!8-RvGQ>^TF>P{Wq}dY=t>_>o$7Q&_!fY^JR1Y=9HScyL;=xG+Q zuA>#}OIaNq+-T)VNm-S@^{tAm@<{G=EEcFJH0C|)f-A6B0_^47bC#07lQAB?*Cg$o zeItDmSCO`*ABctT+P1#dI;?2d4cv28s$M}cQ4QD}{N--C*s)q|w3 z{r?R(pXK-CrP=UW(+V2G!#dzL*x|8g7nLPGL2y3d5|^@0@6E7}1pnzU(+|2BnuJR1 zps;Lz_&1`w+c18STv`?@Fxef^SPCg>!YGYJ%@MXcFw4 z!??QEYmh(wH=z4JApVB~|0f(^UOVy!eTk=A_1e~Tl?cj=JSbBiV%Zg+43q1q3RZRE zK4G#vIAOAHJf7@|lNaF8F8f|}t;~=R zwY&RvruV$?U_&Y?lVHW#{eOblKa9Di&@gdBP3@r-*AQz{N+&EJPNAvsfc^b@l<^K0 zcb)5m>82z%UzX$sX~+Ge;l^?MAd9X3`}PMRSxWtnR2`QbViIChKykKVtIj>|{4=Ne z^0Rc&Kl7XV&T0qKLhhqB4x*Ca{ojAib)0wQF6qh1PJU_(>TlXY5iX1Pbj|QRF|o}o z>`hl!mToCk^{G+Pb&}`aVI^1Bsw=Ow zNJ5F8W|iCP>vVAn8ipk+S4m^bB%?}Q-4CVd`aTP-4+Uz#hUBR16Q;NT29mi%0#hhX zz9I3Nu+1>o%nqjz!a1s0_D+~4wh*H)_hCw6{?Wl6c+5ikLfoB^D6D5KpQ8gs!IJVe z^Pt5bEMc~wGURiuq8^{s3zzoENWJSA!UE*|KEc5`pO?on zk)@DXUPbdP1-H8`atZsM8w>cu%fFAcb~%NaX@R&*b5$+H1|Nj^EHXGMBz^Odd8S7U z_!nH+*z(7?VX|E^&yWWsh)VRD@|(|ug!A_0wtZXTUfGWc1YQ9EbiN^T?bwO8>gLGv zkFRYdy`Cu`}5Z_$DaFota=)Gt(!uUYWm zy#nlZ>idi?bR1)log=_3I~%`#@S%atPQY|*n&qpzWb8bev%x9V$jDQ2bQ1 zG8cdR`{G~Z?=W5baTtjNN_qI}>x9>{DO)Gi7O=+_%7^`sZvs8P2MW)(ODVM?aBC&( zA7Xvqy2D70j~C&=OT7bV0qrA2!*4YrKscN0&a-%v9Z412)H~>|^erJ`xR0)io58rC ztOgzDQ&ddWdw0mq0IJn291(Q`$=LbXg4B%u9jzzKAq#VuDQF*^PnduN?}${(wmy8st?!fJuyS;U`~g{nvS=ja%ln4$Nd01kyGSg->U^W{_N0CH$)zV)24i!9d#Hdt=#e5qd@Ki`` z7kR$QWfwU&@Vz8|CcB&b5;rmy zhU5fwvUW9rzVr9r^DhgN@7zH56+R-8xcZ_Kz<|Th4jwn_#^%LVy6+?h@>+laMQ^}k zsKOEhh*eflPy#x{(yLlzBIjR`0l>E(yH?|)<>BPMoZPGY?<;Ox(U(@oY{3tby{&Pue%gStN$~+- zNlZ=A20|-q{=nRyw{|O{2@vn}-+>oH1Mv6_A)ZYN zSA4jmqI(-`ZZ6nbG3zMIJ84ZX=u}OX#%+1h1Y_nzzuIY+%*M_(B1WSk^%6>0G8*7= z=!m#G(<5C|)!ES5 z7D(_b;l#;=2uf)3)Np}4*f=C-zuq5p$eL+vOH2F3g*I;%0J=9qKB)OWZ#yT;+Y zpUu4IU3H`x#uI7*!cKb_8n_w+c5x&!+QK7 z5f~y@JB?6h@e30ZUQN)(CZ8U?^Zb2khMxF!vuD}yx!Ux%;c`1KrgL+R>qj>N$iXp= zW%+CjT>%}7g1A@a|BR9U+J5FI(b^27rm3`&Xd?f014L*dWXCAhyU%rvFx%q^ z;=It6Ll;6;uh+bld(!z^V1#Fx=W9an4;nw6JAcjNNtZ&)Oy0SbOIp`lU$y*T(E9bA zk**r~WqMGKfGT-%>J=gPh)@8NKtf#=EQY|e^s<1mj9FbDni;1$D>BHiGtXVui^C+SE2w$iu&g!ca z5)G{08R$9c2uw$&*WgxMSn2Bqlhrqd`1fqh-QOl9(jNr)<&ERm?s%9oSJ&~2IJ(6o zWewX-+>=+1_xiN=Mr5(l;hI>I*@EQd`#i+J{r z-p_SL<;MBd%Qvx3yY~X#rCEo6q=L0hm@Ei(X_JAEkN8fQ>YrpZDujrZot{}D5PPFk z+OY%c5Njj<$P%SB*UsKkay@9WwtP0UYAM&jYh%~5Z0sLMbe`r zs=}b%2vLFnU07&q4VB=WVc9qE?agQD&Ml}kj!>3Y#nU))lR*Aa zgd=UcEMS`d(^$@??5XmeDYtwiVE*x_^LhJ_3G!xpvWi3JTCmdZ^p7#SN72^aylPEa zu>)|RvpkoVr+*_GV&$H!blG@CZ%{URQC-OTJM?jx)iAI^ZmLQ5_GpbOUZH%wb;pnL z-IJ_iAXiD){Qyw1Bo@4nK4H>-s2kfbmSlCs4;E3gj@juV#nQa-qtW#B37!{P7lvZ1Iln`{<%u=cP zSa7rys0OP*v#H<`KJwL#86M`7Hg_EnmMws;CJ?3`mkO1uGC90F)ThK~>HILrYn_xf zNU(BV0CnaJ*s*w;Km~4!ryaz4H9LP05M3?Ow+0VB?!q~im2A_K!iK!X3Z$F0q!aI8 zJ70i9*-Dt+f zAP=mTRw*4)?Mq^x-e0`KE$3C-8I7zWXugp!12Ph+-gc~n-eq8kidTZuvP)nPl+VSH z8Wm;ob=7s1gRzY|VRDk-ZBP)Fpw&2Yu$bEqdYOO>fRe#5u6fQh zKJR4JENzE5{{rlz!Ej-FDJ)1KdmjbOJQrtGvf|xF;>M@h`m;$_a6VG-R$SrtDT6F2 z_@7bX1JTiWirAmZ4NWJVknfYSdye!gnEy0{#xRe z#z7@ZU$AagradP3T?Epx^#=C1&0eY`7rLH6@fUbkl=)zD&+<#)-Z5gT$!F`-YSXa@ z>j%iLelIL9KfIUQx`w$C3|uvCS#Uc`mQajM=JJ~vH z^Fu~^-$)t8J79B4P)QTg#$czYm1QS9a}g2V|C%O@isYghPN(5cw{lwIQq*)$)Qduh zrG-rKgEsN9S*(JWyYei*aHXy< zGu=6h1;-+kF&^eXLX*MsoV2< zMRjO^PzkNaZ$To+eJz2W(R)z0Z(RSGod2Wx%c^KAyh+=|4vWSk#Kh0~F`0$1!0Moy z@EZ%LxEqx-n$1^$d^a?m6^#PT+?}(l?_MwO)@z&)agXn&dd=qSaLFu&uZqv)RE~1? z(&pwj@w-QFA4*6L_&YDZlmhSNz3A-aj7fyxhK#(5jCwFPALcItL&<{L{Xybk#=$$hKKsmg7= zTD)czOkF1qSv_f$Fvxy=sDR|j9q#Z-%7*VHrn1=RKB_Qx>C zJUq5it5)@d$?fp6xYor&Dq5*(HZ;mOrw(+Dz;y8r`~KbyiUr&)SOO!zy4Dy`-N`n> zoPMU9aW~YXzCz*(IzM@u@7JuTA&bovw|kK$@(x|bz5Do$2nuW{;x#@*?(ovce+JFtbR zqQ6(EmwLreq(R{elR^U}p9)k1O1+=?A_+Y9=t~V@h1I<&X@er~e*5V^QkVa%PLMp0 zN7_Xoo(27yk|A0h#)tDnMcJ(91aF`@xMAan_DAQbJ3IwlY)Xr8+Ykv=eZ5`5ce7Gl zT}76wa-&qqI1Zbswa6@XY!&pY%;0{_#+TefdFLX#*s8nCN2Xi)VawHbY~~JS^YId5 zJ!VLv5~os)^^wWEE;(aES5b<DH{CA#;DumQCA5qp^W2>YUtF50uRBofnPp-NC&;Kuu(Cc zDy~Mz&98>%r_{h-kPAq8zZ!;>|-^zXXq?K>;ic~|*fv=8WMnj2R+skx&d(&6G*9N5ayo>tU z-TDB18|~U{p>S1KlFKoluqL=)^C{zMT}454l+iV-KbWrII8{_^sr6&6M9c6q`lpI{ z1&cuy+k3}Z5?)OWJ58>pmDqaM?!7b{by1P|p8cR8wxrH?NN3@#F8q4Ao54^~FYK}G z!(OvU<4G3hpfrwhXRY`Ek1yk!4c)^AZ_4Y+O}FP!jUtnRz;thUnSmSQTUFn4s`!$> zfA_cHCIk|%X;6uGPMB_#HjM4|NaPVS9QbltM-uNu8izDm%F5P@$j>prq>-r*W%uF) zm(O$7fl4th>q>eNhU^AK^^Zb>wux(8Zm!1=mpfm7lmE}u=-<`L)?Gh6vdR4R3GXXp z>s1h$9-5SD)z{cLvIxlHUAIEb6G#@V0NZAh45wu`*f{La-#}4^u7?~71BK33mYAuWN6u?3ujC2GFhT6v8O#@851bVS0EK!rIZI zuUzp^qby4+AV9yidWX3qV2P*zGZcri%b;R3kO`q9)A=dXqGF0G(po(*HlO^znT}aq2VOJvF zYi(pKeZ);;PSEfRP9ldB5?q~jXpp~mKU)tsS{*-*k)^=CA6CxOiaKNVeO<&0u*ibt z6eo$iZ&&=D2jthy0EPqF1Q4n&?N6~iNuy2_fUXf_ZJa8sg4=&I82BxIDyU$^ zD#FLeeUJG)2-+N3L1fOstH zYC2hW>>}i3?@GqHsR!jwhxwi`eRQ}sFB}k$JLcc}xw!Cau*i*%N!bN7A%!x(K?)h) zX`ugL7c_PeWb<)DPF=Tm4f55%aN3uP_qZgVAUQF8Rr#waRM60$Rc0kFK(1V z^%X*!ceea z%p3+;zxXQh6WNYdS!BX<$W^DbpVP>AYwVDnXv0*?*WK=B`&8t$UPPj z76v-W+dvZOFDR}sm~~1PpN5xLtWEMjd7*mLyt81+yWjq%MSuA?%XE5FWMaC;Y!@Y7 z)&KJQVbydFD$?bR@@U3EJnuW>s$w+*Ufd>!Wh>S{QMtfG9`Gt4>!vDvD+mWD@n3H4 zGY<4#-uI23KUB4gtUPoFuy!>h(g5(7u4@WA^YApEmbc~{-73!BD!QXiKAsE9jA1Jn zy4ruJKnM_ps4`Fjv?c8Pa@25d6usoGWEH7Wj2I2SdBb#}B$Dp!P;RDpm|m&erY%}w zHzp^Ukeqh67Mj_}wkp?~96eJln{gLd&haYPCm6B(;uc-rw!Y07D3r4P$gp8L*q1K# zG6^;y#g)(Ex!qUZ0_CK55oZyPhKD?i4cwb%M0VdzidT<1LR$mUt4zb1nD@tJM)Z*%%E53)rlr@5~7wIw~XgoJ{ypFbSJI}x3^J4-wL7sHY-%Le`Mhob#g(jA2Tc|N^+ES=S{pXNn365Z(c zTqyb3oaGyW(vJ?Wt(B%o_`fFYz$tY01Z-G2(YxSf*NBbgZLD-fd12jJuIQJJ)-YQ` zB&o##R01-F+9}ao~>*^cOskMw^xiAhS6M zL@@~m70f>X3xrfeB!9?%P8wD#MJ2cgS%oxIw6Z#TGUPSu%~vOD@!^!D?=AAg*wq#K zwp~37*TSOel2{tY2fqv1?@{x5v5d`c)gh*0DT8|fV?L!eSH+Q4NyQDp4;s-^LoBQ_ zEfzZx529&U^Enrjs}1U|B=T&731C(FXQ6nFVWr+4z9#jE&U(<1`! z(euOI_Ky0YTIWhA`dYn{L9JdqhSYMz`G>0_&99ZZ{jH*yB7(GgR=%^naKbd|(jY{v zHkFuhp_|z32PAbq?Tzt}na@xTO`r91JB=RjnnbwiAgJy1{^}iJ@||f>1o`9kab|4w z5LTx~NslMIHa+! z-Jg$+*5=Do5P8oXB;D?^Ulq?t3s3jmy=zo25LE;CUK*j=K!S|(Q^VR9Act&)4npes z(wv6HsFf3@wN#6VTYp$4WiDwHHu_#$HZwp)Si71LbHh_T+Crr&+2oH?_E4-c9XXTt za(#qzIk79tKr7>X!jNP*&OaoRU3a5$3v$Kx4Pq>`z09x!o;5z{mrZ->N$v|@e&p-x zKlJSDOUM6;f&9+Y-yC@?Te5;kaHN=W`9aqw)|RaNo@o}gqY_!4erp<98l!u)%{9~? zQGuwG!I@c3e(2W@H-rseq(Z4I}p+reQIn29vMvTMOvcb;QAS!w`#h_WofS#C=^vY6$>r9L*#U)Lv3ysF~qK- z&imVFl{?1g>+IRnOe~vM6>aXIs&0y1sO^C#XxUqs%u$i3h=)LpWn@ z%lg9%(1>NC2he;SL3(kM4FIzATAmY_? zotJ0lnxvBsZOPm4>agbC^)_Rvz|k1X4^eIC-+JSL52Q_AfoQG9ar{oJvhE-lpda&) zf6^ggu*kxT%;n=YeZGGy#nQF)`n;oqXJ_NaRkOR zRwdBQ&OrYNG!^`6P~|;2m~Uidm$?aauTcMy>7?n}YrjGH_`6YL3meiELzrRJm1yhX z20_{DjS+u4HvQ%Ndzs&nt{rF6Qvs-)KP(rv$iZ#w?O zbnUuHP9cWGmys>9`$8r8+fUd1t+-c{7U;2->mTkb-@MV^6=n=KP*49j?PZAbadQ2> z69TvH6w5HGwRqIR`S6ihW5QhF?m_hLH1E~Ib?%1JSWMbHX>+QUO0nZcz!p{M%RV+M z6gz;8B8DPuX;@68-@|NYOFVKpz7K+;xDDgL3nl}G30xwWp$fkNLCTjR4w6i5Y_9Z> zmz9wNw(O^F?zLi$P{UU#HTZlBPZNUlPtzKGV$xp(FtMcuUZhTP%XG_^Pz^&;~BNCaM73xiFcBVOL%z@vAsC_GL2r?(Nms|WbP~?H-wcPXnpow zp+Kpv0suF#YH9r_J@M&uMNPvcPT3*TqM;&fBe{8E_A@@p``{CP=Ef( z;4liXtXIpEZLcSW%9MobQL!Nc_wk5IHszqCGT#Su+-h<|HPkOCb88M6G!|D1#9>=@X_~Zxg+|!w?f`er?@ot!rIJvTc=91d_&?(@pDdw`y&=B4Z?S z#|?Ar>LEbxJw|wmt%Aq-o`%62(oS zmHvX3=^$?w<6+y>?JbLppf#fh8(K9PYEobkNXP>HsL#UIzzoqVSl|+$`^Y45#&pB| z`{vdX@1v)GtRk>(%LerCYo&)}^eg4^L(t)xoy>2s_r)!4TAJz3fCP05rjs3nP^Z|%01_iVPnuTP|SO@?$=kmZl)T!E)oyV}_mp0ja z&E2T5jE(%Bd3%}SJ!1>?m`bTo={GhS{2k5enje5|k4!^Vbo>QCbnB&+*dy^nqcmp0Uv zP|GRS41tR0Dd@8I5ykz;MCi3ZyeM{vP@((K)i@wa$PD@Gf{T@e?T6QgmC&zlC?G1) z+ES2pSRjHXDAi<+YLKXG-LLI>;s;Bu3$|6v#XBC8Jh;J@Y1zC>@tN@wUY%%ceS z%K058xu+~wF3zL&XQ!}>#uc3j`hAE~&8!bMFayKu=GlL#zOiR#WWE0$A->@?sTkV8 zKoUEx!%;7>e1^^n?6c9OpZ3N()yoq+_|wA{teX^Yv|S)!j)xo1Rb(NR*KA_YP9~&T z%POb%K5&B0@rQ$p8edQP^pnu#l4xbb52VreQFBf5r-4JF3Tr7Hdy2lMkR;TnIegqO zF^y!jLF$V(Os1{lX6=y_LP=;-aAyGQ?QSKoTkMg>uLoLFE^f-`TEQiC&@(vZgoz)o zbwh#S8BJhMMdTLT?sq6afn%=t5)lYfw>NfSQ(z+QEhNIn0H`J%(trR|N)~Y*Tapm@ zT`DhZlKhtVvW~t%5s*&JJ?l9)rAG7et>m&)*MM3=^mj^0Peim-P?~xXE~PKv>A&#) z4BOLq?aI8$nQ_JySS|*Te!|45VI&7=F&PcgrS}AFMqt0q&HM_{Ug>s(SZCaARE7PRlrWfsdZ-dMk(%YrfG5$ra`iZ05t|q0mOEp7$+Py)W;TRf+`ZO+7}2ovq6kq6y_ma-s?0XV_F0L;ocl;V<;ot*VZ2 z=}M^FayR?Va*&^-(;TT2XuH4PdK_gfBHyR2$%j)>E6dS3)B3rJ;W0_GEH}XF^jgXI}-g&Evy#C zhY&koPtFLW9snlLL5a}u=Bh3+S>~kF*l|2egW~V+nj$)stL3>Q>i=jPl%XLi8 zK~mePYP`w@sylxC2(YejGjR6c5Ef>x^#%_d^PGB1yx?uGeQTwPFtQPT*{^A|+l~h< zYtf1=Vz#(`i!u9`Dcd_~iziG~59YoUEuQx8B3*gaL6SQ47v~5itvIv3|1(%1GCLD0 z_}FX$>3>wpUW3HbiQ* zy`}sRBF$cm#I@m@df)LbEQ89HF7u?hsnXc}dC00j@y&@??fMfY>GBNw7sZD!aj{jO z*QmwhuCS5VmgVw6%L=4Gg1i5LjXjuqdlk@^)Z)>x(-WAJ?HDt}5~-Nczp6bil9d#r zxMl^c(`W)o9ETe1N9KkmQd5?sJaa>nOrVgpSch1^HZSu=5;8N#4J?8xQT2^$nU<7Y zd7G4jfw^0e2Nr|rlk9(T=r45d)VssT*FcdbkXhWsqekRW8DD#7;e-CdA_Hklyk-+; zRFeQ!Z^C1nlFhw0y-E?(AEmwUt`O@zT?ZLdd(JUx3Hvl#M0r83Nnxj2D|2`A*as+L zqB_D3iq6cNtlR-;0$w@=wLVW8qY9%s`Z|vL-zv05KUg>zsL;((0Se{J##Fu#6E$;+ z3YD`}I?i2yXBVXH^q1)g|<<3Y=my--;qD~Pz-{){669gEQtoB)GL z>p=a@hRtPT^V-F+BQiWJ^8>Axc(eVjTP)`211n`@JP+?k6+dB04Ss+R*S1)8U=heG z$MuwVAqsZ)rpy+s>YrFP#YZls_I+paMr4eXXu<>$B3VnN&7}hL8 zYP5ChAfhH@FjI#?9+&?@AOCD}!xWy*iN3MP{h<3mVPOr4l5aAfgrxH52eI0!B7LJ- z9PA|A^}R1rjFz9@PP){)Pux9cG2%M98sVqk_O@R5wY_!aF(2;by4~rF0X9i;YKRlz z+5qyM)uxp#CFZQ)WQrAb{^|V9>3}Bdm`$Bkha5caiYR5s=;S1!#(^8+|jvV?I3Kn zJ{)2mXRJ~K^dqg`yOql} zVXjW{?>s!{;IOEEF8i5l;!jpE$y`)Ci?vIhgg&y}dpphxtrT&jdb$!i3x%#X+cdtX zV*~us?u%IRiZ;x0ctXNvp93?-Fh>9m1Jel4*xALqL8~*eZ1M^T25WB89i7#}CX?4| zFKis#1CKVtkI)V<`eSBueLbofm3w2Vx$UOw2~(uElda+$L=(UPYNhP3I%Md{OEIn$ z^;Am;8wVs$((Nb-&ucnz8S$JZ6*0k~fN%1>{JMz=h-c+D*Z8=@j45}rUdW}ruytjz zz2)F$Tp&mM{9lTnyU6r|+^M}XN+WrV`8qB zd$oNH4bHVOweos$xk&T}>8~06eq}krK)7da}L6z*; zGoEGPCkTmHeoK#xg{BV&2b_Uv4Z-kO;9WLm)@HoPie1|uYmLZ8ZsmxV@S0HiwtKBp zU&%Z;U5~atMj3AtDN0y9RSBZVWt>N|37}8O_wCI`WTZSUaHMaPr_Ibk_Wavp^!Q(}ECa?vJS zX-)RdsV^lx+ipZ!8mVHv2Nx~C9MF%tqcK>dZ3b1@C!j`;KV^)6Sdvx-$H`6I`jf1) z*r%iXTB2yml+LdsqyLNz2))UdWj+ zYR8q7i~BzkkU6ez7degZz>ZRLMJ$3vR(>(Y_IqHQd3gOZf_xsPyZ%YeKYgE>@6EOM zL^-pu$*R2NTAtW&9Xt#|Q(Eib$2v=I8(vyS|D3t0=>Af)v>z&sj8yvX(jzk~qO6v&vhuCA*j&!O#AyuY*yv$m>YT*$fj_*B=Xiday7;@w znPM*U!4Sdwb_|Mo!=!+k zdh2wjPfKn_{W~m2(qYVlWTWpyDChy_=2WV8L-LP>qq*GPm4GU*SBv?;A#tf&5gtl5_moyNX zKSGJ;djlT-@VBvd&R+BgsU%lHepwzKjsv|+VYE-D+hT8eCQoJw*{4>xsfVO2JRHWw11n5@z5~0{FgF(g%gc z`RmL>J<8*1mQYO%{5o=FhVjRFAaM%O3F{!Pp>~1fY!~Gak#*1P_oGIy_wk=+%`6jT zgN#cYH6DYW;SqP%uQTo?+Gq#}KtffrpyWqY5$<<8yNN~?g^pt&F1