├── CaptchaTest
├── app.py
├── generate.py
├── static
│ ├── font
│ │ └── font.ttf
│ └── js
│ │ └── jquery-3.1.1.js
└── templates
│ └── index.html
├── ImageBox
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-37.pyc
│ ├── config.cpython-37.pyc
│ └── ui.cpython-37.pyc
├── config.py
├── icons
│ ├── zoom_in.jpg
│ └── zoom_out.jpg
├── images
│ ├── wallhaven-748705.jpg
│ ├── wallhaven-753155.jpg
│ ├── wallhaven-d5qy5m.jpg
│ └── wallhaven-vml6em.jpg
├── run.py
└── ui.py
├── LICENSE
├── LRU
└── lru_cache.py
├── PaginateTest
├── app.py
├── models.py
├── static
│ ├── css
│ │ └── layui.css
│ └── layui.js
└── templates
│ ├── index.html
│ └── main.html
├── README.md
├── python_ls
└── ls.py
└── typing
├── __init__.py
├── crawl.py
├── run.py
├── text.txt
├── typing.ui
└── ui.py
/CaptchaTest/app.py:
--------------------------------------------------------------------------------
1 | import os
2 | import random
3 | from flask import Flask, render_template
4 |
5 | app = Flask(__name__)
6 |
7 |
8 | @app.route('/index')
9 | def index():
10 | return render_template("index.html")
11 |
12 |
13 | @app.route('/get_captcha', methods=['GET'])
14 | def get_captcha():
15 | img_list = os.listdir("static/captcha")
16 | img = img_list[random.randint(0, 1000)]
17 | return os.path.join("static/captcha", img)
18 |
19 |
20 | if __name__ == '__main__':
21 | app.run()
22 |
--------------------------------------------------------------------------------
/CaptchaTest/generate.py:
--------------------------------------------------------------------------------
1 | """
2 | Version: Python3.7
3 | Author: OniOn
4 | Site: http://www.cnblogs.com/TM0831/
5 | Time: 2019/9/29 16:18
6 | """
7 | from random import randint
8 | from PIL import Image, ImageDraw, ImageFont
9 |
10 |
11 | def get_random_color():
12 | # 随机颜色RGB
13 | return randint(120, 200), randint(120, 200), randint(120, 200)
14 |
15 |
16 | def get_random_code():
17 | # 随机字符
18 | codes = [[chr(i) for i in range(48, 58)], [chr(i) for i in range(65, 91)], [chr(i) for i in range(97, 123)]]
19 | codes = codes[randint(0, 2)]
20 | return codes[randint(0, len(codes)-1)]
21 |
22 |
23 | def generate_captcha(width=140, height=60, length=4):
24 | # 生成验证码
25 | img = Image.new("RGB", (width, height), (250, 250, 250))
26 | draw = ImageDraw.Draw(img)
27 | font = ImageFont.truetype("static/font/font.ttf", size=36)
28 | # 验证码文本
29 | text = ""
30 | for i in range(length):
31 | c = get_random_code()
32 | text += c
33 |
34 | rand_len = randint(-5, 5)
35 | draw.text((width * 0.2 * (i+1) + rand_len, height * 0.2 + rand_len), c, font=font, fill=get_random_color())
36 | # 加入干扰线
37 | for i in range(3):
38 | x1 = randint(0, width)
39 | y1 = randint(0, height)
40 | x2 = randint(0, width)
41 | y2 = randint(0, height)
42 | draw.line((x1, y1, x2, y2), fill=get_random_color())
43 | # 加入干扰点
44 | for i in range(16):
45 | draw.point((randint(0, width), randint(0, height)), fill=get_random_color())
46 | # 保存图片
47 | img.save("static/captcha/" + text + ".jpg")
48 | return text + ".jpg"
49 |
50 |
51 | if __name__ == "__main__":
52 | for i in range(1000):
53 | generate_captcha()
54 |
--------------------------------------------------------------------------------
/CaptchaTest/static/font/font.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/CaptchaTest/static/font/font.ttf
--------------------------------------------------------------------------------
/CaptchaTest/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Title
7 |
8 |
9 |
10 |
11 |
![]()
12 |
看不清楚,换一张
13 |
14 |
15 |
16 |
28 |
44 |
45 |
--------------------------------------------------------------------------------
/ImageBox/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/ImageBox/__init__.py
--------------------------------------------------------------------------------
/ImageBox/__pycache__/__init__.cpython-37.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/ImageBox/__pycache__/__init__.cpython-37.pyc
--------------------------------------------------------------------------------
/ImageBox/__pycache__/config.cpython-37.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/ImageBox/__pycache__/config.cpython-37.pyc
--------------------------------------------------------------------------------
/ImageBox/__pycache__/ui.cpython-37.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/ImageBox/__pycache__/ui.cpython-37.pyc
--------------------------------------------------------------------------------
/ImageBox/config.py:
--------------------------------------------------------------------------------
1 | import sys
2 | from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFileDialog
3 | from PyQt5.Qt import QPixmap, QPoint, Qt, QPainter, QIcon
4 | from PyQt5.QtCore import QSize
5 |
--------------------------------------------------------------------------------
/ImageBox/icons/zoom_in.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/ImageBox/icons/zoom_in.jpg
--------------------------------------------------------------------------------
/ImageBox/icons/zoom_out.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/ImageBox/icons/zoom_out.jpg
--------------------------------------------------------------------------------
/ImageBox/images/wallhaven-748705.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/ImageBox/images/wallhaven-748705.jpg
--------------------------------------------------------------------------------
/ImageBox/images/wallhaven-753155.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/ImageBox/images/wallhaven-753155.jpg
--------------------------------------------------------------------------------
/ImageBox/images/wallhaven-d5qy5m.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/ImageBox/images/wallhaven-d5qy5m.jpg
--------------------------------------------------------------------------------
/ImageBox/images/wallhaven-vml6em.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/ImageBox/images/wallhaven-vml6em.jpg
--------------------------------------------------------------------------------
/ImageBox/run.py:
--------------------------------------------------------------------------------
1 | from ImageBox.ui import MainDemo
2 | from ImageBox.config import *
3 |
4 |
5 | if __name__ == '__main__':
6 | app = QApplication(sys.argv)
7 | box = MainDemo()
8 | box.show()
9 | app.exec_()
10 |
--------------------------------------------------------------------------------
/ImageBox/ui.py:
--------------------------------------------------------------------------------
1 | from ImageBox.config import *
2 |
3 |
4 | class ImageBox(QWidget):
5 | def __init__(self):
6 | super(ImageBox, self).__init__()
7 | self.img = None
8 | self.scaled_img = None
9 | self.point = QPoint(0, 0)
10 | self.start_pos = None
11 | self.end_pos = None
12 | self.left_click = False
13 | self.scale = 0.5
14 |
15 | def init_ui(self):
16 | self.setWindowTitle("ImageBox")
17 |
18 | def set_image(self, img_path):
19 | """
20 | open image file
21 | :param img_path: image file path
22 | :return:
23 | """
24 | self.img = QPixmap(img_path)
25 | self.scaled_img = self.img.scaled(self.size())
26 |
27 | def paintEvent(self, e):
28 | """
29 | receive paint events
30 | :param e: QPaintEvent
31 | :return:
32 | """
33 | if self.scaled_img:
34 | painter = QPainter()
35 | painter.begin(self)
36 | painter.scale(self.scale, self.scale)
37 | painter.drawPixmap(self.point, self.scaled_img)
38 | painter.end()
39 |
40 | def mouseMoveEvent(self, e):
41 | """
42 | mouse move events for the widget
43 | :param e: QMouseEvent
44 | :return:
45 | """
46 | if self.left_click:
47 | self.end_pos = e.pos() - self.start_pos
48 | self.point = self.point + self.end_pos
49 | self.start_pos = e.pos()
50 | self.repaint()
51 |
52 | def mousePressEvent(self, e):
53 | """
54 | mouse press events for the widget
55 | :param e: QMouseEvent
56 | :return:
57 | """
58 | if e.button() == Qt.LeftButton:
59 | self.left_click = True
60 | self.start_pos = e.pos()
61 |
62 | def mouseReleaseEvent(self, e):
63 | """
64 | mouse release events for the widget
65 | :param e: QMouseEvent
66 | :return:
67 | """
68 | if e.button() == Qt.LeftButton:
69 | self.left_click = False
70 |
71 |
72 | class MainDemo(QWidget):
73 | def __init__(self):
74 | super(MainDemo, self).__init__()
75 |
76 | self.setWindowTitle("Image Viewer")
77 | self.setFixedSize(1000, 600)
78 |
79 | self.open_file = QPushButton("Open Image")
80 | self.open_file.setToolTip("Open the image to view.")
81 | self.open_file.clicked.connect(self.open_image)
82 | self.open_file.setFixedSize(150, 30)
83 |
84 | self.zoom_in = QPushButton("")
85 | self.zoom_in.clicked.connect(self.large_click)
86 | self.zoom_in.setFixedSize(30, 30)
87 | in_icon = QIcon("./icons/zoom_in.jpg")
88 | self.zoom_in.setIcon(in_icon)
89 | self.zoom_in.setIconSize(QSize(30, 30))
90 |
91 | self.zoom_out = QPushButton("")
92 | self.zoom_out.clicked.connect(self.small_click)
93 | self.zoom_out.setFixedSize(30, 30)
94 | out_icon = QIcon("./icons/zoom_out.jpg")
95 | self.zoom_out.setIcon(out_icon)
96 | self.zoom_out.setIconSize(QSize(30, 30))
97 |
98 | w = QWidget(self)
99 | layout = QHBoxLayout()
100 | layout.addWidget(self.open_file)
101 | layout.addWidget(self.zoom_in)
102 | layout.addWidget(self.zoom_out)
103 | layout.setAlignment(Qt.AlignLeft)
104 | w.setLayout(layout)
105 | w.setFixedSize(550, 50)
106 |
107 | self.box = ImageBox()
108 | self.box.resize(500, 300)
109 |
110 | layout = QVBoxLayout()
111 | layout.addWidget(w)
112 | layout.addWidget(self.box)
113 | self.setLayout(layout)
114 |
115 | def open_image(self):
116 | """
117 | select image file and open it
118 | :return:
119 | """
120 | img_name, _ = QFileDialog.getOpenFileName(self, "Open Image File", "*.jpg;;*.png;;*.jpeg")
121 | self.box.set_image(img_name)
122 |
123 | def large_click(self):
124 | """
125 | used to enlarge image
126 | :return:
127 | """
128 | if self.box.scale < 2:
129 | self.box.scale += 0.1
130 | self.box.adjustSize()
131 | self.update()
132 |
133 | def small_click(self):
134 | """
135 | used to reduce image
136 | :return:
137 | """
138 | if self.box.scale > 0.1:
139 | self.box.scale -= 0.2
140 | self.box.adjustSize()
141 | self.update()
142 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 TM0831
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/LRU/lru_cache.py:
--------------------------------------------------------------------------------
1 | """
2 | Version: Python3.7
3 | Author: OniOn
4 | Site: http://www.cnblogs.com/TM0831/
5 | Time: 2020/7/8 18:08
6 | """
7 |
8 |
9 | # Node of the list
10 | class Node:
11 | def __init__(self, val):
12 | self.val = val
13 | self.prev = None
14 | self.next = None
15 |
16 | def __str__(self):
17 | return "The value is " + str(self.val)
18 |
19 |
20 | # Double Linked List
21 | class DoubleList:
22 | def __init__(self):
23 | self.head = None
24 | self.tail = None
25 |
26 | def is_empty(self):
27 | """
28 | returns true if the list is empty, false otherwise
29 | :return:
30 | """
31 | return self.head is None
32 |
33 | def append(self, value):
34 | """
35 | append element after the list
36 | :param value: the value of node
37 | :return:
38 | """
39 | node = Node(value)
40 | if self.is_empty():
41 | self.head = node
42 | self.tail = node
43 | return
44 | cur = self.head
45 | # find the tail of the list
46 | while cur.next:
47 | cur = cur.next
48 | cur.next = node
49 | node.prev = cur
50 | self.tail = node
51 |
52 | def remove(self, value):
53 | """
54 | if value in the list, remove the element
55 | :param value: the value of node
56 | :return:
57 | """
58 | if self.is_empty():
59 | return
60 | cur = self.head
61 | while cur:
62 | if cur.val == value:
63 | if len(self) == 1:
64 | # when the list has only one node
65 | self.head, self.tail = None, None
66 | else:
67 | if cur == self.head:
68 | self.head = cur.next
69 | elif cur == self.tail:
70 | self.tail = cur.prev
71 | else:
72 | cur.prev.next = cur.next
73 | return
74 | else:
75 | cur = cur.next
76 |
77 | def traverse(self):
78 | """
79 | iterate through the list
80 | :return:
81 | """
82 | cur = self.head
83 | index = 1
84 | while cur:
85 | print("Index: {}".format(index) + cur)
86 | cur = cur.next
87 | index += 1
88 |
89 | def __len__(self):
90 | count = 0
91 | cur = self.head
92 | while cur:
93 | count += 1
94 | cur = cur.next
95 | return count
96 |
97 | def __str__(self):
98 | cur = self.head
99 | ret = ""
100 | while cur:
101 | ret += str(cur.val) + "->" if cur.next else str(cur.val)
102 | cur = cur.next
103 | return ret
104 |
105 |
106 | # LRU Cache
107 | class LRU:
108 | def __init__(self, size):
109 | self.size = size
110 | self._list = DoubleList()
111 | self._cache = dict()
112 |
113 | def _set_recent(self, node):
114 | """
115 | set the node to most recently used
116 | :param node: node
117 | :return:
118 | """
119 | # when the node is the tail of the list
120 | if node == self._list.tail:
121 | return
122 | cur = self._list.head
123 | while cur:
124 | # remove the node from the list
125 | if cur == node:
126 | if cur == self._list.head:
127 | self._list.head = cur.next
128 | else:
129 | prev = cur.prev
130 | prev.next = cur.next
131 | if cur.next:
132 | cur = cur.next
133 | else:
134 | break
135 | # set node to the tail of the list
136 | cur.next = node
137 | node.next = None
138 | node.prev = cur
139 | self._list.tail = node
140 |
141 | def get(self, key):
142 | """
143 | get value of the key
144 | :param key: key
145 | :return:
146 | """
147 | node = self._cache.get(key, None)
148 | if not node:
149 | return
150 | self._set_recent(node)
151 | return node.val
152 |
153 | def put(self, key, value):
154 | """
155 | set value of the key and add to the cache
156 | :param key: key
157 | :param value: value
158 | :return:
159 | """
160 | node = self._cache.get(key, None)
161 | if not node:
162 | if len(self._list) < self.size:
163 | self._list.append(value)
164 | else:
165 | # when the quantity reaches the maximum, delete the head node
166 | name = None
167 | for k, v in self._cache.items():
168 | if v == self._list.head:
169 | name = k
170 | if name:
171 | del self._cache[name]
172 | self._list.head = self._list.head.next
173 | self._list.append(value)
174 | else:
175 | self._set_recent(node)
176 | self._list.tail.val = value
177 | # add to cache
178 | self._cache[key] = self._list.tail
179 |
180 | def show(self):
181 | """
182 | show data of the list
183 | :return:
184 | """
185 | return "The list is: {}".format(self._list)
186 |
187 |
188 | if __name__ == '__main__':
189 | lru = LRU(8)
190 | for i in range(10):
191 | lru.put(str(i), i)
192 | print(lru.show())
193 | for i in range(10):
194 | if i % 3 == 0:
195 | print("Get {}: {}".format(i, lru.get(str(i))))
196 | print(lru.show())
197 | lru.put("2", 22)
198 | lru.put("4", 44)
199 | lru.put("6", 66)
200 | print(lru.show())
201 |
--------------------------------------------------------------------------------
/PaginateTest/app.py:
--------------------------------------------------------------------------------
1 | from flask import Flask, request, render_template
2 | from models import t_students
3 | from sqlalchemy import create_engine
4 | from sqlalchemy.orm import sessionmaker
5 | from flask_paginate import Pagination
6 |
7 | engine = create_engine("mysql+pymysql://root:qwer1234@127.0.0.1/flask")
8 | DBSession = sessionmaker(bind=engine)
9 |
10 | app = Flask(__name__)
11 |
12 |
13 | @app.route('/index')
14 | def index(limit=10):
15 | sess = DBSession()
16 | data = sess.query(t_students).all()
17 | page = int(request.args.get("page", 1))
18 | start = (page - 1) * limit
19 | end = page * limit if len(data) > page * limit else len(data)
20 | paginate = Pagination(page=page, total=len(data))
21 | ret = sess.query(t_students).slice(start, end)
22 | return render_template("index.html", data=ret, paginate=paginate)
23 |
24 |
25 | @app.route('/main', methods=['GET'])
26 | def main():
27 | return render_template("main.html")
28 |
29 |
30 | @app.route('/get_data', methods=['POST'])
31 | def get_data():
32 | sess = DBSession()
33 | data = sess.query(t_students).all()
34 | limit = int(request.form.get("pageSize"))
35 | page = int(request.form.get("currentPage"))
36 | start = (page - 1) * limit
37 | end = page * limit if len(data) > page * limit else len(data)
38 | ret = [{"id": data[i].stu_id, "name": data[i].stu_name} for i in range(start, end)]
39 | return {"data": ret, "count": len(data)}
40 |
41 |
42 | if __name__ == '__main__':
43 | app.run()
44 |
--------------------------------------------------------------------------------
/PaginateTest/models.py:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 | from sqlalchemy import Column, MetaData, String, Table
3 |
4 | metadata = MetaData()
5 |
6 |
7 | t_students = Table(
8 | 'students', metadata,
9 | Column('stu_id', String(10), nullable=False),
10 | Column('stu_name', String(10), nullable=False)
11 | )
12 |
--------------------------------------------------------------------------------
/PaginateTest/static/css/layui.css:
--------------------------------------------------------------------------------
1 | /** layui-v2.5.5 MIT License By https://www.layui.com */
2 | .layui-inline,img{display:inline-block;vertical-align:middle}h1,h2,h3,h4,h5,h6{font-weight:400}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-body,.layui-edge,.layui-elip{overflow:hidden}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-elip,.layui-form-checkbox span,.layui-form-pane .layui-form-label{text-overflow:ellipsis;white-space:nowrap}.layui-breadcrumb,.layui-tree-btnGroup{visibility:hidden}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{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}.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{*display:inline;*zoom:1}.layui-edge{display:inline-block;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent}.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-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=250);src:url(../font/iconfont.eot?v=250#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=250) format('woff2'),url(../font/iconfont.woff?v=250) format('woff'),url(../font/iconfont.ttf?v=250) format('truetype'),url(../font/iconfont.svg?v=250#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.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-icon-addition:before{content:"\e624"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-service:before{content:"\e626"}.layui-icon-transfer:before{content:"\e691"}.layui-main{width:1140px;margin:0 auto}.layui-header{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-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{position:fixed;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:0 0}.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:after,.layui-row:before{content:'';display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.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-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.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-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.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-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{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-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{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-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{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-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{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:-.5px}.layui-col-space1>*{padding:.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-select,.layui-textarea,.layui-upload-button{outline:0;-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 1px 1px 5px;background:0 0}.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:1px 0 0}.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-content,.layui-colla-item{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-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.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-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:0 0;z-index:9999999999}.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-textarea{position:relative}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#eee!important;color:#666!important}.layui-badge-rim,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#e6e6e6}.layui-timeline-item:before,hr{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;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}.layui-btn:hover{opacity:.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\9}.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-checked{background-color:#5FB878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{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-select,.layui-textarea{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-select::-webkit-input-placeholder,.layui-textarea::-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{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{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{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{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{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.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 dd,.layui-form-select dl dt{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-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}: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;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.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}.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:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;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!important;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!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;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-checkbox-disbaled,.layui-checkbox-disbaled i{border-color:#e2e2e2!important}.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 span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio>i:hover,.layui-form-radioed>i{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;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-radio,.layui-form-pane .layui-form-switch{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:0 1px 0 0}.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;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-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.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 button,.layui-laypage input,.layui-laypage select,.layui-laypage span{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-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.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-next em,.layui-laypage-prev 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 button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{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-table,.layui-table-view{margin:10px 0}.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 *{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:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;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 tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#e6e6e6}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.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 .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{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-table td[data-edit=text]{cursor:text}.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 0 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-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#f2f2f2}.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 0 0 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;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-numbers,.laytable-cell-radio,.laytable-cell-space{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 0 0 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 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.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:0 0}.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 button,.layui-table-page .layui-laypage input{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-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-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{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 0 0 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:0 0;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-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{padding:0 10px;color:#999}.layui-upload-drag{position:relative;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-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;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-transfer-active,.layui-transfer-box{display:inline-block;vertical-align:middle}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#e6e6e6}.layui-transfer-box{position:relative;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#666}.layui-transfer-active{margin:0 15px}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5FB878;border-color:#5FB878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#FBFBFB;border-color:#e6e6e6;color:#C9C9C9}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#f2f2f2;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.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 .layui-this:after,.layui-nav-bar,.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-nav-item a:hover,.layui-nav .layui-this a{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:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:50%;right:3px;margin-top:-3px;border-width:6px;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 dashed solid;border-color:transparent transparent #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 .layui-nav-child dd.layui-this a,.layui-nav-child dd.layui-this{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;background-color:#009688}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.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;color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;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-nav-itemed:after,.layui-bg-blue .layui-this:after{background-color:#93D1FF}.layui-bg-blue .layui-nav-child dd.layui-this{background-color:#1E9FFF}.layui-bg-blue .layui-nav-itemed>a,.layui-nav-tree.layui-bg-blue .layui-nav-title a,.layui-nav-tree.layui-bg-blue .layui-nav-title a:hover{background-color:#007DDB!important}.layui-breadcrumb{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}.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;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\9;-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}.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}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .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}.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:0 0;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}.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\9;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: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:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left: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\9;opacity:1;left: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-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{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-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{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]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.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]>.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-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{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]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{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}.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:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}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}.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;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)}.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(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;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 #888;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}.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:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn: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}.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:0;-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-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-iconClick,.layui-tree-main{display:inline-block;vertical-align:middle}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:'';position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:'';position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#666}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:'';position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-btnGroup,.layui-tree-editInput{position:relative;vertical-align:middle;display:inline-block}.layui-tree-spread>.layui-tree-entry>.layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#666}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.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(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}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:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.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:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.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:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.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:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.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}
--------------------------------------------------------------------------------
/PaginateTest/static/layui.js:
--------------------------------------------------------------------------------
1 | /** layui-v2.5.5 MIT License By https://www.layui.com */
2 | ;!function(e){"use strict";var t=document,o={modules:{},status:{},timeout:10,event:{}},n=function(){this.v="2.5.5"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,o=t.scripts,n=o.length-1,r=n;r>0;r--)if("interactive"===o[r].readyState){e=o[r].src;break}return e||o[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),i=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},a="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",transfer:"modules/transfer",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,i=function(){var e=function(e,t){layui[e]=t,o.status[e]=!0};return"function"==typeof t&&t(function(n,r){e(n,r),o.callback[n]=function(){t(e)}}),this};return r&&(t=e,e=[]),!layui["layui.all"]&&layui["layui.mobile"]?i.call(n):(n.use(e,i),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?y.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var y=this,p=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),y;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?p+"lay/":/^\{\/\}/.test(y.modules[f])?"":o.base||"")+(y.modules[f]||f)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||a?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return y},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var a=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?a:(function p(){return++y>1e3*o.timeout/100?i(e+" timeout"):void(1989===parseInt(a.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(p,100))}(),a)},o.callback={},n.prototype.factory=function(e){if(layui[e])return"function"==typeof o.callback[e]?o.callback[e]:null},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,"function"==typeof t&&t(n)},void(n.onerror=function(e){n.onerror=null,"function"==typeof o&&o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?i("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),o.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o,n){if(t=t||"layui",n=n||localStorage,e.JSON&&e.JSON.parse){if(null===o)return delete n[t];o="object"==typeof o?o:{key:o};try{var r=JSON.parse(n[t])}catch(i){var r={}}return"value"in o&&(r[o.key]=o.value),o.remove&&delete r[o.key],n[t]=JSON.stringify(r),o.key?r[o.key]:r}},n.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:i}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;oi?1:r
2 |
3 |
4 |
5 |
6 | Flask Pagination
7 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | ID |
26 | NAME |
27 |
28 |
29 |
30 | {% for i in data %}
31 |
32 | {{ i.stu_id }} |
33 | {{ i.stu_name }} |
34 |
35 | {% endfor %}
36 |
37 |
38 | {{ paginate.links }}
39 |
40 |
41 |
--------------------------------------------------------------------------------
/PaginateTest/templates/main.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
17 | layPage Test
18 |
19 |
20 |
21 |
22 |
23 |
24 | |
25 | ID |
26 | NAME |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
85 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PythonCode
2 | Do something with python.
3 | * CaptchaTest
4 | 用Python+Flask制作的一个简易的验证码系统,实现了生成、显示和验证验证码的功能。
5 | * ImageBox
6 | 用PyQt5实现一个图片查看器,实现了打开图片、拖动图片、放大和缩小图片等功能。
7 | * LRU
8 | 自定义双向链表,并使用双向链表和哈希表模拟实现LRU Cache。
9 | * PaginateTest
10 | 使用Flask开发的分页Demo,分别使用扩展库flask-pagination和前端框架layui实现分页功能。
11 | * python_ls
12 | 用Python实现Linux中的ls命令,主要使用了argparse和os模块。
13 | * typing
14 | 基于PyQT5开发的打字训练小工具,并使用了爬虫爬取文本数据。
15 |
--------------------------------------------------------------------------------
/python_ls/ls.py:
--------------------------------------------------------------------------------
1 | """
2 | Version: Python3.7
3 | Author: OniOn
4 | Site: http://www.cnblogs.com/TM0831/
5 | Time: 2019/9/6 21:41
6 | """
7 | import os
8 | import time
9 | import argparse
10 | import terminaltables
11 |
12 |
13 | def get(path):
14 | """
15 | 获取指定路径下的内容
16 | :param path: 路径
17 | :return:
18 | """
19 | if os.path.isdir(path): # 判断是否是真实路径
20 | files = os.listdir(path)
21 | return files
22 | else:
23 | print("No such file or directory")
24 | exit()
25 |
26 |
27 | def get_all(path):
28 | """
29 | 获取指定路径下的全部内容
30 | :param path: 路径
31 | :return:
32 | """
33 | if os.path.isdir(path):
34 | files = [".", ".."] + os.listdir(path)
35 | return files
36 | else:
37 | print("No such file or directory")
38 | exit()
39 |
40 |
41 | def check_arg(data):
42 | """
43 | 检查参数信息
44 | :param data: 命令行参数(dict)
45 | :return:
46 | """
47 | assert type(data) == dict
48 | if not data["path"]:
49 | data["path"] = "."
50 | # a参数
51 | if data["a"]:
52 | files = get_all(data["path"])
53 | else:
54 | files = get(data["path"])
55 | # r参数
56 | if data["r"]:
57 | files = files[::-1]
58 | # t参数
59 | if data["t"]:
60 | files = sorted(files, key=lambda x: os.stat(x).st_mtime)
61 | for i in range(len(files)):
62 | files[i] = [files[i], time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(os.stat(files[i]).st_mtime))]
63 | # l参数
64 | if data["l"]:
65 | result = []
66 | for i in range(len(files)):
67 | file = files[i][0] if data["t"] else files[i]
68 | # 获取文件信息
69 | file_info = os.stat(file)
70 | # k参数
71 | if data["k"]:
72 | # 格式化时间,文件大小用KB表示
73 | result.append([file, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(file_info.st_ctime)),
74 | "%.3f KB" % (file_info.st_size / 1024)])
75 | else:
76 | # 格式化时间,文件大小用B表示
77 | result.append([file, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(file_info.st_ctime)),
78 | "{} Byte".format(file_info.st_size)])
79 | if data["t"]:
80 | for i in result:
81 | i.append(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(os.stat(i[0]).st_mtime)))
82 |
83 | show_file(result, True, True) if data["t"] else show_file(result, True, False)
84 | return
85 | show_file(files, False, True) if data["t"] else show_file(files, False, False)
86 |
87 |
88 | def show_file(files, has_l, has_t):
89 | """
90 | 格式化输出文件信息
91 | :param files: 文件列表
92 | :param has_l: 是否有l参数
93 | :param has_t: 是否有t参数
94 | :return:
95 | """
96 | # 根据参数信息设置表头
97 | if not has_l:
98 | if not has_t:
99 | table_data = [["ID", "FILE_NAME"]]
100 | for i in range(len(files)):
101 | table_data.append([i + 1, files[i]])
102 | else:
103 | table_data = [["ID", "FILE_NAME", "FILE_MTIME"]]
104 | for i in range(len(files)):
105 | table_data.append([i + 1] + files[i])
106 | else:
107 | if not has_t:
108 | table_data = [["ID", "FILE_NAME", "FILE_CTIME", "FILE_SIZE"]]
109 | else:
110 | table_data = [["ID", "FILE_NAME", "FILE_CTIME", "FILE_SIZE", "FILE_MTIME"]]
111 | for i in range(len(files)):
112 | table_data.append([i + 1] + files[i])
113 |
114 | # 创建AsciiTable对象
115 | table = terminaltables.AsciiTable(table_data)
116 | # 设置标题
117 | table.title = "file table"
118 | for i in range(len(table.column_widths)):
119 | if i != 1:
120 | # 居中显示
121 | table.justify_columns[i] = "center"
122 | print(table.table)
123 |
124 |
125 | def main():
126 | """
127 | 主函数,设置和接收命令行参数,并根据参数调用相应方法
128 | :return:
129 | """
130 | # 创建解析器
131 | parse = argparse.ArgumentParser(description="Python_ls")
132 | # 可选参数
133 | parse.add_argument("-a", "-all", help="Show all files", action="store_true", required=False)
134 | parse.add_argument("-l", "-long", help="View in long format", action="store_true", required=False)
135 | parse.add_argument("-k", help="Expressed in bytes", action="store_true", required=False)
136 | parse.add_argument("-r", "-reverse", help="In reverse order", action="store_true", required=False)
137 | parse.add_argument("-t", help="Sort by modified time", action="store_true", required=False)
138 | parse.add_argument("-V", "-Version", help="Get the version", action="store_true", required=False)
139 | # 位置参数
140 | parse.add_argument("path", type=str, help="The path", nargs="?")
141 |
142 | # 命令行参数信息
143 | data = vars(parse.parse_args())
144 | assert type(data) == dict
145 | if data["V"]:
146 | print("Python_ls version: 1.0")
147 | return
148 | else:
149 | check_arg(data)
150 |
151 |
152 | if __name__ == '__main__':
153 | main()
--------------------------------------------------------------------------------
/typing/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TM0831/PythonCode/188dd2c7799679e6fb22d5d647e5a89a3ad59e15/typing/__init__.py
--------------------------------------------------------------------------------
/typing/crawl.py:
--------------------------------------------------------------------------------
1 | import time
2 | import random
3 | import requests
4 | from lxml import etree
5 |
6 |
7 | headers = {
8 | "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
9 | }
10 |
11 |
12 | def is_chinese(word):
13 | # 判断是不是中文
14 | for ch in word:
15 | if '\u4e00' <= ch <= '\u9fff':
16 | return True
17 | return False
18 |
19 |
20 | def get_page(url):
21 | # 请求页面
22 | time.sleep(random.randint(1, 4))
23 | res = requests.get(url, headers=headers)
24 | res.encoding = "utf-8"
25 | # 解析网页
26 | et = etree.HTML(res.text)
27 | text_list = et.xpath('//*[@id="article"]/div/p/span/text()')
28 | result = []
29 | for text in text_list:
30 | if is_chinese(text[0]):
31 | pass
32 | else:
33 | if text[1] == ":":
34 | result.append(text.split(":")[1])
35 | else:
36 | result.append(text.split(":")[1])
37 | # print("\n".join(result))
38 | save_text(result)
39 |
40 |
41 | def save_text(text):
42 | # 保存结果
43 | with open("text.txt", "w", encoding="utf-8") as f:
44 | f.write("\n".join(text))
45 |
46 |
47 | def crawl_main():
48 | # 爬取主函数
49 | start_url = "https://baijiahao.baidu.com/s?id=1608464841941419175&wfr=spider&for=pc"
50 | get_page(start_url)
51 |
52 |
53 | if __name__ == "__main__":
54 | crawl_main()
55 |
--------------------------------------------------------------------------------
/typing/run.py:
--------------------------------------------------------------------------------
1 | """
2 | Version: Python3.7
3 | Author: OniOn
4 | Site: http://www.cnblogs.com/TM0831/
5 | Time: 2019/9/13 21:46
6 | """
7 | import os
8 | import sys
9 | import time
10 | import random
11 | from PyQt5 import QtWidgets
12 | from typing.ui import Ui_Form
13 | from typing.crawl import crawl_main
14 |
15 |
16 | class MyForm(Ui_Form, QtWidgets.QWidget):
17 | def __init__(self):
18 | super(MyForm, self).__init__()
19 | self.setupUi(self)
20 |
21 | with open("text.txt", "r", encoding="utf-8") as f:
22 | self.text_list = f.readlines()
23 | self.text_list = [i.strip() for i in self.text_list]
24 | self.text = self.text_list[random.randint(0, len(self.text_list))] # 随机选取一个句子
25 | self.used_list = [self.text] # 已经使用过的句子
26 | self.textBrowser.setText(self.text) # 设置内容
27 | self.hide_label()
28 | self.start_time = time.time()
29 | # 设置槽函数
30 | self.submit_btn.clicked.connect(self.click)
31 | self.next_btn.clicked.connect(self.next)
32 | # 设置快捷键
33 | self.submit_btn.setShortcut('ctrl+e')
34 | self.next_btn.setShortcut('ctrl+n')
35 |
36 | def get_time(self):
37 | # 计算时间
38 | end_time = time.time()
39 | cost_time = "%.2f"%(end_time - self.start_time)
40 | self.time_label.setText("本次打字花费:{}s".format(cost_time))
41 |
42 | def click(self):
43 | """
44 | 点击按钮时调用
45 | :return:
46 | """
47 | self.get_time()
48 | the_input = self.textEdit.toPlainText()
49 | # 计算准确率
50 | count = 0
51 | for i in range(len(the_input)):
52 | if the_input[i] == self.text[i]:
53 | count += 1
54 | accuracy = count / len(self.text) * 100
55 | # print(accuracy)
56 | self.show_label()
57 | # 设置提示信息
58 | info = "有点可惜,你的正确率是: %.2f%% " % accuracy if accuracy != 100 else "恭喜你全对了呢!继续加油哦!"
59 | self.info_lable.setText(info)
60 |
61 | def next(self):
62 | while 1:
63 | text = self.text_list[random.randint(0, len(self.text_list))]
64 | if text not in self.used_list:
65 | self.used_list.append(text)
66 | self.text = text
67 | self.textBrowser.setText(text)
68 | self.textEdit.clear()
69 | self.hide_label()
70 | self.start_time = time.time()
71 | break
72 |
73 | def hide_label(self):
74 | # 将透明度设置为0,达到隐藏且保留位置的目的
75 | op = QtWidgets.QGraphicsOpacityEffect()
76 | op.setOpacity(0)
77 | self.info_lable.setGraphicsEffect(op)
78 | op = QtWidgets.QGraphicsOpacityEffect()
79 | op.setOpacity(0)
80 | self.time_label.setGraphicsEffect(op)
81 |
82 | def show_label(self):
83 | # 将透明度设置为1,即显示出来
84 | op = QtWidgets.QGraphicsOpacityEffect()
85 | op.setOpacity(1)
86 | self.info_lable.setGraphicsEffect(op)
87 | op = QtWidgets.QGraphicsOpacityEffect()
88 | op.setOpacity(1)
89 | self.time_label.setGraphicsEffect(op)
90 |
91 |
92 | if __name__ == '__main__':
93 | if os.path.exists("text.txt") and os.stat("text.txt").st_size > 0:
94 | pass
95 | else:
96 | crawl_main()
97 | app = QtWidgets.QApplication(sys.argv)
98 | my_form = MyForm()
99 | my_form.show()
100 | sys.exit(app.exec_())
101 |
--------------------------------------------------------------------------------
/typing/text.txt:
--------------------------------------------------------------------------------
1 | Victory won’t e to me unless I go to it.
2 | Other men live to eat, while I eat to live.
3 | The brave and the wise can both pity and excuse,when cowards and fools shew no mercy.
4 | Truth is the daughter of time.
5 | You may be more happy than pinces,if you will be more virtuous.
6 | Cunning proceeds from want of capacity.
7 | It is never too late to mend.
8 | There is no man so bad,but he secretly respects the good.
9 | It's the easiest thing in the world for a man to deceive himself.
10 | The sting of a reproach,is the truth of it.
11 | A good fame is better than a good face.
12 | TAll mankind are beholden to him that is kind to the good.
13 | Lost time is never found again.光阴一去不复返。
14 | Think twice before acting.三思而后行。
15 | It is an equal failing to trust everybody, and to trust nobody.
16 | Clean your finger,before you point at my spots.
17 | The darkest hour is that before the dawn.
18 | Beggars cannot be choosers.
19 | Each year one vicious habit rooted out,in time minght make the worst man good throughout.
20 | Difficulties strengthen the mind, as labour does the body.
21 | Who judges best of a man,his enemies or himself?
22 | If you trust before you try, you may repent before you die.
23 | If thou wouldest live long,live well;for folly and wickedness shorten life.
24 | To an optimist every change is a change for the better.
25 | Though malice may darken truth,it cannot put it out.
26 | A true great man will neither trample on a worm,nor sneak to an emperpor.
27 | All things are difficult before they are easy.
28 | Goals determine what you are going to be.
29 | If you do what you should not,you must hear what you would not.
30 | We soon believe what we desire.
31 | One cannot eat one’s cake and have it.
32 | A true great man will neither trample on a worm,nor sneak to an emperpor.
33 | Better late than never.
34 | Truth's best ornament is nakedness.
35 | The secret of success is constancy of purpose.
36 | The truths we least like to hear are those which it is most to our advantage to know.
37 | If thou wouldest live long,live well;for folly and wickedness shorten life.
38 | Truth will prevail.
39 | While there is life, there is hope.
40 | Early to bed and early to rise, makes a man healthy, wealthy, and wise.
41 | A quite conscience sleeps in thunder,but rest and guilt live far adunder.
42 | From small beginnings es great things.
43 | Follow your own course, and let people talk.
44 | A candle lights others and consumes itself.
45 | Love rules his kingdom without a sword.
46 | Saying and doing are two different things.
47 | Never put off until tomorrow what may be done today.
48 | The longest day has an end.
49 | Virtue and happiness are mother and daugher.
50 | Diamond cuts diamond.
51 | Suspicion is the poison of friendship.
52 | He that can bear a reproof,and mend by it,if he is not wise,is in a fair way of being so.
53 | A false tongue will hardly speak truth.
54 | You may be too cunning for one,but not for all.
55 | Be just to all,but trust not all.
56 | Something attempted,something done.
57 | Confidence is a plant of slow growth.
58 | Who has deceiv'd thee so oft as thy self?
59 | Truth and roses have thorns about them.
60 | Each year one vicious habit rooted out,in time minght make the worst man good throughout.
61 | Initiative is doing the right thing without being told.
--------------------------------------------------------------------------------
/typing/typing.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | Form
4 |
5 |
6 |
7 | 0
8 | 0
9 | 640
10 | 480
11 |
12 |
13 |
14 |
15 | 640
16 | 480
17 |
18 |
19 |
20 |
21 | 640
22 | 480
23 |
24 |
25 |
26 | Form
27 |
28 |
29 |
30 |
31 | 0
32 | 0
33 | 642
34 | 476
35 |
36 |
37 |
38 |
39 | 0
40 |
41 | -
42 |
43 |
44 |
45 | 200
46 | 50
47 |
48 |
49 |
50 |
51 | Microsoft YaHei
52 | 20
53 | 75
54 | false
55 | true
56 | false
57 | false
58 |
59 |
60 |
61 |
62 |
63 |
64 | 打字训练器
65 |
66 |
67 | Qt::RichText
68 |
69 |
70 | Qt::AlignHCenter|Qt::AlignTop
71 |
72 |
73 |
74 | -
75 |
76 |
77 |
78 | 300
79 | 40
80 |
81 |
82 |
83 |
84 | 13
85 |
86 |
87 |
88 | 此次训练的句子为:
89 |
90 |
91 |
92 | -
93 |
94 |
95 |
96 | 640
97 | 100
98 |
99 |
100 |
101 |
102 | 640
103 | 100
104 |
105 |
106 |
107 |
108 | Microsoft New Tai Lue
109 | 12
110 |
111 |
112 |
113 |
114 | -
115 |
116 |
-
117 |
118 |
119 |
120 | 199
121 | 30
122 |
123 |
124 |
125 |
126 | 199
127 | 30
128 |
129 |
130 |
131 |
132 | Adobe 宋体 Std L
133 | 12
134 | true
135 |
136 |
137 |
138 | color:rgb(255, 0, 0)
139 |
140 |
141 | TextLabel
142 |
143 |
144 | Qt::PlainText
145 |
146 |
147 |
148 | -
149 |
150 |
151 | false
152 |
153 |
154 |
155 | 400
156 | 30
157 |
158 |
159 |
160 |
161 | Bahnschrift Condensed
162 | 12
163 |
164 |
165 |
166 | color:rgb(255, 0, 0)
167 |
168 |
169 | TextLabel
170 |
171 |
172 | Qt::AutoText
173 |
174 |
175 | 0
176 |
177 |
178 |
179 |
180 |
181 | -
182 |
183 |
184 |
185 | 600
186 | 150
187 |
188 |
189 |
190 |
191 | 640
192 | 150
193 |
194 |
195 |
196 |
197 | 13
198 |
199 |
200 |
201 |
202 | -
203 |
204 |
205 |
206 | 640
207 | 200
208 |
209 |
210 |
211 |
-
212 |
213 |
214 | Qt::Horizontal
215 |
216 |
217 | QSizePolicy::Fixed
218 |
219 |
220 |
221 | 120
222 | 0
223 |
224 |
225 |
226 |
227 | -
228 |
229 |
230 | true
231 |
232 |
233 |
234 | 140
235 | 50
236 |
237 |
238 |
239 |
240 | 140
241 | 50
242 |
243 |
244 |
245 |
246 | Century
247 | 14
248 | 75
249 | true
250 |
251 |
252 |
253 | PointingHandCursor
254 |
255 |
256 | 提 交
257 |
258 |
259 |
260 | -
261 |
262 |
263 | Qt::Horizontal
264 |
265 |
266 | QSizePolicy::Maximum
267 |
268 |
269 |
270 | 120
271 | 0
272 |
273 |
274 |
275 |
276 | -
277 |
278 |
279 |
280 | 140
281 | 50
282 |
283 |
284 |
285 |
286 | 140
287 | 50
288 |
289 |
290 |
291 |
292 | Century
293 | 14
294 | 75
295 | true
296 |
297 |
298 |
299 | PointingHandCursor
300 |
301 |
302 | 下一句
303 |
304 |
305 |
306 | -
307 |
308 |
309 | Qt::Horizontal
310 |
311 |
312 | QSizePolicy::Maximum
313 |
314 |
315 |
316 | 120
317 | 0
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
--------------------------------------------------------------------------------
/typing/ui.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # Form implementation generated from reading ui file 'e:/Code/MyQT/typing/typing.ui'
4 | #
5 | # Created by: PyQt5 UI code generator 5.13.0
6 | #
7 | # WARNING! All changes made in this file will be lost!
8 |
9 |
10 | from PyQt5 import QtCore, QtGui, QtWidgets
11 |
12 |
13 | class Ui_Form(object):
14 | def setupUi(self, Form):
15 | Form.setObjectName("Form")
16 | Form.resize(640, 480)
17 | Form.setMinimumSize(QtCore.QSize(640, 480))
18 | Form.setMaximumSize(QtCore.QSize(640, 480))
19 | self.verticalLayoutWidget = QtWidgets.QWidget(Form)
20 | self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 642, 476))
21 | self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
22 | self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
23 | self.verticalLayout.setContentsMargins(0, 0, 0, 0)
24 | self.verticalLayout.setSpacing(0)
25 | self.verticalLayout.setObjectName("verticalLayout")
26 | self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
27 | self.label.setMaximumSize(QtCore.QSize(200, 50))
28 | font = QtGui.QFont()
29 | font.setFamily("Microsoft YaHei")
30 | font.setPointSize(20)
31 | font.setBold(True)
32 | font.setItalic(False)
33 | font.setUnderline(False)
34 | font.setWeight(75)
35 | font.setStrikeOut(False)
36 | self.label.setFont(font)
37 | self.label.setLocale(QtCore.QLocale(QtCore.QLocale.Chinese, QtCore.QLocale.China))
38 | self.label.setTextFormat(QtCore.Qt.RichText)
39 | self.label.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)
40 | self.label.setObjectName("label")
41 | self.verticalLayout.addWidget(self.label, 0, QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)
42 | self.label_2 = QtWidgets.QLabel(self.verticalLayoutWidget)
43 | self.label_2.setMaximumSize(QtCore.QSize(300, 40))
44 | font = QtGui.QFont()
45 | font.setPointSize(13)
46 | self.label_2.setFont(font)
47 | self.label_2.setObjectName("label_2")
48 | self.verticalLayout.addWidget(self.label_2)
49 | self.textBrowser = QtWidgets.QTextBrowser(self.verticalLayoutWidget)
50 | self.textBrowser.setMinimumSize(QtCore.QSize(640, 100))
51 | self.textBrowser.setMaximumSize(QtCore.QSize(640, 100))
52 | font = QtGui.QFont()
53 | font.setFamily("Microsoft New Tai Lue")
54 | font.setPointSize(12)
55 | self.textBrowser.setFont(font)
56 | self.textBrowser.setObjectName("textBrowser")
57 | self.verticalLayout.addWidget(self.textBrowser)
58 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
59 | self.horizontalLayout_2.setObjectName("horizontalLayout_2")
60 | self.time_label = QtWidgets.QLabel(self.verticalLayoutWidget)
61 | self.time_label.setMinimumSize(QtCore.QSize(199, 30))
62 | self.time_label.setMaximumSize(QtCore.QSize(199, 30))
63 | font = QtGui.QFont()
64 | font.setFamily("Adobe 宋体 Std L")
65 | font.setPointSize(12)
66 | font.setUnderline(True)
67 | self.time_label.setFont(font)
68 | self.time_label.setStyleSheet("color:rgb(255, 0, 0)")
69 | self.time_label.setTextFormat(QtCore.Qt.PlainText)
70 | self.time_label.setObjectName("time_label")
71 | self.horizontalLayout_2.addWidget(self.time_label, 0, QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
72 | self.info_lable = QtWidgets.QLabel(self.verticalLayoutWidget)
73 | self.info_lable.setEnabled(False)
74 | self.info_lable.setMaximumSize(QtCore.QSize(400, 30))
75 | font = QtGui.QFont()
76 | font.setFamily("Bahnschrift Condensed")
77 | font.setPointSize(12)
78 | self.info_lable.setFont(font)
79 | self.info_lable.setStyleSheet("color:rgb(255, 0, 0)")
80 | self.info_lable.setTextFormat(QtCore.Qt.AutoText)
81 | self.info_lable.setObjectName("info_lable")
82 | self.horizontalLayout_2.addWidget(self.info_lable, 0, QtCore.Qt.AlignRight)
83 | self.verticalLayout.addLayout(self.horizontalLayout_2)
84 | self.textEdit = QtWidgets.QTextEdit(self.verticalLayoutWidget)
85 | self.textEdit.setMinimumSize(QtCore.QSize(600, 150))
86 | self.textEdit.setMaximumSize(QtCore.QSize(640, 150))
87 | font = QtGui.QFont()
88 | font.setPointSize(13)
89 | self.textEdit.setFont(font)
90 | self.textEdit.setObjectName("textEdit")
91 | self.verticalLayout.addWidget(self.textEdit)
92 | self.horizontalGroupBox = QtWidgets.QGroupBox(self.verticalLayoutWidget)
93 | self.horizontalGroupBox.setMaximumSize(QtCore.QSize(640, 200))
94 | self.horizontalGroupBox.setObjectName("horizontalGroupBox")
95 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalGroupBox)
96 | self.horizontalLayout.setObjectName("horizontalLayout")
97 | spacerItem = QtWidgets.QSpacerItem(120, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
98 | self.horizontalLayout.addItem(spacerItem)
99 | self.submit_btn = QtWidgets.QPushButton(self.horizontalGroupBox)
100 | self.submit_btn.setEnabled(True)
101 | self.submit_btn.setMinimumSize(QtCore.QSize(140, 50))
102 | self.submit_btn.setMaximumSize(QtCore.QSize(140, 50))
103 | font = QtGui.QFont()
104 | font.setFamily("Century")
105 | font.setPointSize(14)
106 | font.setBold(True)
107 | font.setWeight(75)
108 | self.submit_btn.setFont(font)
109 | self.submit_btn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
110 | self.submit_btn.setObjectName("submit_btn")
111 | self.horizontalLayout.addWidget(self.submit_btn, 0, QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter)
112 | spacerItem1 = QtWidgets.QSpacerItem(120, 0, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
113 | self.horizontalLayout.addItem(spacerItem1)
114 | self.next_btn = QtWidgets.QPushButton(self.horizontalGroupBox)
115 | self.next_btn.setMinimumSize(QtCore.QSize(140, 50))
116 | self.next_btn.setMaximumSize(QtCore.QSize(140, 50))
117 | font = QtGui.QFont()
118 | font.setFamily("Century")
119 | font.setPointSize(14)
120 | font.setBold(True)
121 | font.setWeight(75)
122 | self.next_btn.setFont(font)
123 | self.next_btn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
124 | self.next_btn.setObjectName("next_btn")
125 | self.horizontalLayout.addWidget(self.next_btn)
126 | spacerItem2 = QtWidgets.QSpacerItem(120, 0, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
127 | self.horizontalLayout.addItem(spacerItem2)
128 | self.verticalLayout.addWidget(self.horizontalGroupBox)
129 |
130 | self.retranslateUi(Form)
131 | QtCore.QMetaObject.connectSlotsByName(Form)
132 |
133 | def retranslateUi(self, Form):
134 | _translate = QtCore.QCoreApplication.translate
135 | Form.setWindowTitle(_translate("Form", "Form"))
136 | self.label.setText(_translate("Form", "打字训练器"))
137 | self.label_2.setText(_translate("Form", "此次训练的句子为:"))
138 | self.time_label.setText(_translate("Form", "TextLabel"))
139 | self.info_lable.setText(_translate("Form", "TextLabel"))
140 | self.submit_btn.setText(_translate("Form", "提 交"))
141 | self.next_btn.setText(_translate("Form", "下一句"))
142 |
--------------------------------------------------------------------------------