├── .gitignore ├── README.md ├── adminsite.py ├── alert.db ├── bottle.py ├── config.json ├── cutimg ├── 20200414101233.png └── 20200414101319.png ├── db.py ├── html ├── html │ ├── about.html │ ├── error.html │ └── login.html ├── index.html ├── json │ └── menu.json ├── monitor │ ├── alertlist.html │ ├── chart.html │ ├── history.html │ ├── urllist.html │ └── user.html └── static │ ├── css │ ├── common.css │ └── sign.css │ ├── img │ └── faceid.jpg │ ├── js │ ├── common.js │ ├── highcharts.js │ ├── jquery.min.js │ ├── login.js │ └── tips.js │ ├── lau │ ├── lau.css │ └── lau.js │ └── layui │ ├── css │ ├── layui.css │ ├── layui.mobile.css │ └── modules │ │ ├── code.css │ │ ├── laydate │ │ └── default │ │ │ └── laydate.css │ │ └── layer │ │ └── default │ │ ├── icon-ext.png │ │ ├── icon.png │ │ ├── layer.css │ │ ├── loading-0.gif │ │ ├── loading-1.gif │ │ └── loading-2.gif │ ├── font │ ├── iconfont.eot │ ├── iconfont.svg │ ├── iconfont.ttf │ └── iconfont.woff │ ├── images │ └── face │ │ ├── 0.gif │ │ ├── 1.gif │ │ ├── 10.gif │ │ ├── 11.gif │ │ ├── 12.gif │ │ ├── 13.gif │ │ ├── 14.gif │ │ ├── 15.gif │ │ ├── 16.gif │ │ ├── 17.gif │ │ ├── 18.gif │ │ ├── 19.gif │ │ ├── 2.gif │ │ ├── 20.gif │ │ ├── 21.gif │ │ ├── 22.gif │ │ ├── 23.gif │ │ ├── 24.gif │ │ ├── 25.gif │ │ ├── 26.gif │ │ ├── 27.gif │ │ ├── 28.gif │ │ ├── 29.gif │ │ ├── 3.gif │ │ ├── 30.gif │ │ ├── 31.gif │ │ ├── 32.gif │ │ ├── 33.gif │ │ ├── 34.gif │ │ ├── 35.gif │ │ ├── 36.gif │ │ ├── 37.gif │ │ ├── 38.gif │ │ ├── 39.gif │ │ ├── 4.gif │ │ ├── 40.gif │ │ ├── 41.gif │ │ ├── 42.gif │ │ ├── 43.gif │ │ ├── 44.gif │ │ ├── 45.gif │ │ ├── 46.gif │ │ ├── 47.gif │ │ ├── 48.gif │ │ ├── 49.gif │ │ ├── 5.gif │ │ ├── 50.gif │ │ ├── 51.gif │ │ ├── 52.gif │ │ ├── 53.gif │ │ ├── 54.gif │ │ ├── 55.gif │ │ ├── 56.gif │ │ ├── 57.gif │ │ ├── 58.gif │ │ ├── 59.gif │ │ ├── 6.gif │ │ ├── 60.gif │ │ ├── 61.gif │ │ ├── 62.gif │ │ ├── 63.gif │ │ ├── 64.gif │ │ ├── 65.gif │ │ ├── 66.gif │ │ ├── 67.gif │ │ ├── 68.gif │ │ ├── 69.gif │ │ ├── 7.gif │ │ ├── 70.gif │ │ ├── 71.gif │ │ ├── 8.gif │ │ └── 9.gif │ ├── lay │ └── modules │ │ ├── carousel.js │ │ ├── code.js │ │ ├── element.js │ │ ├── flow.js │ │ ├── form.js │ │ ├── jquery.js │ │ ├── laydate.js │ │ ├── layedit.js │ │ ├── layer.js │ │ ├── laypage.js │ │ ├── laytpl.js │ │ ├── mobile.js │ │ ├── rate.js │ │ ├── table.js │ │ ├── tree.js │ │ ├── upload.js │ │ └── util.js │ ├── layui.all.js │ └── layui.js ├── log.py ├── mailalert.py ├── monitor.py ├── run.log ├── run.py ├── sitehandler.py ├── tool.py └── visit.py /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | *.log 3 | *.db 4 | config.json 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 什么是carewebsite 2 | carewebsite,是一个基于python3标准库构建的极简网站和api监控工具,无需安装任何第三方包只要有python3(建议3.5+以上)就可以直接运行。monitor website, monitor api. 网站监控,API监控,接口监控,极简监控 3 | 功能包括如下: 4 | - 按返回码监控 5 | - 按返回值关键字监控 6 | - 按响应时间监控 7 | - 发送预警邮件(后续增加短信|微信|第三方支持) 8 | - web界面管理,支持GET,post方法(post数据格式:{'id':1,"page":1}) 9 | - 跨平台 10 | 11 | # 配置和使用 carewebsite 12 | - 1 设置SMPT邮件服务器, 编辑根目录下的config.json,: 13 | ```python 14 | { 15 | "mail_sender":"xxxx@qq.com", # 发送邮箱地址 16 | "mail_server":"smtp.qq.com", # smtp邮箱服务器地址 17 | "mail_server_pw":"fgxxxxxxxa" # 邮箱服务器密码 18 | } 19 | ``` 20 | 21 | - 2 运行: 22 | - windows: 23 | 安装python3,运行 python run.py 24 | - mac: 25 | 安装python3,运行 python run.py 26 | - linux: 27 | 安装python3,运行 python run.py(注意:linux 需要支持ssl和sqlite3. 测试import ssl 和 import sqlite3 是否正常) 28 | 29 | - 3 使用: 30 | 1 打开 http://localhost:8080/ 或 http://ip:8080/ , 默认账号admin,密码:123456 31 | 2 可删除默认账号,新增账号和邮箱(用于预警) 32 | 3 增加URL监控. 33 | 34 | # carewebsite运行截图 35 | ![01](https://github.com/Yasil/carewebsite/blob/master/cutimg/20200414101233.png) 36 | 37 | ![02](https://github.com/Yasil/carewebsite/blob/master/cutimg/20200414101319.png) 38 | 39 | # FAQ 40 | 有问题或建议请反馈到issues,或者直接pull上来! 41 | -------------------------------------------------------------------------------- /adminsite.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | import os 3 | from bottle import route, run, template, static_file 4 | from bottle import hook, request, response, get, error, abort, post, redirect 5 | import hashlib 6 | import json 7 | from sitehandler import create_session, check_session, clear_session, check_user, json_resp 8 | from sitehandler import web_get_url, web_get_alert, web_get_user, web_get_history, web_get_urldetail, web_get_url_delete, web_url_add 9 | from sitehandler import web_get_url_delete, web_url_add, web_user_delete, web_user_add, web_alert_empty, web_history_empty 10 | 11 | import log 12 | logger = log.logging.getLogger("site") 13 | 14 | 15 | @hook('before_request') 16 | def validate(): 17 | """ 18 | 钩子函数,处理请求路由之前需要做什么的事情 19 | :return: 20 | """ 21 | """使用勾子处理页面或接口访问事件""" 22 | # 让bottle框架支持jquery ajax的RESTful风格的PUT和DELETE等请求 23 | REQUEST_METHOD = request.environ.get('REQUEST_METHOD') 24 | HTTP_ACCESS_CONTROL_REQUEST_METHOD = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_METHOD') 25 | if REQUEST_METHOD == 'OPTIONS' and HTTP_ACCESS_CONTROL_REQUEST_METHOD: 26 | request.environ['REQUEST_METHOD'] = HTTP_ACCESS_CONTROL_REQUEST_METHOD 27 | 28 | # check userlogin 29 | path_info = request.environ.get("PATH_INFO") 30 | 31 | if request.method == 'OPTIONS': 32 | # actual request; reply with the actual response 33 | # print('打印!!!') 34 | logger.warning("OPTIONS") 35 | 36 | # 获取当前访问的Url路径 37 | # 过滤不用做任何操作的路由 38 | if path_info in ['/favicon.ico', '/check_err/', '/log/']: 39 | return '' 40 | 41 | 42 | @hook('after_request') 43 | def enable_cors(): 44 | """ 45 | 钩子函数,处理请求路由之后需要做什么的事情 46 | :return: 47 | """ 48 | pass 49 | # response.headers['Access-Control-Allow-Origin'] = '*' 50 | 51 | 52 | @route('/') 53 | def server_static(filepath): 54 | return static_file(filepath, root='./html/') 55 | 56 | @route('/') 57 | def server_default(): 58 | return static_file('/html/login.html', root='./html/') 59 | 60 | @route('/index') 61 | def server_default(): 62 | return static_file('index.html', root='./html/') 63 | 64 | @route('/hello/') 65 | def index(name): 66 | session = request.get_cookie('session') 67 | return template('Hello {{name}}!', name=name) 68 | 69 | 70 | @post('/logout') 71 | def logout(): 72 | # sessionid = request.get_cookie('session') 73 | sessionid = request.forms.get("session") 74 | clear_session(sessionid) 75 | redirect("/html/login.html") 76 | 77 | 78 | def check_login(): 79 | sessionid = request.get_cookie('session') 80 | if sessionid is None: 81 | # return json_resp(1,"login first") 82 | # redirect("/html/login.html") 83 | return json_resp(1,"login first") 84 | 85 | success,errmsg = check_session(sessionid) 86 | logger.debug("session:{},{},{}".format(sessionid, success, errmsg)) 87 | if success is False: 88 | # redirect("/html/login.html") 89 | return json_resp(1, errmsg) 90 | 91 | @post('/api/loginpost') 92 | def login(): 93 | name = request.forms.get("username") 94 | pw = request.forms.get("password") 95 | if check_user(name, pw): 96 | # login 97 | session = create_session(name) 98 | response.set_cookie('session', session) 99 | return '{"errcode": 0,"errmsg": "login success","data":"'+ session +'"}' 100 | else: 101 | return '''{"errcode": 1,"errmsg": "user not exists or else"}''' 102 | 103 | @route('/api/urls') 104 | def urls(): 105 | check_result = check_login() 106 | if check_result is not None: 107 | return check_result 108 | 109 | page = request.query.page 110 | limit = request.query.limit 111 | count, data = web_get_url(int(page), int(limit)) 112 | return json_resp(0,'ok', count, data) 113 | 114 | @route('/api/alerts') 115 | def alerts(): 116 | check_result = check_login() 117 | if check_result is not None: 118 | return check_result 119 | 120 | page = request.query.page 121 | limit = request.query.limit 122 | count, data = web_get_alert(int(page), int(limit)) 123 | return json_resp(0,'ok', count, data) 124 | 125 | @route('/api/users') 126 | def alerts(): 127 | check_result = check_login() 128 | if check_result is not None: 129 | return check_result 130 | 131 | page = request.query.page 132 | limit = request.query.limit 133 | count, data = web_get_user(int(page), int(limit)) 134 | return json_resp(0,'ok', count, data) 135 | 136 | 137 | @route('/api/historys') 138 | def alerts(): 139 | check_result = check_login() 140 | if check_result is not None: 141 | return check_result 142 | 143 | page = request.query.page 144 | limit = request.query.limit 145 | count, data = web_get_history(int(page), int(limit)) 146 | return json_resp(0,'ok', count, data) 147 | 148 | 149 | @route('/api/urldetail') 150 | def urldetail(): 151 | check_result = check_login() 152 | if check_result is not None: 153 | return check_result 154 | 155 | urlid = request.query.id 156 | count, data = web_get_urldetail(urlid) 157 | return json_resp(0,'ok', count, data) 158 | 159 | @post('/api/url/delete') 160 | def urldetail(): 161 | check_result = check_login() 162 | if check_result is not None: 163 | return check_result 164 | 165 | urlid = request.forms.id 166 | web_get_url_delete(urlid) 167 | return json_resp(0,'ok') 168 | 169 | @post('/api/url/add') 170 | def urladd(): 171 | check_result = check_login() 172 | if check_result is not None: 173 | return check_result 174 | addurl = dict(request.forms) 175 | name = request.forms.getunicode("name") 176 | addurl.update(name=name) 177 | keyword = request.forms.getunicode("keyword") 178 | addurl.update(keyword=keyword) 179 | post = request.forms.getunicode("post") 180 | addurl.update(post=post) 181 | url = request.forms.getunicode("url") 182 | addurl.update(url=url) 183 | web_url_add(addurl) 184 | return json_resp(0,'ok') 185 | 186 | @post('/api/user/delete') 187 | def userdetail(): 188 | check_result = check_login() 189 | if check_result is not None: 190 | return check_result 191 | 192 | userid = request.forms.id 193 | web_user_delete(userid) 194 | return json_resp(0,'ok') 195 | 196 | @post('/api/user/add') 197 | def urladd(): 198 | check_result = check_login() 199 | if check_result is not None: 200 | return check_result 201 | 202 | web_user_add(dict(request.forms)) 203 | return json_resp(0,'ok') 204 | 205 | @get('/api/alert/empty') 206 | def alertempty(): 207 | check_result = check_login() 208 | if check_result is not None: 209 | return check_result 210 | 211 | web_alert_empty() 212 | return json_resp(0,'ok') 213 | 214 | @get('/api/hitory/empty') 215 | def hisempty(): 216 | check_result = check_login() 217 | if check_result is not None: 218 | return check_result 219 | 220 | web_history_empty() 221 | return json_resp(0,'ok') 222 | 223 | 224 | def run_web_site(): 225 | ''' run web site ''' 226 | run(host='', port=8080) 227 | 228 | 229 | if __name__ == '__main__': 230 | pass -------------------------------------------------------------------------------- /alert.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/alert.db -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "mail_sender":"xxxxxx@qq.com", 3 | "mail_server":"smtp.qq.com", 4 | "mail_server_pw":"fgxxxxxxxha" 5 | } -------------------------------------------------------------------------------- /cutimg/20200414101233.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/cutimg/20200414101233.png -------------------------------------------------------------------------------- /cutimg/20200414101319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/cutimg/20200414101319.png -------------------------------------------------------------------------------- /db.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | import os 3 | import sqlite3 4 | import log 5 | import tool 6 | logger = log.logging.getLogger("db") 7 | 8 | db_filename = 'alert.db' 9 | 10 | def get_sql_exec(sql, args=None): 11 | try: 12 | logger.debug(sql) 13 | with sqlite3.connect(db_filename) as conn: 14 | conn.row_factory = sqlite3.Row 15 | conn.text_factory = str 16 | cursor = conn.cursor() 17 | cursor.execute(sql,args if args is not None else ()) 18 | conn.commit() 19 | except sqlite3.OperationalError as e: 20 | logger.error("sql:{},error:{}".format(sql,e)) 21 | return [] 22 | else: 23 | return cursor.fetchall() 24 | finally: 25 | pass 26 | 27 | def user_get(): 28 | return get_sql_exec("select * from user") 29 | 30 | def user_update(arg): 31 | # 更新用户 arg={'field':'password','value':'pw','id':1} 32 | if arg.get('field').isalnum(): 33 | return get_sql_exec("update user set {}=:value where id=:id".format(arg.get('field')), arg) 34 | else: 35 | logger.error("user_update非法参数") 36 | return False 37 | 38 | def user_delete(userid): 39 | # 删除用户 userid=1 40 | return get_sql_exec("delete from user where id=?", [userid]) 41 | 42 | def user_insert(userinfo): 43 | # 插入用户 userid=1 44 | return get_sql_exec("insert into user(username,password,mail,phone,createtime) values(:username,:password,:mail,:phone,:createtime)", userinfo) 45 | 46 | def url_get(): 47 | # 获取URL 48 | return get_sql_exec("select * from url limit 1000") 49 | 50 | def url_insert(urlinfo): 51 | # 插入URL 52 | return get_sql_exec("insert into url(name,url,method,postdata,status,keyword,timeout,integer,createtime) values(:name,:url,:method,:postdata,:status,:keyword,:timeout,:integer,:createtime)", urlinfo) 53 | 54 | def url_delete(urlid): 55 | # 删除URL 56 | return get_sql_exec("delete from url where id=?", [urlid]) 57 | 58 | 59 | def visit_history_all(): 60 | # 获取所有 61 | return get_sql_exec("select * from visit_history order by id desc limit 1000") 62 | 63 | def visit_history_get(uid): 64 | # 获取历史数据最新的60个 65 | return get_sql_exec("select id,resp_time,status,createtime from visit_history where uid=? order by id desc limit 60", [uid]) 66 | 67 | def visit_history_insert(visitinfo): 68 | # 插入访问历史数据 69 | return get_sql_exec("insert into visit_history(uid, resp_time, resp_code, result, status, createtime) values(?,?,?,?,?,?) ", visitinfo) 70 | 71 | def visit_empty(): 72 | # 清空历史访问数据 73 | return get_sql_exec("delete from visit_history") 74 | 75 | def event_get_all(): 76 | # 获取所有告警历史数据 77 | return get_sql_exec("select * from event order by id desc limit 1000") 78 | 79 | def event_get(uid): 80 | # 获取历史数据最新的30个 81 | return get_sql_exec("select * from event where uid=? order by id desc limit 10", [uid]) 82 | 83 | def event_insert(eventinfo): 84 | # 插入告警历史数据 85 | return get_sql_exec("insert into event(uid, url, result, status, createtime) values(?,?,?,?,?) ", eventinfo) 86 | 87 | def event_empty(): 88 | # 清空告警历史 89 | return get_sql_exec("delete from event") 90 | 91 | def delete_old_data(): 92 | # Auto delete > 48 hours data 93 | oldtime = tool.clock() - 48*60*60 94 | get_sql_exec("delete from event where createtime 2 |
版本信息
3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
基于框架layui-v2.2.6 更新日志
13 |
14 | -------------------------------------------------------------------------------- /html/html/error.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 错误 8 | 9 | 10 | 11 | 12 |
13 |
14 | 15 |
好像出错了呢
16 |
17 |
18 | 19 | 20 | 28 | -------------------------------------------------------------------------------- /html/html/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 登录 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |

登录

16 |

监控系统

17 |
18 | 19 |
20 | 21 |
22 |
23 |
24 | 25 |
26 | 27 |
28 |
29 |
30 | 31 |
32 | 33 |
34 | 35 | 36 | 37 | 38 | 41 | -------------------------------------------------------------------------------- /html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 监控后台 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 | 27 |
28 | 29 | 30 | 31 |
32 |
33 |
34 |
    35 | 36 |
37 |
38 |
39 | 40 | 41 | 42 | 43 |
44 | 45 | 46 |
47 | 48 | 49 | 99 | -------------------------------------------------------------------------------- /html/json/menu.json: -------------------------------------------------------------------------------- 1 | [[{ 2 | "title": "监控模块", 3 | "open": true, 4 | "list": [{ 5 | "title": "监控列表", 6 | "href": "/monitor/urllist.html" 7 | }, { 8 | "title": "告警列表", 9 | "href": "/monitor/alertlist.html" 10 | }, { 11 | "title": "访问历史", 12 | "href": "/monitor/history.html" 13 | }] 14 | }, 15 | { 16 | "title": "用户", 17 | "icon": "layui-icon-home", 18 | "href": "/monitor/user.html" 19 | } 20 | ]] -------------------------------------------------------------------------------- /html/monitor/alertlist.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 告警列表 6 | 7 | 8 | 9 | 10 | 11 | 12 | 25 |
26 | 27 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /html/monitor/chart.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | history 5 | 6 | 7 | 8 | 9 |
10 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /html/monitor/history.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 访问历史 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 65 | 66 | -------------------------------------------------------------------------------- /html/monitor/urllist.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 监控列表 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 |
14 |
15 | 16 | 17 | 21 | 93 | 94 | 95 | 101 | 102 | 220 | 221 | -------------------------------------------------------------------------------- /html/monitor/user.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | User list 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 |
14 |
15 | 16 | 56 | 57 | 58 | 59 | 60 | 61 | 66 | 67 | 68 | 153 | 154 | 155 | -------------------------------------------------------------------------------- /html/static/css/common.css: -------------------------------------------------------------------------------- 1 | /*全局*/ 2 | html { 3 | overflow-x: hidden; 4 | height: 100%; 5 | } 6 | body { 7 | background-color: #f2f2f2; 8 | padding: 15px; 9 | color: #666; 10 | overflow-y: scroll; 11 | overflow-x: hidden; 12 | height: 100%; 13 | margin: 0; 14 | box-sizing: border-box; 15 | } 16 | a, *[lau-href], *[lau-event] { 17 | cursor: pointer; 18 | } 19 | /*卡片轮播*/ 20 | .lau-carousel { 21 | height: 185px!important; 22 | background-color: #fff; 23 | } 24 | .lau-carousel .layui-carousel-ind li { 25 | background-color: #e2e2e2; 26 | } 27 | .lau-carousel .layui-carousel-ind li:hover { 28 | background-color: #c2c2c2; 29 | } 30 | .lau-carousel .layui-carousel-ind li.layui-this { 31 | background-color: #999; 32 | } 33 | .lau-carousel .layui-carousel, 34 | .lau-carousel > *[carousel-item] > * { 35 | background-color: #fff; 36 | } 37 | .lau-carousel .layui-col-space10 { 38 | margin: 0; 39 | } 40 | .lau-carousel .layui-carousel-ind { 41 | position: absolute; 42 | top: -41px; 43 | text-align: right; 44 | } 45 | .lau-carousel .layui-carousel-ind ul { 46 | background: none; 47 | } 48 | /*快捷入口*/ 49 | .lau-shortcut li { 50 | text-align: center; 51 | } 52 | .lau-shortcut li .layui-icon { 53 | display: inline-block; 54 | width: 100%; 55 | height: 60px; 56 | line-height: 60px; 57 | text-align: center; 58 | border-radius: 2px; 59 | font-size: 30px; 60 | background-color: #F8F8F8; 61 | color: #333; 62 | transition: all .3s; 63 | -webkit-transition: all .3s; 64 | } 65 | .lau-shortcut li cite { 66 | position: relative; 67 | top: 2px; 68 | display: block; 69 | color: #666; 70 | text-overflow: ellipsis; 71 | overflow: hidden; 72 | white-space: nowrap; 73 | font-size: 14px; 74 | } 75 | .lau-shortcut li:hover .layui-icon { 76 | background-color: #f2f2f2; 77 | } 78 | /*待办事项*/ 79 | .lau-todo .lau-todo-body { 80 | display: block; 81 | padding: 10px 15px; 82 | background-color: #f8f8f8; 83 | color: #999; 84 | border-radius: 2px; 85 | transition: all .3s; 86 | -webkit-transition: all .3s; 87 | } 88 | .lau-todo-body h3 { 89 | padding-bottom: 10px; 90 | font-size: 12px; 91 | } 92 | .lau-todo-body p cite { 93 | font-style: normal; 94 | font-size: 30px; 95 | font-weight: 300; 96 | color: #009688; 97 | } 98 | .lau-todo-body:hover { 99 | background-color: #f2f2f2; 100 | color: #888; 101 | } 102 | /*系统负载*/ 103 | .lau-load { 104 | height: 185px; 105 | } 106 | /*概览图表*/ 107 | .lau-overview { 108 | padding: 15px; 109 | } 110 | .lau-overview h5 { 111 | position: relative; 112 | } 113 | .lau-overview h5 span { 114 | position: absolute; 115 | right: 0; 116 | } 117 | .lau-overview h2 { 118 | margin-top: 10px; 119 | height: 30px; 120 | line-height: 30px; 121 | position: relative; 122 | } 123 | .lau-overview h2 span { 124 | position: absolute; 125 | right: 0; 126 | } 127 | /*进度条*/ 128 | .lau-takerates .layui-progress { 129 | margin: 40px 0 60px; 130 | } 131 | .lau-takerates .layui-progress:last-child { 132 | margin-bottom: 10px; 133 | } 134 | .lau-takerates .layui-progress h3 { 135 | position: absolute; 136 | right: 0; 137 | top: -35px; 138 | color: #999; 139 | font-size: 14px; 140 | } 141 | .lau-takerates .layui-progress-bar { 142 | text-align: left; 143 | } 144 | .lau-takerates .layui-progress-text { 145 | top: -35px; 146 | line-height: 26px; 147 | font-size: 26px; 148 | } 149 | -------------------------------------------------------------------------------- /html/static/css/sign.css: -------------------------------------------------------------------------------- 1 | html { 2 | height: 100%; 3 | } 4 | .lau-sign-body { 5 | background-color: #f2f2f2; 6 | padding: 150px 0; 7 | position: relative; 8 | min-height: 100%; 9 | box-sizing: border-box; 10 | } 11 | .lau-sign-link { 12 | cursor: pointer; 13 | color: #029789!important; 14 | } 15 | .lau-sign-link:hover { 16 | opacity: 0.8; 17 | } 18 | .lau-sign-form { 19 | width: 380px; 20 | margin: 0 auto; 21 | box-sizing: border-box; 22 | box-shadow: 0 0 20px 0 #999; 23 | background-color: #fff; 24 | padding: 15px; 25 | } 26 | .lau-sign-title { 27 | text-align: center; 28 | font-size: 28px; 29 | font-weight: bold; 30 | color: #666; 31 | padding: 15px; 32 | letter-spacing: 5px; 33 | } 34 | .lau-sign-subtitle { 35 | text-align: center; 36 | color: #999; 37 | letter-spacing: 1px; 38 | margin-bottom: 15px; 39 | } 40 | .layui-form-pane .layui-form-label { 41 | width: 90px; 42 | padding: 8px 0; 43 | } 44 | .layui-form-pane .layui-input-block { 45 | margin-left: 90px; 46 | } 47 | .lau-sign-code input { 48 | width: 130px; 49 | } 50 | .lau-sign-captcha { 51 | position: absolute; 52 | top: 1px; 53 | right: 1px; 54 | height: 36px; 55 | max-width: 120px; 56 | cursor: pointer; 57 | } 58 | .lau-sign-form.layui-form-pane .layui-form-checkbox { 59 | margin-left: 0; 60 | } 61 | .lau-sign-forgot { 62 | float: right; 63 | margin-top: 9px; 64 | } 65 | .lau-sign-other .layui-icon { 66 | font-size: 26px; 67 | margin-right: 5px; 68 | } 69 | .layui-icon-login-qq { 70 | color: #3492ED; 71 | } 72 | .layui-icon-login-wechat { 73 | color: #4DAF29; 74 | } 75 | .layui-icon-login-weibo { 76 | color: #CF1900; 77 | } 78 | .lau-sign-reg { 79 | float: right; 80 | margin-top: 3px; 81 | } 82 | .lau-sign-footer { 83 | position: absolute; 84 | left: 0; 85 | bottom: 0; 86 | width: 100%; 87 | text-align: center; 88 | box-sizing: border-box; 89 | padding: 10px; 90 | color: rgba(0,0,0,0.5); 91 | } 92 | .lau-sign-footer p { 93 | height: 30px; 94 | line-height: 30px; 95 | } 96 | .lau-sign-footer span { 97 | padding: 0 5px; 98 | } 99 | .lau-sign-footer a { 100 | color: rgba(0,0,0,0.5); 101 | } 102 | .lau-sign-footer a:hover { 103 | color: rgba(0,0,0,1); 104 | } 105 | 106 | .lau-sign-sms { 107 | position: absolute; 108 | right: 0; 109 | top: 0; 110 | width: 120px; 111 | } 112 | .lau-sign-lic { 113 | float: right; 114 | margin-top: 9px; 115 | } 116 | .lau-sign-login { 117 | float: right; 118 | margin-top: 3px; 119 | } 120 | -------------------------------------------------------------------------------- /html/static/img/faceid.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/img/faceid.jpg -------------------------------------------------------------------------------- /html/static/js/common.js: -------------------------------------------------------------------------------- 1 | layui.define(['jquery'], function(exports) { 2 | var $ = layui.$, 3 | lau = top.layui.lau; 4 | 5 | //监听锚点打开选项卡 6 | $(document).on('click', '*[lau-href]', function () { 7 | var _this = $(this); 8 | lau.go(_this.attr('lau-href'), _this.attr('lau-title'), _this.attr('lau-icon')); 9 | }); 10 | 11 | exports('common', lau); 12 | }); 13 | -------------------------------------------------------------------------------- /html/static/js/login.js: -------------------------------------------------------------------------------- 1 | function checkStorageSupport() 2 | { 3 | // sessionStorage 4 | if (window.sessionStorage) { 5 | return true; 6 | } else { 7 | return false; 8 | } 9 | } 10 | 11 | layui.define(['layer', 'form', 'tips'], function(exports) { 12 | var form = layui.form, 13 | layer = layui.layer, 14 | $ = layui.$, 15 | tips = layui.tips; 16 | 17 | if(!checkStorageSupport()){ 18 | layer.open({ 19 | title:"browser Warning", 20 | content: '

Your browser don\'t support sessionStorage! please user chrome or else

', 21 | yes: function(index, layero){ 22 | //do something 23 | layer.close(index); //如果设定了yes回调,需进行手工关闭 24 | window.location.href='https://www.google.com/chrome/'; 25 | } 26 | }); 27 | } 28 | 29 | 30 | //ajax请求出错提示 31 | $(document).ajaxError(function (event, request, setting) { 32 | if (request.status === 200) { 33 | tips.error('Invalid response'); 34 | } else { 35 | tips.error(request.status + ': ' + request.statusText); 36 | } 37 | }); 38 | 39 | //登陆 40 | form.on('submit(login)', function (data) { 41 | if (!/^[a-zA-Z0-9_]{4,16}$/.test(data.field.username)) { 42 | tips.warning('用户名必须为5-16位数字/字母/下划线组成'); 43 | return false; 44 | } else if (!/^\S{6,16}$/.test(data.field.password)) { 45 | tips.warning('密码必须6-12位且不能出现空格'); 46 | return false; 47 | } else if (!/^\S{4,}$/.test(data.field.captcha)) { 48 | tips.warning('验证码格式不正确'); 49 | return false; 50 | } 51 | 52 | //登陆中 53 | tips.loading('loging...', 0, -1); 54 | 55 | //发送登陆表单 56 | $.post('/api/loginpost', data.field, function (json) { 57 | if (json.errcode == 0) { 58 | tips.success(json.errmsg, function () { 59 | st = window.sessionStorage; 60 | sessionStorage.setItem("session", json.data) 61 | location.href = '/index'; 62 | }); 63 | } else { 64 | tips.error(json.errmsg, function () { 65 | captchaImg.attr('src', captchaSrc + '?_t=' + Math.random()); 66 | }); 67 | } 68 | }, 'json'); 69 | 70 | return false; 71 | }); 72 | 73 | exports('login', {}); 74 | }); 75 | -------------------------------------------------------------------------------- /html/static/js/tips.js: -------------------------------------------------------------------------------- 1 | layui.define(['layer'], function(exports) { 2 | exports('tips', { 3 | warning: function (title, call, timer) { 4 | return layer.msg(title, {icon: 0, shade: 0.3, time: timer||1000}, function () { 5 | typeof call === "function" && call(); 6 | }); 7 | }, 8 | error: function (title, call, timer) { 9 | return layer.msg(title, {icon: 2, shade: 0.3, time: timer||1000}, function () { 10 | typeof call === "function" && call(); 11 | }); 12 | }, 13 | success: function (title, call, timer) { 14 | return layer.msg(title, {icon: 1, shade: 0.3, time: timer||1000}, function () { 15 | typeof call === "function" && call(); 16 | }); 17 | }, 18 | loading: function (title, call, timer) { 19 | return layer.msg(title, {icon: 16, shade: 0.3, time: timer||1000}, function () { 20 | typeof call === "function" && call(); 21 | }); 22 | } 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /html/static/lau/lau.css: -------------------------------------------------------------------------------- 1 | a, *[lau-href], *[lau-event] { 2 | cursor: pointer; 3 | } 4 | /*顶部导航*/ 5 | .layui-layout-admin .layui-header { 6 | height: 50px; 7 | background-color: #373D41; 8 | box-sizing: border-box; 9 | border-bottom: 1px solid #2a2f32; 10 | } 11 | .layui-header .lau-logo-mini { 12 | display: inline-block; 13 | height: 50px; 14 | line-height: 50px; 15 | width: 50px; 16 | text-align: center; 17 | border-right: 1px solid #2a2f32; 18 | } 19 | .layui-header .lau-logo-mini i { 20 | color: #fff; 21 | font-weight: bold; 22 | } 23 | .layui-header .layui-logo { 24 | left: 50px; 25 | line-height: 50px; 26 | width: 130px; 27 | border-right: 1px solid #2a2f32; 28 | font-weight: bold; 29 | } 30 | .layui-header .layui-layout-left { 31 | left: 180px; 32 | } 33 | .layui-header .layui-nav { 34 | padding: 0; 35 | } 36 | .layui-header .layui-nav .layui-nav-item { 37 | height: 50px; 38 | line-height: 50px; 39 | } 40 | .layui-header .layui-nav-child { 41 | top: 55px; 42 | } 43 | .layui-header .layui-nav .layui-nav-child dd.layui-this a, .layui-header .layui-nav-child dd.layui-this { 44 | background: none; 45 | color: #333; 46 | } 47 | .layui-header .layui-nav-bar { 48 | top: 0!important; 49 | height: 3px; 50 | bottom: auto; 51 | } 52 | /*侧栏菜单*/ 53 | .layui-layout-admin .layui-side { 54 | top: 50px; 55 | width: 180px; 56 | padding-top: 30px; 57 | border-right: 1px solid #2a2f32; 58 | background-color: #373D41; 59 | -webkit-transition: width 0.2s; 60 | transition: width 0.2s; 61 | } 62 | .layui-side .lau-side-fold { 63 | position: absolute; 64 | left: 0; 65 | top: 0; 66 | width: 100%; 67 | height: 30px; 68 | line-height: 30px; 69 | text-align: center; 70 | border-bottom: 1px solid #2a2f32; 71 | box-sizing: border-box; 72 | cursor: pointer; 73 | } 74 | .layui-side .lau-side-fold i { 75 | display: inline-block; 76 | color: #fff; 77 | font-size: 14px; 78 | cursor: pointer; 79 | -webkit-transition: transform 0.2s; 80 | transition: transform 0.2s; 81 | } 82 | 83 | .layui-side .layui-side-scroll { 84 | width: 200px; 85 | -webkit-transition: width 0.2s; 86 | transition: width 0.2s; 87 | } 88 | .layui-side .layui-side-scroll .layui-nav-tree { 89 | width: 180px; 90 | background-color: rgba(255,255,255,0.1); 91 | -webkit-transition: width 0.2s; 92 | transition: width 0.2s; 93 | } 94 | .layui-side .lau-nav-item a { 95 | position: relative; 96 | height: 40px; 97 | line-height: 40px; 98 | display: block; 99 | overflow: hidden; 100 | color: #fff; 101 | letter-spacing: 1px; 102 | -webkit-transition: background-color 0.2s; 103 | transition: background-color 0.2s; 104 | } 105 | .layui-side .lau-nav-item a i { 106 | font-size: 14px; 107 | display: inline-block; 108 | width: 50px; 109 | text-align: center; 110 | -webkit-transition: transform 0.2s; 111 | transition: transform 0.2s; 112 | } 113 | .layui-side .lau-nav-item.lau-open .lau-nav-header i { 114 | -webkit-transform: rotate(45deg); 115 | transform: rotate(45deg); 116 | } 117 | .layui-side .lau-nav-item .lau-nav-child { 118 | background-color: #373D41; 119 | overflow: hidden; 120 | } 121 | .layui-side .lau-nav-item .lau-nav-child a { 122 | height: 0; 123 | -webkit-transition: height 0.2s, background-color 0.2s; 124 | transition: height 0.2s, background-color 0.2s; 125 | } 126 | .layui-side .lau-nav-item .lau-nav-child a:hover { 127 | background-color: rgba(255,255,255,0.2); 128 | } 129 | .layui-side .lau-nav-item.lau-open .lau-nav-child a { 130 | height: 40px; 131 | } 132 | .layui-side.lau-mini { 133 | width: 50px; 134 | } 135 | .layui-side.lau-mini .layui-side-scroll { 136 | width: 70px; 137 | } 138 | .layui-side.lau-mini .layui-side-scroll .layui-nav-tree { 139 | width: 50px; 140 | } 141 | .layui-side.lau-mini .lau-side-fold i { 142 | -webkit-transform: rotateY(180deg); 143 | transform: rotateY(180deg); 144 | } 145 | /*内容主体*/ 146 | .layui-layout-admin .layui-body { 147 | top: 50px; 148 | bottom: 0; 149 | left: 180px; 150 | overflow: hidden; 151 | -webkit-transition: left 0.2s; 152 | transition: left 0.2s; 153 | } 154 | .layui-side.lau-mini + .layui-body { 155 | left: 50px; 156 | } 157 | /*选项卡控制菜单*/ 158 | .layui-body .lau-tabs-ctrl { 159 | position: absolute; 160 | top: 0; 161 | width: 40px; 162 | height: 40px; 163 | line-height: 40px; 164 | cursor: pointer; 165 | text-align: center; 166 | -webkit-transition: all .3s; 167 | transition: all .3s; 168 | border-bottom: 1px solid #f6f6f6; 169 | background-color: #fff; 170 | z-index: 19921216; 171 | } 172 | .layui-body .lau-tabs-ctrl:hover { 173 | background-color: #f6f6f6; 174 | } 175 | .layui-body .lau-tabs-ctrl.layui-icon-prev { 176 | left: 0; 177 | border-right: 1px solid #f6f6f6; 178 | } 179 | .layui-body .lau-tabs-ctrl.layui-icon-next { 180 | right: 80px; 181 | border-left: 1px solid #f6f6f6; 182 | } 183 | .layui-body .lau-tabs-ctrl.layui-icon-refresh-3 { 184 | right: 40px; 185 | border-left: 1px solid #f6f6f6; 186 | } 187 | .layui-body .lau-tabs-ctrl.layui-icon-down { 188 | right: 0; 189 | border-left: 1px solid #f6f6f6; 190 | } 191 | .layui-body .lau-tabs-more.layui-nav { 192 | position: absolute; 193 | left: 0; 194 | top: 0; 195 | width: 100%; 196 | height: 100%; 197 | padding: 0; 198 | background: none; 199 | } 200 | .layui-body .lau-tabs-more.layui-nav .layui-nav-item { 201 | line-height: 40px; 202 | } 203 | .layui-body .lau-tabs-more.layui-nav .layui-nav-item > a { 204 | height: 40px; 205 | } 206 | .layui-body .lau-tabs-more.layui-nav .layui-nav-item a { 207 | color: #666; 208 | } 209 | .layui-body .lau-tabs-more.layui-nav .layui-nav-child { 210 | top: 40px; 211 | left: auto; 212 | right: 0; 213 | border-radius: 0; 214 | } 215 | .layui-body .lau-tabs-more.layui-nav .layui-nav-child dd.layui-this, .layui-body .lau-tabs-more.layui-nav .layui-nav-child dd.layui-this a { 216 | background-color: #f2f2f2!important; 217 | color: #333; 218 | } 219 | .layui-body .lau-tabs-more.layui-nav .layui-nav-more, .layui-body .lau-tabs-more.layui-nav .layui-nav-bar { 220 | display: none; 221 | } 222 | /*重置选项卡导航条样式*/ 223 | .layui-body .layui-tab { 224 | margin: 0; 225 | } 226 | .layui-body .layui-tab-bar { 227 | display: none; 228 | } 229 | .layui-body .layui-tab-title { 230 | margin: 0 120px 0 40px; 231 | border-bottom-color: #f6f6f6; 232 | } 233 | .layui-body .layui-tab[overflow]>.layui-tab-title { 234 | overflow: visible; 235 | } 236 | .layui-body .layui-tab-title li:first-child i.layui-tab-close { 237 | display: none; 238 | } 239 | .layui-body .layui-tab-title li { 240 | height: 40px; 241 | border-bottom: 1px solid #f6f6f6; 242 | } 243 | .layui-body .layui-tab-title li:after { 244 | content: ''; 245 | position: absolute; 246 | left: 0; 247 | width: 0; 248 | height: 41px; 249 | border-radius: 0; 250 | border-bottom: 2px solid #5FB878; 251 | box-sizing: border-box; 252 | -webkit-transition: all .2s; 253 | transition: all .2s; 254 | } 255 | .layui-body .layui-tab-title li i:first-child { 256 | font-size: 16px; 257 | } 258 | .layui-body .layui-tab-brief[overflow]>.layui-tab-title .layui-this:after { 259 | top: 0; 260 | } 261 | .layui-body .layui-tab-title li.layui-this:after { 262 | width: 100%; 263 | } 264 | .layui-body .layui-tab-brief>.layui-tab-title .layui-this { 265 | background-color: #f6f6f6; 266 | } 267 | /*选项卡内容样式*/ 268 | .layui-body .layui-tab .layui-tab-content { 269 | padding: 0; 270 | } 271 | .layui-body .layui-tab .layui-tab-item { 272 | position: absolute; 273 | left: 0; 274 | right: 0; 275 | top: 41px; 276 | bottom: 0; 277 | } 278 | .layui-body iframe { 279 | width: 100%; 280 | height: 100%; 281 | border: none; 282 | } 283 | /*抽屉*/ 284 | @-webkit-keyframes layui-rl { 285 | from { 286 | -webkit-transform: translate3d(100%, 0, 0); 287 | } 288 | to { 289 | -webkit-transform: translate3d(0, 0, 0); 290 | } 291 | } 292 | @keyframes layui-rl { 293 | from { 294 | transform: translate3d(100%, 0, 0); 295 | } 296 | to { 297 | transform: translate3d(0, 0, 0); 298 | } 299 | } 300 | .layui-anim-rl { 301 | -webkit-animation-name: layui-rl; 302 | animation-name: layui-rl; 303 | } 304 | @-webkit-keyframes layui-lr { 305 | from { 306 | -webkit-transform: translate3d(0, 0, 0); 307 | opacity: 1; 308 | } 309 | to { 310 | -webkit-transform: translate3d(100%, 0, 0); 311 | opacity: 1; 312 | } 313 | } 314 | @keyframes layui-lr { 315 | from { 316 | transform: translate3d(0, 0, 0); 317 | } 318 | to { 319 | transform: translate3d(100%, 0, 0); 320 | } 321 | } 322 | .layui-anim-lr { 323 | -webkit-animation-name: layui-lr; 324 | animation-name: layui-lr; 325 | } 326 | .layui-anim-rl.layer-anim-close { 327 | -webkit-animation-name: layui-lr; 328 | animation-name: layui-lr; 329 | } 330 | .lau-drawer { 331 | top: 50px !important; 332 | bottom: 0; 333 | box-shadow: 1px 1px 10px rgba(0,0,0,.1); 334 | border-radius: 0!important; 335 | overflow: auto; 336 | } 337 | 338 | -------------------------------------------------------------------------------- /html/static/layui/css/layui.mobile.css: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}@-webkit-keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-left{-webkit-animation-name:layui-m-anim-left;animation-name:layui-m-anim-left}@-webkit-keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-right{-webkit-animation-name:layui-m-anim-right;animation-name:layui-m-anim-right}@-webkit-keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.layui-m-anim-lout{-webkit-animation-name:layui-m-anim-lout;animation-name:layui-m-anim-lout}@-webkit-keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.layui-m-anim-rout{-webkit-animation-name:layui-m-anim-rout;animation-name:layui-m-anim-rout}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} -------------------------------------------------------------------------------- /html/static/layui/css/modules/code.css: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} -------------------------------------------------------------------------------- /html/static/layui/css/modules/laydate/default/laydate.css: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px} -------------------------------------------------------------------------------- /html/static/layui/css/modules/layer/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/css/modules/layer/default/icon-ext.png -------------------------------------------------------------------------------- /html/static/layui/css/modules/layer/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/css/modules/layer/default/icon.png -------------------------------------------------------------------------------- /html/static/layui/css/modules/layer/default/layer.css: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} -------------------------------------------------------------------------------- /html/static/layui/css/modules/layer/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/css/modules/layer/default/loading-0.gif -------------------------------------------------------------------------------- /html/static/layui/css/modules/layer/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/css/modules/layer/default/loading-1.gif -------------------------------------------------------------------------------- /html/static/layui/css/modules/layer/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/css/modules/layer/default/loading-2.gif -------------------------------------------------------------------------------- /html/static/layui/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/font/iconfont.eot -------------------------------------------------------------------------------- /html/static/layui/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/font/iconfont.ttf -------------------------------------------------------------------------------- /html/static/layui/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/font/iconfont.woff -------------------------------------------------------------------------------- /html/static/layui/images/face/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/0.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/1.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/10.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/11.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/12.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/13.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/14.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/15.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/16.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/17.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/18.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/19.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/2.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/20.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/21.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/22.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/23.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/24.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/25.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/26.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/27.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/28.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/29.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/3.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/30.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/31.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/32.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/33.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/33.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/34.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/34.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/35.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/36.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/37.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/38.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/39.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/4.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/40.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/40.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/41.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/42.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/43.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/44.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/44.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/45.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/45.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/46.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/47.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/48.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/48.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/49.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/49.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/5.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/50.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/51.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/51.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/52.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/52.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/53.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/54.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/54.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/55.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/56.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/57.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/58.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/58.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/59.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/59.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/6.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/60.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/61.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/62.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/63.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/64.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/65.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/65.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/66.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/66.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/67.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/68.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/68.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/69.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/7.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/70.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/70.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/71.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/71.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/8.gif -------------------------------------------------------------------------------- /html/static/layui/images/face/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/html/static/layui/images/face/9.gif -------------------------------------------------------------------------------- /html/static/layui/lay/modules/carousel.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
    ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
"].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
  1. '+o.replace(/[\r\t\n]+/g,"
  2. ")+"
"),c.find(">.layui-code-h3")[0]||c.prepend('

'+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); -------------------------------------------------------------------------------- /html/static/layui/lay/modules/element.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='
  • "+(i.title||"unnaming")+"
  • ";return s[0]?s.before(r):n.append(r),o.append('
    '+(i.content||"")+"
    "),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next('li')[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a(''),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append(''),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append(''+(l?"":"")+""),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)}); -------------------------------------------------------------------------------- /html/static/layui/lay/modules/flow.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)}); -------------------------------------------------------------------------------- /html/static/layui/lay/modules/form.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var t=this;return i.extend(!0,t.config,e),t},u.prototype.verify=function(e){var t=this;return i.extend(!0,t.config.verify,e),t},u.prototype.on=function(e,i){return layui.onevent.call(this,l,e,i)},u.prototype.val=function(e,t){var a=i(r+'[lay-filter="'+e+'"]');a.each(function(e,a){var n=i(this);layui.each(t,function(e,i){var t,a=n.find('[name="'+e+'"]');a[0]&&(t=a[0].type,"checkbox"===t?a[0].checked=i:"radio"===t?a.each(function(){this.value===i&&(this.checked=!0)}):a.val(i))})}),f.render(null,e)},u.prototype.render=function(e,t){var n=this,u=i(r+function(){return t?'[lay-filter="'+t+'"]':""}()),d={select:function(){var e,t="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(t,l){i(t.target).parent().hasClass(n)&&!l||(i("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(t,u,f){var y,p=i(this),m=t.find("."+n),k=m.find("input"),g=t.find("dl"),x=g.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=t.offset().top+t.outerHeight()+5-h.scrollTop(),i=g.outerHeight();b=p[0].selectedIndex,t.addClass(a+"ed"),x.removeClass(o),y=null,x.eq(b).addClass(s).siblings().removeClass(s),e+i>h.height()&&e>=i&&t.addClass(a+"up")},w=function(e){t.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||$(k.val(),function(e){e&&(d=g.find("."+s).html(),k&&k.val(d))})};m.on("click",function(e){t.hasClass(a+"ed")?w():(v(e,!0),C()),g.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var i=e.keyCode;9===i&&C()}).on("keydown",function(e){var i=e.keyCode;9===i&&w();var t=function(i,a){var n,l;if(e.preventDefault(),a=function(){return a&&a[0]?a:y&&y[0]?y:x.eq(b)}(),l=a[i](),n=a[i]("dd"),l[0]){if(y=a[i](),!n[0]||n.hasClass(c))return t(i,y);n.addClass(s).siblings().removeClass(s);var r=g.children("dd.layui-this"),o=r.position().top,u=g.height(),d=r.height();o>u&&g.scrollTop(o+g.scrollTop()-u+d-5),o<0&&g.scrollTop(o+g.scrollTop())}};38===i&&t("prev"),40===i&&t("next"),13===i&&(e.preventDefault(),g.children("dd."+s).trigger("click"))});var $=function(e,t,a){var n=0;layui.each(x,function(){var t=i(this),l=t.text(),r=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:r)&&n++,"keyup"===a&&t[r?"addClass":"removeClass"](o)});var l=n===x.length;return t(l),l},T=function(e){var i=this.value,t=e.keyCode;return 9!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&($(i,function(e){e?g.find("."+r)[0]||g.append('

    无匹配项

    '):g.find("."+r).remove()},"keyup"),void(""===i&&g.find("."+r).remove()))};f&&k.on("keyup",T).on("blur",function(t){var a=p[0].selectedIndex;e=k,d=i(p[0].options[a]).html(),setTimeout(function(){$(k.val(),function(e){d||k.val("")},"blur")},200)}),x.on("click",function(){var e=i(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:t}),w(!0),!1)}),t.find("dl>dt").on("click",function(e){return!1}),i(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=i(this),o=r.next("."+a),u=this.disabled,d=l.value,f=i(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?t:v.innerHTML||t:t,m=i(['
    ','
    ','','
    ','
    ',function(e){var i=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?i.push("
    "+a.label+"
    "):i.push('
    '+a.innerHTML+"
    "):i.push('
    '+(a.innerHTML||t)+"
    ")}),0===i.length&&i.push('
    没有选项
    '),i.join("")}(r.find("*"))+"
    ","
    "].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},t=u.find("input[type=checkbox]"),a=function(e,t){var a=i(this);e.on("click",function(){var i=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(t[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(t[1]).find("em").text(n[0])),layui.event.call(a[0],l,t[2]+"("+i+")",{elem:a[0],value:a[0].value,othis:e}))})};t.each(function(t,n){var l=i(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=i(['
    ",function(){var e=n.title.replace(/\s/g,""),i={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?s[0]:s[1])||"")+""};return i[r]||i.checkbox}(),"
    "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",t=["",""],a=u.find("input[type=radio]"),n=function(a){var n=i(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=i(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(t[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(t[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=i(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=i(['
    ',''+t[l.checked?0:1]+"","
    "+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"
    ","
    "].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,i){i()}),n};var d=function(){var e=i(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),v=e.parents("form")[0],h=u.find("input,select,textarea"),y=e.attr("lay-filter");if(layui.each(d,function(e,l){var r=i(this),c=r.attr("lay-verify").split("|"),u=r.attr("lay-verType"),d=r.val();if(r.removeClass(o),layui.each(c,function(e,i){var c,f="",v="function"==typeof a[i];if(a[i]){var c=v?f=a[i](d,l):!a[i][0].test(d);if(f=f||a[i][1],c)return"tips"===u?t.tips(f,function(){return"string"==typeof r.attr("lay-ignore")||"select"!==l.tagName.toLowerCase()&&!/^checkbox|radio$/.test(l.type)?r:r.next()}(),{tips:1}):"alert"===u?t.alert(f,{title:"提示",shadeClose:!0}):t.msg(f,{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}}),s)return s}),s)return!1;var p={};return layui.each(h,function(e,i){if(i.name=(i.name||"").replace(/^\s*|\s*&/,""),i.name){if(/^.*\[\]$/.test(i.name)){var t=i.name.match(/^(.*)\[\]$/g)[0];p[t]=0|p[t],i.name=i.name.replace(/^(.*)\[\]$/,"$1["+p[t]++ +"]")}/^checkbox|radio$/.test(i.type)&&!i.checked||(c[i.name]=i.value)}}),layui.event.call(this,l,"submit("+y+")",{elem:this,form:v,field:c})},f=new u,v=i(document),h=i(window);f.render(),v.on("reset",r,function(){var e=i(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)}); -------------------------------------------------------------------------------- /html/static/layui/lay/modules/layedit.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("string"==typeof t?"#"+t:t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
    ','
    '+f+"
    ",'
    ','',"
    ","
    "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

    ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

    "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

    "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

      ','
    • ','','
      ','',"
      ","
    • ",'
    • ','','
      ','",'","
      ","
    • ",'
    • ','','',"
    • ","
    "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
  • '+e+'
  • ')}),'
      '+t.join("")+"
    "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
      ','
    • ','','
      ','","
      ","
    • ",'
    • ','','
      ','',"
      ","
    • ",'
    • ','','',"
    • ","
    "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)}); -------------------------------------------------------------------------------- /html/static/layui/lay/modules/laypage.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
    ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
    "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); -------------------------------------------------------------------------------- /html/static/layui/lay/modules/laytpl.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); -------------------------------------------------------------------------------- /html/static/layui/lay/modules/rate.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,i={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,a){return layui.onevent.call(this,n,e,a)}},l=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",s="layui-icon-rate-solid",u="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var l=this;l.index=++i.index,l.config=a.extend({},l.config,i.config,e),l.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,i=e.config,l=i.theme?'style="color: '+i.theme+';"':"";i.elem=a(i.elem),parseInt(i.value)!==i.value&&(i.half||(i.value=Math.ceil(i.value)-i.value<.5?Math.ceil(i.value):Math.floor(i.value)));for(var n='
      ",u=1;u<=i.length;u++){var r='
    • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
    • ":n+=r}n+="
    "+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)}); -------------------------------------------------------------------------------- /html/static/layui/lay/modules/table.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define(["laytpl","laypage","layer","form"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=layui.hint(),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,s,e,t)}},c=function(){var e=this,t=e.config,i=t.id;return i&&(c.config[i]=t),{reload:function(t){e.reload.call(e,t)},config:t}},s="table",u=".layui-table",h="layui-hide",f="layui-none",y="layui-table-view",p=".layui-table-header",m=".layui-table-body",v=".layui-table-main",g=".layui-table-fixed",x=".layui-table-fixed-l",b=".layui-table-fixed-r",k=".layui-table-tool",C=".layui-table-page",w=".layui-table-sort",N="layui-table-edit",T="layui-table-hover",F=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
    ','
    1){ }}","group","{{# } else { }}","{{d.index}}-{{item2.field || i2}}",'{{# if(item2.type !== "normal"){ }}'," laytable-cell-{{ item2.type }}","{{# } }}","{{# } }}",'" {{#if(item2.align){}}align="{{item2.align}}"{{#}}}>','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(!(item2.colspan > 1) && item2.sort){ }}",'',"{{# } }}","{{# } }}","
    ","
    "].join("")},W=['',"","
    "].join(""),z=['
    ',"{{# if(d.data.toolbar){ }}",'
    ',"{{# } }}",'
    ',"{{# var left, right; }}",'
    ',F(),"
    ",'
    ',W,"
    ","{{# if(left){ }}",'
    ','
    ',F({fixed:!0}),"
    ",'
    ',W,"
    ","
    ","{{# }; }}","{{# if(right){ }}",'
    ','
    ',F({fixed:"right"}),'
    ',"
    ",'
    ',W,"
    ","
    ","{{# }; }}","
    ","{{# if(d.data.page){ }}",'
    ','
    ',"
    ","{{# } }}","","
    "].join(""),A=t(window),S=t(document),M=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};M.prototype.config={limit:10,loading:!0,cellMinWidth:60,text:{none:"无数据"}},M.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id"),a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;e.setArea();var l=a.elem,n=l.next("."+y),o=e.elem=t(i(z).render({VIEW_CLASS:y,data:a,index:e.index}));if(a.index=e.index,n[0]&&n.remove(),l.after(o),e.layHeader=o.find(p),e.layMain=o.find(v),e.layBody=o.find(m),e.layFixed=o.find(g),e.layFixLeft=o.find(x),e.layFixRight=o.find(b),e.layTool=o.find(k),e.layPage=o.find(C),e.layTool.html(i(t(a.toolbar).html()||"").render(a)),a.height&&e.fullSize(),a.cols.length>1){var r=e.layFixed.find(p).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},M.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},M.prototype.setArea=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=t.width||function(){var e=function(i){var a,l;i=i||t.elem.parent(),a=i.width();try{l="none"===i.css("display")}catch(n){}return!i[0]||a&&!l?a:e(i.parent())};return e()}();e.eachCols(function(){i++}),o-=function(){return"line"===t.skin||"nob"===t.skin?2:i+1}(),layui.each(t.cols,function(t,i){layui.each(i,function(t,l){var r;return l?(e.initOpts(l),r=l.width||0,void(l.colspan>1||(/\d+%$/.test(r)?l.width=r=Math.floor(parseFloat(r)/100*o):r||(l.width=r=0,a++),n+=r))):void i.splice(t,1)})}),e.autoColNums=a,o>n&&a&&(l=(o-n)/a),layui.each(t.cols,function(e,i){layui.each(i,function(e,i){var a=i.minWidth||t.cellMinWidth;i.colspan>1||0===i.width&&(i.width=Math.floor(l>=a?l:a))})}),t.height&&/^full-\d+$/.test(t.height)&&(e.fullHeightGap=t.height.split("-")[1],t.height=A.height()-e.fullHeightGap)},M.prototype.reload=function(e){var i=this;i.config.data&&i.config.data.constructor===Array&&delete i.config.data,i.config=t.extend({},i.config,e),i.render()},M.prototype.page=1,M.prototype.pullData=function(e,i){var a=this,n=a.config,o=n.request,r=n.response,d=function(){"object"==typeof n.initSort&&a.sort(n.initSort.field,n.initSort.type)};if(a.startTime=(new Date).getTime(),n.url){var c={};c[o.pageName]=e,c[o.limitName]=n.limit;var s=t.extend(c,n.where);n.contentType&&0==n.contentType.indexOf("application/json")&&(s=JSON.stringify(s)),t.ajax({type:n.method||"get",url:n.url,contentType:n.contentType,data:s,dataType:"json",headers:n.headers||{},success:function(t){t[r.statusName]!=r.statusCode?(a.renderForm(),a.layMain.html('
    '+(t[r.msgName]||"返回的数据状态异常")+"
    ")):(a.renderData(t,e,t[r.countName]),d(),n.time=(new Date).getTime()-a.startTime+" ms"),i&&l.close(i),"function"==typeof n.done&&n.done(t,e,t[r.countName])},error:function(e,t){a.layMain.html('
    数据接口请求异常
    '),a.renderForm(),i&&l.close(i)}})}else if(n.data&&n.data.constructor===Array){var u={},h=e*n.limit-n.limit;u[r.dataName]=n.data.concat().splice(h,n.limit),u[r.countName]=n.data.length,a.renderData(u,e,n.data.length),d(),"function"==typeof n.done&&n.done(u,e,u[r.countName])}},M.prototype.eachCols=function(e){var i=t.extend(!0,[],this.config.cols),a=[],l=0;layui.each(i,function(e,t){layui.each(t,function(t,n){if(n.colspan>1){var o=0;l++,n.CHILD_COLS=[],layui.each(i[e+1],function(e,t){t.PARENT_COL||o==n.colspan||(t.PARENT_COL=l,n.CHILD_COLS.push(t),o+=t.colspan>1?t.colspan:1)})}n.PARENT_COL||a.push(n)})});var n=function(t){layui.each(t||a,function(t,i){return i.CHILD_COLS?n(i.CHILD_COLS):void e(t,i)})};n()},M.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],y=[],p=[],m=[],v=function(){return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(e,a){var l=[],o=[],u=[],h=e+s.limit*(n-1)+1;0!==a.length&&(r||(a[d.config.indexName]=e),c.eachCols(function(e,n){var r=n.field||e,f=a[r];c.getColElem(c.layHeader,r);if(void 0!==f&&null!==f||(f=""),!(n.colspan>1)){var y=['",'
    '+function(){var e=t.extend(!0,{LAY_INDEX:h},a);return"checkbox"===n.type?'":"numbers"===n.type?h:n.toolbar?i(t(n.toolbar).html()||"").render(e):n.templet?function(){return"function"==typeof n.templet?n.templet(e):i(t(n.templet).html()||String(f)).render(e)}():f}(),"
    "].join("");l.push(y),n.fixed&&"right"!==n.fixed&&o.push(y),"right"===n.fixed&&u.push(y)}}),y.push(''+l.join("")+""),p.push(''+o.join("")+""),m.push(''+u.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+f).remove(),c.layMain.find("tbody").html(y.join("")),c.layFixLeft.find("tbody").html(p.join("")),c.layFixRight.find("tbody").html(m.join("")),c.renderForm(),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,void l.close(c.tipsIndex))};return c.key=s.id||s.index,d.cache[c.key]=u,c.layPage[0===u.length&&1==n?"addClass":"removeClass"](h),r?v():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+f).remove(),c.layMain.append('
    '+s.text.none+"
    ")):(v(),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr,c.loading()))}},s.page),s.page.count=o,a.render(s.page))))},M.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},M.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},M.prototype.sort=function(e,i,a,l){var n,r,c=this,u={},h=c.config,f=h.elem.attr("lay-filter"),y=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var p=c.layHeader.find("th .laytable-cell-"+h.index+"-"+n).find(w);c.layHeader.find("th").find(w).removeAttr("lay-sort"),p.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},"asc"===i?r=layui.sort(y,n):"desc"===i?r=layui.sort(y,n,!0):(r=layui.sort(y,d.config.indexName),delete c.sortKey),u[h.response.dataName]=r,c.renderData(u,c.page,c.count,!0),l&&layui.event.call(e,s,"sort("+f+")",{field:n,type:i})},M.prototype.loading=function(){var e=this,t=e.config;if(t.loading&&t.url)return l.msg("数据请求中",{icon:16,offset:[e.elem.offset().top+e.elem.height()/2-35-A.scrollTop()+"px",e.elem.offset().left+e.elem.width()/2-90-A.scrollLeft()+"px"],time:-1,anim:-1,fixed:!1})},M.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},M.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},M.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(a,l){if(l.selectorText===".laytable-cell-"+i.index+"-"+e)return t(l),!0})},M.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=A.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),e=parseFloat(a)-parseFloat(t.layHeader.height())-1,i.toolbar&&(e-=t.layTool.outerHeight()),i.page&&(e=e-t.layPage.outerHeight()-1),t.layMain.css("height",e)},M.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},M.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=e.getScrollWidth(e.layMain[0]),o=i.outerWidth()-e.layMain.width();if(e.autoColNums&&o<5&&!e.scrollPatchWStatus){var r=e.layHeader.eq(0).find("thead th:last-child"),d=r.data("field");e.getCssRule(d,function(t){var i=t.style.width||r.outerWidth();t.style.width=parseFloat(i)-n-o+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px"),e.scrollPatchWStatus=!0})}if(a&&l){if(!e.elem.find(".layui-table-patch")[0]){var c=t('
    ');c.find("div").css({width:a}),e.layHeader.eq(0).find("thead tr").append(c)}}else e.layHeader.eq(0).find(".layui-table-patch").remove();var s=e.layMain.height(),u=s-l;e.layFixed.find(m).css("height",i.height()>u?u:"auto"),e.layFixRight[o>0?"removeClass":"addClass"](h),e.layFixRight.css("right",a-1)},M.prototype.events=function(){var e,a=this,n=a.config,o=t("body"),c={},u=a.layHeader.find("th"),h=".layui-table-cell",f=n.elem.attr("lay-filter");u.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.attr("colspan")>1||i.data("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var i=t(this);if(c.allowResize){var l=i.data("field");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],a.getCssRule(l,function(e){var t=e.style.width||i.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=i.data("minwidth")||n.cellMinWidth})}}),S.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var i=c.ruleWidth+t.clientX-c.offset[0];i');d[0].value=e.data("content")||o.text(),e.find("."+N)[0]||e.append(d),d.focus()}else o.find(".layui-form-switch,.layui-form-checkbox")[0]||Math.round(o.prop("scrollWidth"))>Math.round(o.outerWidth())&&(a.tipsIndex=l.tips(['
    ',o.html(),"
    ",''].join(""),o[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:600,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}))}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),l=e.parents("tr").eq(0).data("index"),n=a.layBody.find('tr[data-index="'+l+'"]'),o="layui-table-click",r=d.cache[a.key][l];layui.event.call(this,s,"tool("+f+")",{data:d.clearCacheKey(r),event:e.attr("lay-event"),tr:n,del:function(){d.cache[a.key][l]=[],n.remove(),a.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,l){if(e in r){var o,d=n.children('td[data-field="'+e+'"]');r[e]=l,a.eachCols(function(t,i){i.field==e&&i.templet&&(o=i.templet)}),d.children(h).html(o?i(t(o).html()||l).render(r):l),d.data("content",l)}})}}),n.addClass(o).siblings("tr").removeClass(o)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layFixed.find(m).scrollTop(n),l.close(a.tipsIndex)}),A.on("resize",function(){a.fullSize(),a.scrollPatch()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':u+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},c.config={},d.reload=function(e,i){var a=c.config[e];return i=i||{},a?(i.data&&i.data.constructor===Array&&delete a.data,d.render(t.extend(!0,{},a,i))):o.error("The ID option was not found in the table instance")},d.render=function(e){var t=new M(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(s,d)}); -------------------------------------------------------------------------------- /html/static/layui/lay/modules/tree.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
      '),s=o(["
    • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
    • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
      '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); -------------------------------------------------------------------------------- /html/static/layui/lay/modules/upload.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('
      '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i(''),a=i(['
      ',"
      "].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(c)||(e.elemFile.wrap(a),t.elem.next("."+c).append(function(){var e=[];return layui.each(t.data,function(i,t){t="function"==typeof t?t():t,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){i="function"==typeof i?i():i,r.append(e,i)}),i.ajax({url:l.url,type:l.method,data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files},resetFile:function(e,i,t){var n=new File([i],t);o.files=o.files||{},o.files[e]=n}},y=function(){if("choose"!==t&&!l.auto||(l.choose&&l.choose(g),"choose"!==t))return l.before&&l.before(g),a.ie?a.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?t.toFixed(2)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after(''+o+"")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)}); -------------------------------------------------------------------------------- /html/static/layui/lay/modules/util.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,a,o="layui-fixbar",r="layui-fixbar-top",l=t(document),n=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],g=t(['
        ',e.bar1?'
      • '+c[0]+"
      • ":"",e.bar2?'
      • '+c[1]+"
      • ":"",'
      • '+c[2]+"
      • ","
      "].join("")),u=g.find("."+r),s=function(){var t=l.scrollTop();t>=e.showHeight?i||(u.show(),i=1):i&&(u.hide(),i=0)};t("."+o)[0]||("object"==typeof e.css&&g.css(e.css),n.append(g),s(),g.find("li").on("click",function(){var i=t(this),a=i.attr("lay-type");"top"===a&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,a)}),l.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var a=this,o="function"==typeof t,r=new Date(e).getTime(),l=new Date(!t||o?(new Date).getTime():t).getTime(),n=r-l,c=[Math.floor(n/864e5),Math.floor(n/36e5)%24,Math.floor(n/6e4)%60,Math.floor(n/1e3)%60];o&&(i=t);var g=setTimeout(function(){a.countdown(e,l+1e3,i)},1e3);return i&&i(n>0?c:[0,0,0,0],t,g),n<=0&&clearTimeout(g),g},timeAgo:function(e,t){var i=this,a=[[],[]],o=(new Date).getTime()-new Date(e).getTime();return o>6912e5?(o=new Date(e),a[0][0]=i.digit(o.getFullYear(),4),a[0][1]=i.digit(o.getMonth()+1),a[0][2]=i.digit(o.getDate()),t||(a[1][0]=i.digit(o.getHours()),a[1][1]=i.digit(o.getMinutes()),a[1][2]=i.digit(o.getSeconds())),a[0].join("-")+" "+a[1].join(":")):o>=864e5?(o/1e3/60/60/24|0)+"天前":o>=36e5?(o/1e3/60/60|0)+"小时前":o>=12e4?(o/1e3/60|0)+"分钟前":o<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var a=e.length;a/g,">").replace(/'/g,"'").replace(/"/g,""")}};e("util",i)}); -------------------------------------------------------------------------------- /html/static/layui/layui.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;!function(e){"use strict";var t=document,n={modules:{},status:{},timeout:10,event:{}},o=function(){this.v="2.3.0"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,n=t.scripts,o=n.length-1,r=o;r>0;r--)if("interactive"===n[r].readyState){e=n[r].src;break}return e||n[o].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),a=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},i="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",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};o.prototype.cache=n,o.prototype.define=function(e,t){var o=this,r="function"==typeof e,a=function(){var e=function(e,t){layui[e]=t,n.status[e]=!0};return"function"==typeof t&&t(function(o,r){e(o,r),n.callback[o]=function(){t(e)}}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?a.call(o):(o.use(e,a),o)},o.prototype.use=function(e,o,l){function s(e,t){var o="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||o.test((e.currentTarget||e.srcElement).readyState))&&(n.modules[d]=t,f.removeChild(v),function r(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void(n.status[d]?c():setTimeout(r,4))}())}function c(){l.push(layui[d]),e.length>1?y.use(e.slice(1),o,l):"function"==typeof o&&o.apply(layui,l)}var y=this,p=n.dir=n.dir?n.dir:r,f=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,n){"jquery"===n&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var d=e[0],m=0;if(l=l||[],n.host=n.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[d]||!layui["layui.all"]&&layui["layui.mobile"]&&u[d])return c(),y;if(n.modules[d])!function g(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void("string"==typeof n.modules[d]&&n.status[d]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[d]?p+"lay/":/^\{\/\}/.test(y.modules[d])?"":n.base||"")+(y.modules[d]||d)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=n.version===!0?n.v||(new Date).getTime():n.version||"";return e?"?v="+e:""}(),f.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||i?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),n.modules[d]=h}return y},o.prototype.getStyle=function(t,n){var o=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return o[o.getPropertyValue?"getPropertyValue":"getAttribute"](n)},o.prototype.link=function(e,o,r){var i=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof o&&(r=o);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(n.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof o?i:(function p(){return++y>1e3*n.timeout/100?a(e+" timeout"):void(1989===parseInt(i.getStyle(t.getElementById(c),"width"))?function(){o()}():setTimeout(p,100))}(),i)},n.callback={},o.prototype.factory=function(e){if(layui[e])return"function"==typeof n.callback[e]?n.callback[e]:null},o.prototype.addcss=function(e,t,o){return layui.link(n.dir+"css/"+e,t,o)},o.prototype.img=function(e,t,n){var o=new Image;return o.src=e,o.complete?t(o):(o.onload=function(){o.onload=null,"function"==typeof t&&t(o)},void(o.onerror=function(e){o.onerror=null,"function"==typeof n&&n(e)}))},o.prototype.config=function(e){e=e||{};for(var t in e)n[t]=e[t];return this},o.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),o.prototype.extend=function(e){var t=this;e=e||{};for(var n in e)t[n]||t.modules[n]?a("模块名 "+n+" 已被占用"):t.modules[n]=e[n];return t},o.prototype.router=function(e){var t=this,e=e||location.hash,n={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),n.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),n.search[t[0]]=t[1]}():n.path.push(t)}),n):n},o.prototype.data=function(t,n,o){if(t=t||"layui",o=o||localStorage,e.JSON&&e.JSON.parse){if(null===n)return delete o[t];n="object"==typeof n?n:{key:n};try{var r=JSON.parse(o[t])}catch(a){var r={}}return"value"in n&&(r[n.key]=n.value),n.remove&&delete r[n.key],o[t]=JSON.stringify(r),n.key?r[n.key]:r}},o.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},o.prototype.device=function(t){var n=navigator.userAgent.toLowerCase(),o=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(n.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(n)?"windows":/linux/.test(n)?"linux":/iphone|ipod|ipad|ios/.test(n)?"ios":/mac/.test(n)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((n.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:o("micromessenger")};return t&&!r[t]&&(r[t]=o(t)),r.android=/android/.test(n),r.ios="ios"===r.os,r},o.prototype.hint=function(){return{error:a}},o.prototype.each=function(e,t){var n,o=this;if("function"!=typeof t)return o;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;na?1:r= 30: 63 | # 每隔30秒更新URL列表 64 | logger.debug("update url task:") 65 | start_T = end_t 66 | update_urltask() 67 | 68 | 69 | def check_site(uid, urlinfo): 70 | # 校验网站访问是否需要 71 | lasttime = urlinfo.get("visittime") 72 | keyword = urlinfo.get('keyword').strip() 73 | now = tstamp() 74 | if now - lasttime <= urlinfo.get('integer'): 75 | # 未过间隔期 76 | return 77 | urlinfo.update(visittime=tstamp()) 78 | success, code, keyresult, spendtime = visit_site(urlinfo.get('url'), urlinfo.get('method'), urlinfo.get('postdata'), keyword=keyword) 79 | result = '' 80 | logger.info("URL:{}, 返回码:{}, 匹配结果:{}, 耗时:{}".format(urlinfo.get('url'), code, keyresult, spendtime)) 81 | url_status, key_status, t_status, err_status = 0,0,0,0 82 | 83 | if success: 84 | if urlinfo.get('status') == code: 85 | # 代码一致 86 | url_status = 1000 87 | result += 'code ok.' 88 | else: 89 | url_status = 2000 90 | result += 'Error code:{}!'.format(code) 91 | 92 | if keyword != '': 93 | logger.debug("Keyword:{}".format(keyword)) 94 | if keyresult: 95 | # 关键词 96 | key_status = 10 97 | result += 'Keyword ok.' 98 | else: 99 | key_status = 20 100 | result += 'Can\'t find keyword!' 101 | 102 | if urlinfo.get('timeout') != '': 103 | if spendtime < urlinfo.get('timeout'): 104 | t_status = 1 105 | result += 'Time ok.' 106 | else: 107 | t_status = 2 108 | result += 'Timeout!actual:{}'.format(spendtime) 109 | else: 110 | if code == 0: 111 | err_status = -1 112 | result += "Can't open url!" 113 | else: 114 | pass 115 | status = url_status + key_status + t_status + err_status 116 | logger.info("uid:{},status:{}".format(uid, status)) 117 | visitinfo = [uid, spendtime, code, result, status, tstamp()] 118 | db.visit_history_insert(visitinfo) 119 | if url_status>1000 or key_status>10 or t_status>1: 120 | # 异常发送邮件或者短信提醒 121 | title = "访问异常:{}".format(urlinfo.get('name')) 122 | message = "status:{}\nurl:{}\nmessage:\n{}".format(status, urlinfo.get('url'), result) 123 | alert_email(uid, urlinfo.get('url'), title, message) 124 | 125 | 126 | email_last_sendtime = 0 # 上一次发送告警邮件时间,用于控制发送邮件间隔。 127 | 128 | def alert_email(uid, url, title, message): 129 | # touch alert, event status: 1 send sucess 2 mail fail 3 error mail address 4 interval time not out 130 | global email_last_sendtime 131 | status = 0 132 | if tstamp() - email_last_sendtime > 1500: 133 | # send email every 15 minutes 134 | db.delete_old_data() # Delete old data every 15 minutes 135 | email_last_sendtime = tstamp() 136 | reciver_address = [b[3] for b in db.user_get()] 137 | if len(reciver_address) == 0: 138 | logger.warning("reciver email is empty!") 139 | # uid, url, result, status, createtime 140 | db.event_insert([uid, url, message, 3, tstamp()]) 141 | return 142 | success, errmsg = mailalert.send_email(title, message, reciver_address) 143 | # success = True 144 | # errmsg ='ok' 145 | logger.info("send email:{}\n{}\n{}\n{}\n{}".format(success, errmsg, title, reciver_address, message)) 146 | 147 | if success: 148 | # 发送成功 149 | db.event_insert([uid, url, message, 1, tstamp()]) 150 | 151 | else: 152 | db.event_insert([uid, url, message, 2, tstamp()]) 153 | else: 154 | # 未超过发送邮件间隔,发送邮件.控制邮件间隔 155 | db.event_insert([uid, url, message, 4, tstamp()]) 156 | 157 | 158 | if __name__ == '__main__': 159 | run_monitor() 160 | # pass 161 | # run_monitor() 162 | # print(url_task) 163 | # print(15*60) 164 | 165 | # result = db.user_get() 166 | # for i in result: 167 | # _,_,_,address,_,_ = i 168 | # print(address) 169 | # print(result) 170 | # print([b[3] for b in db.user_get()]) 171 | # alert_email(1,'xxx.com', "site check","site warning to team") -------------------------------------------------------------------------------- /run.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yasil/carewebsite/a5b0453d041cf63894514dd1ea37808d63cb77b7/run.log -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from multiprocessing import Process 3 | from monitor import run_monitor 4 | from adminsite import run_web_site 5 | 6 | # import threading 7 | # monitor = threading.Thread(target=run_monitor, args=(), name="monitor") 8 | # monitor.start() 9 | if __name__ == '__main__': 10 | monitor = Process(target=run_monitor, args=(), name="monitor") 11 | monitor.start() 12 | run_web_site() -------------------------------------------------------------------------------- /sitehandler.py: -------------------------------------------------------------------------------- 1 | import uuid 2 | import db 3 | import json 4 | from tool import get_md5, clock 5 | import log 6 | logger = log.logging.getLogger("sitehandler") 7 | 8 | session_dict = {} 9 | 10 | COOKIE_KEY = "20monitor20" 11 | 12 | def check_session(sessionid): 13 | # check_login 14 | global session_dict 15 | # print(session_dict) 16 | logger.debug("session:{}".format(session_dict)) 17 | if session_dict.get(sessionid,False) is False: 18 | # session fail 19 | return False, "please login!" 20 | else: 21 | if clock() - session_dict.get(sessionid).get('lifetime') > 7200: 22 | session_dict.pop(sessionid) 23 | return False, "login timeout!" 24 | else: 25 | session_dict.get(sessionid).update(lifetime=clock()) 26 | 27 | return True, "ok" 28 | 29 | def create_session(username): 30 | global session_dict 31 | sessionid = str(uuid.uuid4()) 32 | session_dict.setdefault(sessionid, {"name":username, "lifetime":clock()}) 33 | return sessionid 34 | 35 | def clear_session(sessionid): 36 | global session_dict 37 | logger.debug(sessionid) 38 | if session_dict.get(sessionid, False) is not False: 39 | session_dict.pop(sessionid) 40 | 41 | 42 | def check_user(name, pw): 43 | result = db.user_get() 44 | for i in result: 45 | if name == i['username']: 46 | if get_md5(pw) == i['password']: 47 | # user exists 48 | return True 49 | else: 50 | continue 51 | else: 52 | continue 53 | else: 54 | # user not exists 55 | return False 56 | 57 | 58 | def json_resp(code, msg, count=0, data=None): 59 | ''' return response json ''' 60 | if data is not None: 61 | d = {"code":code, 62 | "msg":msg, 63 | "count":count, 64 | "data":data} 65 | return json.dumps(d) 66 | else: 67 | d = {"code":code, 68 | "msg":msg 69 | } 70 | return json.dumps(d) 71 | 72 | 73 | def web_get_url(page,limit): 74 | page = page - 1 if page - 1 >= 0 else 0 75 | result = db.url_get() 76 | start = page * limit 77 | end = start + limit 78 | return len(result), [dict(r) for r in result[start:end]] 79 | 80 | 81 | def web_get_alert(page,limit): 82 | page = page - 1 if page - 1 >= 0 else 0 83 | result = db.event_get_all() 84 | start = page * limit 85 | end = start + limit 86 | return len(result), [dict(r) for r in result[start:end]] 87 | 88 | 89 | def web_get_user(page,limit): 90 | page = page - 1 if page - 1 >= 0 else 0 91 | result = db.user_get() 92 | start = page * limit 93 | end = start + limit 94 | return len(result), [dict(r) for r in result[start:end]] 95 | 96 | 97 | def web_get_history(page,limit): 98 | page = page - 1 if page - 1 >= 0 else 0 99 | result = db.visit_history_all() 100 | start = page * limit 101 | end = start + limit 102 | return len(result), [dict(r) for r in result[start:end]] 103 | 104 | def web_get_urldetail(urlid): 105 | result = db.visit_history_get(urlid) 106 | return 60, [dict(r) for r in result] 107 | 108 | def web_get_url_delete(urlid): 109 | result = db.url_delete(urlid) 110 | return result 111 | 112 | def web_url_add(formdict): 113 | formdict.setdefault('createtime', clock()) 114 | result = db.url_insert(formdict) 115 | return result 116 | 117 | def web_user_delete(userid): 118 | result = db.user_delete(userid) 119 | return result 120 | 121 | def web_user_add(formdict): 122 | # user dict 123 | password = formdict.get('password') 124 | formdict.update(password=get_md5(password)) 125 | formdict.setdefault('createtime', clock()) 126 | result = db.user_insert(formdict) 127 | return result 128 | 129 | 130 | def web_alert_empty(): 131 | return db.event_empty() 132 | 133 | def web_history_empty(): 134 | return db.visit_empty() 135 | 136 | if __name__ == '__main__': 137 | # result = web_get_urldetail(2) 138 | # print(result) 139 | # web_get_url_delete(22) 140 | pass -------------------------------------------------------------------------------- /tool.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | import time 3 | import json 4 | 5 | def get_md5(dstr): 6 | # return md5 7 | h = hashlib.md5() 8 | h.update(dstr.encode('utf-8')) 9 | return h.hexdigest() 10 | 11 | def clock(): 12 | return int(time.time()) 13 | 14 | 15 | def read_config(): 16 | with open('config.json','r') as f: 17 | config = json.loads(f.read()) 18 | return config 19 | 20 | 21 | if __name__ == '__main__': 22 | read_config() 23 | -------------------------------------------------------------------------------- /visit.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from urllib import parse 3 | from urllib import request 4 | from urllib.error import URLError, HTTPError 5 | import time 6 | import log 7 | logger = log.logging.getLogger("visit") 8 | 9 | 10 | get_now_milli_time = lambda: int(time.time() * 1000) 11 | 12 | def visit_site(url, v_type='get', postdata=None, keyword=None): 13 | # 返回值: 成功|失败, 状态码, 关键字匹配结果, 消耗时间 14 | try: 15 | if v_type == 'get': 16 | r = request.Request(url) 17 | else: 18 | encoded_args = parse.urlencode(postdata).encode('utf-8') 19 | r = request.Request(url,encoded_args) 20 | r.add_header( 21 | 'User-agent', 22 | 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1', 23 | ) 24 | start = get_now_milli_time() 25 | with request.urlopen(r, timeout=3) as f: 26 | data = f.read() 27 | logger.info('Status:{},{}'.format(f.status, f.reason)) 28 | # for k, v in f.getheaders(): 29 | # print('%s: %s' % (k, v)) 30 | logger.debug('Data:\n{}'.format(data.decode('utf-8'))) 31 | except HTTPError as e: 32 | end = get_now_milli_time() 33 | logger.error('{}:Error code:{}'.format(url, e.code)) 34 | return True, e.code, False, end - start 35 | except URLError as e: 36 | logger.error('{}:URLError Reason:{}'.format(url, e.reason)) 37 | return False, 0, False, 0 38 | except ValueError as e: 39 | logger.error('{}:URL vlaue error:{}'.format(url, e)) 40 | return False, 0, False, 0 41 | except Exception as e: 42 | logger.error('{}: unknow error:{}'.format(url, e)) 43 | return False, 0, False, 0 44 | else: 45 | end = get_now_milli_time() 46 | logger.info('{}:OK'.format(url)) 47 | if keyword is not None: 48 | return True, f.status, keyword in data.decode('utf-8'), end - start 49 | else: 50 | return True, f.status, False, end - start 51 | finally: 52 | pass 53 | 54 | if __name__ == '__main__': 55 | # query_args = {'username': 'admin', 'password':'123456'} 56 | # result = visit_site('http://localhost:8080/api/loginpost', 'post', query_args) 57 | # print(result) 58 | pass 59 | --------------------------------------------------------------------------------