├── 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 | 26 | 27 | 28 | 29 | 30 | {% for i in data %} 31 | 32 | 33 | 34 | 35 | {% endfor %} 36 | 37 |
IDNAME
{{ i.stu_id }}{{ i.stu_name }}
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 | 26 | 27 | 28 | 29 | 30 |
IDNAME
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 | --------------------------------------------------------------------------------