75 Commits
Author SHA1 Message Date
zhengxinonly ad0f174996 refactor:修改pydantic数据校验模型名 2022-07-04 20:56:24 +08:00
zhengxinonly 45874b17ee update readme.md 2022-06-16 23:21:15 +08:00
zhengxinonly d7d7e554ee 移除旧版本静态模板 2022-06-01 20:27:19 +08:00
zhengxinonly 8835721924 添加初始化数据 2022-05-28 23:36:32 +08:00
zhengxinonly 4748a286db wip:upgrade pear admin layui to 3.9.7 2022-05-25 03:14:30 +08:00
zhengxinonly 7501ae1dc2 fix:提交冲突 2022-05-24 18:59:51 +08:00
zhengxinonly 9fc2eb0ae3 style(jinja2):修改模板的复用方式 2022-05-24 18:53:37 +08:00
zhengxinonly 12d4dfe410 break:移除flask-restful 2022-05-21 02:10:26 +08:00
zhengxinonly d54eb4dc3e wip:(重构接口实现方式5) 2022-05-20 23:56:11 +08:00
zhengxinonly 246ce3b3b7 20220512 2022-05-12 04:17:58 +08:00
zhengxinonly 36250fad43 wip:(重构接口实现方式4) 2022-05-11 23:31:58 +08:00
zhengxinonly 0d25b479e5 wip:(重构接口实现方式3) 2022-05-10 23:43:33 +08:00
zhengxinonly 7e6aecc99b wip:(重构接口实现方式2) 2022-05-10 01:13:37 +08:00
zhengxinonly 82de7b0273 wip:(重构接口实现方式) 2022-05-09 03:30:41 +08:00
zhengxinonly 8760f21b03 添加服务器配置文件 2022-03-30 20:54:30 +08:00
zhengxinonly 1e34ef339a fix(修复模型名) 2022-03-11 21:26:36 +08:00
zhengxinonlyandGitee 5333a68416 !36 修复多写了一个rights导致的权限创建和修改问题
Merge pull request !36 from Rayi/N/A
2022-03-05 10:59:34 +00:00
RayiandGitee decde3a69a 修复多写了一个rights导致的权限创建和修改问题 2022-03-05 08:39:42 +00:00
zhengxinonly 9dcc05deda fix(power fields) 2022-03-04 15:25:02 +08:00
zhengxinonly c0d963628b refactor(移除生产部署文件) 2022-01-23 01:09:35 +08:00
zhengxinonly 6978002393 refactor(重构程序&目录结构) 2022-01-23 00:43:39 +08:00
zhengxinonly 3453b01938 refactor(javascript):移除esm,es6语法 2021-12-08 15:43:10 +08:00
zhengxinonly 820ab9f5c6 refactor(api):移除marshal序列化 2021-12-07 20:24:07 +08:00
不胜舟andGitee 9490ccb7c0 !29 修改模板复用方式
Merge pull request !29 from zhengxinonly/mini
2021-11-21 14:33:49 +00:00
zhengxinonly 056c4b7023 撤销删除模板组件 2021-11-19 22:56:30 +08:00
zhengxinonly d4d8d8b294 refactor(jinja2):修改模板使用继承 2021-11-19 18:38:55 +08:00
zhengxinonly 8bc5d6e0c2 fix:修复权限数据序列化 2021-09-17 04:00:11 +08:00
zhengxinonly 3fa8ae0a8a refactor(api-logging):暂时删除权限校验与日志记录 2021-09-16 02:46:48 +08:00
zhengxinonly 316ebc2441 ''wip(semantic):调整序列化返回结果 2021-09-15 00:45:35 +08:00
zhengxinonly 550f99e468 'wip(semantic):调整模板api接口' 2021-09-12 18:16:02 +08:00
zhengxinonly b9c449ad57 'wip(logging):调整日志记录方式' 2021-09-10 01:17:26 +08:00
zhengxinonly db5b4e89ed wip(semantic):调整模板文件内容 2021-09-09 02:52:15 +08:00
zhengxinonly 733286b090 wip(semantic):调整模板文件内容 2021-09-09 02:49:55 +08:00
zhengxinonly 7505e4552b 'wip(semantic):调整模板文件' 2021-09-08 01:05:54 +08:00
zhengxinonly e918727984 wip(semantic):数据æapi接口改为集中式 2021-09-07 03:43:01 +08:00
zhengxinonly 00053da117 wip(semantic):数据模型语义化 2021-09-06 02:17:36 +08:00
zhengxinonly 27f5d78c35 refactor(dept):changge to iframe 2021-08-16 00:32:32 +08:00
zhengxinonly 97e0160aaf refactor(jinja2):remove-jinja2-urlfor 2021-08-11 03:47:53 +08:00
zhengxinonly 04794e583f fix(menu):修复菜单排序 2021-07-31 01:15:34 +08:00
zhengxinonly 0640255519 fix(issues):修改bug 2021-07-28 00:08:47 +08:00
zhengxinonly 460984f209 fix(rights):修复权限表状态禁用切换 2021-07-27 16:07:37 +08:00
zhengxinonly 635dcc1dac refactor(api):调整模板 2021-07-27 03:34:00 +08:00
zhengxinonly b26237e24b refactor(rest-api):抽取请求地址 2021-07-27 00:12:06 +08:00
zhengxinonly a35d443fb6 refactor(rest-api):角色与用户数据 2021-07-26 19:55:59 +08:00
zhengxinonly ab4bb1ca40 refactor(rest-api):调整部门数据 2021-07-26 14:36:49 +08:00
zhengxinonly 2b7304e615 refactor(rest-api):调整文件接口数据 2021-07-26 04:21:13 +08:00
zhengxinonly 64748e513d refactor(rest-api):调整部门接口数据 2021-07-26 03:42:53 +08:00
mkg 5b07fed518 解决layer关闭 2021-07-24 16:50:32 +08:00
zhengxinonly eb85e30b79 refactor(api):调整后端逻辑-下 2021-07-24 16:27:17 +08:00
zhengxinonly b8e0173a9c refactor(api):调整后端逻辑-上 2021-07-24 03:06:19 +08:00
zhengxinonly 0ca75c81d4 refactor(api):调整前端逻辑 2021-07-23 02:00:10 +08:00
zhengxinonly aa86bbe372 refactor(api):分离部分模板页面 2021-07-23 01:22:28 +08:00
zhengxinonly 86f07817b1 refactor(migrate):重构数据迁移脚本 2021-07-22 15:55:54 +08:00
mkg 3f74011c98 photo.html页面add关闭当前layer 2021-07-22 14:31:41 +08:00
zhengxinonly ce8adda79d refactor(api):调整模板目录 2021-07-22 00:57:22 +08:00
zhengxinonly 5470837707 refactor(api):前后端半分离 2021-07-21 02:19:52 +08:00
zhengxinonly c26f15ae69 feat(supervisor):新增守护进程 2021-07-10 13:54:02 +08:00
zhengxinonly 4d6d998ae2 wip(production):生产环境部署 2021-07-08 23:26:40 +08:00
zhengxinonly d628432621 fix(flask-uploads):修复flask-uploads与Werkzeug2.0.1兼容问题 2021-07-08 22:13:27 +08:00
mkg 2bcaa8e071 升级layui 2021-07-07 13:58:32 +08:00
zhengxinonly ebf76055a4 fix(dept):部门数据更新bug 2021-07-06 02:15:48 +08:00
mkgandGitee b2b08769b0 update README.md. 2021-07-04 09:19:15 +00:00
mkgandGitee aae15fd07a !8 v2新分支
Merge pull request !8 from zhengxinonly/mini
2021-07-03 00:18:38 +00:00
zhengxinonly 945f746d97 修改说明文档 2021-07-03 01:43:56 +08:00
zhengxinonly dce7908041 调整目录结构 2021-07-02 04:39:57 +08:00
zhengxinonly 0ba2b3aa56 修改说明文档 2021-06-29 04:04:42 +08:00
zhengxinonly 17792ccacf flask-restful依赖替换完成 2021-06-28 01:56:05 +08:00
zhengxinonly e3dd5458ad 使用flask-restful实现数据校验与序列化3 2021-06-27 19:27:08 +08:00
zhengxinonly e9bd8a17a0 使用flask-restful实现数据校验与序列化2 2021-06-27 15:33:13 +08:00
zhengxinonly b8870d4c33 使用flask-restful实现数据校验与序列化 2021-06-26 03:17:29 +08:00
zhengxinonly 8fba71c464 调整魔目录结构 2021-06-24 02:42:34 +08:00
zhengxinonly 0cb74c5eb7 修改目录结构2 2021-06-23 23:56:04 +08:00
zhengxinonly 6da6768f81 修改目录结构 2021-06-22 23:42:25 +08:00
zhengxinonly 05dff28523 继续è°workflowï:调整目录结构 2021-06-22 03:18:44 +08:00
zhengxinonly d7c7237cd4 将数据操作全部改为迁移脚本 2021-06-14 02:10:29 +08:00
1197 changed files with 69011 additions and 39455 deletions
+3
View File
@@ -0,0 +1,3 @@
FLASK_ENV=development
FLASK_RUN_HOST=0.0.0.0
FLASK_APP='applications:create_app'
+7 -1
View File
@@ -115,4 +115,10 @@ dmypy.json
.pyre/
#ide
.idea/
.idea/
# 数据库文件
*.db
#上传到本地的图片文件
*upload/
migrations/
+73 -76
View File
@@ -29,111 +29,108 @@
<img width="92%" style="border-radius:10px;margin-top:20px;margin-bottom:20px;box-shadow: 2px 0 6px gray;" src="https://images.gitee.com/uploads/images/2020/1019/104805_042b888c_4835367.png" />
</div>
#### 项目简介
>Pear Admin Flask 基于 Flask 的后台管理系统,拥抱应用广泛的python语言,通过使用本系统,即可快速构建你的功能业务
>
>项目旨在为python开发者提供一个后台管理系统的模板,成为您构建信息管理系统,物联网后台....等等应用时灵活,简单的工具
>
>各位Python爱好者多多指教
## 项目简介
Pear Admin Flask 基于 Flask 生态的后台管理系统,该项目旨在为 python 开发者提供一个快速开发前后端半分离的后台管理系统的模板
Pear Admin Flask 分为 Common / Simple 两个版本:
在使用本项目之前最好掌握以下知识点
[** Common 通用版本 **](https://gitee.com/pear-admin/pear-admin-flask/tree/master/)
+ [html、css、JavaScript](https://developer.mozilla.org/zh-CN/docs/Learn/HTML)
+ [jQuery](https://www.w3school.com.cn/jquery/index.asp)
+ [layui](https://www.layui.com/)
+ [flask](https://dormousehole.readthedocs.io/en/latest/)
+ [flask-login](https://flask-login.readthedocs.io/en/latest/)
+ [flask-sqlalchemy](http://www.pythondoc.com/flask-sqlalchemy/quickstart.html)
[** Simple 简洁版本 **](https://gitee.com/pear-admin/pear-admin-flask/tree/simple/)
#### 内置功能
## 预览
Pear Admin Flask 有以下几个版本:
[master分支版本 ](https://gitee.com/pear-admin/pear-admin-flask/tree/master/)
>flask 2.x + flask-sqlalchemy + 权限验证 + Flask-APScheduler 定时任务 + marshmallow 序列化与数据验证
[Mini 分支版本 ](https://gitee.com/pear-admin/pear-admin-flask/tree/mini/)
>flask 2.x + flask-sqlalchemy + 基于角色的权限管理
| | |
|---------------------|---------------------|
| ![](docs/assets/1.jpg) | ![](docs/assets/2.jpg) |
| ![](docs/assets/3.jpg)| ![](docs/assets/4.jpg) |
| ![](docs/assets/5.jpg) | ![](docs/assets/6.jpg) |
## 内置功能
- [x] 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
- [x] 权限管理:配置系统菜单,操作权限,按钮权限标识等。
- [x] 角色管理:角色菜单权限分配。
- [x] 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
- [x] 登录日志:系统登录日志记录查询包含登录异常。
- [x] 服务监控:监视当前系统CPU、内存、磁盘、python版本,运行时长等相关信息。
- [x] 文件上传: 图片上传示例
- [ ] 代码生成: 构想中....
#### 项目结构
```
Pear Admin Flask
├─applications # 应用
│ ├─configs # 配置文件
│ │ ├─ common.py # 普通配置
│ │ └─ config.py # 配置文件对象
│ ├─extensions # 注册插件
│ ├─models # 数据模型
│ ├─static # 静态资源文件
│ ├─templates # 静态模板文件
│ └─views # 视图部分
│ ├─admin # 后台管理视图模块
│ └─index # 前台视图模块
├─docs # 文档说明(占坑)
├─migrations # 迁移文件记录
├─requirement # 依赖文件
├─test # 测试文件夹(占坑)
└─.env # 项目的配置文件
```
- [x] 文件上传: 图片上传示例
## 文档
正在编写
#### 项目安装
## 安装使用
+ 下载源码
```bash
# 下 载
git clone https://gitee.com/pear-admin/pear-admin-flask
# 安 装
pip install -r requirement\requirement-dev.txt
# 配 置
.env
# 切换分支
git checkout mini
```
#### 修改配置
```python
# 主 机
HOST = '127.0.0.1'
# 端 口
PORT = '3306'
# 数 据 库
DATABASE = 'PearAdminFlask'
# 账 户
USERNAME = 'root'
# 密 码
PASSWORD = 'root'
```
#### Venv 安装
+ 安装依赖
```bash
# 创建虚拟环境
python -m venv venv
# 然后使虚拟环境生效(windows)
venv\Scripts\activate
# source venv/bin/activate # Linux激活虚拟环境)
# 安装依赖
pip install -r requirement.txt
```
#### 运行项目
+ 数据迁移
默认的使用 `sqlite3` 作为测试环境的数据库进行演示,不需要按照mysql即可查看演示。如果需要二次开发,建议改成 `mysql`
如果需要在开发环境使用 mysql 作为数据库,请查看 `applications/configs/config.py` 文件里面的相关配置文件, 注释掉 sqlite 的配置即可
如果需要修改数据的配置信息,请在 `.flaskenv` 里面调整即可
```bash
# 初 始 化 数 据 库
python test\init_databases.py
flask db init
flask db migrate -m '数据初始化'
flask db upgrade
flask init-db
```
执行 flask run 命令启动项目
+ 项目启动
```bash
flask run
```
#### 预览项目
## Git 贡献提交规范
| | |
|---------------------|---------------------|
| ![](docs/assets/1.jpg) | ![](docs/assets/2.jpg) |
| ![](docs/assets/3.jpg)| ![](docs/assets/4.jpg) |
| ![](docs/assets/5.jpg) | ![](docs/assets/6.jpg) |
- 参考 [vue](https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION.md) 规范 ([Angular](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular))
- `feat` 增加新功能
- `fix` 修复问题/BUG
- `style` 代码风格相关无影响运行结果的
- `perf` 优化/性能提升
- `refactor` 重构
- `revert` 撤销修改
- `test` 测试相关
- `docs` 文档/注释
- `chore` 依赖更新/脚手架配置修改等
- `workflow` 工作流改进
- `ci` 持续集成
- `types` 类型定义文件更改
- `wip` 开发中
-6
View File
@@ -1,6 +0,0 @@
from applications import create_app
app = create_app()
if __name__ == '__main__':
app.run()
+28 -14
View File
@@ -1,35 +1,49 @@
import os
from flask import Flask
from flask_uploads import configure_uploads
from flask import Flask, Blueprint
from applications.common.utils.upload import photos
from applications.configs import common
from applications.extensions import init_plugs
import config
from applications.view import init_view
from applications.configs import config
from common import register_api
from common.flask_uploads import configure_uploads
from common.utils.upload import photos
from extensions import init_plugs
api_bp: Blueprint = Blueprint('api', __name__, url_prefix='/api/v1')
from .rights import register_rights_api
from .system import register_sys_api
from .users import register_users_api
register_rights_api(api_bp)
register_users_api(api_bp)
register_sys_api(api_bp)
def create_app(config_name=None):
app = Flask(__name__)
def init_api(app: Flask) -> None:
app.register_blueprint(api_bp)
if not config_name:
# 尝试从本地环境中读取
config_name = os.getenv('FLASK_CONFIG', 'development')
def create_app() -> Flask:
app = Flask('pear-admin-flask')
# 引入数据库配置
app.config.from_object(common)
app.config.from_object(config[config_name])
app.config.from_object(config)
# 注册各种插件
init_plugs(app)
# 注册路由
init_view(app)
# 注册接口(restful api
init_api(app)
# 文件上传
configure_uploads(app, photos)
logo()
if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
logo()
return app
View File
-87
View File
@@ -1,87 +0,0 @@
from applications.common.utils.validate import xss_escape
from applications.extensions import db
from applications.models import Dept, DeptSchema
from applications.models import User
from applications.common.curd import model_to_dicts
def get_dept_dict():
dept = Dept.query.order_by(Dept.sort).all()
res = model_to_dicts(Schema=DeptSchema, model=dept)
return res
def save_dept(req):
address = xss_escape(req.get("address"))
deptName = xss_escape(req.get("deptName"))
email = xss_escape(req.get("email"))
leader = xss_escape(req.get("leader"))
parentId = xss_escape(req.get("parentId"))
phone = xss_escape(req.get("phone"))
sort = xss_escape(req.get("sort"))
status = xss_escape(req.get("status"))
dept = Dept(
parent_id=parentId,
dept_name=deptName,
sort=sort,
leader=leader,
phone=phone,
email=email,
status=status,
address=address
)
r = db.session.add(dept)
db.session.commit()
return r
def get_dept_by_id(id):
d = Dept.query.filter_by(id=id).first()
return d
# 启动权限
def enable_status(id):
enable = 1
d = Dept.query.filter_by(id=id).update({"status": enable})
if d:
db.session.commit()
return True
return False
# 停用权限
def disable_status(id):
enable = 0
d = Dept.query.filter_by(id=id).update({"status": enable})
if d:
db.session.commit()
return True
return False
def update_dept(json):
id = json.get("deptId"),
data = {
"dept_name": xss_escape(json.get("deptName")),
"sort": xss_escape(json.get("sort")),
"leader": xss_escape(json.get("leader")),
"phone": xss_escape(json.get("phone")),
"email": xss_escape(json.get("email")),
"status": xss_escape(json.get("status")),
"address": xss_escape(json.get("address"))
}
d = Dept.query.filter_by(id=id).update(data)
if not d:
return False
db.session.commit()
return True
def remove_dept(id):
d = Dept.query.filter_by(id=id).delete()
if not d:
return False
User.query.filter_by(dept_id=id).update({"dept_id": None})
db.session.commit()
return True
-145
View File
@@ -1,145 +0,0 @@
from applications.common.utils.validate import xss_escape
from applications.extensions import db
from applications.models import DictType, DictData, DictTypeSchema, DictDataSchema
from applications.common.curd import model_to_dicts
def get_dict(typecode: str):
dict_list = []
if DictType.query.filter_by(type_code=typecode, enable=1).first():
dicts = DictData.query.filter_by(type_code=typecode, enable=1).all()
for d in dicts:
dict_dict = {"key": d.data_label, "value": d.data_value}
dict_list.append(dict_dict)
else:
return None
return dict_list
def get_dict_type(page, limit, type_name):
dict_all = DictType.query
if type_name:
dict_all = dict_all.filter(DictType.type_name.like('%' + type_name + '%'))
dict_all = dict_all.paginate(page=page,
per_page=limit,
error_out=False)
count = DictType.query.count()
data = model_to_dicts(Schema=DictTypeSchema, model=dict_all.items)
return data, count
def get_dict_data(page, limit, type_code):
dict_all = DictData.query.filter_by(type_code=type_code).paginate(page=page,
per_page=limit,
error_out=False)
count = DictType.query.count()
dict_dict = model_to_dicts(Schema=DictDataSchema, model=dict_all.items)
return dict_dict, count
# 增加 dict type
def save_dict_type(req_json):
description = xss_escape(req_json.get("description"))
enable = xss_escape(req_json.get("enable"))
type_code = xss_escape(req_json.get("typeCode"))
type_name = xss_escape(req_json.get("typeName"))
d = DictType(type_name=type_name, type_code=type_code, enable=enable, description=description)
db.session.add(d)
db.session.commit()
return d.id
# 编辑字典类型
def update_dict_type(req_json):
id = xss_escape(req_json.get("id"))
description = xss_escape(req_json.get("description"))
enable = xss_escape(req_json.get("enable"))
type_code = xss_escape(req_json.get("typeCode"))
type_name = xss_escape(req_json.get("typeName"))
DictType.query.filter_by(id=id).update({
"description": description,
"enable": enable,
"type_code": type_code,
"type_name": type_name
})
db.session.commit()
return
def enable_dict_type_status(id):
enable = 1
res = DictType.query.filter_by(id=id).update({"enable": enable})
if res:
db.session.commit()
return True
return False
def disable_dict_type_status(id):
enable = 0
res = DictType.query.filter_by(id=id).update({"enable": enable})
if res:
db.session.commit()
return True
return False
# 删除字典类型
def delete_type_by_id(id):
type_code = DictType.query.filter_by(id=id).first().type_code
DictData.query.filter_by(type_code=type_code).delete()
res = DictType.query.filter_by(id=id).delete()
db.session.commit()
return res
# 增加dictdata
def save_dict_data(req_json):
data_label = xss_escape(req_json.get("dataLabel"))
data_value = xss_escape(req_json.get("dataValue"))
enable = xss_escape(req_json.get("enable"))
remark = xss_escape(req_json.get("remark"))
type_code = xss_escape(req_json.get("typeCode"))
d = DictData(data_label=data_label, data_value=data_value, enable=enable, remark=remark, type_code=type_code)
db.session.add(d)
db.session.commit()
return d.id
# 编辑字典数据
def update_dict_data(req_json):
id = req_json.get("dataId")
DictData.query.filter_by(id=id).update({
"data_label": xss_escape(req_json.get("dataLabel")),
"data_value": xss_escape(req_json.get("dataValue")),
"enable": xss_escape(req_json.get("enable")),
"remark": xss_escape(req_json.get("remark")),
"type_code": xss_escape(req_json.get("typeCode"))
})
db.session.commit()
return
def enable_dict_data_status(id):
enable = 1
res = DictData.query.filter_by(id=id).update({"enable": enable})
if res:
db.session.commit()
return True
return False
def disable_dict_data_status(id):
enable = 0
res = DictData.query.filter_by(id=id).update({"enable": enable})
if res:
db.session.commit()
return True
return False
# 删除dictdata
def delete_data_by_id(id):
res = DictData.query.filter_by(id=id).delete()
db.session.commit()
return res
-36
View File
@@ -1,36 +0,0 @@
import os
from flask import current_app
from sqlalchemy import desc
from applications.common.utils.upload import photos
from applications.extensions import db
from applications.models import Photo, PhotoSchema
from applications.common.curd import model_to_dicts
def get_photo(page, limit):
photo = Photo.query.order_by(desc(Photo.create_time)).paginate(page=page, per_page=limit, error_out=False)
count = Photo.query.count()
data = model_to_dicts(Schema=PhotoSchema, model=photo.items)
return data, count
def upload_one(photo, mime):
filename = photos.save(photo)
file_url = photos.url(filename)
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
size = os.path.getsize(upload_url + '/' + filename)
photo = Photo(name=filename, href=file_url, mime=mime, size=size)
db.session.add(photo)
db.session.commit()
return file_url
def delete_photo_by_id(_id):
photo_name = Photo.query.filter_by(id=_id).first().name
photo = Photo.query.filter_by(id=_id).delete()
db.session.commit()
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
os.remove(upload_url + '/' + photo_name)
return photo
-152
View File
@@ -1,152 +0,0 @@
from io import BytesIO
from flask import session, make_response, current_app
from flask_login import current_user
from applications.common.utils.gen_captcha import gen_captcha
from applications.models.admin_power import PowerSchema
# 授权路由存入session
def add_auth_session():
role = current_user.role
user_power = []
for i in role:
if i.enable == 0:
continue
for p in i.power:
if p.enable == 0:
continue
user_power.append(p.code)
session['permissions'] = user_power
# 生成菜单树
def make_menu_tree():
# power0 = Power.query.filter(
# Power.type == 0,
# ).all()
# power1 = Power.query.filter(
# Power.type == 1
# ).all()
# 获取当前用户的角色
role = current_user.role
power0 = []
power1 = []
for i in role:
# 如果角色没有被启用就直接跳过
if i.enable == 0:
continue
# 变量角色用户的权限
for p in i.power:
# 如果权限关闭了就直接跳过
if p.enable == 0:
continue
# 一级菜单
if int(p.type) == 0:
power0.append(p)
# 二级菜单
else:
power1.append(p)
power_schema = PowerSchema(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类
power0_dict = power_schema.dump(power0) # 生成可序列化对象
power1_dict = power_schema.dump(power1) # 生成可序列化对象
power0_dict = sorted(power0_dict, key=lambda i: i['sort'])
power1_dict = sorted(power1_dict, key=lambda i: i['sort'])
# print(power0)
# print(power1)
menu = []
for p0 in power0_dict:
for p1 in power1_dict:
if p0.get('id') == p1.get('parent_id'):
if p0.get("children") is None:
p0['children'] = []
p0['children'].append(p1)
menu.append(p0)
return menu
# 生成验证码
def get_captcha():
code, image = gen_captcha()
out = BytesIO()
session["code"] = code
image.save(out, 'png')
out.seek(0)
resp = make_response(out.read())
resp.content_type = 'image/png'
return resp, code
def get_render_config():
# 网站配置
config = dict(logo={
# 网站名称
"title": current_app.config.get("SYSTEM_NAME"),
# 网站图标
"image": "/static/admin/admin/images/logo.png"
# 菜单配置
}, menu={
# 菜单数据来源
"data": "/rights/menu",
"collaspe": True,
# 是否同时只打开一个菜单目录
"accordion": True,
"method": "GET",
# 是否开启多系统菜单模式
"control": False,
# 默认选中的菜单项
"select": "0",
# 是否开启异步菜单,false 时 data 属性设置为菜单数据,false 时为 json 文件或后端接口
"async": True
}, tab={
# 是否开启多选项卡
"muiltTab": True,
# 切换选项卡时,是否刷新页面状态
"keepState": True,
# 是否开启 Tab 记忆
"session": True,
# 最大可打开的选项卡数量
"tabMax": 30,
"index": {
# 标识 ID , 建议与菜单项中的 ID 一致
"id": "10",
# 页面地址
"href": "/admin/welcome",
# 标题
"title": "首页"
}
}, theme={
# 默认主题色,对应 colors 配置中的 ID 标识
"defaultColor": "2",
# 默认的菜单主题 dark-theme 黑 / light-theme 白
"defaultMenu": "dark-theme",
# 是否允许用户切换主题,false 时关闭自定义主题面板
"allowCustom": True
}, colors=[{
"id": "1",
"color": "#2d8cf0"
},
{
"id": "2",
"color": "#5FB878"
},
{
"id": "3",
"color": "#1E9FFF"
}, {
"id": "4",
"color": "#FFB800"
}, {
"id": "5",
"color": "darkgray"
}
], links=current_app.config.get("SYSTEM_PANEL_LINKS"), other={
# 主页动画时长
"keepLoad": 1200,
# 布局顶部主题
"autoHead": False
}, header=False)
return config
-112
View File
@@ -1,112 +0,0 @@
from applications.common.utils.validate import xss_escape
from applications.extensions import db
from applications.models.admin_power import Power, PowerSchema2
from applications.models import Role
from applications.common.curd import model_to_dicts
def get_power_dict():
power = Power.query.all()
res = model_to_dicts(Schema=PowerSchema2, model=power)
return res
# 选择父节点
def select_parent():
power = Power.query.all()
res = model_to_dicts(Schema=PowerSchema2, model=power)
res.append({"powerId": 0, "powerName": "顶级权限", "parentId": -1})
return res
# 增加权限
def save_power(req):
icon = xss_escape(req.get("icon"))
openType = xss_escape(req.get("openType"))
parentId = xss_escape(req.get("parentId"))
powerCode = xss_escape(req.get("powerCode"))
powerName = xss_escape(req.get("powerName"))
powerType = xss_escape(req.get("powerType"))
powerUrl = xss_escape(req.get("powerUrl"))
sort = xss_escape(req.get("sort"))
power = Power(
icon=icon,
open_type=openType,
parent_id=parentId,
code=powerCode,
name=powerName,
type=powerType,
url=powerUrl,
sort=sort,
enable=1
)
r = db.session.add(power)
db.session.commit()
return r
# 根据id查询权限
def get_power_by_id(id):
p = Power.query.filter_by(id=id).first()
return p
# 更新权限
def update_power(req_json):
id = req_json.get("powerId")
data = {
"icon": xss_escape(req_json.get("icon")),
"open_type": xss_escape(req_json.get("openType")),
"parent_id": xss_escape(req_json.get("parentId")),
"code": xss_escape(req_json.get("powerCode")),
"name": xss_escape(req_json.get("powerName")),
"type": xss_escape(req_json.get("powerType")),
"url": xss_escape(req_json.get("powerUrl")),
"sort": xss_escape(req_json.get("sort"))
}
# print(data)
power = Power.query.filter_by(id=id).update(data)
db.session.commit()
# print(power)
return power
# 启动权限
def enable_status(id):
enable = 1
user = Power.query.filter_by(id=id).update({"enable": enable})
if user:
db.session.commit()
return True
return False
# 停用权限
def disable_status(id):
enable = 0
user = Power.query.filter_by(id=id).update({"enable": enable})
if user:
db.session.commit()
return True
return False
# 删除权限(目前没有判断父节点自动删除子节点)
def remove_power(id):
power = Power.query.filter_by(id=id).first()
role_id_list = []
roles = power.role
for role in roles:
role_id_list.append(role.id)
roles = Role.query.filter(Role.id.in_(role_id_list)).all()
for p in roles:
power.role.remove(p)
r = Power.query.filter_by(id=id).delete()
db.session.commit()
return r
# 批量删除权限
def batch_remove(ids):
for id in ids:
remove_power(id)
-149
View File
@@ -1,149 +0,0 @@
from sqlalchemy import and_
from applications.common.utils.validate import xss_escape
from applications.extensions import db
from applications.models import Role, RoleSchema
from applications.models.admin_power import Power, PowerSchema2
from applications.models import User
# 获取角色对象
from applications.common.curd import model_to_dicts
def get_role_data(page, limit, filters):
role = Role.query.filter(and_(*[getattr(Role, k).like(v) for k, v in filters.items()])).paginate(page=page,
per_page=limit,
error_out=False)
count = Role.query.count()
return role, count
# 获取角色dict
def get_role_data_dict(page, limit, filters):
role, count = get_role_data(page, limit, filters)
data = model_to_dicts(Schema=RoleSchema, model=role.items)
return data, count
# 增加角色
def add_role(req):
details = xss_escape(req.get("details"))
enable = xss_escape(req.get("enable"))
roleCode = xss_escape(req.get("roleCode"))
roleName = xss_escape(req.get("roleName"))
sort = xss_escape(req.get("sort"))
role = Role(
details=details,
enable=enable,
code=roleCode,
name=roleName,
sort=sort
)
db.session.add(role)
db.session.commit()
# 通过id获取角色
def get_role_by_id(id):
r = Role.query.filter_by(id=id).first()
return r
# 更新角色
def update_role(req_json):
id = req_json.get("roleId")
data = {
"code": xss_escape(req_json.get("roleCode")),
"name": xss_escape(req_json.get("roleName")),
"sort": xss_escape(req_json.get("sort")),
"enable": xss_escape(req_json.get("enable")),
"details": xss_escape(req_json.get("details"))
}
role = Role.query.filter_by(id=id).update(data)
db.session.commit()
return role
# 获取角色的权限
def get_role_power(id):
role = Role.query.filter_by(id=id).first()
check_powers = role.power
check_powers_list = []
for cp in check_powers:
check_powers_list.append(cp.id)
powers = Power.query.all()
power_schema = PowerSchema2(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类
output = power_schema.dump(powers) # 生成可序列化对象
for i in output:
if int(i.get("powerId")) in check_powers_list:
i["checkArr"] = "1"
else:
i["checkArr"] = "0"
return output
# 更新角色权限
def update_role_power(id, power_list):
role = Role.query.filter_by(id=id).first()
power_id_list = []
for p in role.power:
power_id_list.append(p.id)
# print(p.id)
# print(power_id_list)
powers = Power.query.filter(Power.id.in_(power_id_list)).all()
for p in powers:
role.power.remove(p)
powers = Power.query.filter(Power.id.in_(power_list)).all()
for p in powers:
role.power.append(p)
db.session.commit()
# 启动角色
def enable_status(id):
enable = 1
role = Role.query.filter_by(id=id).update({"enable": enable})
if role:
db.session.commit()
return True
return False
# 停用角色
def disable_status(id):
enable = 0
role = Role.query.filter_by(id=id).update({"enable": enable})
if role:
db.session.commit()
return True
return False
# 删除角色
def remove_role(id):
role = Role.query.filter_by(id=id).first()
# 删除该角色的权限
power_id_list = []
for p in role.power:
power_id_list.append(p.id)
powers = Power.query.filter(Power.id.in_(power_id_list)).all()
for p in powers:
role.power.remove(p)
user_id_list = []
for u in role.user:
user_id_list.append(u.id)
users = User.query.filter(User.id.in_(user_id_list)).all()
for u in users:
role.user.remove(u)
r = Role.query.filter_by(id=id).delete()
db.session.commit()
return r
# 批量删除
def batch_remove(ids):
# role = Role.query.filter(Role.id.in_(ids)).delete(synchronize_session=False)
# db.session.commit()
for id in ids:
remove_role(id)
-159
View File
@@ -1,159 +0,0 @@
from flask import jsonify
from flask_login import current_user
from sqlalchemy import and_, desc
from applications.extensions import db
from applications.models import User, UserSchema
from applications.models import Role
from applications.models import AdminLog
# 获取用户的 sqlalchemy 对象分页器
from applications.common.curd import model_to_dicts
def get_user_data(page, limit, filters, deptId):
if deptId:
user = User.query.filter_by(dept_id=deptId).filter(
and_(*[getattr(User, k).like(v) for k, v in filters.items()])).paginate(page=page,
per_page=limit,
error_out=False)
else:
user = User.query.filter(and_(*[getattr(User, k).like(v) for k, v in filters.items()])).paginate(page=page,
per_page=limit,
error_out=False)
count = User.query.count()
return user, count
# 获取用户的dict数据分页器
def get_user_data_dict(page, limit, filters, deptId):
user, count = get_user_data(page, limit, filters, deptId)
data = model_to_dicts(Schema=UserSchema, model=user.items)
return data, count
# 通过名称获取用户
def get_user_by_name(username):
return User.query.filter_by(username=username).first()
# 获取当前用户日志
def get_current_user_logs():
log = AdminLog.query.filter_by(url='/admin/login').filter_by(uid=current_user.id).order_by(
desc(AdminLog.create_time)).limit(10)
return log
# 判断用户是否存在
def is_user_exists(username):
res = User.query.filter_by(username=username).count()
return bool(res)
# 增加用户
def add_user(username, realName, password):
user = User(username=username, realname=realName)
user.set_password(password)
db.session.add(user)
db.session.commit()
return user.id
# 增加用户角色
def add_user_role(id, roles_list):
user = User.query.filter_by(id=id).first()
roles = Role.query.filter(Role.id.in_(roles_list)).all()
for r in roles:
user.role.append(r)
db.session.commit()
# 更新用户头像
def update_avatar(url):
r = User.query.filter_by(id=current_user.id).update({"avatar": url})
db.session.commit()
return r
# 更新用户信息
def update_user(id, username, realname, deptId):
user = User.query.filter_by(id=id).update({'username': username, 'realname': realname, 'dept_id': deptId})
db.session.commit()
return user
# 更新当前用户信息
def update_current_user_info(req_json):
r = User.query.filter_by(id=current_user.id).update(
{"realname": req_json.get("realName"), "remark": req_json.get("details")})
db.session.commit()
return r
# 修改当前用户密码
def edit_password(res_json):
if res_json.get("newPassword") == '':
return jsonify(success=False, msg="新密码不得为空")
if res_json.get("newPassword") != res_json.get("confirmPassword"):
return jsonify(success=False, msg="俩次密码不一样")
user = current_user
is_right = user.validate_password(res_json.get("oldPassword"))
if not is_right:
return jsonify(success=False, msg="旧密码错误")
user.set_password(res_json.get("newPassword"))
db.session.add(user)
db.session.commit()
return jsonify(success=True, msg="更改成功")
# 删除用户
def delete_by_id(id):
user = User.query.filter_by(id=id).first()
roles_id = []
for role in user.role:
roles_id.append(role.id)
roles = Role.query.filter(Role.id.in_(roles_id)).all()
for r in roles:
user.role.remove(r)
res = User.query.filter_by(id=id).delete()
db.session.commit()
return res
# 启用用户
def enable_status(id):
enable = 1
user = User.query.filter_by(id=id).update({"enable": enable})
if user:
db.session.commit()
return True
return False
# 停用用户
def disable_status(id):
enable = 0
user = User.query.filter_by(id=id).update({"enable": enable})
if user:
db.session.commit()
return True
return False
# 批量删除
def batch_remove(ids):
for id in ids:
delete_by_id(id)
def update_user_role(id, roles_list):
user = User.query.filter_by(id=id).first()
roles_id = []
for role in user.role:
roles_id.append(role.id)
roles = Role.query.filter(Role.id.in_(roles_id)).all()
for r in roles:
user.role.remove(r)
roles = Role.query.filter(Role.id.in_(roles_list)).all()
for r in roles:
user.role.append(r)
db.session.commit()
-56
View File
@@ -1,56 +0,0 @@
from flask_login import current_user
from applications.extensions import db
from applications.models import AdminLog
def login_log(request, uid, is_access):
info = {
'method': request.method,
'url': request.path,
'ip': request.remote_addr,
'user_agent': request.headers.get('User-Agent'),
'desc': request.form.get('username'),
'uid': uid,
'success': int(is_access)
}
log = AdminLog(
url=info.get('url'),
ip=info.get('ip'),
user_agent=info.get('user_agent'),
desc=info.get('desc'),
uid=info.get('uid'),
method=info.get('method'),
success=info.get('success')
)
db.session.add(log)
db.session.flush()
db.session.commit()
return log.id
def admin_log(request, is_access):
info = {
'method': request.method,
'url': request.path,
'ip': request.remote_addr,
'user_agent': request.headers.get('User-Agent'),
'desc': str(dict(request.values)),
'uid': current_user.id,
'success': int(is_access)
}
log = AdminLog(
url=info.get('url'),
ip=info.get('ip'),
user_agent=info.get('user_agent'),
desc=info.get('desc'),
uid=info.get('uid'),
method=info.get('method'),
success=info.get('success')
)
db.session.add(log)
db.session.commit()
return log.id
-5
View File
@@ -1,5 +0,0 @@
def model_to_dicts(Schema, model):
# 如果是分页器返回,需要传入model.items
common_schema = Schema(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类
output = common_schema.dump(model) # 生成可序列化对象
return output
-17
View File
@@ -1,17 +0,0 @@
#
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = '3306'
MYSQL_DATABASE = 'PearAdminFlask'
MYSQL_USERNAME = 'root'
MYSQL_PASSWORD = 'root'
MYSQL_DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,
password=PASSWORD,
host=HOST,
port=PORT,
db=DATABASE)
SQLALCHEMY_DATABASE_URI = MYSQL_DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_ECHO = False
SQLALCHEMY_POOL_RECYCLE = 8
-14
View File
@@ -1,14 +0,0 @@
from captcha.image import ImageCaptcha
from PIL import Image
from random import choices
def gen_captcha(content='0123456789'):
""" 生成验证码 """
image = ImageCaptcha()
# 获取字符串
captcha_text = "".join(choices(content, k=4))
# 生成图像
captcha_image = Image.open(image.generate(captcha_text))
return captcha_text, captcha_image
-24
View File
@@ -1,24 +0,0 @@
from flask import jsonify
def success_api(msg: str = "成功"):
""" 成功响应 默认值”成功“ """
return jsonify(success=True, msg=msg)
def fail_api(msg: str = "失败"):
""" 失败响应 默认值“失败” """
return jsonify(success=False, msg=msg)
def table_api(msg: str = "", count=0, data=None, limit=10):
""" 动态表格渲染响应 """
res = {
'msg': msg,
'code': 0,
'data': data,
'count': count,
'limit': limit
}
return jsonify(res)
-25
View File
@@ -1,25 +0,0 @@
from functools import wraps
from flask import abort, request, jsonify, session
from flask_login import login_required
from applications.common.admin_log import admin_log
def authorize(power: str, log: bool = False):
def decorator(func):
@login_required
@wraps(func)
def wrapper(*args, **kwargs):
if not power in session.get('permissions'):
if log:
admin_log(request=request, is_access=False)
if request.method == 'GET':
abort(403)
else:
return jsonify(success=False, msg="权限不足!")
if log:
admin_log(request=request, is_access=True)
return func(*args, **kwargs)
return wrapper
return decorator
-4
View File
@@ -1,4 +0,0 @@
from flask_uploads import UploadSet, IMAGES
photos = UploadSet('photos', IMAGES)
-20
View File
@@ -1,20 +0,0 @@
# xss过滤
from flask import abort, make_response, jsonify
def xss_escape(s: str):
if s is None:
return None
else:
return s.replace("&", "&amp;").replace(">", "&gt;").replace("<", "&lt;").replace("'", "&#39;").replace('"',
"&#34;")
def check_data(schema, data):
errors = schema.validate(data)
for k, v in errors.items():
for i in v:
# print("{}{}".format(k, i))
msg = "{}{}".format(k, i)
if errors:
abort(make_response(jsonify(result=False, msg=msg), 200))
-1
View File
@@ -1 +0,0 @@
from .config import config
-24
View File
@@ -1,24 +0,0 @@
SYSTEM_NAME = "Pear Admin"
# 主题面板的链接列表配置
SYSTEM_PANEL_LINKS = [
{
"icon": "layui-icon layui-icon-auz",
"title": "官方网站",
"href": "http://www.pearadmin.com"
},
{
"icon": "layui-icon layui-icon-auz",
"title": "开发文档",
"href": "http://www.pearadmin.com"
},
{
"icon": "layui-icon layui-icon-auz",
"title": "开源地址",
"href": "https://gitee.com/Jmysy/Pear-Admin-Layui"
}
]
UPLOADED_PHOTOS_DEST = 'static/upload'
UPLOADED_FILES_ALLOW = ['gif', 'jpg']
# JSON配置
JSON_AS_ASCII = False
-51
View File
@@ -1,51 +0,0 @@
import logging
import os
class BaseConfig:
SECRET_KEY = os.getenv('SECRET_KEY', 'dev key')
# redis配置
REDIS_HOST = os.getenv('REDIS_HOST') or "127.0.0.1"
REDIS_PORT = int(os.getenv('REDIS_PORT') or 6379)
# mysql 配置
MYSQL_USERNAME = os.getenv('MYSQL_USERNAME') or "root"
MYSQL_PASSWORD = os.getenv('MYSQL_PASSWORD') or "123456"
MYSQL_HOST = os.getenv('MYSQL_HOST') or "127.0.0.1"
MYSQL_PORT = int(os.getenv('MYSQL_PORT') or 3306)
MYSQL_DATABASE = os.getenv('MYSQL_DATABASE') or "PearAdminFlask"
UPLOADED_PHOTOS_DEST = '/static'
# mysql 数据库的配置信息
SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MYSQL_USERNAME}:{MYSQL_PASSWORD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}"
# 默认日志等级
LOG_LEVEL = logging.WARN
class TestingConfig(BaseConfig):
""" 测试配置 """
SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:' # 内存数据库
class DevelopmentConfig(BaseConfig):
""" 开发配置 """
SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_ECHO = False
class ProductionConfig(BaseConfig):
"""生成环境配置"""
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = False
SQLALCHEMY_POOL_RECYCLE = 8
LOG_LEVEL = logging.ERROR
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig
}
@@ -1,7 +0,0 @@
from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
def init_debug_tool(app: Flask):
toolbar = DebugToolbarExtension()
toolbar.init_app(app)
@@ -1,54 +0,0 @@
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from marshmallow import fields
from marshmallow.validate import (
URL, Email, Range, Length, Equal, Regexp,
Predicate, NoneOf, OneOf, ContainsOnly
)
URL.default_message = '无效的链接'
Email.default_message = '无效的邮箱地址'
Range.message_min = '不能小于{min}'
Range.message_max = '不能小于{max}'
Range.message_all = '不能超过{min}{max}这个范围'
Length.message_min = '长度不得小于{min}'
Length.message_max = '长度不得大于{max}'
Length.message_all = '长度不能超过{min}{max}这个范围'
Length.message_equal = '长度必须等于{equal}'
Equal.default_message = '必须等于{other}'
Regexp.default_message = '非法输入'
Predicate.default_message = '非法输入'
NoneOf.default_message = '非法输入'
OneOf.default_message = '无效的选择'
ContainsOnly.default_message = '一个或多个无效的选择'
fields.Field.default_error_messages = {
"required": "缺少必要数据",
"null": "数据不能为空",
"validator_failed": "非法数据",
}
fields.Str.default_error_messages = {
'invalid': "不是合法文本"
}
fields.Int.default_error_messages = {
"invalid": "不是合法整数"
}
fields.Number.default_error_messages = {
"invalid": "不是合法数字"
}
fields.Boolean.default_error_messages = {
"invalid": "不是合法布尔值"
}
db = SQLAlchemy()
ma = Marshmallow()
def init_databases(app: Flask):
db.init_app(app)
ma.init_app(app)
-9
View File
@@ -1,9 +0,0 @@
from .admin_dept import Dept, DeptSchema
from .admin_dict import DictType, DictData, DictTypeSchema, DictDataSchema
from .admin_log import AdminLog, LogSchema
from .admin_photo import Photo, PhotoSchema
from .admin_power import Power, PowerSchema, PowerSchema2
from .admin_role import Role, RoleSchema
from .admin_role_power import role_power
from .admin_user import User, UserSchema
from .admin_user_role import user_role
-31
View File
@@ -1,31 +0,0 @@
import datetime
from applications.extensions import db, ma
from marshmallow import fields, validate
class Dept(db.Model):
__tablename__ = 'admin_dept'
id = db.Column(db.Integer, primary_key=True, comment="部门ID")
parent_id = db.Column(db.Integer, comment="父级编号")
dept_name = db.Column(db.String(50), comment="部门名称")
sort = db.Column(db.Integer, comment="排序")
leader = db.Column(db.String(50), comment="负责人")
phone = db.Column(db.String(20), comment="联系方式")
email = db.Column(db.String(50), comment="邮箱")
status = db.Column(db.Integer, comment='状态(1开启,0关闭)')
remark = db.Column(db.Text, comment="备注")
address = db.Column(db.String(255), comment="详细地址")
create_at = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
update_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='创建时间')
class DeptSchema(ma.Schema): # 序列化类
deptId = fields.Integer(attribute="id")
parentId = fields.Integer(attribute="parent_id")
deptName = fields.Str(attribute="dept_name")
leader = fields.Str()
phone = fields.Str()
email = fields.Str(validate=validate.Email())
address = fields.Str()
status = fields.Str(validate=validate.OneOf(["0", "1"]))
sort = fields.Integer()
-47
View File
@@ -1,47 +0,0 @@
import datetime
from applications.extensions import db, ma
from marshmallow import fields
class DictType(db.Model):
__tablename__ = 'admin_dict_type'
id = db.Column(db.Integer, primary_key=True)
type_name = db.Column(db.String(255), comment='字典类型名称')
type_code = db.Column(db.String(255), comment='字典类型标识')
description = db.Column(db.String(255), comment='字典类型描述')
enable = db.Column(db.Integer, comment='是否开启')
create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间')
class DictData(db.Model):
__tablename__ = 'admin_dict_data'
id = db.Column(db.Integer, primary_key=True)
data_label = db.Column(db.String(255), comment='字典类型名称')
data_value = db.Column(db.String(255), comment='字典类型标识')
type_code = db.Column(db.String(255), comment='字典类型描述')
is_default = db.Column(db.Integer, comment='是否默认')
enable = db.Column(db.Integer, comment='是否开启')
remark = db.Column(db.String(255), comment='备注')
create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间')
class DictTypeSchema(ma.Schema): # 序列化类
id = fields.Str(attribute="id")
typeName = fields.Str(attribute="type_name")
typeCode = fields.Str(attribute="type_code")
description = fields.Str(attribute="description")
createTime = fields.Str(attribute="create_time")
updateName = fields.Str(attribute="update_time")
remark = fields.Str()
enable = fields.Str()
class DictDataSchema(ma.Schema): # 序列化类
dataId = fields.Str(attribute="id")
dataLabel = fields.Str(attribute="data_label")
dataValue = fields.Str(attribute="data_value")
remark = fields.Str()
enable = fields.Str()
-28
View File
@@ -1,28 +0,0 @@
import datetime
from applications.extensions import db, ma
from marshmallow import fields
class AdminLog(db.Model):
__tablename__ = 'admin_admin_log'
id = db.Column(db.Integer, primary_key=True)
method = db.Column(db.String(10))
uid = db.Column(db.Integer)
url = db.Column(db.String(255))
desc = db.Column(db.Text)
ip = db.Column(db.String(255))
success = db.Column(db.Integer)
user_agent = db.Column(db.Text)
create_time = db.Column(db.DateTime, default=datetime.datetime.now)
class LogSchema(ma.Schema): # 序列化类
id = fields.Integer()
method = fields.Str()
uid = fields.Str()
url = fields.Str()
desc = fields.Str()
ip = fields.Str()
user_agent = fields.Str()
success = fields.Bool()
create_time = fields.DateTime()
-24
View File
@@ -1,24 +0,0 @@
import datetime
from applications.extensions import db, ma
from marshmallow import fields
class Photo(db.Model):
__tablename__ = 'admin_photo'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), nullable=False)
href = db.Column(db.String(255))
mime = db.Column(db.CHAR(50), nullable=False)
size = db.Column(db.CHAR(30), nullable=False)
create_time = db.Column(db.DateTime, default=datetime.datetime.now)
class PhotoSchema(ma.Schema):
id = fields.Integer()
name = fields.Str()
href = fields.Str()
mime = fields.Str()
size = fields.Str()
ext = fields.Str()
create_time = fields.DateTime()
-49
View File
@@ -1,49 +0,0 @@
import datetime
from applications.extensions import db, ma
from marshmallow import fields
class Power(db.Model):
__tablename__ = 'admin_power'
id = db.Column(db.Integer, primary_key=True, comment='权限编号')
name = db.Column(db.String(255), comment='权限名称')
type = db.Column(db.String(1), comment='权限类型')
code = db.Column(db.String(30), comment='权限标识')
url = db.Column(db.String(255), comment='权限路径')
open_type = db.Column(db.String(10), comment='打开方式')
parent_id = db.Column(db.Integer, comment='父类编号')
icon = db.Column(db.String(128), comment='图标')
sort = db.Column(db.Integer, comment='排序')
create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间')
enable = db.Column(db.Integer, comment='是否开启')
# 权限models序列化类
class PowerSchema(ma.Schema):
id = fields.Integer()
title = fields.Str(attribute="name")
type = fields.Str()
code = fields.Str()
href = fields.Str(attribute="url")
openType = fields.Str(attribute="open_type")
parent_id = fields.Integer()
icon = fields.Str()
sort = fields.Integer()
create_time = fields.DateTime()
update_time = fields.DateTime()
enable = fields.Integer()
class PowerSchema2(ma.Schema): # 序列化类
powerId = fields.Str(attribute="id")
powerName = fields.Str(attribute="name")
powerType = fields.Str(attribute="type")
powerUrl = fields.Str(attribute="url")
openType = fields.Str(attribute="open_type")
parentId = fields.Str(attribute="parent_id")
icon = fields.Str()
sort = fields.Integer()
create_time = fields.DateTime()
update_time = fields.DateTime()
enable = fields.Integer()
-29
View File
@@ -1,29 +0,0 @@
import datetime
from applications.extensions import db, ma
from marshmallow import fields
class Role(db.Model):
__tablename__ = 'admin_role'
id = db.Column(db.Integer, primary_key=True, comment='角色ID')
name = db.Column(db.String(255), comment='角色名称')
code = db.Column(db.String(255), comment='角色标识')
enable = db.Column(db.Integer, comment='是否启用')
remark = db.Column(db.String(255), comment='备注')
details = db.Column(db.String(255), comment='详情')
sort = db.Column(db.Integer, comment='排序')
create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间')
power = db.relationship('Power', secondary="admin_role_power", backref=db.backref('role'))
class RoleSchema(ma.Schema):
id = fields.Integer()
roleName = fields.Str(attribute="name")
roleCode = fields.Str(attribute="code")
enable = fields.Str()
remark = fields.Str()
details = fields.Str()
sort = fields.Integer()
create_at = fields.DateTime()
update_at = fields.DateTime()
-9
View File
@@ -1,9 +0,0 @@
from applications.extensions import db
# 创建中间表
role_power = db.Table(
"admin_role_power", # 中间表名称
db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'), # 主键
db.Column("power_id", db.Integer, db.ForeignKey("admin_power.id"), comment='用户编号'), # 属性 外键
db.Column("role_id", db.Integer, db.ForeignKey("admin_role.id"), comment='角色编号'), # 属性 外键
)
-44
View File
@@ -1,44 +0,0 @@
import datetime
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from applications.extensions import db, ma
from marshmallow import fields
from applications.models import Dept
class User(db.Model, UserMixin):
__tablename__ = 'admin_user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='用户ID')
username = db.Column(db.String(20), comment='用户名')
realname = db.Column(db.String(20), comment='真实名字')
avatar = db.Column(db.String(255), comment='头像', default="/static/admin/admin/images/avatar.jpg")
remark = db.Column(db.String(255), comment='备注')
password_hash = db.Column(db.String(128), comment='哈希密码')
enable = db.Column(db.Integer, default=0, comment='启用')
dept_id = db.Column(db.Integer, comment='部门id')
create_at = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
update_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='创建时间')
role = db.relationship('Role', secondary="admin_user_role", backref=db.backref('user'), lazy='dynamic')
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def validate_password(self, password):
return check_password_hash(self.password_hash, password)
# 用户models的序列化类
class UserSchema(ma.Schema):
id = fields.Integer()
username = fields.Str()
realname = fields.Str()
enable = fields.Integer()
create_at = fields.DateTime()
update_at = fields.DateTime()
dept = fields.Method("get_dept")
def get_dept(self, obj):
if obj.dept_id != None:
return Dept.query.filter_by(id=obj.dept_id).first().dept_name
else:
return None
-9
View File
@@ -1,9 +0,0 @@
from applications.extensions import db
# 创建中间表
user_role = db.Table(
"admin_user_role", # 中间表名称
db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'), # 主键
db.Column("user_id", db.Integer, db.ForeignKey("admin_user.id"), comment='用户编号'), # 属性 外键
db.Column("role_id", db.Integer, db.ForeignKey("admin_role.id"), comment='角色编号'), # 属性 外键
)
+42
View File
@@ -0,0 +1,42 @@
from common import register_api
from .department import DepartmentsApi, DeptEnableAPI
from .rights import (
RightsApi, PowerApi, right_power_enable_resource,
admin_configs_resource, admin_menu_resource
)
from .roles import RoleRoleApi, RolePowerApi, role_deletes, role_enable_resource
def register_rights_api(api_bp):
register_api(DepartmentsApi, 'rights_dept_api', '/dept/department/', pk='_id', app=api_bp)
api_bp.add_url_rule('/dept/department/<int:_id>/status',
view_func=DeptEnableAPI.as_view('dept_status_api'),
methods=['PUT', ])
api_bp.add_url_rule('/rights/rights',
view_func=RightsApi.as_view('dept_rights_api'),
methods=['GET', 'DELETE'])
register_api(PowerApi, 'rights_power_api', '/rights/power/', pk='_id', app=api_bp)
api_bp.add_url_rule('/rights/configs',
endpoint='rights_config_api',
view_func=admin_configs_resource,
methods=['GET'])
api_bp.add_url_rule('/rights/menu',
endpoint='rights_menu_api',
view_func=admin_menu_resource,
methods=['GET'])
api_bp.add_url_rule('/rights/power/<int:_id>/<action>',
endpoint='rights_power_action_api',
view_func=right_power_enable_resource,
methods=['PUT'])
api_bp.add_url_rule('/roles/role',
endpoint='rights_roles_role_api',
view_func=role_deletes,
methods=['DELETE'])
register_api(RoleRoleApi, 'rights_role_api', '/roles/role/', pk='_id', app=api_bp)
register_api(RolePowerApi, 'rights_role_power_api', '/roles/role_power/', pk='_id', app=api_bp)
api_bp.add_url_rule('/roles/role/<int:_id>/status',
endpoint='rights_roles_enable_api',
view_func=role_enable_resource,
methods=['PUT'])
+112
View File
@@ -0,0 +1,112 @@
import typing as t
from flask.views import MethodView
from flask_pydantic import validate
from pydantic import BaseModel, Field
from common.utils.http import success_api, fail_api, table_api
from extensions import db
from models import DepartmentModel, UserModel
class DeptSchema(BaseModel):
address: t.Optional[str]
dept_name: t.Optional[str] = Field(alias='deptName')
email: t.Optional[str]
leader: t.Optional[str]
parent_id: t.Optional[str] = Field(alias='parentId')
phone: t.Optional[str]
sort: t.Optional[int]
status: t.Optional[int]
class DepartmentsApi(MethodView):
def get(self, _id):
if _id:
dept = DepartmentModel.query.filter_by(id=_id).first()
dept_data = {
'id': dept.id,
'dept_name': dept.dept_name,
'leader': dept.leader,
'email': dept.email,
'phone': dept.phone,
'status': dept.status,
'sort': dept.sort,
'address': dept.address,
}
return dict(success=True, message='ok', dept=dept_data)
dept_data = DepartmentModel.query.order_by(DepartmentModel.sort).all()
return table_api(
result={
'items': [
{
'deptId': item.id,
'parentId': item.parent_id,
'deptName': item.dept_name,
'sort': item.sort,
'leader': item.leader,
'phone': item.phone,
'email': item.email,
'status': item.status,
'comment': item.comment,
'address': item.address,
'create_at': item.create_at.strftime('%Y-%m-%d %H:%M:%S')
} for item in dept_data
],
'total': len(dept_data)}
, code=0)
@validate()
def post(self, body: DeptSchema):
dept = DepartmentModel(
parent_id=body.parent_id,
dept_name=body.dept_name,
sort=body.sort,
leader=body.leader,
phone=body.phone,
email=body.email,
status=body.status,
address=body.address
)
db.session.add(dept)
db.session.commit()
return success_api(message="成功")
@validate()
def put(self, _id, body: DeptSchema):
data = {
"dept_name": body.dept_name,
"sort": body.sort,
"leader": body.leader,
"phone": body.phone,
"email": body.email,
"status": body.status,
"address": body.address
}
body = DepartmentModel.query.filter_by(id=_id).update(data)
if not body:
return {'success': False, 'message': "更新失败", 'code': 404}
db.session.commit()
return {'success': True, 'message': '更新成功', 'code': 200}
def delete(self, _id):
ret = DepartmentModel.query.filter_by(id=_id).delete()
UserModel.query.filter_by(dept_id=_id).update({"dept_id": None})
db.session.commit()
if ret:
return success_api(message="删除成功")
return fail_api(message="删除失败")
class DeptEnableAPI(MethodView):
def put(self, _id):
d = DepartmentModel.query.get(_id)
if d:
d.status = not d.status
db.session.commit()
message = '修改成功'
return success_api(message=message)
return fail_api(message="出错啦")
+278
View File
@@ -0,0 +1,278 @@
import copy
from collections import OrderedDict
from typing import Optional
from flask import request, jsonify, current_app
from flask.views import MethodView
from flask_login import current_user
from flask_pydantic import validate
from pydantic import BaseModel, Field
from common.utils.http import success_api, fail_api
from extensions import db
from models import RightModel, RoleModel
def get_render_config():
# 网站配置
config = {
'logo': {
# 网站名称
"title": current_app.config.get("SYSTEM_NAME"),
# 网站图标
"image": "/static/admin/admin/images/logo.png"
# 菜单配置
},
'menu': {
# 菜单数据来源
"data": "/api/v1/rights/menu",
"collaspe": True,
# 是否同时只打开一个菜单目录
"accordion": True,
"method": "GET",
# 是否开启多系统菜单模式
"control": False,
# 默认选中的菜单项
"select": "0",
# 是否开启异步菜单,false 时 data 属性设置为菜单数据,false 时为 json 文件或后端接口
"async": True
},
'tab': {
# 是否开启多选项卡
"muiltTab": True,
# 切换选项卡时,是否刷新页面状态
"keepState": True,
# 是否开启 Tab 记忆
"session": True,
# 最大可打开的选项卡数量
"tabMax": 30,
"index": {
# 标识 ID , 建议与菜单项中的 ID 一致
"id": "10",
# 页面地址
"href": "/admin/welcome",
# 标题
"title": "首页"
}
},
'theme': {
# 默认主题色,对应 colors 配置中的 ID 标识
"defaultColor": "2",
# 默认的菜单主题 dark-theme 黑 / light-theme 白
"defaultMenu": "dark-theme",
# 是否允许用户切换主题,false 时关闭自定义主题面板
"allowCustom": True
},
'colors': [
{
"id": "1",
"color": "#2d8cf0"
},
{
"id": "2",
"color": "#5FB878"
},
{
"id": "3",
"color": "#1E9FFF"
},
{
"id": "4",
"color": "#FFB800"
},
{
"id": "5",
"color": "darkgray"
},
],
'links': current_app.config.get("SYSTEM_PANEL_LINKS"),
'other': {
# 主页动画时长
"keepLoad": 1200,
# 布局顶部主题
"autoHead": False
},
'header': False
}
return config
# 生成菜单树
def make_menu_tree():
role = current_user.role
powers = []
for i in role:
# 如果角色没有被启用就直接跳过
if i.enable == 0:
continue
# 变量角色用户的权限
for p in i.power:
# 如果权限关闭了就直接跳过
if p.enable == 0:
continue
# 一二级菜单
if p.type == 0 or p.type == 1:
powers.append(p)
power_dict = [
{
'id': item.id,
'title': item.name,
'type': item.type,
'code': item.code,
'href': item.url,
'openType': item.open_type,
'parent_id': item.parent_id,
'icon': item.icon,
'sort': item.sort,
'enable': item.enable,
} for item in powers
]
power_dict.sort(key=lambda x: x['id'], reverse=True)
menu_dict = OrderedDict()
for _dict in power_dict:
if _dict['id'] in menu_dict:
# 当前节点添加子节点
_dict['children'] = copy.deepcopy(menu_dict[_dict['id']])
_dict['children'].sort(key=lambda item: item['sort'])
# 删除子节点
del menu_dict[_dict['id']]
if _dict['parent_id'] not in menu_dict:
menu_dict[_dict['parent_id']] = [_dict]
else:
menu_dict[_dict['parent_id']].append(_dict)
return sorted(menu_dict.get(0), key=lambda item: item['sort'])
class PowerSchema(BaseModel):
icon: str
open_type: Optional[str] = Field(alias='openType')
parent_id: Optional[str] = Field(alias='parentId')
power_code: Optional[str] = Field(alias='powerCode')
power_name: Optional[str] = Field(alias='powerName')
power_type: Optional[str] = Field(alias='powerType')
power_url: Optional[str] = Field(alias='powerUrl')
sort: Optional[int] = Field(alias='sort')
class RightsApi(MethodView):
def get(self):
"""获取选择父节点"""
power = RightModel.query.all()
# power_data = marshal(power, RightModel.fields())
power_data = [
{
'powerId': item.id,
'powerName': item.name,
'powerType': item.type,
'powerUrl': item.url,
'openType': item.open_type,
'parentId': item.parent_id,
'icon': item.icon,
'sort': item.sort,
'enable': item.enable,
} for item in power
]
power_data.append({"powerId": 0, "powerName": "顶级权限", "parentId": -1})
res = {
"status": {"code": 200, "message": "默认"},
"data": power_data
}
return res
def delete(self):
ids = request.form.getlist('ids[]')
for id in ids:
role = RoleModel.query.filter_by(id=id).first()
# 删除该角色的权限和用户
role.power = []
role.user = []
r = RoleModel.query.filter_by(id=id).delete()
db.session.commit()
return success_api(message="批量删除成功")
class PowerApi(MethodView):
@validate()
def post(self, body: PowerSchema):
power = RightModel(
icon=body.icon,
open_type=body.open_type,
parent_id=body.parent_id,
code=body.power_code,
name=body.power_name,
type=body.power_type,
url=body.power_url,
sort=body.sort,
enable=1
)
try:
db.session.add(power)
db.session.commit()
except Exception as e:
print(e)
return fail_api(message='数据提交失败')
return success_api(message="成功")
def delete(self, _id):
# 删除权限(目前没有判断父节点自动删除子节点)
power = RightModel.query.filter_by(id=_id).first()
role_id_list = []
roles = power.role
for role in roles:
role_id_list.append(role.id)
roles = RoleModel.query.filter(RoleModel.id.in_(role_id_list)).all()
for p in roles:
power.role.remove(p)
r = RightModel.query.filter_by(id=_id).delete()
db.session.commit()
if r:
return success_api(message="删除成功")
else:
return fail_api(message="删除失败")
@validate()
def put(self, _id, body: PowerSchema):
data = {
"icon": body.icon,
"open_type": body.open_type,
"parent_id": body.parent_id,
"code": body.power_code,
"name": body.power_name,
"type": body.power_type,
"url": body.power_url,
"sort": body.sort
}
power = RightModel.query.filter_by(id=_id).update(data)
db.session.commit()
if not power:
return fail_api(message="更新权限失败")
return success_api(message="更新权限成功")
def right_power_enable_resource(_id, action):
power = RightModel.query.get(_id)
if power:
power.enable = not power.enable
db.session.commit()
message = "修改成功"
return success_api(message=message)
else:
return fail_api(message="出错啦")
def admin_configs_resource():
return get_render_config()
def admin_menu_resource():
menu_tree = make_menu_tree()
return jsonify(menu_tree)
+162
View File
@@ -0,0 +1,162 @@
from flask import request
from flask.views import MethodView
from common.utils.http import table_api, success_api, fail_api
from extensions import db
from models import RightModel, RoleModel
def role_deletes():
ids = request.form.getlist('ids[]')
for id in ids:
role = RoleModel.query.filter_by(id=id).first()
# 删除该角色的权限和用户
role.power = []
role.user = []
r = RoleModel.query.filter_by(id=id).delete()
db.session.commit()
return success_api(message="批量删除成功")
class RoleRoleApi(MethodView):
def get(self, _id):
if not _id:
page = request.args.get('page', default=1, type=int)
limit = request.args.get('limit', default=10, type=int)
role_name = request.args.get('roleName', default="", type=str)
role_code = request.args.get('roleCode', default="", type=str)
filters = []
if role_name:
filters.append(RoleModel.name.like('%' + role_name + '%'))
if role_code:
filters.append(RoleModel.code.like('%' + role_code + '%'))
paginate = RoleModel.query.filter(*filters).paginate(page=page, per_page=limit, error_out=False)
return table_api(
result={
'items': [{'id': item.id,
'roleName': item.name,
'roleCode': item.code,
'enable': item.enable,
'comment': item.comment,
'details': item.details,
'sort': item.sort,
} for item in paginate.items],
'total': paginate.total}
, code=0)
def post(self):
# TODO 添加校验
details = request.json.get('details', '')
enable = request.json.get('enable', 0)
role_code = request.json.get('roleCode', '')
role_name = request.json.get('roleName', '')
sort = request.json.get('sort', 0)
role = RoleModel(
details=details,
enable=int(enable),
code=role_code,
name=role_name,
sort=int(sort)
)
db.session.add(role)
db.session.commit()
return success_api(message="成功")
# 更新角色
def put(self, _id):
# TODO 添加校验
role_code = request.json.get('roleCode', 0)
role_name = request.json.get('roleName', '')
sort = request.json.get('sort', 0) # int
enable = request.json.get('enable', 0) # int
details = request.json.get('details', '')
data = {
"code": role_code,
"name": role_name,
"sort": sort,
"enable": enable,
"details": details
}
role = RoleModel.query.filter_by(id=_id).update(data)
db.session.commit()
if not role:
return fail_api(message="更新角色失败")
return success_api(message="更新角色成功")
def role_enable_resource(_id):
"""启用用户"""
ret = RoleModel.query.get(_id)
ret.enable = not ret.enable
db.session.commit()
message = "修改成功"
if not ret:
return fail_api(message="出错啦")
return success_api(message=message)
class RolePowerApi(MethodView):
def get(self, _id):
# 获取角色权限
role = RoleModel.query.filter_by(id=_id).first()
# 获取权限列表的 id
check_powers_list = [rp.id for rp in role.power]
powers = RightModel.query.all() # 获取所有的权限
powers = [
{
'powerId': item.id,
'powerName': item.name,
'powerType': item.type,
'powerUrl': item.url,
'openType': item.open_type,
'parentId': item.parent_id,
'icon': item.icon,
'sort': item.sort,
'enable': item.enable,
} for item in powers]
for i in powers:
if int(i.get("powerId")) in check_powers_list:
i["checkArr"] = "1"
else:
i["checkArr"] = "0"
return {
"data": powers,
"status": {"code": 200, "message": "默认"}
}
# 保存角色权限
def put(self, _id):
power_ids = request.json.get('powerIds', '')
power_list = power_ids.split(',')
""" 更新角色权限 """
role = RoleModel.query.filter_by(id=_id).first()
powers = RightModel.query.filter(RightModel.id.in_(power_list)).all()
role.power = powers
db.session.commit()
return success_api(message="授权成功")
# 角色删除
def delete(self, _id):
role = RoleModel.query.filter_by(id=_id).first()
# 删除该角色的权限和用户
role.power = []
role.user = []
r = RoleModel.query.filter_by(id=_id).delete()
db.session.commit()
if not r:
return fail_api(message="角色删除失败")
return success_api(message="角色删除成功")
@@ -1,18 +0,0 @@
.pear-container {background-color: whitesmoke;margin: 10px;}
.pear-card {width: 100%;height: 66px;background-color: #F8F8F8;display: inline-block;border-radius: 5px;text-align: center;margin-bottom: 3px;}
.pear-card:hover,.pear-card2:hover{box-shadow: 2px 0 8px 0 lightgray!important;}.pear-card2 {width: 100%;height: 90px;background-color: #F8F8F8;display: inline-block;border-radius: 5px;text-align: center;margin-bottom: 3px;}
.pear-card2 i {font-size: 30px;height: 90px;line-height: 90px;}
.pear-card i {font-size: 30px;height: 66px;line-height: 66px;}
.layui-col-md3 {text-align: center;}
.pear-card-title {margin-top: 3px;}
.person img {width: 90px;height: 90px;border-radius: 4px;margin-top: 8px;margin-left: 8px;}
.pear-card2 .count {color: #51A351;font-size: 30px;margin-top: 12px;}
.pear-card2 .title {color: gray;font-size: 14px;margin-top: 14px;}
.pear-card-status {padding: 0 10px 10px;}
.pear-card-status li {position: relative;padding: 10px 0;border-bottom: 1px solid #EEE;}
.pear-card-status li h3 {padding-bottom: 5px;font-weight: 700;}
.pear-card-status li p {padding-bottom: 10px;padding-top: 3px ;}
.pear-card-status li>span {color: #999;}
.pear-reply {position: absolute;right: 20px;}
.person .title{font-size: 17px;font-weight: 600;margin-left: 18px;margin-top: 16px;position: absolute;display: inline-block;}
.person .desc{font-size: 16px;font-weight: 600;margin-left: 115px;margin-top: -30px;position: absolute;display: inline-block;}
@@ -1,58 +0,0 @@
.dept-tree {
width: 100%;
height: -webkit-calc(100vh - 247px);
height: -moz-calc(100vh - 247px);
height: calc(100vh - 247px);
margin-top: 20px;
}
.dtree-laySimple-item-this{
background-color: transparent!important;
}
.dtree-nav-div:hover{
background-color: transparent!important;
}
.button{
margin-top: 10px;
width: 94%;
margin-left: 3%;
display: block;
height: 40px;
line-height: 40px;
padding: 0 15px;
white-space: nowrap;
text-align: center;
font-size: 14.5px;
border: none;
cursor: pointer;
box-sizing: border-box;
display:inline-block;
outline: 0;
border-radius: 2px;
-webkit-appearance: none;
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15);
}
.button-primary{
background-color: #5FB878;
color: white;
}
.button-default{
color: #2f495e;
background-color: #edf2f7;
}
.user-main{
width: calc(100% - 312px);
float: right;
}
.user-left{
width: 300px;
float: left;
}
.user-collasped.user-main{
width: 100%;
}
.user-collasped.user-left{
width: 0px;
}
.user-collasped.user-left .user-group{
display: none;
}
@@ -1,56 +0,0 @@
{
"code": 0,
"msg": "...",
"count": 3,
"data": [{
"id": "1",
"image": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png",
"title": "Alipay",
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
"time": "几秒前"
},{
"id": "2",
"image": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png",
"title": "Layui",
"remark": "生命就像一盒巧克力,结果往往出人意料",
"time": "几秒前"
},{
"id": "1",
"image": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png",
"title": "Angular",
"remark": "希望是一个好东西,也许是最好的,好东西是不会消亡的",
"time": "几秒前"
},
{
"id": "1",
"image": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png",
"title": "React",
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
"time": "几秒前"
},{
"id": "1",
"image": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png",
"title": "Alipay",
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
"time": "几秒前"
},{
"id": "2",
"image": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png",
"title": "Layui",
"remark": "生命就像一盒巧克力,结果往往出人意料",
"time": "几秒前"
},{
"id": "1",
"image": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png",
"title": "Angular",
"remark": "希望是一个好东西,也许是最好的,好东西是不会消亡的",
"time": "几秒前"
},
{
"id": "1",
"image": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png",
"title": "React",
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
"time": "几秒前"
}]
}
@@ -1,88 +0,0 @@
[{
"id": 1,
"title": "私信",
"children": [{
"id": 11,
"avatar":"admin/images/avatar.jpg",
"title": "收到一条私人消息",
"context": "这是消息内容。",
"form": "就眠仪式",
"time": "2019-02-15"
}, {
"id": 12,
"avatar":"admin/images/avatar.jpg",
"title": "收到一条私人消息",
"context": "这是消息内容。",
"form": "就眠仪式",
"time": "2019-02-15"
}]
},
{
"id": 2,
"title": "消息",
"children": [{
"id": 11,
"avatar":"admin/images/avatar.jpg",
"title": "收到一条紧急任务",
"context": "这是消息内容。",
"form": "就眠仪式",
"time": "2019-02-15"
}, {
"id": 12,
"avatar":"admin/images/avatar.jpg",
"title": "收到一条紧急任务",
"context": "这是消息内容。",
"form": "就眠仪式",
"time": "2019-02-15"
},
{
"id": 11,
"avatar":"admin/images/avatar.jpg",
"title": "收到一条紧急任务",
"context": "这是消息内容。",
"form": "就眠仪式",
"time": "2019-02-15"
}, {
"id": 12,
"avatar":"admin/images/avatar.jpg",
"title": "收到一条紧急任务",
"context": "这是消息内容。",
"form": "就眠仪式",
"time": "2019-02-15"
},
{
"id": 11,
"avatar":"admin/images/avatar.jpg",
"title": "收到一条紧急任务",
"context": "这是消息内容。",
"form": "就眠仪式",
"time": "2019-02-15"
}, {
"id": 12,
"avatar":"admin/images/avatar.jpg",
"title": "收到一条紧急任务",
"context": "这是消息内容。",
"form": "就眠仪式",
"time": "2019-02-15"
}]
},
{
"id": 3,
"title": "通知",
"children": [{
"id": 11,
"avatar":"admin/images/avatar.jpg",
"title": "收到一条警告通知",
"context": "这是消息内容。",
"form": "就眠仪式",
"time": "2019-02-15"
}, {
"id": 12,
"avatar":"admin/images/avatar.jpg",
"title": "收到一条警告通知",
"context": "这是消息内容。",
"form": "就眠仪式",
"time": "2019-02-15"
}]
}
]
@@ -1 +0,0 @@
{"createTime":null,"createBy":null,"updateTime":null,"updateBy":null,"remark":null,"code":0,"msg":"...","count":3,"data":[{"createTime":null,"createBy":null,"updateTime":null,"updateBy":null,"remark":null,"roleId":"1","roleName":"超级管理员","roleCode":"admin","enable":"1","details":"超级管理员","checked":false},{"createTime":null,"createBy":null,"updateTime":null,"updateBy":null,"remark":null,"roleId":"2","roleName":"普通管理员","roleCode":"manager","enable":"0","details":"普通管理员","checked":false},{"createTime":null,"createBy":null,"updateTime":null,"updateBy":null,"remark":null,"roleId":"3","roleName":"普通用户","roleCode":"pearson","enable":"0","details":"普通用户","checked":false}]}
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
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 #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee}.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 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view .layui-code-ol li:first-child{padding-top:10px}.layui-code-view .layui-code-ol li:last-child{padding-bottom:10px}.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}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,3 +0,0 @@
.layui-iconpicker .layui-anim{
width: 300px!important;
}
@@ -1,4 +0,0 @@
.layui-layer-msg{
border-color: transparent!important;
box-shadow: 2px 0 6px rgb(0 21 41 / 0.05)!important;
}
@@ -1,42 +0,0 @@
.pear-notice .layui-this {
color: #5FB878 !important;
font-weight: 500;
}
.pear-notice li {
border-right: 1px solid whitesmoke;
}
.pear-notice * {
color: dimgray !important;
}
.pear-notice{
width: 285px!important;
}
.pear-notice span{
margin-left: 20px;
font-size: 13px;
}
.pear-notice img{
margin-left: 8px;
width: 33px!important;
height: 33px!important;
border-radius: 50px;
}
.pear-notice-item{
height: 45px!important;
line-height: 45px!important;
}
/** 滚动条样式 */
.pear-notice *::-webkit-scrollbar{width:0px;height:0px;}
.pear-notice *::-webkit-scrollbar-track{background: white;border-radius:2px;}
.pear-notice *::-webkit-scrollbar-thumb{background: #E6E6E6;border-radius:2px;}
.pear-notice *::-webkit-scrollbar-thumb:hover{background: #E6E6E6;}
.pear-notice *::-webkit-scrollbar-corner{background: #f6f6f6;}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,356 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<!--
2013-9-30: Created.
-->
<svg>
<metadata>
Created by iconfont
</metadata>
<defs>
<font id="pear-icon" horiz-adv-x="1024" >
<font-face
font-family="pear-icon"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
ascent="896"
descent="-128"
/>
<missing-glyph />
<glyph glyph-name="jiazai" unicode="&#59072;" d="M512-96c-64.78 0-127.65 12.7-186.85 37.74-57.16 24.18-108.49 58.78-152.56 102.85-44.07 44.07-78.68 95.4-102.85 152.56C44.7 256.35 32 319.22 32 384s12.7 127.65 37.74 186.85c24.18 57.16 58.78 108.49 102.85 152.56s95.4 78.68 152.56 102.85C384.35 851.3 447.22 864 512 864c19.89 0 36.01-16.12 36.01-36.01s-16.12-36.01-36.01-36.01c-55.09 0-108.52-10.78-158.79-32.05-48.58-20.55-92.21-49.97-129.69-87.45s-66.9-81.11-87.45-129.69c-21.26-50.27-32.05-103.7-32.05-158.79s10.78-108.52 32.05-158.79c20.55-48.58 49.97-92.21 87.45-129.69s81.11-66.9 129.69-87.45c50.27-21.26 103.7-32.05 158.79-32.05s108.52 10.78 158.79 32.05c48.58 20.55 92.21 49.97 129.69 87.45s66.9 81.11 87.45 129.69c21.26 50.27 32.05 103.7 32.05 158.79 0 44.18-7.01 87.61-20.83 129.09-6.29 18.87 3.91 39.26 22.78 45.55 18.87 6.29 39.26-3.91 45.55-22.78C983.75 487.02 992 435.93 992 384c0-64.78-12.7-127.65-37.74-186.85-24.18-57.16-58.78-108.49-102.85-152.56-44.07-44.07-95.4-78.68-152.56-102.85C639.65-83.3 576.78-96 512-96z" horiz-adv-x="1024" />
<glyph glyph-name="3column" unicode="&#59004;" d="M874.666667 778.666667H149.333333C108.8 778.666667 74.666667 744.533333 74.666667 704v-640c0-40.533333 34.133333-74.666667 74.666666-74.666667h725.333334c40.533333 0 74.666667 34.133333 74.666666 74.666667V704c0 40.533333-34.133333 74.666667-74.666666 74.666667z m-245.333334-64v-661.333334h-234.666666v661.333334h234.666666zM138.666667 64V704c0 6.4 4.266667 10.666667 10.666666 10.666667h181.333334v-661.333334H149.333333c-6.4 0-10.666667 4.266667-10.666666 10.666667z m746.666666 0c0-6.4-4.266667-10.666667-10.666666-10.666667h-181.333334v661.333334H874.666667c6.4 0 10.666667-4.266667 10.666666-10.666667v-640z" horiz-adv-x="1024" />
<glyph glyph-name="column-4" unicode="&#59005;" d="M874.666667 778.666667H149.333333C108.8 778.666667 74.666667 744.533333 74.666667 704v-640c0-40.533333 34.133333-74.666667 74.666666-74.666667h725.333334c40.533333 0 74.666667 34.133333 74.666666 74.666667V704c0 40.533333-34.133333 74.666667-74.666666 74.666667z m-330.666667-64h128v-661.333334h-128v661.333334z m-64-661.333334h-128v661.333334h128v-661.333334z m-341.333333 10.666667V704c0 6.4 4.266667 10.666667 10.666666 10.666667h138.666667v-661.333334H149.333333c-6.4 0-10.666667 4.266667-10.666666 10.666667z m746.666666 0c0-6.4-4.266667-10.666667-10.666666-10.666667h-138.666667v661.333334H874.666667c6.4 0 10.666667-4.266667 10.666666-10.666667v-640z" horiz-adv-x="1024" />
<glyph glyph-name="add" unicode="&#59006;" d="M853.333333 416H544V725.333333c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-309.333333H170.666667c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h309.333333V42.666667c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V352H853.333333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="adjust" unicode="&#59007;" d="M522.666667 437.333333c-17.066667 0-32-14.933333-32-32v-362.666666c0-17.066667 14.933333-32 32-32S554.666667 25.6 554.666667 42.666667V405.333333c0 17.066667-14.933333 32-32 32zM341.333333 341.333333H106.666667c-17.066667 0-32-14.933333-32-32S89.6 277.333333 106.666667 277.333333h74.666666v-234.666666c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V277.333333H341.333333c17.066667 0 32 14.933333 32 32S358.4 341.333333 341.333333 341.333333zM693.333333 522.666667c0 17.066667-14.933333 32-32 32h-106.666666V725.333333c0 17.066667-14.933333 32-32 32S490.666667 742.4 490.666667 725.333333v-170.666666h-106.666667c-17.066667 0-32-14.933333-32-32S366.933333 490.666667 384 490.666667h277.333333c17.066667 0 32 14.933333 32 32zM917.333333 277.333333H682.666667c-17.066667 0-32-14.933333-32-32S665.6 213.333333 682.666667 213.333333h96v-170.666666c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v170.666666H917.333333c17.066667 0 32 14.933333 32 32S934.4 277.333333 917.333333 277.333333zM213.333333 437.333333c17.066667 0 32 14.933333 32 32V725.333333c0 17.066667-14.933333 32-32 32S181.333333 742.4 181.333333 725.333333v-256c0-17.066667 14.933333-32 32-32zM810.666667 373.333333c17.066667 0 32 14.933333 32 32V725.333333c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-320c0-17.066667 14.933333-32 32-32z" horiz-adv-x="1024" />
<glyph glyph-name="ashbin" unicode="&#59008;" d="M874.666667 654.933333h-202.666667V725.333333c0 40.533333-34.133333 74.666667-74.666667 74.666667h-170.666666c-40.533333 0-74.666667-34.133333-74.666667-74.666667v-70.4H149.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h53.333334V42.666667c0-40.533333 34.133333-74.666667 74.666666-74.666667h469.333334c40.533333 0 74.666667 34.133333 74.666666 74.666667V590.933333H874.666667c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM416 725.333333c0 6.4 4.266667 10.666667 10.666667 10.666667h170.666666c6.4 0 10.666667-4.266667 10.666667-10.666667v-70.4h-192V725.333333z m341.333333-682.666666c0-6.4-4.266667-10.666667-10.666666-10.666667H277.333333c-6.4 0-10.666667 4.266667-10.666666 10.666667V586.666667h490.666666V42.666667zM426.666667 160c17.066667 0 32 14.933333 32 32V405.333333c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-213.333333c0-17.066667 14.933333-32 32-32zM597.333333 160c17.066667 0 32 14.933333 32 32V405.333333c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-213.333333c0-17.066667 14.933333-32 32-32z" horiz-adv-x="1024" />
<glyph glyph-name="browse" unicode="&#59009;" d="M512 59.733333C230.4 59.733333 74.666667 362.666667 68.266667 375.466667c-4.266667 8.533333-4.266667 19.2 0 29.866666 6.4 12.8 164.266667 315.733333 443.733333 315.733334 281.6 0 437.333333-305.066667 443.733333-317.866667 4.266667-8.533333 4.266667-19.2 0-29.866667-6.4-10.666667-162.133333-313.6-443.733333-313.6zM132.266667 390.4c34.133333-57.6 170.666667-266.666667 379.733333-266.666667s345.6 209.066667 379.733333 266.666667c-34.133333 57.6-170.666667 266.666667-379.733333 266.666667S166.4 448 132.266667 390.4zM512 245.333333c-76.8 0-138.666667 61.866667-138.666667 138.666667s61.866667 138.666667 138.666667 138.666667 138.666667-61.866667 138.666667-138.666667-61.866667-138.666667-138.666667-138.666667z m0 213.333334c-40.533333 0-74.666667-34.133333-74.666667-74.666667s34.133333-74.666667 74.666667-74.666667 74.666667 34.133333 74.666667 74.666667-34.133333 74.666667-74.666667 74.666667z" horiz-adv-x="1024" />
<glyph glyph-name="bottom" unicode="&#59010;" d="M896 32H128c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h768c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM488.533333 168.533333c6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466667 8.533333l213.333333 213.333334c12.8 12.8 12.8 32 0 44.8-12.8 12.8-32 12.8-44.8 0l-157.866667-157.866667V725.333333c0 17.066667-14.933333 32-32 32s-34.133333-14.933333-34.133333-32v-456.533333L322.133333 426.666667c-12.8 12.8-32 12.8-44.8 0-12.8-12.8-12.8-32 0-44.8l211.2-213.333334z" horiz-adv-x="1024" />
<glyph glyph-name="back" unicode="&#59011;" d="M853.333333 650.666667H245.333333l93.866667 93.866666c12.8 12.8 12.8 34.133333 0 46.933334-12.8 12.8-34.133333 12.8-46.933333 0l-145.066667-145.066667c-12.8-12.8-12.8-34.133333 0-46.933333l145.066667-145.066667c6.4-6.4 14.933333-10.666667 23.466666-10.666667s17.066667 4.266667 23.466667 10.666667c12.8 12.8 12.8 34.133333 0 46.933333L256 584.533333h597.333333c6.4 0 10.666667-4.266667 10.666667-10.666666v-426.666667c0-6.4-4.266667-10.666667-10.666667-10.666667H170.666667c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h682.666666c40.533333 0 74.666667 34.133333 74.666667 74.666667V576c0 40.533333-34.133333 74.666667-74.666667 74.666667z" horiz-adv-x="1024" />
<glyph glyph-name="bad" unicode="&#59012;" d="M904.533333 373.333333L853.333333 710.4c-8.533333 51.2-55.466667 89.6-106.666666 89.6H204.8c-59.733333 0-108.8-46.933333-108.8-106.666667v-258.133333c0-57.6 49.066667-106.666667 108.8-106.666667h91.733333l125.866667-281.6c2.133333-2.133333 2.133333-4.266667 4.266667-6.4 14.933333-23.466667 38.4-36.266667 64-36.266666 12.8 0 25.6 4.266667 38.4 10.666666 57.6 34.133333 87.466667 72.533333 87.466666 117.333334v117.333333h183.466667c32 0 59.733333 12.8 81.066667 36.266667 19.2 25.6 29.866667 55.466667 23.466666 87.466666z m-616.533333 21.333334H204.8c-25.6 0-44.8 19.2-44.8 42.666666v256c0 23.466667 19.2 42.666667 44.8 42.666667h83.2v-341.333333zM832 328.533333c-8.533333-8.533333-21.333333-14.933333-34.133333-14.933333h-213.333334c-17.066667 0-32-14.933333-32-32v-149.333333c0-25.6-29.866667-49.066667-55.466666-64-4.266667-2.133333-10.666667-2.133333-14.933334 4.266666L352 362.666667V736H746.666667c21.333333 0 40.533333-14.933333 42.666666-36.266667L842.666667 362.666667c2.133333-10.666667-2.133333-23.466667-10.666667-34.133334z" horiz-adv-x="1024" />
<glyph glyph-name="arrow-double-left" unicode="&#59013;" d="M842.666667 32c-8.533333 0-14.933333 2.133333-21.333334 8.533333l-341.333333 309.333334c-6.4 6.4-10.666667 14.933333-10.666667 23.466666 0 8.533333 4.266667 17.066667 10.666667 23.466667l341.333333 309.333333c12.8 12.8 34.133333 10.666667 44.8-2.133333 12.8-12.8 10.666667-34.133333-2.133333-44.8L548.266667 373.333333l315.733333-285.866666c12.8-10.666667 14.933333-32 2.133333-44.8-6.4-6.4-14.933333-10.666667-23.466666-10.666667zM512 32c-8.533333 0-14.933333 2.133333-21.333333 8.533333L149.333333 349.866667c-6.4 6.4-10.666667 14.933333-10.666666 23.466666 0 8.533333 4.266667 17.066667 10.666666 23.466667L490.666667 706.133333c12.8 12.8 34.133333 10.666667 44.8-2.133333 12.8-12.8 10.666667-34.133333-2.133334-44.8L217.6 373.333333 533.333333 87.466667c12.8-12.8 14.933333-32 2.133334-44.8-6.4-6.4-14.933333-10.666667-23.466667-10.666667z" horiz-adv-x="1024" />
<glyph glyph-name="arrow-double-right" unicode="&#59014;" d="M544 373.333333c0 8.533333-4.266667 17.066667-10.666667 23.466667L192 706.133333c-12.8 12.8-34.133333 10.666667-44.8-2.133333-12.8-12.8-10.666667-34.133333 2.133333-44.8l315.733334-285.866667L149.333333 87.466667c-12.8-12.8-14.933333-32-2.133333-44.8 6.4-6.4 14.933333-10.666667 23.466667-10.666667 8.533333 0 14.933333 2.133333 21.333333 8.533333l341.333333 309.333334c6.4 6.4 10.666667 14.933333 10.666667 23.466666zM864 396.8l-341.333333 309.333333c-12.8 12.8-34.133333 10.666667-44.8-2.133333-12.8-12.8-10.666667-34.133333 2.133333-44.8l315.733333-285.866667-315.733333-285.866666c-12.8-12.8-14.933333-32-2.133333-44.8 6.4-6.4 14.933333-10.666667 23.466666-10.666667 8.533333 0 14.933333 2.133333 21.333334 8.533333l341.333333 309.333334c6.4 6.4 10.666667 14.933333 10.666667 23.466666 0 8.533333-4.266667 17.066667-10.666667 23.466667z" horiz-adv-x="1024" />
<glyph glyph-name="camera" unicode="&#59015;" d="M846.933333 657.066667h-140.8L646.4 746.666667c-6.4 10.666667-17.066667 17.066667-29.866667 17.066666h-209.066666c-12.8 0-23.466667-6.4-29.866667-17.066666l-59.733333-89.6H177.066667c-57.6 0-106.666667-46.933333-106.666667-106.666667v-426.666667c0-57.6 46.933333-106.666667 106.666667-106.666666h672c57.6 0 106.666667 46.933333 106.666666 106.666666v426.666667c-2.133333 59.733333-49.066667 106.666667-108.8 106.666667z m34.133334-533.333334c0-19.2-14.933333-34.133333-34.133334-34.133333H177.066667c-19.2 0-34.133333 14.933333-34.133334 34.133333v426.666667c0 19.2 14.933333 34.133333 34.133334 34.133333h160c12.8 0 23.466667 6.4 29.866666 17.066667L426.666667 689.066667h170.666666l59.733334-89.6c6.4-10.666667 17.066667-17.066667 29.866666-17.066667h160c19.2 0 34.133333-14.933333 34.133334-34.133333v-424.533334zM512 531.2c-96 0-174.933333-78.933333-174.933333-174.933333 0-96 78.933333-174.933333 174.933333-174.933334 96 0 174.933333 78.933333 174.933333 174.933334 0 96-78.933333 174.933333-174.933333 174.933333z m0-279.466667c-57.6 0-104.533333 46.933333-104.533333 104.533334s46.933333 104.533333 104.533333 104.533333 104.533333-46.933333 104.533333-104.533333-46.933333-104.533333-104.533333-104.533334z" horiz-adv-x="1024" />
<glyph glyph-name="chart-bar" unicode="&#59016;" d="M149.333333 96h128c29.866667 0 53.333333 23.466667 53.333334 53.333333V362.666667c0 29.866667-23.466667 53.333333-53.333334 53.333333H149.333333c-29.866667 0-53.333333-23.466667-53.333333-53.333333v-213.333334c0-29.866667 23.466667-53.333333 53.333333-53.333333z m10.666667 256h106.666667v-192h-106.666667v192zM448 96h128c29.866667 0 53.333333 23.466667 53.333333 53.333333V746.666667c0 29.866667-23.466667 53.333333-53.333333 53.333333h-128c-29.866667 0-53.333333-23.466667-53.333333-53.333333v-597.333334c0-29.866667 23.466667-53.333333 53.333333-53.333333z m10.666667 640h106.666666v-576h-106.666666v576zM874.666667 586.666667h-128c-29.866667 0-53.333333-23.466667-53.333334-53.333334v-384c0-29.866667 23.466667-53.333333 53.333334-53.333333h128c29.866667 0 53.333333 23.466667 53.333333 53.333333V533.333333c0 29.866667-23.466667 53.333333-53.333333 53.333334z m-10.666667-426.666667h-106.666667v362.666667h106.666667v-362.666667zM896 42.666667H128c-17.066667 0-32-14.933333-32-32S110.933333-21.333333 128-21.333333h768c17.066667 0 32 14.933333 32 32S913.066667 42.666667 896 42.666667z" horiz-adv-x="1024" />
<glyph glyph-name="attachment" unicode="&#59017;" d="M874.666667 428.8c-10.666667 10.666667-29.866667 12.8-42.666667 0l-343.466667-341.333333c-74.666667-74.666667-198.4-74.666667-275.2 0-36.266667 36.266667-57.6 85.333333-57.6 136.533333s19.2 100.266667 57.6 136.533333L556.8 704c46.933333 46.933333 121.6 46.933333 168.533333 0 23.466667-23.466667 34.133333-53.333333 34.133334-83.2 0-32-12.8-61.866667-34.133334-83.2L384 192c-17.066667-17.066667-44.8-17.066667-64 0-8.533333 8.533333-12.8 19.2-12.8 32s4.266667 23.466667 12.8 32l317.866667 315.733333c10.666667 10.666667 12.8 29.866667 0 42.666667-10.666667 12.8-29.866667 12.8-42.666667 0L277.333333 298.666667c-19.2-19.2-29.866667-46.933333-29.866666-74.666667S258.133333 170.666667 277.333333 149.333333c40.533333-40.533333 106.666667-40.533333 147.2 0L768 492.8c34.133333 34.133333 53.333333 78.933333 53.333333 125.866667s-19.2 93.866667-53.333333 125.866666a178.986667 178.986667 0 0 1-253.866667 0l-341.333333-341.333333c-46.933333-46.933333-74.666667-110.933333-74.666667-179.2s25.6-132.266667 74.666667-179.2c49.066667-49.066667 115.2-74.666667 179.2-74.666667s130.133333 25.6 179.2 74.666667l343.466667 341.333333c10.666667 12.8 10.666667 32 0 42.666667z" horiz-adv-x="1024" />
<glyph glyph-name="code" unicode="&#59018;" d="M322.133333 599.466667c-12.8 12.8-32 12.8-44.8 0l-192-192c-12.8-12.8-12.8-32 0-44.8l192-192c6.4-6.4 14.933333-8.533333 23.466667-8.533334s17.066667 2.133333 23.466667 8.533334c12.8 12.8 12.8 32 0 44.8L151.466667 384l168.533333 168.533333c12.8 12.8 12.8 34.133333 2.133333 46.933334zM940.8 407.466667l-192 192c-12.8 12.8-32 12.8-44.8 0-12.8-12.8-12.8-32 0-44.8l168.533333-168.533334-168.533333-168.533333c-12.8-12.8-12.8-32 0-44.8 6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466666 8.533333l192 192c8.533333 8.533333 8.533333 29.866667-2.133333 42.666667zM622.933333 819.2c-17.066667 4.266667-34.133333-6.4-38.4-23.466667L366.933333-6.4c-4.266667-17.066667 6.4-34.133333 23.466667-38.4 2.133333 0 6.4-2.133333 8.533333-2.133333 14.933333 0 27.733333 8.533333 29.866667 23.466666L644.266667 780.8c4.266667 17.066667-4.266667 34.133333-21.333334 38.4z" horiz-adv-x="1024" />
<glyph glyph-name="close" unicode="&#59019;" d="M556.8 384L832 659.2c12.8 12.8 12.8 32 0 44.8-12.8 12.8-32 12.8-44.8 0L512 428.8l-275.2 277.333333c-12.8 12.8-32 12.8-44.8 0-12.8-12.8-12.8-32 0-44.8l275.2-277.333333-277.333333-275.2c-12.8-12.8-12.8-32 0-44.8 6.4-6.4 14.933333-8.533333 23.466666-8.533333s17.066667 2.133333 23.466667 8.533333L512 339.2 787.2 64c6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466666 8.533333c12.8 12.8 12.8 32 0 44.8L556.8 384z" horiz-adv-x="1024" />
<glyph glyph-name="check-item" unicode="&#59020;" d="M853.333333 800H170.666667C130.133333 800 96 765.866667 96 725.333333v-682.666666c0-40.533333 34.133333-74.666667 74.666667-74.666667h682.666666c40.533333 0 74.666667 34.133333 74.666667 74.666667V725.333333c0 40.533333-34.133333 74.666667-74.666667 74.666667z m10.666667-757.333333c0-6.4-4.266667-10.666667-10.666667-10.666667H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667V725.333333c0 6.4 4.266667 10.666667 10.666667 10.666667h682.666666c6.4 0 10.666667-4.266667 10.666667-10.666667v-682.666666zM704 514.133333l-243.2-234.666666-117.333333 125.866666c-12.8 12.8-32 12.8-44.8 2.133334-12.8-12.8-12.8-32-2.133334-44.8l140.8-149.333334c6.4-6.4 14.933333-10.666667 23.466667-10.666666 8.533333 0 17.066667 4.266667 21.333333 8.533333l264.533334 256c12.8 12.8 12.8 32 0 44.8-10.666667 12.8-29.866667 14.933333-42.666667 2.133333z" horiz-adv-x="1024" />
<glyph glyph-name="calendar" unicode="&#59021;" d="M853.333333 746.666667h-138.666666V789.333333c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-42.666666h-277.333334V789.333333c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-42.666666H170.666667c-40.533333 0-74.666667-34.133333-74.666667-74.666667v-618.666667C96 12.8 130.133333-21.333333 170.666667-21.333333h682.666666c40.533333 0 74.666667 34.133333 74.666667 74.666666v618.666667C928 712.533333 893.866667 746.666667 853.333333 746.666667zM170.666667 682.666667h138.666666v-64c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v64h277.333334v-64c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v64H853.333333c6.4 0 10.666667-4.266667 10.666667-10.666667v-194.133333c-4.266667 2.133333-6.4 2.133333-10.666667 2.133333H170.666667c-4.266667 0-6.4 0-10.666667-2.133333v194.133333c0 6.4 4.266667 10.666667 10.666667 10.666667z m682.666666-640H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666666V418.133333c4.266667-2.133333 6.4-2.133333 10.666667-2.133333h682.666666c4.266667 0 6.4 0 10.666667 2.133333v-364.8c0-6.4-4.266667-10.666667-10.666667-10.666666zM384 288h-85.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h85.333333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM725.333333 288h-192c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h192c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="comment" unicode="&#59022;" d="M853.333333 757.333333H170.666667c-40.533333 0-74.666667-34.133333-74.666667-74.666666v-512c0-40.533333 34.133333-74.666667 74.666667-74.666667h151.466666V-21.333333c0-12.8 8.533333-25.6 19.2-29.866667 4.266667-2.133333 8.533333-2.133333 12.8-2.133333 8.533333 0 17.066667 4.266667 23.466667 10.666666l136.533333 138.666667H853.333333c40.533333 0 74.666667 34.133333 74.666667 74.666667V682.666667c0 40.533333-34.133333 74.666667-74.666667 74.666666z m10.666667-586.666666c0-6.4-4.266667-10.666667-10.666667-10.666667H501.333333c-8.533333 0-17.066667-4.266667-23.466666-10.666667l-89.6-93.866666V128c0 17.066667-14.933333 32-32 32H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667V682.666667c0 6.4 4.266667 10.666667 10.666667 10.666666h682.666666c6.4 0 10.666667-4.266667 10.666667-10.666666v-512zM512 405.333333H298.666667c-17.066667 0-32-14.933333-32-32S281.6 341.333333 298.666667 341.333333h213.333333c17.066667 0 32 14.933333 32 32S529.066667 405.333333 512 405.333333zM672 554.666667H298.666667c-17.066667 0-32-14.933333-32-32S281.6 490.666667 298.666667 490.666667h373.333333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="column-vertical" unicode="&#59023;" d="M874.666667 778.666667H149.333333C108.8 778.666667 74.666667 744.533333 74.666667 704v-640c0-40.533333 34.133333-74.666667 74.666666-74.666667h725.333334c40.533333 0 74.666667 34.133333 74.666666 74.666667V704c0 40.533333-34.133333 74.666667-74.666666 74.666667z m-725.333334-64h725.333334c6.4 0 10.666667-4.266667 10.666666-10.666667v-288h-746.666666V704c0 6.4 4.266667 10.666667 10.666666 10.666667z m725.333334-661.333334H149.333333c-6.4 0-10.666667 4.266667-10.666666 10.666667V352h746.666666V64c0-6.4-4.266667-10.666667-10.666666-10.666667z" horiz-adv-x="1024" />
<glyph glyph-name="column-horizontal" unicode="&#59024;" d="M874.666667 778.666667H149.333333C108.8 778.666667 74.666667 744.533333 74.666667 704v-640c0-40.533333 34.133333-74.666667 74.666666-74.666667h725.333334c40.533333 0 74.666667 34.133333 74.666666 74.666667V704c0 40.533333-34.133333 74.666667-74.666666 74.666667zM138.666667 64V704c0 6.4 4.266667 10.666667 10.666666 10.666667h330.666667v-661.333334H149.333333c-6.4 0-10.666667 4.266667-10.666666 10.666667z m746.666666 0c0-6.4-4.266667-10.666667-10.666666-10.666667H544v661.333334H874.666667c6.4 0 10.666667-4.266667 10.666666-10.666667v-640z" horiz-adv-x="1024" />
<glyph glyph-name="complete" unicode="&#59025;" d="M874.666667 394.666667c-17.066667 0-32-14.933333-32-32v-298.666667c0-6.4-4.266667-10.666667-10.666667-10.666667H192c-6.4 0-10.666667 4.266667-10.666667 10.666667V704c0 6.4 4.266667 10.666667 10.666667 10.666667h469.333333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32H192C151.466667 778.666667 117.333333 744.533333 117.333333 704v-640c0-40.533333 34.133333-74.666667 74.666667-74.666667h640c40.533333 0 74.666667 34.133333 74.666667 74.666667V362.666667c0 17.066667-14.933333 32-32 32zM940.8 727.466667c-12.8 12.8-32 12.8-44.8 0l-390.4-384-106.666667 106.666666c-12.8 12.8-32 12.8-44.8 0-12.8-12.8-12.8-32 0-44.8l130.133334-128c6.4-6.4 14.933333-8.533333 23.466666-8.533333s17.066667 2.133333 23.466667 8.533333l411.733333 405.333334c8.533333 10.666667 10.666667 32-2.133333 44.8z" horiz-adv-x="1024" />
<glyph glyph-name="chart-pie" unicode="&#59026;" d="M887.466667 253.866667c-17.066667 6.4-34.133333 0-42.666667-17.066667-64-151.466667-221.866667-243.2-386.133333-221.866667-164.266667 21.333333-294.4 149.333333-315.733334 313.6C119.466667 490.666667 209.066667 650.666667 358.4 716.8c17.066667 6.4 23.466667 25.6 17.066667 42.666667-6.4 17.066667-25.6 23.466667-42.666667 17.066666C155.733333 697.6 51.2 509.866667 78.933333 317.866667c27.733333-192 179.2-343.466667 371.2-369.066667 19.2-2.133333 36.266667-4.266667 55.466667-4.266667 170.666667 0 330.666667 102.4 398.933333 264.533334 6.4 17.066667-2.133333 36.266667-17.066666 44.8zM814.933333 686.933333C727.466667 774.4 612.266667 821.333333 490.666667 821.333333c-17.066667 0-32-14.933333-32-32v-426.666666c0-17.066667 14.933333-32 32-32h426.666666c17.066667 0 32 14.933333 32 32 0 121.6-46.933333 236.8-134.4 324.266666zM522.666667 394.666667V755.2c93.866667-6.4 179.2-46.933333 247.466666-115.2 66.133333-66.133333 106.666667-153.6 115.2-247.466667h-362.666666z" horiz-adv-x="1024" />
<glyph glyph-name="cry" unicode="&#59027;" d="M512 821.333333C270.933333 821.333333 74.666667 625.066667 74.666667 384S270.933333-53.333333 512-53.333333 949.333333 142.933333 949.333333 384 753.066667 821.333333 512 821.333333z m0-810.666666c-204.8 0-373.333333 168.533333-373.333333 373.333333S307.2 757.333333 512 757.333333 885.333333 588.8 885.333333 384 716.8 10.666667 512 10.666667zM512 298.666667c-81.066667 0-151.466667-36.266667-211.2-106.666667-10.666667-12.8-8.533333-34.133333 4.266667-44.8 12.8-10.666667 34.133333-8.533333 44.8 4.266667 46.933333 57.6 100.266667 85.333333 162.133333 85.333333s115.2-27.733333 162.133333-85.333333c6.4-8.533333 14.933333-10.666667 25.6-10.666667 6.4 0 14.933333 2.133333 21.333334 6.4 12.8 10.666667 14.933333 32 4.266666 44.8-61.866667 70.4-132.266667 106.666667-213.333333 106.666667zM362.666667 384c23.466667 0 42.666667 19.2 42.666666 42.666667v64c0 23.466667-19.2 42.666667-42.666666 42.666666s-42.666667-19.2-42.666667-42.666666v-64c0-23.466667 19.2-42.666667 42.666667-42.666667zM661.333333 384c23.466667 0 42.666667 19.2 42.666667 42.666667v64c0 23.466667-19.2 42.666667-42.666667 42.666666s-42.666667-19.2-42.666666-42.666666v-64c0-23.466667 19.2-42.666667 42.666666-42.666667z" horiz-adv-x="1024" />
<glyph glyph-name="customer-service" unicode="&#59028;" d="M864 456.533333V469.333333c0 194.133333-157.866667 352-352 352S160 663.466667 160 469.333333v-12.8c-36.266667-4.266667-64-36.266667-64-72.533333v-170.666667c0-40.533333 34.133333-74.666667 74.666667-74.666666h85.333333c40.533333 0 74.666667 34.133333 74.666667 74.666666v170.666667c0 40.533333-34.133333 74.666667-74.666667 74.666667h-32V469.333333c0 157.866667 130.133333 288 288 288S800 627.2 800 469.333333v-10.666666H768c-40.533333 0-74.666667-34.133333-74.666667-74.666667v-170.666667c0-40.533333 34.133333-74.666667 74.666667-74.666666h21.333333c-17.066667-49.066667-59.733333-98.133333-179.2-106.666667-12.8 19.2-32 32-55.466666 32-36.266667 0-64-27.733333-64-64s27.733333-64 64-64c23.466667 0 44.8 12.8 55.466666 34.133333 166.4 10.666667 226.133333 91.733333 245.333334 170.666667 40.533333 2.133333 72.533333 34.133333 72.533333 74.666667v170.666666c0 36.266667-27.733333 66.133333-64 70.4z m-597.333333-72.533333v-170.666667c0-6.4-4.266667-10.666667-10.666667-10.666666H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666666v170.666667c0 6.4 4.266667 10.666667 10.666667 10.666667h85.333333c6.4 0 10.666667-4.266667 10.666667-10.666667z m597.333333-170.666667c0-6.4-4.266667-10.666667-10.666667-10.666666h-85.333333c-6.4 0-10.666667 4.266667-10.666667 10.666666v170.666667c0 6.4 4.266667 10.666667 10.666667 10.666667h85.333333c6.4 0 10.666667-4.266667 10.666667-10.666667v-170.666667z" horiz-adv-x="1024" />
<glyph glyph-name="direction-down" unicode="&#59029;" d="M898.133333 384c-12.8 12.8-32 12.8-44.8 2.133333L544 96V746.666667c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-650.666667L170.666667 386.133333c-12.8 12.8-34.133333 10.666667-44.8-2.133333-12.8-12.8-10.666667-34.133333 2.133333-44.8l362.666667-341.333333c2.133333-2.133333 6.4-4.266667 8.533333-6.4 4.266667-2.133333 6.4-2.133333 10.666667-2.133334s8.533333 0 10.666666 2.133334c4.266667 2.133333 6.4 4.266667 8.533334 6.4l362.666666 341.333333c17.066667 12.8 19.2 32 6.4 44.8z" horiz-adv-x="1024" />
<glyph glyph-name="copy" unicode="&#59030;" d="M853.333333 672h-53.333333V725.333333c0 40.533333-34.133333 74.666667-74.666667 74.666667H170.666667C130.133333 800 96 765.866667 96 725.333333v-554.666666c0-40.533333 34.133333-74.666667 74.666667-74.666667h53.333333V42.666667c0-40.533333 34.133333-74.666667 74.666667-74.666667h554.666666c40.533333 0 74.666667 34.133333 74.666667 74.666667V597.333333c0 40.533333-34.133333 74.666667-74.666667 74.666667zM160 170.666667V725.333333c0 6.4 4.266667 10.666667 10.666667 10.666667h554.666666c6.4 0 10.666667-4.266667 10.666667-10.666667v-554.666666c0-6.4-4.266667-10.666667-10.666667-10.666667H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667z m704-128c0-6.4-4.266667-10.666667-10.666667-10.666667H298.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667v53.333333H725.333333c40.533333 0 74.666667 34.133333 74.666667 74.666667V608H853.333333c6.4 0 10.666667-4.266667 10.666667-10.666667v-554.666666zM576 480h-96V576c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-96H320c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h96V320c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v96H576c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="cut" unicode="&#59031;" d="M917.333333 693.333333h-96V789.333333c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-96H277.333333c-40.533333 0-74.666667-34.133333-74.666666-74.666666v-480H106.666667c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h96V-21.333333c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v96H746.666667c40.533333 0 74.666667 34.133333 74.666666 74.666666V629.333333H917.333333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM757.333333 149.333333c0-6.4-4.266667-10.666667-10.666666-10.666666H266.666667V618.666667c0 6.4 4.266667 10.666667 10.666666 10.666666h480V149.333333z" horiz-adv-x="1024" />
<glyph glyph-name="data-view" unicode="&#59032;" d="M874.666667 32H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667V746.666667c0 17.066667-14.933333 32-32 32S96 763.733333 96 746.666667v-704c0-40.533333 34.133333-74.666667 74.666667-74.666667h704c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM437.333333 426.666667v-320c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V426.666667c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32zM298.666667 74.666667c17.066667 0 32 14.933333 32 32V362.666667c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-256c0-17.066667 14.933333-32 32-32zM640 330.666667c-17.066667 0-32-14.933333-32-32v-192c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v192c0 17.066667-14.933333 32-32 32zM810.666667 544c-17.066667 0-32-14.933333-32-32v-405.333333c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V512c0 17.066667-14.933333 32-32 32zM322.133333 488.533333l147.2 147.2 147.2-147.2c6.4-6.4 14.933333-8.533333 23.466667-8.533333h2.133333c8.533333 0 17.066667 6.4 23.466667 12.8l170.666667 234.666667c10.666667 14.933333 6.4 34.133333-6.4 44.8-14.933333 10.666667-34.133333 6.4-44.8-6.4l-149.333334-204.8L490.666667 706.133333c-12.8 12.8-32 12.8-44.8 0l-170.666667-170.666666c-12.8-12.8-12.8-32 0-44.8 12.8-12.8 34.133333-12.8 46.933333-2.133334z" horiz-adv-x="1024" />
<glyph glyph-name="direction-right" unicode="&#59033;" d="M904.533333 373.333333c2.133333 4.266667 2.133333 6.4 2.133334 10.666667s0 8.533333-2.133334 10.666667c-2.133333 4.266667-4.266667 6.4-6.4 8.533333l-341.333333 362.666667c-12.8 12.8-32 12.8-44.8 2.133333-12.8-12.8-12.8-32-2.133333-44.8l290.133333-309.333333H149.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h650.666667L509.866667 42.666667c-12.8-12.8-10.666667-34.133333 2.133333-44.8 6.4-6.4 14.933333-8.533333 21.333333-8.533334 8.533333 0 17.066667 4.266667 23.466667 10.666667l341.333333 362.666667c2.133333 2.133333 4.266667 6.4 6.4 10.666666z" horiz-adv-x="1024" />
<glyph glyph-name="direction-up" unicode="&#59034;" d="M896 428.8l-362.666667 341.333333c-2.133333 2.133333-6.4 4.266667-8.533333 6.4-4.266667 2.133333-6.4 2.133333-10.666667 2.133334s-8.533333 0-10.666666-2.133334c-4.266667-2.133333-6.4-4.266667-8.533334-6.4l-362.666666-341.333333c-12.8-12.8-12.8-32-2.133334-44.8 12.8-12.8 32-12.8 44.8-2.133333l309.333334 290.133333V21.333333c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V672L853.333333 381.866667c6.4-6.4 14.933333-8.533333 21.333334-8.533334 8.533333 0 17.066667 4.266667 23.466666 10.666667 12.8 12.8 10.666667 32-2.133333 44.8z" horiz-adv-x="1024" />
<glyph glyph-name="discount" unicode="&#59035;" d="M874.666667 800H593.066667c-19.2 0-38.4-8.533333-53.333334-21.333333l-405.333333-405.333334c-29.866667-29.866667-29.866667-76.8 0-104.533333l260.266667-260.266667c14.933333-14.933333 32-21.333333 53.333333-21.333333s38.4 8.533333 53.333333 21.333333l405.333334 405.333334c14.933333 14.933333 21.333333 32 21.333333 53.333333V746.666667c0 29.866667-23.466667 53.333333-53.333333 53.333333z m-10.666667-334.933333c0-2.133333-2.133333-6.4-2.133333-8.533334l-405.333334-405.333333c-2.133333-2.133333-6.4-2.133333-8.533333-2.133333s-4.266667 0-8.533333 2.133333L181.333333 311.466667c-4.266667 4.266667-4.266667 10.666667 0 14.933333l405.333334 405.333333c2.133333 2.133333 4.266667 2.133333 8.533333 2.133334h270.933333v-268.8zM704 480c53.333333 0 96 42.666667 96 96s-42.666667 96-96 96-96-42.666667-96-96 42.666667-96 96-96z m0 128c17.066667 0 32-14.933333 32-32s-14.933333-32-32-32-32 14.933333-32 32 14.933333 32 32 32z" horiz-adv-x="1024" />
<glyph glyph-name="direction-left" unicode="&#59036;" d="M874.666667 416H224L514.133333 725.333333c12.8 12.8 10.666667 34.133333-2.133333 44.8s-32 10.666667-44.8-2.133333l-341.333333-362.666667c-2.133333-2.133333-4.266667-6.4-6.4-8.533333-2.133333-4.266667-2.133333-6.4-2.133334-10.666667s0-8.533333 2.133334-10.666666c2.133333-4.266667 4.266667-6.4 6.4-8.533334l341.333333-362.666666c6.4-6.4 14.933333-10.666667 23.466667-10.666667 8.533333 0 14.933333 2.133333 21.333333 8.533333 12.8 12.8 12.8 32 2.133333 44.8L224 352H874.666667c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="download" unicode="&#59037;" d="M896 224c-17.066667 0-32-14.933333-32-32v-128c0-6.4-4.266667-10.666667-10.666667-10.666667H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667v128c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-128c0-40.533333 34.133333-74.666667 74.666667-74.666667h682.666666c40.533333 0 74.666667 34.133333 74.666667 74.666667v128c0 17.066667-14.933333 32-32 32zM488.533333 168.533333c6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466667 8.533333l213.333333 213.333334c12.8 12.8 12.8 32 0 44.8-12.8 12.8-32 12.8-44.8 0l-157.866667-157.866667V725.333333c0 17.066667-14.933333 32-32 32s-34.133333-14.933333-34.133333-32v-456.533333L322.133333 426.666667c-12.8 12.8-32 12.8-44.8 0-12.8-12.8-12.8-32 0-44.8l211.2-213.333334z" horiz-adv-x="1024" />
<glyph glyph-name="electronics" unicode="&#59038;" d="M840.533333 778.666667H183.466667c-59.733333 0-108.8-49.066667-108.8-108.8v-379.733334c0-59.733333 49.066667-108.8 108.8-108.8h232.533333v-115.2H341.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h341.333334c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32h-74.666667v115.2h232.533333c59.733333 0 108.8 49.066667 108.8 108.8V669.866667c0 59.733333-49.066667 108.8-108.8 108.8zM544 66.133333h-64v115.2h64v-115.2z m341.333333 224c0-25.6-19.2-44.8-44.8-44.8H183.466667c-25.6 0-44.8 19.2-44.8 44.8V669.866667c0 25.6 19.2 44.8 44.8 44.8h657.066666c25.6 0 44.8-19.2 44.8-44.8v-379.733334z" horiz-adv-x="1024" />
<glyph glyph-name="drag" unicode="&#59039;" d="M362.666667 704m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM661.333333 704m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM362.666667 384m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM661.333333 384m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM362.666667 64m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM661.333333 64m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0Z" horiz-adv-x="1024" />
<glyph glyph-name="elipsis" unicode="&#59040;" d="M192 384m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM512 384m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM832 384m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0Z" horiz-adv-x="1024" />
<glyph glyph-name="export" unicode="&#59041;" d="M582.4 32H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667V725.333333c0 6.4 4.266667 10.666667 10.666667 10.666667h309.333333V576c0-40.533333 34.133333-74.666667 74.666667-74.666667h160v-38.4c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V597.333333c0 8.533333-4.266667 17.066667-8.533334 23.466667l-170.666666 170.666667c-6.4 6.4-14.933333 8.533333-23.466667 8.533333H170.666667C130.133333 800 96 765.866667 96 725.333333v-682.666666c0-40.533333 34.133333-74.666667 74.666667-74.666667h411.733333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z m132.266667 550.4v-17.066667H554.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667V736h19.2l151.466667-153.6zM866.133333 226.133333l-106.666666 106.666667c-12.8 12.8-32 12.8-44.8 0s-12.8-32 0-44.8l51.2-51.2H512c-17.066667 0-32-14.933333-32-32S494.933333 170.666667 512 170.666667h253.866667l-51.2-51.2c-12.8-12.8-12.8-32 0-44.8 6.4-6.4 14.933333-8.533333 23.466666-8.533334s17.066667 2.133333 23.466667 8.533334l106.666667 106.666666c8.533333 10.666667 8.533333 32-2.133334 44.8z" horiz-adv-x="1024" />
<glyph glyph-name="explain" unicode="&#59042;" d="M789.333333 821.333333H234.666667C194.133333 821.333333 160 787.2 160 746.666667v-725.333334c0-40.533333 34.133333-74.666667 74.666667-74.666666h554.666666c40.533333 0 74.666667 34.133333 74.666667 74.666666V746.666667c0 40.533333-34.133333 74.666667-74.666667 74.666666z m-138.666666-64v-296.533333L576 531.2c-6.4 6.4-14.933333 8.533333-21.333333 8.533333-8.533333 0-17.066667-2.133333-21.333334-8.533333l-74.666666-72.533333v298.666666h192z m149.333333-736c0-6.4-4.266667-10.666667-10.666667-10.666666H234.666667c-6.4 0-10.666667 4.266667-10.666667 10.666666V746.666667c0 6.4 4.266667 10.666667 10.666667 10.666666h160v-322.133333c0-14.933333 6.4-27.733333 14.933333-36.266667 21.333333-21.333333 53.333333-21.333333 74.666667 0l70.4 68.266667 70.4-68.266667c10.666667-10.666667 23.466667-14.933333 36.266666-14.933333 29.866667 0 53.333333 23.466667 53.333334 53.333333v320H789.333333c6.4 0 10.666667-4.266667 10.666667-10.666666v-725.333334z" horiz-adv-x="1024" />
<glyph glyph-name="edit" unicode="&#59043;" d="M853.333333 394.666667c-17.066667 0-32-14.933333-32-32v-320c0-6.4-4.266667-10.666667-10.666666-10.666667H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667V682.666667c0 6.4 4.266667 10.666667 10.666667 10.666666h320c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32H170.666667c-40.533333 0-74.666667-34.133333-74.666667-74.666666v-640c0-40.533333 34.133333-74.666667 74.666667-74.666667h640c40.533333 0 74.666667 34.133333 74.666666 74.666667V362.666667c0 17.066667-14.933333 32-32 32zM405.333333 411.733333l-32-125.866666c-2.133333-10.666667 0-23.466667 8.533334-29.866667 6.4-6.4 14.933333-8.533333 23.466666-8.533333h8.533334l125.866666 32c6.4 2.133333 10.666667 4.266667 14.933334 8.533333l300.8 300.8c38.4 38.4 38.4 102.4 0 140.8-38.4 38.4-102.4 38.4-140.8 0L413.866667 426.666667c-4.266667-4.266667-6.4-8.533333-8.533334-14.933334z m59.733334-23.466666L761.6 682.666667c12.8 12.8 36.266667 12.8 49.066667 0 12.8-12.8 12.8-36.266667 0-49.066667L516.266667 337.066667l-66.133334-17.066667 14.933334 68.266667z" horiz-adv-x="1024" />
<glyph glyph-name="eye-close" unicode="&#59044;" d="M955.733333 403.2c-6.4 12.8-162.133333 317.866667-443.733333 317.866667-23.466667 0-46.933333-2.133333-70.4-6.4-17.066667-4.266667-29.866667-19.2-25.6-36.266667 4.266667-17.066667 19.2-29.866667 36.266667-25.6 19.2 4.266667 38.4 4.266667 57.6 4.266667 209.066667 0 345.6-209.066667 379.733333-266.666667-10.666667-19.2-32-53.333333-64-91.733333-10.666667-12.8-8.533333-34.133333 4.266667-44.8 6.4-4.266667 12.8-6.4 21.333333-6.4s19.2 4.266667 25.6 10.666666c51.2 61.866667 78.933333 115.2 78.933333 117.333334 6.4 8.533333 6.4 19.2 0 27.733333zM215.466667 770.133333c-12.8 12.8-32 12.8-44.8 0-12.8-12.8-12.8-32 0-44.8l91.733333-91.733333C138.666667 541.866667 72.533333 411.733333 68.266667 405.333333c-4.266667-8.533333-4.266667-19.2 0-29.866666 6.4-12.8 162.133333-315.733333 443.733333-315.733334 83.2 0 164.266667 27.733333 241.066667 81.066667l96-96c6.4-6.4 14.933333-8.533333 23.466666-8.533333s17.066667 2.133333 23.466667 8.533333c12.8 12.8 12.8 32 0 44.8L215.466667 770.133333z m243.2-334.933333l104.533333-104.533333c-12.8-12.8-32-21.333333-51.2-21.333334-40.533333 0-74.666667 34.133333-74.666667 74.666667 0 19.2 8.533333 38.4 21.333334 51.2zM512 123.733333c-209.066667 0-345.6 209.066667-379.733333 266.666667 21.333333 36.266667 81.066667 130.133333 174.933333 196.266667l104.533333-104.533334c-25.6-25.6-38.4-59.733333-38.4-96 0-76.8 61.866667-138.666667 138.666667-138.666666 36.266667 0 70.4 14.933333 96 38.4l98.133333-98.133334c-61.866667-42.666667-128-64-194.133333-64z" horiz-adv-x="1024" />
<glyph glyph-name="email" unicode="&#59045;" d="M874.666667 714.666667H149.333333c-40.533333 0-74.666667-34.133333-74.666666-74.666667v-512c0-40.533333 34.133333-74.666667 74.666666-74.666667h725.333334c40.533333 0 74.666667 34.133333 74.666666 74.666667V640c0 40.533333-34.133333 74.666667-74.666666 74.666667z m-725.333334-64h725.333334c6.4 0 10.666667-4.266667 10.666666-10.666667v-25.6L512 379.733333l-373.333333 234.666667V640c0 6.4 4.266667 10.666667 10.666666 10.666667z m725.333334-533.333334H149.333333c-6.4 0-10.666667 4.266667-10.666666 10.666667V539.733333l356.266666-224c4.266667-4.266667 10.666667-4.266667 17.066667-4.266666s12.8 2.133333 17.066667 4.266666l356.266666 224V128c0-6.4-4.266667-10.666667-10.666666-10.666667z" horiz-adv-x="1024" />
<glyph glyph-name="favorite" unicode="&#59046;" d="M934.4 539.733333c-8.533333 10.666667-21.333333 19.2-34.133333 21.333334l-234.666667 34.133333-104.533333 213.333333c-6.4 8.533333-14.933333 17.066667-25.6 23.466667-12.8 6.4-27.733333 6.4-40.533334 2.133333-12.8-4.266667-23.466667-14.933333-29.866666-27.733333l-104.533334-213.333333-234.666666-34.133334c-10.666667-2.133333-21.333333-6.4-29.866667-14.933333-21.333333-21.333333-19.2-55.466667 0-74.666667l170.666667-166.4-40.533334-234.666666c-2.133333-10.666667 0-23.466667 6.4-34.133334 12.8-25.6 46.933333-36.266667 72.533334-21.333333l211.2 110.933333 211.2-110.933333c8.533333-4.266667 17.066667-6.4 25.6-6.4h8.533333c14.933333 2.133333 25.6 10.666667 34.133333 21.333333 8.533333 10.666667 10.666667 25.6 8.533334 40.533334l-40.533334 234.666666 170.666667 166.4c8.533333 8.533333 14.933333 19.2 14.933333 29.866667-2.133333 14.933333-6.4 27.733333-14.933333 40.533333z m-224-194.133333c-12.8-12.8-19.2-29.866667-14.933333-46.933333l38.4-217.6L512 196.266667l-221.866667-115.2L328.533333 298.666667c2.133333 17.066667-2.133333 34.133333-14.933333 46.933333l-157.866667 153.6 219.733334 32c17.066667 2.133333 32 12.8 40.533333 29.866667L512 759.466667l98.133333-198.4c8.533333-14.933333 23.466667-27.733333 40.533334-29.866667l219.733333-32-160-153.6z" horiz-adv-x="1024" />
<glyph glyph-name="file-common" unicode="&#59047;" d="M832 821.333333H192c-17.066667 0-32-14.933333-32-32v-765.866666c0-12.8 4.266667-23.466667 12.8-34.133334 8.533333-10.666667 21.333333-17.066667 36.266667-19.2h6.4c12.8 0 23.466667 4.266667 34.133333 12.8l264.533333 213.333334 264.533334-213.333334c8.533333-8.533333 21.333333-12.8 34.133333-12.8 29.866667 0 53.333333 23.466667 53.333333 53.333334V789.333333c-2.133333 17.066667-17.066667 32-34.133333 32z m-32-776.533333L531.2 262.4c-10.666667 8.533333-27.733333 8.533333-40.533333 0L224 44.8V757.333333h576v-712.533333zM341.333333 554.666667h320c17.066667 0 32 14.933333 32 32S678.4 618.666667 661.333333 618.666667H341.333333c-17.066667 0-32-14.933333-32-32S324.266667 554.666667 341.333333 554.666667zM341.333333 384h213.333334c17.066667 0 32 14.933333 32 32S571.733333 448 554.666667 448H341.333333c-17.066667 0-32-14.933333-32-32S324.266667 384 341.333333 384z" horiz-adv-x="1024" />
<glyph glyph-name="file-delete" unicode="&#59048;" d="M842.666667 610.133333l-187.733334 187.733334c-14.933333 14.933333-32 21.333333-53.333333 21.333333H234.666667C194.133333 821.333333 160 787.2 160 746.666667v-725.333334c0-40.533333 34.133333-74.666667 74.666667-74.666666h554.666666c40.533333 0 74.666667 34.133333 74.666667 74.666666V558.933333c0 19.2-8.533333 38.4-21.333333 51.2z m-44.8-44.8c-2.133333-2.133333-4.266667 0-8.533334 0h-170.666666c-6.4 0-10.666667 4.266667-10.666667 10.666667V746.666667c0 2.133333 0 6.4-2.133333 8.533333 0 0 2.133333 0 2.133333-2.133333l189.866667-187.733334z m-8.533334-554.666666H234.666667c-6.4 0-10.666667 4.266667-10.666667 10.666666V746.666667c0 6.4 4.266667 10.666667 10.666667 10.666666h311.466666c-2.133333-4.266667-2.133333-6.4-2.133333-10.666666v-170.666667c0-40.533333 34.133333-74.666667 74.666667-74.666667h170.666666c4.266667 0 6.4 0 10.666667 2.133334V21.333333c0-6.4-4.266667-10.666667-10.666667-10.666666zM640 309.333333H384c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h256c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="file-add" unicode="&#59049;" d="M842.666667 610.133333l-187.733334 187.733334c-14.933333 14.933333-32 21.333333-53.333333 21.333333H234.666667C194.133333 821.333333 160 787.2 160 746.666667v-725.333334c0-40.533333 34.133333-74.666667 74.666667-74.666666h554.666666c40.533333 0 74.666667 34.133333 74.666667 74.666666V558.933333c0 19.2-8.533333 38.4-21.333333 51.2z m-44.8-44.8H618.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667V755.2l189.866667-189.866667z m-8.533334-554.666666H234.666667c-6.4 0-10.666667 4.266667-10.666667 10.666666V746.666667c0 6.4 4.266667 10.666667 10.666667 10.666666h309.333333V576c0-40.533333 34.133333-74.666667 74.666667-74.666667h181.333333V21.333333c0-6.4-4.266667-10.666667-10.666667-10.666666zM618.666667 309.333333h-74.666667V384c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-74.666667H405.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h74.666667V170.666667c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v74.666666H618.666667c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="fabulous" unicode="&#59050;" d="M859.733333 642.133333c-44.8 44.8-102.4 70.4-166.4 70.4-61.866667 0-121.6-25.6-166.4-70.4l-14.933333-17.066666-17.066667 17.066666c-44.8 44.8-102.4 70.4-166.4 70.4-61.866667 0-121.6-25.6-166.4-70.4-91.733333-91.733333-91.733333-243.2 0-337.066666l324.266667-330.666667c6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 4.266667 23.466666 8.533333l324.266667 330.666667c44.8 44.8 68.266667 104.533333 68.266667 168.533333s-21.333333 123.733333-66.133334 168.533333z m-44.8-290.133333L512 42.666667 209.066667 352c-66.133333 68.266667-66.133333 179.2 0 247.466667 32 32 74.666667 51.2 119.466666 51.2 44.8 0 87.466667-17.066667 119.466667-51.2l38.4-40.533334c12.8-12.8 34.133333-12.8 44.8 0l38.4 40.533334c32 32 74.666667 51.2 119.466667 51.2 44.8 0 87.466667-17.066667 119.466666-51.2 32-32 49.066667-76.8 49.066667-123.733334s-12.8-91.733333-42.666667-123.733333z" horiz-adv-x="1024" />
<glyph glyph-name="file" unicode="&#59051;" d="M842.666667 610.133333l-187.733334 187.733334c-14.933333 14.933333-32 21.333333-53.333333 21.333333H234.666667C194.133333 821.333333 160 787.2 160 746.666667v-725.333334c0-40.533333 34.133333-74.666667 74.666667-74.666666h554.666666c40.533333 0 74.666667 34.133333 74.666667 74.666666V558.933333c0 19.2-8.533333 38.4-21.333333 51.2z m-44.8-44.8c-2.133333-2.133333-4.266667 0-8.533334 0h-170.666666c-6.4 0-10.666667 4.266667-10.666667 10.666667V746.666667c0 2.133333 0 6.4-2.133333 8.533333 0 0 2.133333 0 2.133333-2.133333l189.866667-187.733334z m-8.533334-554.666666H234.666667c-6.4 0-10.666667 4.266667-10.666667 10.666666V746.666667c0 6.4 4.266667 10.666667 10.666667 10.666666h311.466666c-2.133333-4.266667-2.133333-6.4-2.133333-10.666666v-170.666667c0-40.533333 34.133333-74.666667 74.666667-74.666667h170.666666c4.266667 0 6.4 0 10.666667 2.133334V21.333333c0-6.4-4.266667-10.666667-10.666667-10.666666zM640 202.666667H341.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h298.666667c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM640 373.333333H341.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h298.666667c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM341.333333 480h85.333334c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32h-85.333334c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32z" horiz-adv-x="1024" />
<glyph glyph-name="folder-close" unicode="&#59052;" d="M853.333333 629.333333H514.133333c-4.266667 0-6.4 2.133333-8.533333 4.266667l-38.4 66.133333c-12.8 21.333333-38.4 36.266667-64 36.266667H170.666667c-40.533333 0-74.666667-34.133333-74.666667-74.666667v-554.666666c0-40.533333 34.133333-74.666667 74.666667-74.666667h682.666666c40.533333 0 74.666667 34.133333 74.666667 74.666667V554.666667c0 40.533333-34.133333 74.666667-74.666667 74.666666z m-682.666666 42.666667h232.533333c4.266667 0 6.4-2.133333 8.533333-4.266667l38.4-66.133333c12.8-21.333333 38.4-36.266667 64-36.266667H853.333333c6.4 0 10.666667-4.266667 10.666667-10.666666v-74.666667h-704V661.333333c0 6.4 4.266667 10.666667 10.666667 10.666667z m682.666666-576H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667V416h704V106.666667c0-6.4-4.266667-10.666667-10.666667-10.666667z" horiz-adv-x="1024" />
<glyph glyph-name="good" unicode="&#59053;" d="M881.066667 501.333333c-21.333333 23.466667-51.2 36.266667-81.066667 36.266667H618.666667v117.333333c0 44.8-29.866667 85.333333-87.466667 117.333334-17.066667 10.666667-38.4 12.8-57.6 8.533333-19.2-4.266667-36.266667-17.066667-46.933333-34.133333-2.133333-2.133333-2.133333-4.266667-4.266667-6.4l-125.866667-281.6H204.8c-59.733333 0-108.8-46.933333-108.8-106.666667v-258.133333c0-57.6 49.066667-106.666667 108.8-106.666667h544c53.333333 0 98.133333 38.4 106.666667 89.6l51.2 337.066667c4.266667 34.133333-6.4 64-25.6 87.466666z m-593.066667-448H204.8c-25.6 0-44.8 19.2-44.8 42.666667v256c0 23.466667 19.2 42.666667 44.8 42.666667h83.2v-341.333334z m554.666667 373.333334L789.333333 89.6c-4.266667-21.333333-21.333333-36.266667-42.666666-36.266667H352V424.533333l130.133333 290.133334c2.133333 4.266667 4.266667 4.266667 6.4 4.266666 2.133333 0 4.266667 0 8.533334-2.133333 25.6-14.933333 55.466667-38.4 55.466666-64v-149.333333c0-17.066667 14.933333-32 32-32h213.333334c12.8 0 25.6-4.266667 34.133333-14.933334 8.533333-6.4 12.8-19.2 10.666667-29.866666z" horiz-adv-x="1024" />
<glyph glyph-name="hide" unicode="&#59054;" d="M917.333333 322.133333l-87.466666 87.466667c34.133333 32 66.133333 68.266667 91.733333 108.8 8.533333 14.933333 4.266667 34.133333-10.666667 44.8-14.933333 8.533333-34.133333 4.266667-44.8-10.666667-76.8-125.866667-209.066667-200.533333-356.266666-200.533333-145.066667 0-279.466667 74.666667-354.133334 198.4-8.533333 14.933333-29.866667 19.2-44.8 10.666667-14.933333-8.533333-19.2-29.866667-10.666666-44.8 25.6-40.533333 55.466667-76.8 91.733333-108.8l-85.333333-85.333334c-12.8-12.8-12.8-32 0-44.8 6.4-6.4 14.933333-8.533333 23.466666-8.533333s17.066667 2.133333 23.466667 8.533333l91.733333 91.733334c38.4-25.6 81.066667-46.933333 125.866667-59.733334l-34.133333-130.133333c-4.266667-17.066667 6.4-34.133333 23.466666-38.4 2.133333 0 6.4-2.133333 8.533334-2.133333 14.933333 0 27.733333 8.533333 29.866666 23.466666l36.266667 132.266667c25.6-4.266667 51.2-6.4 78.933333-6.4 27.733333 0 55.466667 2.133333 83.2 6.4l36.266667-132.266667c4.266667-14.933333 17.066667-23.466667 29.866667-23.466666 2.133333 0 6.4 0 8.533333 2.133333 17.066667 4.266667 27.733333 21.333333 23.466667 38.4L661.333333 311.466667c44.8 12.8 85.333333 34.133333 123.733334 59.733333l91.733333-91.733333c6.4-6.4 14.933333-8.533333 23.466667-8.533334s17.066667 2.133333 23.466666 8.533334c6.4 10.666667 6.4 29.866667-6.4 42.666666z" horiz-adv-x="1024" />
<glyph glyph-name="file-open" unicode="&#59055;" d="M921.6 445.866667c-6.4 8.533333-14.933333 12.8-25.6 12.8h-10.666667V554.666667c0 40.533333-34.133333 74.666667-74.666666 74.666666H514.133333c-4.266667 0-6.4 2.133333-8.533333 4.266667l-38.4 66.133333c-12.8 21.333333-38.4 36.266667-64 36.266667H170.666667c-40.533333 0-74.666667-34.133333-74.666667-74.666667v-597.333333c0-6.4 2.133333-12.8 6.4-19.2 6.4-8.533333 14.933333-12.8 25.6-12.8h640c12.8 0 25.6 8.533333 29.866667 21.333333l128 362.666667c4.266667 10.666667 2.133333 21.333333-4.266667 29.866667zM170.666667 672h232.533333c4.266667 0 6.4-2.133333 8.533333-4.266667l38.4-66.133333c12.8-21.333333 38.4-36.266667 64-36.266667H810.666667c6.4 0 10.666667-4.266667 10.666666-10.666666v-96H256c-12.8 0-25.6-8.533333-29.866667-21.333334l-66.133333-185.6V661.333333c0 6.4 4.266667 10.666667 10.666667 10.666667z m573.866666-576H172.8l104.533333 298.666667h571.733334l-104.533334-298.666667z" horiz-adv-x="1024" />
<glyph glyph-name="forward" unicode="&#59056;" d="M853.333333 138.666667H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666666V576c0 6.4 4.266667 10.666667 10.666667 10.666667h599.466666l-83.2-83.2c-12.8-12.8-12.8-34.133333 0-46.933334 6.4-6.4 14.933333-10.666667 23.466667-10.666666s17.066667 4.266667 23.466667 10.666666l145.066666 145.066667c12.8 12.8 12.8 34.133333 0 46.933333l-145.066666 145.066667c-12.8 12.8-34.133333 12.8-46.933334 0-12.8-12.8-12.8-34.133333 0-46.933333l93.866667-93.866667H170.666667c-40.533333 0-74.666667-34.133333-74.666667-74.666667v-426.666666c0-40.533333 34.133333-74.666667 74.666667-74.666667h682.666666c17.066667 0 32 14.933333 32 32s-14.933333 29.866667-32 29.866667z" horiz-adv-x="1024" />
<glyph glyph-name="import" unicode="&#59057;" d="M667.733333 32H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667V725.333333c0 6.4 4.266667 10.666667 10.666667 10.666667h309.333333V576c0-40.533333 34.133333-74.666667 74.666667-74.666667h160v-38.4c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V597.333333c0 8.533333-4.266667 17.066667-8.533334 23.466667l-170.666666 170.666667c-6.4 6.4-14.933333 8.533333-23.466667 8.533333H170.666667C130.133333 800 96 765.866667 96 725.333333v-682.666666c0-40.533333 34.133333-74.666667 74.666667-74.666667h497.066666c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z m46.933334 550.4v-17.066667H554.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667V736h19.2l151.466667-153.6zM853.333333 298.666667H599.466667l51.2 51.2c12.8 12.8 12.8 32 0 44.8-12.8 12.8-32 12.8-44.8 0l-106.666667-106.666667c-12.8-12.8-12.8-32 0-44.8l106.666667-106.666667c6.4-6.4 14.933333-8.533333 23.466666-8.533333s17.066667 2.133333 23.466667 8.533333c12.8 12.8 12.8 32 0 44.8L599.466667 234.666667H853.333333c17.066667 0 32 14.933333 32 32S870.4 298.666667 853.333333 298.666667z" horiz-adv-x="1024" />
<glyph glyph-name="link" unicode="&#59058;" d="M861.866667 731.733333c-87.466667 87.466667-230.4 89.6-320 2.133334l-68.266667-68.266667c-12.8-12.8-12.8-32 0-44.8s32-12.8 44.8 0l68.266667 68.266667c64 61.866667 166.4 61.866667 230.4-2.133334 64-64 64-168.533333 2.133333-232.533333l-117.333333-119.466667c-34.133333-34.133333-81.066667-51.2-128-49.066666-46.933333 4.266667-91.733333 27.733333-119.466667 66.133333-10.666667 14.933333-29.866667 17.066667-44.8 6.4-14.933333-10.666667-17.066667-29.866667-6.4-44.8 40.533333-53.333333 100.266667-87.466667 166.4-91.733333h17.066667c59.733333 0 119.466667 23.466667 162.133333 68.266666l117.333333 119.466667c83.2 89.6 83.2 234.666667-4.266666 322.133333zM505.6 145.066667l-66.133333-68.266667c-64-61.866667-166.4-61.866667-230.4 2.133333-64 64-64 168.533333-2.133334 232.533334l117.333334 119.466666c34.133333 34.133333 81.066667 51.2 128 49.066667 46.933333-4.266667 91.733333-27.733333 119.466666-66.133333 10.666667-14.933333 29.866667-17.066667 44.8-6.4 14.933333 10.666667 17.066667 29.866667 6.4 44.8-40.533333 53.333333-100.266667 87.466667-166.4 91.733333-66.133333 4.266667-130.133333-19.2-177.066666-66.133333l-117.333334-119.466667c-85.333333-89.6-85.333333-234.666667 2.133334-322.133333 44.8-44.8 102.4-66.133333 162.133333-66.133334 57.6 0 115.2 21.333333 160 64l66.133333 68.266667c12.8 12.8 12.8 32 0 44.8-14.933333 10.666667-34.133333 10.666667-46.933333-2.133333z" horiz-adv-x="1024" />
<glyph glyph-name="layout" unicode="&#59059;" d="M853.333333 800H170.666667C130.133333 800 96 765.866667 96 725.333333v-682.666666c0-40.533333 34.133333-74.666667 74.666667-74.666667h682.666666c40.533333 0 74.666667 34.133333 74.666667 74.666667V725.333333c0 40.533333-34.133333 74.666667-74.666667 74.666667z m-682.666666-64h682.666666c6.4 0 10.666667-4.266667 10.666667-10.666667v-213.333333h-704V725.333333c0 6.4 4.266667 10.666667 10.666667 10.666667zM160 42.666667V448H341.333333v-416H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667z m693.333333-10.666667H405.333333V448h458.666667v-405.333333c0-6.4-4.266667-10.666667-10.666667-10.666667z" horiz-adv-x="1024" />
<glyph glyph-name="fullscreen-shrink" unicode="&#59060;" d="M313.6 537.6H177.066667c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h213.333333c4.266667 0 8.533333 0 10.666667 2.133333 8.533333 4.266667 14.933333 8.533333 17.066666 17.066667 2.133333 4.266667 2.133333 8.533333 2.133334 10.666667v213.333333c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-136.533333L172.8 770.133333c-12.8 12.8-32 12.8-44.8 0-12.8-12.8-12.8-32 0-44.8l185.6-187.733333zM695.466667 245.333333H832c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32H618.666667c-4.266667 0-8.533333 0-10.666667-2.133333-8.533333-4.266667-14.933333-8.533333-17.066667-17.066667-2.133333-4.266667-2.133333-8.533333-2.133333-10.666666v-213.333334c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v136.533334l200.533333-200.533334c6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466667 8.533333c12.8 12.8 12.8 32 0 44.8l-204.8 198.4zM435.2 290.133333c-4.266667 8.533333-8.533333 14.933333-17.066667 17.066667-4.266667 2.133333-8.533333 2.133333-10.666666 2.133333H192c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h136.533333L128 44.8c-12.8-12.8-12.8-32 0-44.8 6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466666 8.533333l200.533334 200.533333V64c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V277.333333c-2.133333 4.266667-2.133333 8.533333-4.266667 12.8zM603.733333 492.8c4.266667-8.533333 8.533333-14.933333 17.066667-17.066667 4.266667-2.133333 8.533333-2.133333 10.666667-2.133333h213.333333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32h-136.533333L896 725.333333c12.8 12.8 12.8 32 0 44.8-12.8 12.8-32 12.8-44.8 0l-187.733333-187.733333V718.933333c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-213.333333c2.133333-4.266667 2.133333-8.533333 4.266666-12.8z" horiz-adv-x="1024" />
<glyph glyph-name="layers" unicode="&#59061;" d="M110.933333 544l384-192c4.266667-2.133333 10.666667-4.266667 17.066667-4.266667s10.666667 2.133333 17.066667 4.266667l384 192c12.8 6.4 19.2 19.2 19.2 32s-8.533333 25.6-19.2 32l-384 192c-10.666667 4.266667-21.333333 4.266667-32 0l-384-192c-12.8-6.4-19.2-19.2-19.2-32s6.4-25.6 17.066666-32zM512 727.466667L814.933333 576 512 424.533333 209.066667 576 512 727.466667zM878.933333 224L512 40.533333 145.066667 224c-17.066667 8.533333-38.4 2.133333-49.066667-17.066667-8.533333-17.066667-2.133333-38.4 17.066667-49.066666l384-192c4.266667-2.133333 10.666667-4.266667 17.066666-4.266667s10.666667 2.133333 17.066667 4.266667l384 192c17.066667 8.533333 25.6 29.866667 17.066667 49.066666-12.8 19.2-34.133333 25.6-53.333334 17.066667zM878.933333 416L512 232.533333 145.066667 416c-17.066667 8.533333-38.4 2.133333-49.066667-17.066667-8.533333-17.066667-2.133333-38.4 17.066667-49.066666l384-192c4.266667-2.133333 10.666667-4.266667 17.066666-4.266667s10.666667 2.133333 17.066667 4.266667l384 192c17.066667 8.533333 25.6 29.866667 17.066667 49.066666-12.8 19.2-34.133333 25.6-53.333334 17.066667z" horiz-adv-x="1024" />
<glyph glyph-name="lock" unicode="&#59062;" d="M785.066667 480h-61.866667v121.6c0 108.8-91.733333 198.4-202.666667 198.4s-202.666667-89.6-202.666666-198.4v-121.6h-78.933334c-55.466667 0-100.266667-44.8-100.266666-100.266667v-311.466666c0-55.466667 44.8-100.266667 100.266666-100.266667h546.133334c55.466667 0 100.266667 44.8 100.266666 100.266667V379.733333c0 55.466667-44.8 100.266667-100.266666 100.266667z m-403.2 121.6c0 74.666667 61.866667 134.4 138.666666 134.4s138.666667-59.733333 138.666667-134.4v-121.6h-277.333333v121.6z m439.466666-533.333333c0-19.2-17.066667-36.266667-36.266666-36.266667H238.933333c-19.2 0-36.266667 17.066667-36.266666 36.266667V379.733333c0 19.2 17.066667 36.266667 36.266666 36.266667h546.133334c19.2 0 36.266667-17.066667 36.266666-36.266667v-311.466666zM512 352c-17.066667 0-32-14.933333-32-32v-106.666667c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v106.666667c0 17.066667-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="fullscreen-expand" unicode="&#59063;" d="M149.333333 501.333333c17.066667 0 32 14.933333 32 32v136.533334l187.733334-187.733334c6.4-6.4 14.933333-8.533333 23.466666-8.533333s17.066667 2.133333 23.466667 8.533333c12.8 12.8 12.8 32 0 44.8l-187.733333 187.733334H362.666667c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32H149.333333c-4.266667 0-8.533333 0-10.666666-2.133334-8.533333-4.266667-14.933333-10.666667-19.2-17.066666-2.133333-4.266667-2.133333-8.533333-2.133334-12.8v-213.333334c0-17.066667 14.933333-32 32-32zM874.666667 266.666667c-17.066667 0-32-14.933333-32-32v-136.533334L642.133333 298.666667c-12.8 12.8-32 12.8-44.8 0s-12.8-32 0-44.8l200.533334-200.533334H661.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h213.333334c4.266667 0 8.533333 0 10.666666 2.133334 8.533333 4.266667 14.933333 8.533333 17.066667 17.066666 2.133333 4.266667 2.133333 8.533333 2.133333 10.666667V234.666667c2.133333 17.066667-12.8 32-29.866666 32zM381.866667 300.8l-200.533334-200.533333V234.666667c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-213.333334c0-4.266667 0-8.533333 2.133334-10.666666 4.266667-8.533333 8.533333-14.933333 17.066666-17.066667 4.266667-2.133333 8.533333-2.133333 10.666667-2.133333h213.333333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32h-136.533333l200.533333 200.533333c12.8 12.8 12.8 32 0 44.8s-29.866667 10.666667-42.666666 0zM904.533333 757.333333c0 2.133333 0 2.133333 0 0-4.266667 8.533333-10.666667 14.933333-17.066666 17.066667-4.266667 2.133333-8.533333 2.133333-10.666667 2.133333H661.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h136.533334l-187.733334-187.733333c-12.8-12.8-12.8-32 0-44.8 6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466667 8.533333l187.733333 187.733333V533.333333c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V746.666667c-2.133333 4.266667-2.133333 8.533333-4.266667 10.666666z" horiz-adv-x="1024" />
<glyph glyph-name="map" unicode="&#59064;" d="M512 821.333333C317.866667 821.333333 160 661.333333 160 467.2c0-264.533333 320-484.266667 334.933333-492.8 6.4-4.266667 10.666667-6.4 17.066667-6.4s12.8 2.133333 17.066667 6.4c12.8 8.533333 334.933333 228.266667 334.933333 492.8C864 661.333333 706.133333 821.333333 512 821.333333z m0-782.933333c-66.133333 49.066667-288 228.266667-288 426.666667 0 160 130.133333 290.133333 288 290.133333s288-130.133333 288-290.133333c0-196.266667-221.866667-377.6-288-426.666667zM512 586.666667c-76.8 0-138.666667-61.866667-138.666667-138.666667s61.866667-138.666667 138.666667-138.666667 138.666667 61.866667 138.666667 138.666667-61.866667 138.666667-138.666667 138.666667z m0-213.333334c-40.533333 0-74.666667 34.133333-74.666667 74.666667s34.133333 74.666667 74.666667 74.666667 74.666667-34.133333 74.666667-74.666667-34.133333-74.666667-74.666667-74.666667z" horiz-adv-x="1024" />
<glyph glyph-name="meh" unicode="&#59065;" d="M512-53.333333C270.933333-53.333333 74.666667 142.933333 74.666667 384S270.933333 821.333333 512 821.333333 949.333333 625.066667 949.333333 384 753.066667-53.333333 512-53.333333z m0 810.666666C307.2 757.333333 138.666667 588.8 138.666667 384S307.2 10.666667 512 10.666667 885.333333 179.2 885.333333 384 716.8 757.333333 512 757.333333zM362.666667 384c-23.466667 0-42.666667 19.2-42.666667 42.666667v64c0 23.466667 19.2 42.666667 42.666667 42.666666s42.666667-19.2 42.666666-42.666666v-64c0-23.466667-19.2-42.666667-42.666666-42.666667zM661.333333 384c-23.466667 0-42.666667 19.2-42.666666 42.666667v64c0 23.466667 19.2 42.666667 42.666666 42.666666s42.666667-19.2 42.666667-42.666666v-64c0-23.466667-19.2-42.666667-42.666667-42.666667zM699.733333 181.333333H324.266667c-17.066667 0-32 14.933333-32 32s14.933333 32 32 32h373.333333c17.066667 0 32-14.933333 32-32s-12.8-32-29.866667-32z" horiz-adv-x="1024" />
<glyph glyph-name="menu" unicode="&#59066;" d="M170.666667 682.666667m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM170.666667 384m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM170.666667 85.333333m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM896 117.333333H362.666667c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h533.333333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM362.666667 650.666667h533.333333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32H362.666667c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32zM896 416H362.666667c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h533.333333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="loading" unicode="&#59067;" d="M512 821.333333c-17.066667 0-32-14.933333-32-32v-149.333333c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V789.333333c0 17.066667-14.933333 32-32 32zM693.333333 533.333333c8.533333 0 17.066667 2.133333 23.466667 8.533334l104.533333 104.533333c12.8 12.8 12.8 32 0 44.8-12.8 12.8-32 12.8-44.8 0l-104.533333-104.533333c-12.8-12.8-12.8-32 0-44.8 4.266667-6.4 12.8-8.533333 21.333333-8.533334zM917.333333 416h-149.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h149.333333c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM714.666667 226.133333c-12.8 12.8-32 12.8-44.8 0s-12.8-32 0-44.8l104.533333-104.533333c6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466666 8.533333c12.8 12.8 12.8 32 0 44.8l-106.666666 104.533333zM512 160c-17.066667 0-32-14.933333-32-32v-149.333333c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v149.333333c0 17.066667-14.933333 32-32 32zM309.333333 226.133333l-104.533333-104.533333c-12.8-12.8-12.8-32 0-44.8 6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466666 8.533333l104.533334 104.533333c12.8 12.8 12.8 32 0 44.8s-36.266667 12.8-46.933334 0zM288 384c0 17.066667-14.933333 32-32 32H106.666667c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h149.333333c17.066667 0 32 14.933333 32 32zM247.466667 693.333333c-12.8 12.8-32 12.8-44.8 0-12.8-12.8-12.8-32 0-44.8l104.533333-104.533333c6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466666 8.533333c12.8 12.8 12.8 32 0 44.8l-106.666666 104.533333z" horiz-adv-x="1024" />
<glyph glyph-name="help" unicode="&#59068;" d="M512 821.333333C270.933333 821.333333 74.666667 625.066667 74.666667 384S270.933333-53.333333 512-53.333333 949.333333 142.933333 949.333333 384 753.066667 821.333333 512 821.333333z m0-810.666666c-204.8 0-373.333333 168.533333-373.333333 373.333333S307.2 757.333333 512 757.333333 885.333333 588.8 885.333333 384 716.8 10.666667 512 10.666667zM512 149.333333m-42.666667 0a42.666667 42.666667 0 1 1 85.333334 0 42.666667 42.666667 0 1 1-85.333334 0ZM512 650.666667c-76.8 0-138.666667-61.866667-138.666667-138.666667 0-17.066667 14.933333-32 32-32s32 14.933333 32 32c0 40.533333 34.133333 74.666667 74.666667 74.666667s74.666667-34.133333 74.666667-74.666667c0-27.733333-53.333333-76.8-91.733334-100.266667-8.533333-6.4-14.933333-17.066667-14.933333-27.733333v-106.666667c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v89.6c34.133333 25.6 106.666667 83.2 106.666667 145.066667 0 76.8-61.866667 138.666667-138.666667 138.666667z" horiz-adv-x="1024" />
<glyph glyph-name="modular" unicode="&#59069;" d="M405.333333 437.333333H149.333333c-29.866667 0-53.333333 23.466667-53.333333 53.333334V746.666667c0 29.866667 23.466667 53.333333 53.333333 53.333333h256c29.866667 0 53.333333-23.466667 53.333334-53.333333v-256c0-29.866667-23.466667-53.333333-53.333334-53.333334z m-245.333333 64h234.666667v234.666667h-234.666667v-234.666667zM874.666667 437.333333H618.666667c-29.866667 0-53.333333 23.466667-53.333334 53.333334V746.666667c0 29.866667 23.466667 53.333333 53.333334 53.333333h256c29.866667 0 53.333333-23.466667 53.333333-53.333333v-256c0-29.866667-23.466667-53.333333-53.333333-53.333334z m-245.333334 64h234.666667v234.666667h-234.666667v-234.666667zM874.666667-32H618.666667c-29.866667 0-53.333333 23.466667-53.333334 53.333333V277.333333c0 29.866667 23.466667 53.333333 53.333334 53.333334h256c29.866667 0 53.333333-23.466667 53.333333-53.333334v-256c0-29.866667-23.466667-53.333333-53.333333-53.333333z m-245.333334 64h234.666667v234.666667h-234.666667v-234.666667zM405.333333-32H149.333333c-29.866667 0-53.333333 23.466667-53.333333 53.333333V277.333333c0 29.866667 23.466667 53.333333 53.333333 53.333334h256c29.866667 0 53.333333-23.466667 53.333334-53.333334v-256c0-29.866667-23.466667-53.333333-53.333334-53.333333z m-245.333333 64h234.666667v234.666667h-234.666667v-234.666667z" horiz-adv-x="1024" />
<glyph glyph-name="notification" unicode="&#59070;" d="M800 270.933333V448c0 117.333333-70.4 217.6-170.666667 262.4-4.266667 61.866667-55.466667 110.933333-117.333333 110.933333s-113.066667-49.066667-117.333333-110.933333c-100.266667-44.8-170.666667-145.066667-170.666667-262.4v-177.066667c-57.6-46.933333-85.333333-110.933333-85.333333-185.6 0-17.066667 14.933333-32 32-32h206.933333c14.933333-61.866667 70.4-106.666667 134.4-106.666666s119.466667 44.8 134.4 106.666666H853.333333c17.066667 0 32 14.933333 32 32 0 76.8-27.733333 138.666667-85.333333 185.6zM512 757.333333c19.2 0 36.266667-10.666667 44.8-25.6-14.933333 2.133333-29.866667 4.266667-44.8 4.266667-14.933333 0-29.866667-2.133333-44.8-4.266667 8.533333 14.933333 25.6 25.6 44.8 25.6z m0-746.666666c-29.866667 0-55.466667 17.066667-66.133333 42.666666h134.4c-12.8-25.6-38.4-42.666667-68.266667-42.666666z m-307.2 106.666666c6.4 46.933333 29.866667 83.2 70.4 113.066667 8.533333 6.4 12.8 14.933333 12.8 25.6v192c0 123.733333 100.266667 224 224 224S736 571.733333 736 448v-192c0-10.666667 4.266667-19.2 12.8-25.6 40.533333-29.866667 64-66.133333 70.4-113.066667H204.8z" horiz-adv-x="1024" />
<glyph glyph-name="mic" unicode="&#59071;" d="M516.266667 238.933333c78.933333 0 142.933333 64 142.933333 142.933334V678.4a142.933333 142.933333 0 0 1-285.866667 0v-296.533333c0-78.933333 64-142.933333 142.933334-142.933334z m-78.933334 439.466667c0 42.666667 36.266667 78.933333 78.933334 78.933333s78.933333-36.266667 78.933333-78.933333v-296.533333c0-42.666667-36.266667-78.933333-78.933333-78.933334s-78.933333 36.266667-78.933334 78.933334V678.4zM774.4 486.4c-17.066667 0-32-14.933333-32-32v-74.666667c0-125.866667-102.4-228.266667-228.266667-228.266666S288 256 288 381.866667v74.666666c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-74.666666c0-149.333333 113.066667-273.066667 260.266667-290.133334v-85.333333h-117.333334c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h296.533334c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32h-117.333334v85.333333c145.066667 14.933333 260.266667 140.8 260.266667 290.133334v74.666666c0 17.066667-12.8 29.866667-32 29.866667z" horiz-adv-x="1024" />
<glyph glyph-name="operation" unicode="&#59073;" d="M823.466667 384H578.133333v187.733333c0 66.133333-53.333333 119.466667-117.333333 119.466667s-117.333333-53.333333-117.333333-119.466667v-296.533333l-21.333334 21.333333c-46.933333 46.933333-121.6 46.933333-168.533333 2.133334s-44.8-121.6 2.133333-168.533334l174.933334-174.933333c6.4-6.4 14.933333-8.533333 23.466666-8.533333 8.533333 0 17.066667 2.133333 23.466667 8.533333 12.8 12.8 12.8 32 0 44.8l-174.933333 174.933333c-21.333333 21.333333-23.466667 57.6-2.133334 76.8 21.333333 21.333333 55.466667 19.2 76.8-2.133333l74.666667-74.666667c12.8-12.8 32-12.8 44.8 0 6.4 6.4 8.533333 14.933333 8.533333 23.466667V569.6c0 29.866667 23.466667 55.466667 53.333334 55.466667s53.333333-25.6 53.333333-55.466667v-219.733333c0-17.066667 14.933333-32 32-32h277.333333c6.4 0 10.666667-6.4 10.666667-12.8V-21.333333c0-17.066667 14.933333-32 32-32S896-38.4 896-21.333333V309.333333c2.133333 40.533333-32 74.666667-72.533333 74.666667zM266.666667 565.333333c17.066667 0 32 14.933333 32 32 0 87.466667 72.533333 160 160 160S618.666667 684.8 618.666667 597.333333c0-17.066667 14.933333-32 32-32S682.666667 580.266667 682.666667 597.333333c0 123.733333-100.266667 224-224 224S234.666667 721.066667 234.666667 597.333333c0-17.066667 14.933333-32 32-32z" horiz-adv-x="1024" />
<glyph glyph-name="print" unicode="&#59074;" d="M819.2 531.2h-44.8V768c0 17.066667-14.933333 32-32 32H281.6c-17.066667 0-32-14.933333-32-32v-236.8H204.8c-59.733333 0-108.8-49.066667-108.8-108.8v-192c0-59.733333 49.066667-108.8 108.8-108.8h44.8V0c0-17.066667 14.933333-32 32-32h460.8c17.066667 0 32 14.933333 32 32v121.6h44.8c59.733333 0 108.8 49.066667 108.8 108.8v192c0 59.733333-49.066667 108.8-108.8 108.8zM313.6 736h396.8v-204.8H313.6V736z m396.8-704H313.6V275.2h396.8v-243.2z m153.6 198.4c0-25.6-19.2-44.8-44.8-44.8h-44.8v121.6c0 17.066667-14.933333 32-32 32H281.6c-17.066667 0-32-14.933333-32-32v-121.6H204.8c-25.6 0-44.8 19.2-44.8 44.8v192c0 25.6 19.2 44.8 44.8 44.8h614.4c25.6 0 44.8-19.2 44.8-44.8v-192z" horiz-adv-x="1024" />
<glyph glyph-name="mobile-phone" unicode="&#59075;" d="M746.666667-53.333333H277.333333c-40.533333 0-74.666667 34.133333-74.666666 74.666666V746.666667c0 40.533333 34.133333 74.666667 74.666666 74.666666h469.333334c40.533333 0 74.666667-34.133333 74.666666-74.666666v-725.333334c0-40.533333-34.133333-74.666667-74.666666-74.666666z m-469.333334 810.666666c-6.4 0-10.666667-4.266667-10.666666-10.666666v-725.333334c0-6.4 4.266667-10.666667 10.666666-10.666666h469.333334c6.4 0 10.666667 4.266667 10.666666 10.666666V746.666667c0 6.4-4.266667 10.666667-10.666666 10.666666H277.333333zM512 128m-42.666667 0a42.666667 42.666667 0 1 1 85.333334 0 42.666667 42.666667 0 1 1-85.333334 0ZM597.333333 650.666667h-170.666666c-17.066667 0-32 14.933333-32 32s14.933333 32 32 32h170.666666c17.066667 0 32-14.933333 32-32s-14.933333-32-32-32z" horiz-adv-x="1024" />
<glyph glyph-name="navigation" unicode="&#59076;" d="M834.133333 682.666667c-6.4 12.8-17.066667 23.466667-29.866666 27.733333-12.8 4.266667-27.733333 4.266667-40.533334-2.133333L106.666667 394.666667c-14.933333-6.4-25.6-21.333333-29.866667-36.266667-6.4-27.733333 12.8-57.6 40.533333-64l249.6-53.333333 53.333334-249.6c4.266667-17.066667 14.933333-29.866667 29.866666-36.266667 6.4-4.266667 14.933333-4.266667 23.466667-4.266667 19.2 0 38.4 10.666667 49.066667 29.866667l313.6 657.066667c6.4 12.8 6.4 29.866667-2.133334 44.8zM477.866667 34.133333L426.666667 273.066667c-2.133333 12.8-12.8 21.333333-23.466667 23.466666L162.133333 349.866667l601.6 288-285.866666-603.733334z" horiz-adv-x="1024" />
<glyph glyph-name="move" unicode="&#59077;" d="M921.6 403.2l-121.6 121.6c-12.8 12.8-32 12.8-44.8 0s-12.8-32 0-44.8l66.133333-66.133333h-277.333333v277.333333l66.133333-66.133333c6.4-6.4 14.933333-8.533333 23.466667-8.533334s17.066667 2.133333 23.466667 8.533334c12.8 12.8 12.8 32 0 44.8l-121.6 121.6c-12.8 12.8-32 12.8-44.8 0l-121.6-121.6c-12.8-12.8-12.8-32 0-44.8 12.8-12.8 32-12.8 44.8 0l66.133333 66.133333v-277.333333h-277.333333l66.133333 66.133333c12.8 12.8 12.8 32 0 44.8-12.8 12.8-32 12.8-44.8 0l-121.6-121.6c-12.8-12.8-12.8-32 0-44.8l121.6-121.6c6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466666 8.533333c12.8 12.8 12.8 32 0 44.8l-66.133333 66.133333h277.333333v-277.333333l-66.133333 66.133333c-12.8 12.8-32 12.8-44.8 0s-12.8-32 0-44.8l121.6-121.6c6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466666 8.533333l121.6 121.6c12.8 12.8 12.8 32 0 44.8s-32 12.8-44.8 0l-66.133333-66.133333v277.333333h277.333333l-66.133333-66.133333c-12.8-12.8-12.8-32 0-44.8 6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466666 8.533333l121.6 121.6c6.4 6.4 8.533333 14.933333 8.533334 23.466667s-10.666667 14.933333-17.066667 21.333333z" horiz-adv-x="1024" />
<glyph glyph-name="refresh" unicode="&#59078;" d="M934.4 689.066667c-17.066667 4.266667-34.133333-6.4-38.4-23.466667l-23.466667-87.466667C797.866667 712.533333 654.933333 800 497.066667 800 264.533333 800 74.666667 614.4 74.666667 384s189.866667-416 422.4-416c179.2 0 339.2 110.933333 398.933333 275.2 6.4 17.066667-2.133333 34.133333-19.2 40.533333-17.066667 6.4-34.133333-2.133333-40.533333-19.2-51.2-138.666667-187.733333-232.533333-339.2-232.533333C298.666667 32 138.666667 189.866667 138.666667 384S300.8 736 497.066667 736c145.066667 0 277.333333-87.466667 330.666666-217.6l-128 36.266667c-17.066667 4.266667-34.133333-6.4-38.4-23.466667-4.266667-17.066667 6.4-34.133333 23.466667-38.4l185.6-49.066667c2.133333 0 6.4-2.133333 8.533333-2.133333 6.4 0 10.666667 2.133333 17.066667 4.266667 6.4 4.266667 12.8 10.666667 14.933333 19.2l49.066667 185.6c0 17.066667-8.533333 34.133333-25.6 38.4z" horiz-adv-x="1024" />
<glyph glyph-name="run-up" unicode="&#59079;" d="M409.6 601.338776l71.053061 71.053061v-248.685715c0-16.718367 14.628571-31.346939 31.346939-31.346938s31.346939 14.628571 31.346939 31.346938v250.775511l71.053061-71.053062c6.269388-6.269388 14.628571-8.359184 22.987755-8.359183s16.718367 2.089796 22.987755 8.359183c12.538776 12.538776 12.538776 31.346939 0 43.885715l-125.387755 125.387755c-12.538776 12.538776-31.346939 12.538776-43.885714 0l-125.387755-125.387755c-12.538776-12.538776-12.538776-31.346939 0-43.885715 10.44898-12.538776 31.346939-12.538776 43.885714-2.089795zM936.228571 444.604082l-242.416326 81.50204c-16.718367 6.269388-33.436735-4.179592-39.706123-18.808163-6.269388-16.718367 4.179592-33.436735 18.808164-39.706122l156.734694-52.244898L512 302.497959 194.35102 415.346939l156.734694 52.244898c16.718367 6.269388 25.077551 22.987755 18.808164 39.706122-6.269388 16.718367-22.987755 25.077551-39.706123 18.808163L87.771429 444.604082c-12.538776-4.179592-20.897959-16.718367-20.89796-29.257143 0-12.538776 8.359184-25.077551 20.89796-29.257143l413.779591-146.285714c4.179592-2.089796 6.269388-2.089796 10.44898-2.089796s6.269388 0 10.44898 2.089796l413.779591 146.285714c12.538776 4.179592 20.897959 16.718367 20.89796 29.257143 0 14.628571-8.359184 25.077551-20.89796 29.257143zM512 181.289796c-16.718367 0-31.346939-14.628571-31.346939-31.346939v-156.734694c0-16.718367 14.628571-31.346939 31.346939-31.346939s31.346939 14.628571 31.346939 31.346939v156.734694c0 16.718367-14.628571 31.346939-31.346939 31.346939z" horiz-adv-x="1024" />
<glyph glyph-name="picture" unicode="&#59080;" d="M819.2 800H204.8c-59.733333 0-108.8-49.066667-108.8-108.8v-616.533333c0-59.733333 49.066667-108.8 108.8-108.8h616.533333c59.733333 0 108.8 49.066667 108.8 108.8V691.2c-2.133333 59.733333-51.2 108.8-110.933333 108.8zM160 76.8V691.2c0 23.466667 19.2 44.8 44.8 44.8h616.533333c23.466667 0 44.8-19.2 44.8-44.8v-388.266667l-125.866666 125.866667c-27.733333 27.733333-76.8 27.733333-104.533334 0l-390.4-384c-4.266667-4.266667-6.4-8.533333-6.4-12.8H204.8c-25.6 0-44.8 19.2-44.8 44.8z m659.2-44.8H324.266667l354.133333 354.133333c2.133333 2.133333 6.4 2.133333 8.533333 2.133334s4.266667 0 8.533334-2.133334l160-160c4.266667-4.266667 8.533333-6.4 12.8-6.4v-142.933333c-4.266667-25.6-23.466667-44.8-49.066667-44.8zM375.466667 413.866667c59.733333 0 106.666667 46.933333 106.666666 106.666666s-46.933333 106.666667-106.666666 106.666667-106.666667-46.933333-106.666667-106.666667 49.066667-106.666667 106.666667-106.666666z m0 149.333333c23.466667 0 42.666667-19.2 42.666666-42.666667s-19.2-42.666667-42.666666-42.666666-42.666667 19.2-42.666667 42.666666 19.2 42.666667 42.666667 42.666667z" horiz-adv-x="1024" />
<glyph glyph-name="run-in" unicode="&#59081;" d="M612.352 130.048l-69.632-69.632V179.2c0 16.384-14.336 30.72-30.72 30.72s-30.72-14.336-30.72-30.72v-120.832l-69.632 69.632c-12.288 12.288-30.72 12.288-43.008 0s-12.288-30.72 0-43.008l122.88-122.88c6.144-6.144 14.336-8.192 22.528-8.192s16.384 2.048 22.528 8.192l122.88 122.88c12.288 12.288 12.288 30.72 0 43.008s-34.816 12.288-47.104 2.048zM927.744 474.112l-237.568 79.872c-16.384 6.144-32.768-4.096-38.912-18.432-6.144-16.384 4.096-32.768 18.432-38.912l153.6-51.2L512 334.848 200.704 445.44l153.6 51.2c16.384 6.144 24.576 22.528 18.432 38.912-6.144 16.384-22.528 24.576-38.912 18.432L96.256 474.112c-12.288-4.096-20.48-16.384-20.48-28.672 0-12.288 8.192-24.576 20.48-28.672l405.504-143.36c4.096-2.048 6.144-2.048 10.24-2.048s6.144 0 10.24 2.048l405.504 143.36c12.288 4.096 20.48 16.384 20.48 28.672 0 14.336-8.192 24.576-20.48 28.672zM512 394.24c16.384 0 30.72 14.336 30.72 30.72V742.4c0 16.384-14.336 30.72-30.72 30.72s-30.72-14.336-30.72-30.72V424.96c0-16.384 14.336-30.72 30.72-30.72z" horiz-adv-x="1024" />
<glyph glyph-name="pin" unicode="&#59082;" d="M911.15102 572.081633L689.632653 793.6c-18.808163 18.808163-50.155102 20.897959-71.053061 2.089796l-267.493878-229.877551-96.130612-14.628572c-6.269388 0-12.538776-4.179592-16.718367-8.359183l-58.514286-58.514286c-20.897959-20.897959-20.897959-54.334694 0-73.142857l152.555102-152.555102L125.387755 51.722449c-12.538776-12.538776-12.538776-31.346939 0-43.885714 6.269388-6.269388 14.628571-10.44898 20.897959-10.44898s16.718367 2.089796 22.987755 8.359184l204.8 204.8 152.555102-152.555102c10.44898-10.44898 22.987755-14.628571 37.616327-14.628572s27.167347 6.269388 37.616326 14.628572l58.514286 58.514285c4.179592 4.179592 8.359184 10.44898 8.359184 16.718368l14.628571 96.130612 227.787755 267.493878c18.808163 25.077551 18.808163 56.42449 0 75.232653zM631.118367 266.971429c-4.179592-4.179592-6.269388-10.44898-6.269387-14.628572l-14.628572-94.040816-45.97551-45.97551-334.367347 334.367347 43.885714 43.885714 94.040817 14.628571c6.269388 0 10.44898 4.179592 14.628571 6.269388l269.583674 229.877551 206.889795-206.889796-227.787755-267.493877z" horiz-adv-x="1024" />
<glyph glyph-name="save" unicode="&#59083;" d="M906.666667 597.333333L725.333333 778.666667c-14.933333 14.933333-32 21.333333-53.333333 21.333333H170.666667C130.133333 800 96 765.866667 96 725.333333v-682.666666c0-40.533333 34.133333-74.666667 74.666667-74.666667h682.666666c40.533333 0 74.666667 34.133333 74.666667 74.666667V546.133333c0 19.2-8.533333 38.4-21.333333 51.2zM652.8 32H371.2V247.466667h281.6v-215.466667z m211.2 10.666667c0-6.4-4.266667-10.666667-10.666667-10.666667h-140.8V277.333333c0 17.066667-12.8 29.866667-29.866666 29.866667H341.333333c-17.066667 0-29.866667-12.8-29.866666-29.866667v-245.333333H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667V725.333333c0 6.4 4.266667 10.666667 10.666667 10.666667h140.8V576c0-17.066667 12.8-29.866667 29.866666-29.866667h277.333334c17.066667 0 29.866667 12.8 29.866666 29.866667s-12.8 29.866667-29.866666 29.866667H371.2V736h302.933333c2.133333 0 6.4-2.133333 8.533334-2.133333l179.2-179.2c2.133333-2.133333 2.133333-4.266667 2.133333-8.533334V42.666667z" horiz-adv-x="1024" />
<glyph glyph-name="search" unicode="&#59084;" d="M945.066667-2.133333l-189.866667 189.866666c55.466667 64 87.466667 149.333333 87.466667 241.066667 0 204.8-168.533333 373.333333-373.333334 373.333333S96 631.466667 96 426.666667 264.533333 53.333333 469.333333 53.333333c91.733333 0 174.933333 34.133333 241.066667 87.466667l189.866667-189.866667c6.4-6.4 14.933333-8.533333 23.466666-8.533333s17.066667 2.133333 23.466667 8.533333c8.533333 12.8 8.533333 34.133333-2.133333 46.933334zM469.333333 117.333333C298.666667 117.333333 160 256 160 426.666667S298.666667 736 469.333333 736 778.666667 597.333333 778.666667 426.666667 640 117.333333 469.333333 117.333333z" horiz-adv-x="1024" />
<glyph glyph-name="share" unicode="&#59085;" d="M874.666667 352c-17.066667 0-32-14.933333-32-32v-256c0-6.4-4.266667-10.666667-10.666667-10.666667H192c-6.4 0-10.666667 4.266667-10.666667 10.666667V704c0 6.4 4.266667 10.666667 10.666667 10.666667h256c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32H192C151.466667 778.666667 117.333333 744.533333 117.333333 704v-640c0-40.533333 34.133333-74.666667 74.666667-74.666667h640c40.533333 0 74.666667 34.133333 74.666667 74.666667V320c0 17.066667-14.933333 32-32 32zM874.666667 778.666667H640c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h157.866667L509.866667 428.8c-12.8-12.8-12.8-32 0-44.8 6.4-6.4 14.933333-8.533333 23.466666-8.533333s17.066667 2.133333 23.466667 8.533333l285.866667 285.866667V512c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V746.666667c0 17.066667-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="scanning" unicode="&#59086;" d="M341.333333 32H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667v170.666666c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-170.666666c0-40.533333 34.133333-74.666667 74.666667-74.666667h170.666666c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM896 245.333333c-17.066667 0-32-14.933333-32-32v-170.666666c0-6.4-4.266667-10.666667-10.666667-10.666667h-170.666666c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h170.666666c40.533333 0 74.666667 34.133333 74.666667 74.666667v170.666666c0 17.066667-14.933333 32-32 32zM128 522.666667c17.066667 0 32 14.933333 32 32V725.333333c0 6.4 4.266667 10.666667 10.666667 10.666667h170.666666c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32H170.666667C130.133333 800 96 765.866667 96 725.333333v-170.666666c0-17.066667 14.933333-32 32-32zM853.333333 800h-170.666666c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h170.666666c6.4 0 10.666667-4.266667 10.666667-10.666667v-170.666666c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V725.333333c0 40.533333-34.133333 74.666667-74.666667 74.666667zM896 426.666667H128c-17.066667 0-32-14.933333-32-32S110.933333 362.666667 128 362.666667h768c17.066667 0 32 14.933333 32 32S913.066667 426.666667 896 426.666667z" horiz-adv-x="1024" />
<glyph glyph-name="security" unicode="&#59087;" d="M814.933333 716.8L529.066667 817.066667c-10.666667 4.266667-23.466667 4.266667-34.133334 0L209.066667 716.8c-29.866667-10.666667-49.066667-38.4-49.066667-70.4V298.666667c0-194.133333 157.866667-352 352-352S864 104.533333 864 298.666667V646.4c0 32-19.2 61.866667-49.066667 70.4zM800 298.666667c0-157.866667-130.133333-288-288-288S224 140.8 224 298.666667V646.4c0 4.266667 2.133333 8.533333 6.4 10.666667L512 755.2l281.6-98.133333c4.266667-2.133333 6.4-6.4 6.4-10.666667V298.666667zM659.2 492.8l-192-194.133333-85.333333 68.266666c-12.8 10.666667-34.133333 8.533333-44.8-4.266666-10.666667-12.8-8.533333-34.133333 4.266666-44.8l106.666667-85.333334c6.4-4.266667 12.8-6.4 19.2-6.4 8.533333 0 17.066667 2.133333 23.466667 8.533334l213.333333 213.333333c12.8 12.8 12.8 32 0 44.8-10.666667 10.666667-32 10.666667-44.8 0z" horiz-adv-x="1024" />
<glyph glyph-name="select" unicode="&#59088;" d="M409.6 138.666667c-8.533333 0-17.066667 2.133333-23.466667 8.533333l-238.933333 234.666667c-12.8 12.8-12.8 32 0 44.8 12.8 12.8 32 12.8 44.8 0l215.466667-213.333334 422.4 428.8c12.8 12.8 32 12.8 44.8 0 12.8-12.8 12.8-32 0-44.8L430.933333 149.333333c-4.266667-8.533333-12.8-10.666667-21.333333-10.666666z" horiz-adv-x="1024" />
<glyph glyph-name="stop" unicode="&#59089;" d="M512 821.333333C270.933333 821.333333 74.666667 625.066667 74.666667 384S270.933333-53.333333 512-53.333333 949.333333 142.933333 949.333333 384 753.066667 821.333333 512 821.333333zM885.333333 384c0-85.333333-29.866667-164.266667-78.933333-228.266667l-533.333333 514.133334c64 55.466667 149.333333 87.466667 238.933333 87.466666 204.8 0 373.333333-168.533333 373.333333-373.333333z m-746.666666 0c0 91.733333 34.133333 174.933333 87.466666 241.066667l535.466667-516.266667c-66.133333-59.733333-153.6-98.133333-251.733333-98.133333-202.666667 0-371.2 168.533333-371.2 373.333333z" horiz-adv-x="1024" />
<glyph glyph-name="smile" unicode="&#59090;" d="M512 821.333333C270.933333 821.333333 74.666667 625.066667 74.666667 384S270.933333-53.333333 512-53.333333 949.333333 142.933333 949.333333 384 753.066667 821.333333 512 821.333333z m0-810.666666c-204.8 0-373.333333 168.533333-373.333333 373.333333S307.2 757.333333 512 757.333333 885.333333 588.8 885.333333 384 716.8 10.666667 512 10.666667zM674.133333 288c-46.933333-57.6-100.266667-85.333333-162.133333-85.333333s-115.2 27.733333-162.133333 85.333333c-10.666667 12.8-32 14.933333-44.8 4.266667-12.8-10.666667-14.933333-32-4.266667-44.8 59.733333-70.4 130.133333-106.666667 211.2-106.666667s151.466667 36.266667 211.2 106.666667c10.666667 12.8 8.533333 34.133333-4.266667 44.8-12.8 10.666667-34.133333 8.533333-44.8-4.266667zM362.666667 384c23.466667 0 42.666667 19.2 42.666666 42.666667v64c0 23.466667-19.2 42.666667-42.666666 42.666666s-42.666667-19.2-42.666667-42.666666v-64c0-23.466667 19.2-42.666667 42.666667-42.666667zM661.333333 384c23.466667 0 42.666667 19.2 42.666667 42.666667v64c0 23.466667-19.2 42.666667-42.666667 42.666666s-42.666667-19.2-42.666666-42.666666v-64c0-23.466667 19.2-42.666667 42.666666-42.666667z" horiz-adv-x="1024" />
<glyph glyph-name="switch" unicode="&#59091;" d="M128 373.333333c17.066667 0 32 14.933333 32 32v170.666667c0 6.4 4.266667 10.666667 10.666667 10.666667h652.8l-83.2-83.2c-12.8-12.8-12.8-34.133333 0-46.933334 6.4-6.4 14.933333-10.666667 23.466666-10.666666s17.066667 4.266667 23.466667 10.666666l145.066667 145.066667c12.8 12.8 12.8 34.133333 0 46.933333l-145.066667 145.066667c-12.8 12.8-34.133333 12.8-46.933333 0-12.8-12.8-12.8-34.133333 0-46.933333l93.866666-93.866667H170.666667c-40.533333 0-74.666667-34.133333-74.666667-74.666667v-170.666666c0-19.2 14.933333-34.133333 32-34.133334zM906.666667 394.666667c-17.066667 0-32-14.933333-32-32v-170.666667c0-6.4-4.266667-10.666667-10.666667-10.666667H211.2l83.2 83.2c12.8 12.8 12.8 34.133333 0 46.933334-12.8 12.8-34.133333 12.8-46.933333 0l-145.066667-145.066667c-12.8-12.8-12.8-34.133333 0-46.933333l145.066667-145.066667c6.4-6.4 14.933333-10.666667 23.466666-10.666667s17.066667 4.266667 23.466667 10.666667c12.8 12.8 12.8 34.133333 0 46.933333l-93.866667 93.866667h663.466667c40.533333 0 74.666667 34.133333 74.666667 74.666667v170.666666c0 19.2-12.8 34.133333-32 34.133334z" horiz-adv-x="1024" />
<glyph glyph-name="setting" unicode="&#59092;" d="M904.533333 473.6l-85.333333 14.933333-17.066667 38.4 49.066667 70.4c14.933333 21.333333 12.8 49.066667-6.4 68.266667l-53.333333 53.333333c-19.2 19.2-46.933333 21.333333-68.266667 6.4l-70.4-49.066666-38.4 17.066666-14.933333 85.333334c-2.133333 23.466667-23.466667 42.666667-49.066667 42.666666h-74.666667c-25.6 0-46.933333-19.2-53.333333-44.8l-14.933333-85.333333-38.4-17.066667L296.533333 725.333333c-21.333333 14.933333-49.066667 12.8-68.266666-6.4l-53.333334-53.333333c-19.2-19.2-21.333333-46.933333-6.4-68.266667l49.066667-70.4-17.066667-38.4-85.333333-14.933333c-21.333333-4.266667-40.533333-25.6-40.533333-51.2v-74.666667c0-25.6 19.2-46.933333 44.8-53.333333l85.333333-14.933333 17.066667-38.4L170.666667 168.533333c-14.933333-21.333333-12.8-49.066667 6.4-68.266666l53.333333-53.333334c19.2-19.2 46.933333-21.333333 68.266667-6.4l70.4 49.066667 38.4-17.066667 14.933333-85.333333c4.266667-25.6 25.6-44.8 53.333333-44.8h74.666667c25.6 0 46.933333 19.2 53.333333 44.8l14.933334 85.333333 38.4 17.066667 70.4-49.066667c21.333333-14.933333 49.066667-12.8 68.266666 6.4l53.333334 53.333334c19.2 19.2 21.333333 46.933333 6.4 68.266666l-49.066667 70.4 17.066667 38.4 85.333333 14.933334c25.6 4.266667 44.8 25.6 44.8 53.333333v74.666667c-4.266667 27.733333-23.466667 49.066667-49.066667 53.333333z m-19.2-117.333333l-93.866666-17.066667c-10.666667-2.133333-19.2-8.533333-23.466667-19.2l-29.866667-70.4c-4.266667-10.666667-2.133333-21.333333 4.266667-29.866667l53.333333-76.8-40.533333-40.533333-76.8 53.333333c-8.533333 6.4-21.333333 8.533333-29.866667 4.266667L576 128c-10.666667-4.266667-17.066667-12.8-19.2-23.466667l-17.066667-93.866666h-57.6l-17.066666 93.866666c-2.133333 10.666667-8.533333 19.2-19.2 23.466667l-70.4 29.866667c-10.666667 4.266667-21.333333 2.133333-29.866667-4.266667l-76.8-53.333333-40.533333 40.533333 53.333333 76.8c6.4 8.533333 8.533333 21.333333 4.266667 29.866667L256 320c-4.266667 10.666667-12.8 17.066667-23.466667 19.2l-93.866666 17.066667v57.6l93.866666 17.066666c10.666667 2.133333 19.2 8.533333 23.466667 19.2l29.866667 70.4c4.266667 10.666667 2.133333 21.333333-4.266667 29.866667l-53.333333 76.8 40.533333 40.533333 76.8-53.333333c8.533333-6.4 21.333333-8.533333 29.866667-4.266667L448 640c10.666667 4.266667 17.066667 12.8 19.2 23.466667l17.066667 93.866666h57.6l17.066666-93.866666c2.133333-10.666667 8.533333-19.2 19.2-23.466667l70.4-29.866667c10.666667-4.266667 21.333333-2.133333 29.866667 4.266667l76.8 53.333333 40.533333-40.533333-53.333333-76.8c-6.4-8.533333-8.533333-21.333333-4.266667-29.866667L768 448c4.266667-10.666667 12.8-17.066667 23.466667-19.2l93.866666-17.066667v-55.466666zM512 501.333333c-64 0-117.333333-53.333333-117.333333-117.333333s53.333333-117.333333 117.333333-117.333333 117.333333 53.333333 117.333333 117.333333-53.333333 117.333333-117.333333 117.333333z m0-170.666666c-29.866667 0-53.333333 23.466667-53.333333 53.333333s23.466667 53.333333 53.333333 53.333333 53.333333-23.466667 53.333333-53.333333-23.466667-53.333333-53.333333-53.333333z" horiz-adv-x="1024" />
<glyph glyph-name="survey" unicode="&#59093;" d="M810.666667 757.333333h-85.333334V768c0 29.866667-23.466667 53.333333-53.333333 53.333333h-320C322.133333 821.333333 298.666667 797.866667 298.666667 768v-10.666667h-85.333334c-40.533333 0-74.666667-34.133333-74.666666-74.666666v-661.333334c0-40.533333 34.133333-74.666667 74.666666-74.666666h597.333334c40.533333 0 74.666667 34.133333 74.666666 74.666666V682.666667c0 40.533333-34.133333 74.666667-74.666666 74.666666z m-149.333334 0v-64H362.666667v64h298.666666zM821.333333 21.333333c0-6.4-4.266667-10.666667-10.666666-10.666666H213.333333c-6.4 0-10.666667 4.266667-10.666666 10.666666V682.666667c0 6.4 4.266667 10.666667 10.666666 10.666666h85.333334v-10.666666c0-29.866667 23.466667-53.333333 53.333333-53.333334h320c29.866667 0 53.333333 23.466667 53.333333 53.333334v10.666666h85.333334c6.4 0 10.666667-4.266667 10.666666-10.666666v-661.333334zM659.2 450.133333l-211.2-213.333333-83.2 83.2c-12.8 12.8-32 12.8-44.8 0s-12.8-32 0-44.8l106.666667-106.666667c6.4-6.4 14.933333-8.533333 23.466666-8.533333s17.066667 2.133333 23.466667 8.533333l234.666667 234.666667c12.8 12.8 12.8 32 0 44.8-14.933333 12.8-36.266667 12.8-49.066667 2.133333z" horiz-adv-x="1024" />
<glyph glyph-name="task" unicode="&#59094;" d="M846.933333 780.8c-8.533333 6.4-21.333333 6.4-29.866666 2.133333 0 0-74.666667-34.133333-174.933334-34.133333-49.066667 0-96 17.066667-145.066666 34.133333-53.333333 19.2-106.666667 38.4-166.4 38.4-119.466667 0-162.133333-40.533333-168.533334-44.8-4.266667-6.4-8.533333-14.933333-8.533333-23.466666V-21.333333c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V300.8c14.933333 8.533333 51.2 21.333333 113.066667 21.333333 49.066667 0 96-17.066667 145.066666-34.133333 53.333333-19.2 106.666667-38.4 166.4-38.4 115.2 0 198.4 38.4 200.533334 38.4 10.666667 4.266667 19.2 17.066667 19.2 29.866667V753.066667c0 10.666667-6.4 21.333333-14.933334 27.733333z m-49.066666-441.6c-27.733333-10.666667-85.333333-25.6-155.733334-25.6-49.066667 0-96 17.066667-145.066666 34.133333-53.333333 19.2-106.666667 38.4-166.4 38.4-49.066667 0-87.466667-6.4-113.066667-17.066666V736c14.933333 8.533333 51.2 21.333333 113.066667 21.333333 49.066667 0 96-17.066667 145.066666-34.133333 53.333333-19.2 106.666667-38.4 166.4-38.4 64 0 119.466667 12.8 155.733334 23.466667v-369.066667z" horiz-adv-x="1024" />
<glyph glyph-name="skip" unicode="&#59095;" d="M921.6 539.733333c-14.933333 8.533333-34.133333 4.266667-42.666667-12.8L829.866667 448c-51.2 157.866667-200.533333 266.666667-369.066667 266.666667-172.8 0-324.266667-115.2-373.333333-277.333334-4.266667-17.066667 4.266667-34.133333 21.333333-40.533333 17.066667-4.266667 34.133333 4.266667 40.533333 21.333333 40.533333 136.533333 166.4 232.533333 311.466667 232.533334 140.8 0 264.533333-89.6 307.2-219.733334l-81.066667 46.933334c-14.933333 8.533333-34.133333 4.266667-42.666666-10.666667-8.533333-14.933333-4.266667-34.133333 10.666666-42.666667l147.2-85.333333c4.266667-2.133333 10.666667-4.266667 17.066667-4.266667 2.133333 0 6.4 0 8.533333 2.133334 8.533333 2.133333 14.933333 8.533333 19.2 14.933333l85.333334 147.2c8.533333 12.8 4.266667 32-10.666667 40.533333zM896 138.666667H128c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h768c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="text" unicode="&#59096;" d="M853.333333 757.333333H170.666667c-17.066667 0-32-14.933333-32-32v-128c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V693.333333h277.333333v-618.666666H384c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h256c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32h-96v618.666666h277.333333V597.333333c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V725.333333c0 17.066667-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="time" unicode="&#59097;" d="M512 821.333333C270.933333 821.333333 74.666667 625.066667 74.666667 384S270.933333-53.333333 512-53.333333 949.333333 142.933333 949.333333 384 753.066667 821.333333 512 821.333333z m0-810.666666c-204.8 0-373.333333 168.533333-373.333333 373.333333S307.2 757.333333 512 757.333333 885.333333 588.8 885.333333 384 716.8 10.666667 512 10.666667zM695.466667 328.533333l-151.466667 70.4V618.666667c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-238.933334c0-12.8 6.4-23.466667 19.2-29.866666l170.666667-81.066667c4.266667-2.133333 8.533333-2.133333 12.8-2.133333 12.8 0 23.466667 6.4 29.866666 19.2 6.4 14.933333 0 34.133333-17.066666 42.666666z" horiz-adv-x="1024" />
<glyph glyph-name="toggle-left" unicode="&#59098;" d="M874.666667 96H149.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h725.333334c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM149.333333 672h725.333334c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32H149.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32zM341.333333 416c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h512c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32H341.333333zM275.2 211.2c6.4-6.4 14.933333-8.533333 23.466667-8.533333s17.066667 2.133333 23.466666 8.533333c12.8 12.8 12.8 32 0 44.8l-128 128 125.866667 125.866667c12.8 12.8 12.8 32 0 44.8-12.8 12.8-32 12.8-44.8 0l-149.333333-149.333334c-12.8-12.8-12.8-32 0-44.8l149.333333-149.333333z" horiz-adv-x="1024" />
<glyph glyph-name="toggle-right" unicode="&#59099;" d="M874.666667 96H149.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h725.333334c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM149.333333 672h725.333334c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32H149.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32zM149.333333 352h512c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32H149.333333c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32zM748.8 556.8c-12.8 12.8-32 12.8-44.8 0-12.8-12.8-12.8-32 0-44.8l125.866667-125.866667-125.866667-125.866666c-12.8-12.8-12.8-32 0-44.8 6.4-6.4 14.933333-8.533333 23.466667-8.533334s17.066667 2.133333 23.466666 8.533334l149.333334 149.333333c12.8 12.8 12.8 32 0 44.8l-151.466667 147.2z" horiz-adv-x="1024" />
<glyph glyph-name="top" unicode="&#59100;" d="M896 800H128c-17.066667 0-32-14.933333-32-32S110.933333 736 128 736h768c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32zM535.466667 599.466667c-12.8 12.8-32 12.8-44.8 0l-213.333334-213.333334c-12.8-12.8-12.8-32 0-44.8s32-12.8 44.8 0l157.866667 157.866667V42.666667c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V499.2l157.866667-157.866667c6.4-6.4 14.933333-8.533333 23.466666-8.533333s17.066667 2.133333 23.466667 8.533333c12.8 12.8 12.8 32 0 44.8l-213.333333 213.333334z" horiz-adv-x="1024" />
<glyph glyph-name="unlock" unicode="&#59101;" d="M785.066667 480H381.866667v121.6c0 74.666667 61.866667 134.4 138.666666 134.4 59.733333 0 113.066667-36.266667 132.266667-91.733333 6.4-17.066667 23.466667-25.6 40.533333-19.2 17.066667 6.4 25.6 23.466667 19.2 40.533333-27.733333 81.066667-104.533333 134.4-192 134.4-110.933333 0-202.666667-89.6-202.666666-198.4v-121.6h-78.933334c-55.466667 0-100.266667-44.8-100.266666-100.266667v-311.466666c0-55.466667 44.8-100.266667 100.266666-100.266667h546.133334c55.466667 0 100.266667 44.8 100.266666 100.266667V379.733333c0 55.466667-44.8 100.266667-100.266666 100.266667z m36.266666-411.733333c0-19.2-17.066667-36.266667-36.266666-36.266667H238.933333c-19.2 0-36.266667 17.066667-36.266666 36.266667V379.733333c0 19.2 17.066667 36.266667 36.266666 36.266667h546.133334c19.2 0 36.266667-17.066667 36.266666-36.266667v-311.466666zM512 352c-17.066667 0-32-14.933333-32-32v-106.666667c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v106.666667c0 17.066667-14.933333 32-32 32z" horiz-adv-x="1024" />
<glyph glyph-name="user" unicode="&#59102;" d="M512 821.333333C270.933333 821.333333 74.666667 625.066667 74.666667 384S270.933333-53.333333 512-53.333333 949.333333 142.933333 949.333333 384 753.066667 821.333333 512 821.333333zM288 85.333333c0 123.733333 100.266667 224 224 224S736 209.066667 736 85.333333c-61.866667-46.933333-140.8-74.666667-224-74.666666s-162.133333 27.733333-224 74.666666z m128 384c0 53.333333 42.666667 96 96 96s96-42.666667 96-96-42.666667-96-96-96-96 42.666667-96 96z m377.6-328.533333c-19.2 96-85.333333 174.933333-174.933333 211.2 32 29.866667 51.2 70.4 51.2 117.333333 0 87.466667-72.533333 160-160 160s-160-72.533333-160-160c0-46.933333 19.2-87.466667 51.2-117.333333-89.6-36.266667-155.733333-115.2-174.933334-211.2-55.466667 66.133333-91.733333 149.333333-91.733333 243.2 0 204.8 168.533333 373.333333 373.333333 373.333333S885.333333 588.8 885.333333 384c0-93.866667-34.133333-177.066667-91.733333-243.2z" horiz-adv-x="1024" />
<glyph glyph-name="upload" unicode="&#59103;" d="M896 266.666667c-17.066667 0-32-14.933333-32-32v-170.666667c0-6.4-4.266667-10.666667-10.666667-10.666667H170.666667c-6.4 0-10.666667 4.266667-10.666667 10.666667v170.666667c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-170.666667c0-40.533333 34.133333-74.666667 74.666667-74.666667h682.666666c40.533333 0 74.666667 34.133333 74.666667 74.666667v170.666667c0 17.066667-14.933333 32-32 32zM322.133333 488.533333l157.866667 157.866667V192c0-17.066667 14.933333-32 32-32s32 14.933333 32 32V648.533333l157.866667-157.866666c6.4-6.4 14.933333-8.533333 23.466666-8.533334s17.066667 2.133333 23.466667 8.533334c12.8 12.8 12.8 32 0 44.8l-213.333333 213.333333c-12.8 12.8-32 12.8-44.8 0l-213.333334-213.333333c-12.8-12.8-12.8-32 0-44.8 10.666667-12.8 32-12.8 44.8-2.133334z" horiz-adv-x="1024" />
<glyph glyph-name="work" unicode="&#59104;" d="M885.333333 640H725.333333V697.6C723.2 738.133333 689.066667 768 648.533333 768h-298.666666c-40.533333-2.133333-72.533333-34.133333-72.533334-74.666667V640H138.666667C98.133333 640 64 605.866667 64 565.333333v-490.666666C64 34.133333 98.133333 0 138.666667 0h746.666666c40.533333 0 74.666667 34.133333 74.666667 74.666667v490.666666c0 40.533333-34.133333 74.666667-74.666667 74.666667zM341.333333 693.333333c2.133333 6.4 6.4 10.666667 12.8 10.666667h296.533334c6.4 0 10.666667-6.4 10.666666-10.666667V640H341.333333V693.333333zM138.666667 576h746.666666c6.4 0 10.666667-4.266667 10.666667-10.666667v-128H128v128c0 6.4 4.266667 10.666667 10.666667 10.666667z m277.333333-202.666667h192V320c0-6.4-4.266667-10.666667-10.666667-10.666667h-170.666666c-6.4 0-10.666667 4.266667-10.666667 10.666667v53.333333z m469.333333-309.333333h-746.666666c-6.4 0-10.666667 4.266667-10.666667 10.666667v298.666666h224V320c0-40.533333 34.133333-74.666667 74.666667-74.666667h170.666666c40.533333 0 74.666667 34.133333 74.666667 74.666667v53.333333H896v-298.666666c0-6.4-4.266667-10.666667-10.666667-10.666667z" horiz-adv-x="1024" />
<glyph glyph-name="warning" unicode="&#59105;" d="M934.4 125.866667L605.866667 714.666667C586.666667 748.8 550.4 768 512 768c-38.4 0-74.666667-21.333333-93.866667-53.333333L89.6 125.866667c-19.2-34.133333-19.2-76.8 0-110.933334S145.066667-42.666667 183.466667-42.666667h657.066666c38.4 0 74.666667 21.333333 93.866667 57.6 19.2 34.133333 19.2 76.8 0 110.933334z m-55.466667-81.066667c-8.533333-14.933333-23.466667-23.466667-38.4-23.466667H183.466667c-14.933333 0-29.866667 8.533333-38.4 23.466667-8.533333 14.933333-8.533333 34.133333 0 49.066667L473.6 682.666667c8.533333 12.8 23.466667 21.333333 38.4 21.333333s29.866667-8.533333 38.4-21.333333l328.533333-588.8c8.533333-14.933333 8.533333-32 0-49.066667zM512 149.333333m-42.666667 0a42.666667 42.666667 0 1 1 85.333334 0 42.666667 42.666667 0 1 1-85.333334 0ZM512 266.666667c17.066667 0 32 14.933333 32 32v192c0 17.066667-14.933333 32-32 32s-32-14.933333-32-32v-192c0-17.066667 14.933333-32 32-32z" horiz-adv-x="1024" />
<glyph glyph-name="add-bold" unicode="&#59106;" d="M874.666667 426.666667H554.666667V746.666667c0 23.466667-19.2 42.666667-42.666667 42.666666s-42.666667-19.2-42.666667-42.666666v-320H149.333333c-23.466667 0-42.666667-19.2-42.666666-42.666667s19.2-42.666667 42.666666-42.666667h320v-320c0-23.466667 19.2-42.666667 42.666667-42.666666s42.666667 19.2 42.666667 42.666666V341.333333h320c23.466667 0 42.666667 19.2 42.666666 42.666667s-19.2 42.666667-42.666666 42.666667z" horiz-adv-x="1024" />
<glyph glyph-name="arrow-left-bold" unicode="&#59107;" d="M384 384L731.733333 693.333333c17.066667 14.933333 19.2 42.666667 4.266667 59.733334-14.933333 17.066667-42.666667 19.2-59.733333 4.266666l-384-341.333333c-10.666667-8.533333-14.933333-19.2-14.933334-32s4.266667-23.466667 14.933334-32l384-341.333333c8.533333-6.4 19.2-10.666667 27.733333-10.666667 12.8 0 23.466667 4.266667 32 14.933333 14.933333 17.066667 14.933333 44.8-4.266667 59.733334L384 384z" horiz-adv-x="1024" />
<glyph glyph-name="arrow-up-bold" unicode="&#59108;" d="M904.533333 221.866667l-362.666666 362.666666c-17.066667 17.066667-42.666667 17.066667-59.733334 0l-362.666666-362.666666c-17.066667-17.066667-17.066667-42.666667 0-59.733334 17.066667-17.066667 42.666667-17.066667 59.733333 0L512 494.933333l332.8-332.8c8.533333-8.533333 19.2-12.8 29.866667-12.8s21.333333 4.266667 29.866666 12.8c17.066667 17.066667 17.066667 42.666667 0 59.733334z" horiz-adv-x="1024" />
<glyph glyph-name="close-bold" unicode="&#59109;" d="M571.733333 384l268.8 268.8c17.066667 17.066667 17.066667 42.666667 0 59.733333-17.066667 17.066667-42.666667 17.066667-59.733333 0L512 443.733333 243.2 712.533333c-17.066667 17.066667-42.666667 17.066667-59.733333 0-17.066667-17.066667-17.066667-42.666667 0-59.733333L452.266667 384 183.466667 115.2c-17.066667-17.066667-17.066667-42.666667 0-59.733333 8.533333-8.533333 19.2-12.8 29.866666-12.8s21.333333 4.266667 29.866667 12.8L512 324.266667l268.8-268.8c8.533333-8.533333 19.2-12.8 29.866667-12.8s21.333333 4.266667 29.866666 12.8c17.066667 17.066667 17.066667 42.666667 0 59.733333L571.733333 384z" horiz-adv-x="1024" />
<glyph glyph-name="arrow-down-bold" unicode="&#59110;" d="M904.533333 584.5333330000001c-17.066667 17.066667-42.666667 17.066667-59.733333 0L512 251.73333300000002 179.2 584.5333330000001c-17.066667 17.066667-42.666667 17.066667-59.733333 0-17.066667-17.066667-17.066667-42.666667 0-59.733333l362.666666-362.666667c8.533333-8.533333 19.2-12.8 29.866667-12.8s21.333333 4.266667 29.866667 12.8l362.666666 362.666667c17.066667 17.066667 17.066667 42.666667 0 59.733333z" horiz-adv-x="1024" />
<glyph glyph-name="minus-bold" unicode="&#59111;" d="M853.333333 341.333333H170.666667c-23.466667 0-42.666667 19.2-42.666667 42.666667s19.2 42.666667 42.666667 42.666667h682.666666c23.466667 0 42.666667-19.2 42.666667-42.666667s-19.2-42.666667-42.666667-42.666667z" horiz-adv-x="1024" />
<glyph glyph-name="arrow-right-bold" unicode="&#59112;" d="M731.733333 416l-384 341.333333c-17.066667 14.933333-44.8 14.933333-59.733333-4.266666-14.933333-17.066667-14.933333-44.8 4.266667-59.733334L640 384 292.266667 74.666667c-17.066667-14.933333-19.2-42.666667-4.266667-59.733334 8.533333-8.533333 19.2-14.933333 32-14.933333 10.666667 0 19.2 4.266667 27.733333 10.666667l384 341.333333c8.533333 8.533333 14.933333 19.2 14.933334 32s-4.266667 23.466667-14.933334 32z" horiz-adv-x="1024" />
<glyph glyph-name="select-bold" unicode="&#59113;" d="M883.2 648.533333c-17.066667 17.066667-44.8 17.066667-59.733333 0L409.6 230.4l-209.066667 204.8c-17.066667 17.066667-44.8 17.066667-59.733333 0-17.066667-17.066667-17.066667-44.8 0-59.733333l238.933333-234.666667c8.533333-8.533333 19.2-12.8 29.866667-12.8 10.666667 0 21.333333 4.266667 29.866667 12.8l443.733333 448c17.066667 17.066667 17.066667 42.666667 0 59.733333z" horiz-adv-x="1024" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 106 KiB

@@ -1,528 +0,0 @@
layui.define(['message', 'table', 'jquery', 'element', 'yaml', 'form', 'tab', 'menu', 'frame', 'theme', 'convert'],
function(exports) {
"use strict";
var $ = layui.jquery,
form = layui.form,
element = layui.element,
yaml = layui.yaml,
pearTab = layui.tab,
convert = layui.convert,
pearMenu = layui.menu,
pearFrame = layui.frame,
pearTheme = layui.theme,
message = layui.message;
var bodyFrame;
var sideMenu;
var bodyTab;
var config;
var logout = function() {};
var msgInstance;
var body = $('body');
var pearAdmin = new function() {
// 默认配置
var configType = 'yml';
var configPath = 'pear.configs.yml';
this.setConfigPath = function(path) {
configPath = path;
}
this.setConfigType = function(type) {
configType = type;
}
this.setAvatar = function(url, username) {
var image = new Image();
image.src = url || "admin/images/avatar.jpg";
image.onload = function() {
$(".layui-nav-img").attr("src", convert.imageToBase64(image));
}
$(".layui-nav-img").parent().append(username);
}
this.render = function(initConfig) {
if (initConfig !== undefined) {
applyConfig(initConfig);
} else {
applyConfig(pearAdmin.readConfig());
}
}
this.readConfig = function() {
if (configType === "yml") {
return yaml.load(configPath);
} else {
var data;
$.ajax({
url: configPath,
type: 'get',
dataType: 'json',
async: false,
success: function(result) {
data = result;
}
})
return data;
}
}
this.messageRender = function(option) {
var option = {
elem: '.message',
url: option.header.message,
height: '250px'
};
msgInstance = message.render(option);
}
this.logoRender = function(param) {
$(".layui-logo .logo").attr("src", param.logo.image);
$(".layui-logo .title").html(param.logo.title);
}
this.menuRender = function(param) {
sideMenu = pearMenu.render({
elem: 'sideMenu',
async: param.menu.async !== undefined ? param.menu.async : true,
theme: "dark-theme",
height: '100%',
method: param.menu.method,
control: param.menu.control ? 'control' : false, // control
defaultMenu: 0,
accordion: param.menu.accordion,
url: param.menu.data,
data: param.menu.data, //async为false时,传入菜单数组
parseData: false,
change: function() {
compatible();
},
done: function() {
sideMenu.selectItem(param.menu.select);
}
});
}
this.bodyRender = function(param) {
body.on("click", ".refresh", function() {
var refreshA = $(".refresh a");
refreshA.removeClass("layui-icon-refresh-1");
refreshA.addClass("layui-anim");
refreshA.addClass("layui-anim-rotate");
refreshA.addClass("layui-anim-loop");
refreshA.addClass("layui-icon-loading");
if (param.tab.muiltTab) bodyTab.refresh(400);
else bodyFrame.refresh(400);
setTimeout(function() {
refreshA.addClass("layui-icon-refresh-1");
refreshA.removeClass("layui-anim");
refreshA.removeClass("layui-anim-rotate");
refreshA.removeClass("layui-anim-loop");
refreshA.removeClass("layui-icon-loading");
}, 600)
})
if (param.tab.muiltTab) {
bodyTab = pearTab.render({
elem: 'content',
roll: true,
tool: true,
width: '100%',
height: '100%',
session: param.tab.session,
index: 0,
tabMax: param.tab.tabMax,
closeEvent: function(id) {
sideMenu.selectItem(id);
},
data: [{
id: param.tab.index.id,
url: param.tab.index.href,
title: param.tab.index.title,
close: false
}],
success: function(id) {
if (param.tab.session) {
setTimeout(function() {
sideMenu.selectItem(id);
bodyTab.positionTab();
}, 500)
}
}
});
bodyTab.click(function(id) {
if (!param.tab.keepState) {
bodyTab.refresh(false);
}
bodyTab.positionTab();
sideMenu.selectItem(id);
})
sideMenu.click(function(dom, data) {
bodyTab.addTabOnly({
id: data.menuId,
title: data.menuTitle,
url: data.menuUrl,
icon: data.menuIcon,
close: true
}, 300);
compatible();
})
} else {
bodyFrame = pearFrame.render({
elem: 'content',
title: '首页',
url: param.tab.index.href,
width: '100%',
height: '100%'
});
sideMenu.click(function(dom, data) {
bodyFrame.changePage(data.menuUrl, data.menuPath, true);
compatible()
})
}
}
this.keepLoad = function(param) {
compatible()
setTimeout(function() {
$(".loader-main").fadeOut(200);
}, param.other.keepLoad)
}
this.themeRender = function(option) {
if (option.theme.allowCustom === false) {
$(".setting").remove();
}
var colorId = localStorage.getItem("theme-color");
var currentColor = getColorById(colorId);
localStorage.setItem("theme-color", currentColor.id);
localStorage.setItem("theme-color-context", currentColor.color);
pearTheme.changeTheme(window, option.other.autoHead);
var menu = localStorage.getItem("theme-menu");
if (menu == null) {
menu = option.theme.defaultMenu;
} else {
if (option.theme.allowCustom === false) {
menu = option.theme.defaultMenu;
}
}
localStorage.setItem("theme-menu", menu);
this.menuSkin(menu);
}
this.menuSkin = function(theme) {
var pearAdmin = $(".pear-admin");
pearAdmin.removeClass("light-theme");
pearAdmin.removeClass("dark-theme");
pearAdmin.addClass(theme);
}
this.logout = function(callback) {
logout = callback;
}
this.message = function(callback) {
if (callback != null) {
msgInstance.click(callback);
} else {
msgInstance.click(messageTip);
}
}
this.jump = function(id, title, url) {
if (config.tab.muiltTab) {
bodyTab.addTabOnly({
id: id,
title: title,
url: url,
icon: null,
close: true
}, 300);
} else {
sideMenu.selectItem(id);
bodyFrame.changePage(url, title, true);
}
}
};
var messageTip = function(id, title, context, form) {
layer.open({
type: 1,
title: '消息', //标题
area: ['390px', '330px'], //宽高
shade: 0.4, //遮罩透明度
content: "<div style='background-color:whitesmoke;'><div class='layui-card'><div class='layui-card-body'>来源 : &nbsp; " +
form + "</div><div class='layui-card-header' >标题 : &nbsp; " + title +
"</div><div class='layui-card-body' >内容 : &nbsp; " + context + "</div></div></div>", //支持获取DOM元素
btn: ['确认'], //按钮组
scrollbar: false, //屏蔽浏览器滚动条
yes: function(index) { //layer.msg('yes'); //点击确定回调
layer.close(index);
showToast();
}
});
}
function collaspe() {
sideMenu.collaspe();
var admin = $(".pear-admin");
var left = $(".layui-icon-spread-left")
var right = $(".layui-icon-shrink-right")
if (admin.is(".pear-mini")) {
left.addClass("layui-icon-shrink-right")
left.removeClass("layui-icon-spread-left")
admin.removeClass("pear-mini");
} else {
right.addClass("layui-icon-spread-left")
right.removeClass("layui-icon-shrink-right")
admin.addClass("pear-mini");
}
}
body.on("click", ".logout", function() {
// 回调
var result = logout();
if (result) {
// 清空缓存
bodyTab.clear();
}
})
body.on("click", ".collaspe,.pear-cover", function() {
collaspe();
});
body.on("click", ".fullScreen", function() {
if ($(this).hasClass("layui-icon-screen-restore")) {
screenFun(2).then(function() {
$(".fullScreen").eq(0).removeClass("layui-icon-screen-restore");
});
} else {
screenFun(1).then(function() {
$(".fullScreen").eq(0).addClass("layui-icon-screen-restore");
});
}
});
body.on("click", '[user-menu-id]', function() {
if (config.tab.muiltTab) {
bodyTab.addTabOnly({
id: $(this).attr("user-menu-id"),
title: $(this).attr("user-menu-title"),
url: $(this).attr("user-menu-url"),
icon: "",
close: true
}, 300);
} else {
bodyFrame.changePage($(this).attr("user-menu-url"), "", true);
}
});
body.on("click", ".setting", function() {
var bgColorHtml =
'<li class="layui-this" data-select-bgcolor="dark-theme" >' +
'<a href="javascript:;" data-skin="skin-blue" style="" class="clearfix full-opacity-hover">' +
'<div><span style="display:block; width: 20%; float: left; height: 12px; background: #28333E;"></span><span style="display:block; width: 80%; float: left; height: 12px; background: white;"></span></div>' +
'<div><span style="display:block; width: 20%; float: left; height: 40px; background: #28333E;"></span><span style="display:block; width: 80%; float: left; height: 40px; background: #f4f5f7;"></span></div>' +
'</a>' +
'</li>';
bgColorHtml +=
'<li data-select-bgcolor="light-theme" >' +
'<a href="javascript:;" data-skin="skin-blue" style="" class="clearfix full-opacity-hover">' +
'<div><span style="display:block; width: 20%; float: left; height: 12px; background: white;"></span><span style="display:block; width: 80%; float: left; height: 12px; background: white;"></span></div>' +
'<div><span style="display:block; width: 20%; float: left; height: 40px; background: white;"></span><span style="display:block; width: 80%; float: left; height: 40px; background: #f4f5f7;"></span></div>' +
'</a>' +
'</li>';
var html =
'<div class="pearone-color">\n' +
'<div class="color-title">整体风格</div>\n' +
'<div class="color-content">\n' +
'<ul>\n' + bgColorHtml + '</ul>\n' +
'</div>\n' +
'</div>';
layer.open({
type: 1,
offset: 'r',
area: ['320px', '100%'],
title: false,
shade: 0.1,
closeBtn: 0,
shadeClose: false,
anim: -1,
skin: 'layer-anim-right',
move: false,
content: html + buildColorHtml() + buildLinkHtml() + bottomTool(),
success: function(layero, index) {
var color = localStorage.getItem("theme-color");
var menu = localStorage.getItem("theme-menu");
if (color !== "null") {
$(".select-color-item").removeClass("layui-icon").removeClass("layui-icon-ok");
$("*[color-id='" + color + "']").addClass("layui-icon").addClass("layui-icon-ok");
}
if (menu !== "null") {
$("*[data-select-bgcolor]").removeClass("layui-this");
$("[data-select-bgcolor='" + menu + "']").addClass("layui-this");
}
$('#layui-layer-shade' + index).click(function() {
var $layero = $('#layui-layer' + index);
$layero.animate({
left: $layero.offset().left + $layero.width()
}, 200, function() {
layer.close(index);
});
})
$('#closeTheme').click(function() {
var $layero = $('#layui-layer' + index);
$layero.animate({
left: $layero.offset().left + $layero.width()
}, 200, function() {
layer.close(index);
});
})
}
});
});
function bottomTool() {
return "<button id='closeTheme' style='position: absolute;bottom: 20px;left: 20px;' class='pear-btn'>关闭</button>"
}
body.on('click', '[data-select-bgcolor]', function() {
var theme = $(this).attr('data-select-bgcolor');
$('[data-select-bgcolor]').removeClass("layui-this");
$(this).addClass("layui-this");
localStorage.setItem("theme-menu", theme);
pearAdmin.menuSkin(theme);
});
body.on('click', '.select-color-item', function() {
$(".select-color-item").removeClass("layui-icon").removeClass("layui-icon-ok");
$(this).addClass("layui-icon").addClass("layui-icon-ok");
var colorId = $(".select-color-item.layui-icon-ok").attr("color-id");
var currentColor = getColorById(colorId);
localStorage.setItem("theme-color", currentColor.id);
localStorage.setItem("theme-color-context", currentColor.color);
pearTheme.changeTheme(window, config.other.autoHead);
});
function applyConfig(param) {
config = param;
pearAdmin.logoRender(param);
pearAdmin.menuRender(param);
pearAdmin.bodyRender(param);
pearAdmin.themeRender(param);
pearAdmin.keepLoad(param);
if (param.header.message != false) {
pearAdmin.messageRender(param);
}
}
function getColorById(id) {
var color;
var flag = false;
$.each(config.colors, function(i, value) {
if (value.id === id) {
color = value;
flag = true;
}
})
if (flag === false || config.theme.allowCustom === false) {
$.each(config.colors, function(i, value) {
if (value.id === config.theme.defaultColor) {
color = value;
}
})
}
return color;
}
function buildLinkHtml() {
var links = "";
$.each(config.links, function(i, value) {
// value.target 存在,则为新窗口打开,增加 target="_blank" 属性
links += '<a class="more-menu-item" href="' + value.href + '" '+(value.target?' target="_blank" ':'')+'>' +
'<i class="' + value.icon + '" style="font-size: 19px;"></i> ' + value.title +
'</a>'
})
return '<div class="more-menu-list">' + links + '</div>';
}
function buildColorHtml() {
var colors = "";
$.each(config.colors, function(i, value) {
colors += "<span class='select-color-item' color-id='" + value.id + "' style='background-color:" + value.color +
";'></span>";
})
return "<div class='select-color'><div class='select-color-title'>主题配色</div><div class='select-color-content'>" +
colors + "</div></div>"
}
function compatible() {
if ($(window).width() <= 768) {
collaspe()
}
}
function screenFun(num) {
num = num || 1;
num = num * 1;
var docElm = document.documentElement;
switch (num) {
case 1:
if (docElm.requestFullscreen) {
docElm.requestFullscreen();
} else if (docElm.mozRequestFullScreen) {
docElm.mozRequestFullScreen();
} else if (docElm.webkitRequestFullScreen) {
docElm.webkitRequestFullScreen();
} else if (docElm.msRequestFullscreen) {
docElm.msRequestFullscreen();
}
break;
case 2:
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitCancelFullScreen) {
document.webkitCancelFullScreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
break;
}
return new Promise(function(res, rej) {
res("返回值");
});
}
function isFullscreen() {
return document.fullscreenElement ||
document.msFullscreenElement ||
document.mozFullScreenElement ||
document.webkitFullscreenElement || false;
}
window.onresize = function() {
if (!isFullscreen()) {
$(".fullScreen").eq(0).removeClass("layui-icon-screen-restore");
}
}
exports('admin', pearAdmin);
})
@@ -1,102 +0,0 @@
layui.define(['table', 'laypage','jquery', 'element'], function(exports) {
"use strict";
var MOD_NAME = 'card',
$ = layui.jquery,
element = layui.element,
laypage = layui.laypage;
var pearCard = function(opt) {
this.option = opt;
};
pearCard.prototype.render = function(opt) {
var option = {
// 构建的模型
elem: opt.elem,
// 数据 url 连接
url: opt.url,
// lineSize 每行的个数
lineSize: opt.lineSize ? opt.lineSize : 4,
// 共多少个
pageSize: opt.pageSize ? opt.pageSize : 12,
// 当前页
currentPage: opt.currentSize ? opt.currentSize : 0,
// 完 成 函 数
done: opt.done ? opt.done : function() {
alert("跳转页面");
}
}
// 根 据 请 求 方 式 获 取 数 据
if (option.url != null) {
// 复制数据
option.data = getData(option.url).data;
}
// 根据结果进行相应结构的创建
var html = createComponent(option.data);
$(option.elem).html(html);
// 初始化分页组件
laypage.render({
elem: 'cardpage'
,count: 100
,layout: ['count', 'prev', 'page', 'next', 'limit', 'refresh', 'skip']
,jump: function(obj){
console.log(obj)
}
});
return new pearCard(option);
}
function createComponent(data) {
var html = "<div class='pear-card-component'>"
var content = createCards(data);
var page = "<div id='cardpage'></div>"
content = content + page;
html += content + "</div>"
return html;
}
/** 创建指定数量的卡片 */
function createCards(data) {
var content = "<div class='layui-row layui-col-space30'>";
$.each(data, function(i, item) {
content += createCard(item);
})
content += "</div>"
return content;
}
/** 创建一个卡片 */
function createCard(item) {
var card =
'<div class="layui-col-md3 ew-datagrid-item" data-index="0" data-number="1"> <div class="project-list-item"> <img class="project-list-item-cover" src="'+item.image+'"> <div class="project-list-item-body"> <h2>'+item.title+'</h2> <div class="project-list-item-text layui-text">'+item.remark+'</div> <div class="project-list-item-desc"> <span class="time">'+item.time+'</span> <div class="ew-head-list"> <img class="ew-head-list-item" lay-tips="曲丽丽" lay-offset="0,-5px" src="https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png"> <img class="ew-head-list-item" lay-tips="王昭君" lay-offset="0,-5px" src="https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png"> <img class="ew-head-list-item" lay-tips="董娜娜" lay-offset="0,-5px" src="https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png"> </div> </div> </div> </div> </div>'
return card;
}
/** 同 步 请 求 获 取 数 据 */
function getData(url) {
$.ajaxSettings.async = false;
var data = null;
$.get(url, function(result) {
data = result;
});
$.ajaxSettings.async = true;
return data;
}
exports(MOD_NAME, new pearCard());
})
@@ -1,185 +0,0 @@
layui.define(['jquery', 'element'], function(exports) {
"use strict";
/**
* Drawer component
* */
var MOD_NAME = 'drawer',
$ = layui.jquery,
element = layui.element;
var drawer = new function() {
/**
* open drawer
* */
this.open = function(option) {
var obj = new mSlider({
dom: option.dom,
direction: option.direction,
distance: option.distance,
time: option.time ? option.time : 0,
maskClose: option.maskClose,
callback: option.success
});
obj.open();
return obj;
}
}
exports(MOD_NAME, drawer);
});
/**
* 源码
* */
(function(b, c) {
function a(d) {
this.opts = {
"direction": d.direction || "left",
"distance": d.distance || "60%",
"dom": this.Q(d.dom),
"time": d.time || "",
"maskClose": (d.maskClose + "").toString() !== "false" ? true : false,
"callback": d.callback || ""
};
this.rnd = this.rnd();
this.dom = this.opts.dom[0];
this.wrap = "";
this.inner = "";
this.mask = "";
this.init()
}
a.prototype = {
Q: function(d) {
return document.querySelectorAll(d)
},
isMobile: function() {
return navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i) ? true : false
},
addEvent: function(f, e, d) {
if (f.attachEvent) {
f.attachEvent("on" + e, d)
} else {
f.addEventListener(e, d, false)
}
},
rnd: function() {
return Math.random().toString(36).substr(2, 6)
},
init: function() {
var g = this;
if (!g.dom) {
console.log("未正确绑定弹窗容器");
return
}
var d = document.createElement("div");
var e = document.createElement("div");
var f = document.createElement("div");
d.setAttribute("class", "mSlider-main ms-" + g.rnd);
e.setAttribute("class", "mSlider-inner");
f.setAttribute("class", "mSlider-mask");
g.Q("body")[0].appendChild(d);
g.Q(".ms-" + g.rnd)[0].appendChild(e);
g.Q(".ms-" + g.rnd)[0].appendChild(f);
g.wrap = g.Q(".ms-" + g.rnd)[0];
g.inner = g.Q(".ms-" + g.rnd + " .mSlider-inner")[0];
g.mask = g.Q(".ms-" + g.rnd + " .mSlider-mask")[0];
g.inner.appendChild(g.dom);
switch (g.opts.direction) {
case "top":
g.top = "0";
g.left = "0";
g.width = "100%";
g.height = g.opts.distance;
g.translate = "0,-100%,0";
break;
case "bottom":
g.bottom = "0";
g.left = "0";
g.width = "100%";
g.height = g.opts.distance;
g.translate = "0,100%,0";
break;
case "right":
g.top = "0";
g.right = "0";
g.width = g.opts.distance;
g.height = document.documentElement.clientHeight + "px";
g.translate = "100%,0,0";
break;
default:
g.top = "0";
g.left = "0";
g.width = g.opts.distance;
g.height = document.documentElement.clientHeight + "px";
g.translate = "-100%,0,0"
}
g.wrap.style.display = "none";
g.wrap.style.position = "fixed";
g.wrap.style.top = "0";
g.wrap.style.left = "0";
g.wrap.style.width = "100%";
g.wrap.style.height = "100%";
g.wrap.style.zIndex = 9999999;
g.inner.style.position = "absolute";
g.inner.style.top = g.top;
g.inner.style.bottom = g.bottom;
g.inner.style.left = g.left;
g.inner.style.right = g.right;
g.inner.style.width = g.width;
g.inner.style.height = g.height;
g.inner.style.backgroundColor = "#fff";
g.inner.style.transform = "translate3d(" + g.translate + ")";
g.inner.style.webkitTransition = "all .2s ease-out";
g.inner.style.transition = "all .2s ease-out";
g.inner.style.zIndex = 10000000;
g.mask.style.width = "100%";
g.mask.style.height = "100%";
g.mask.style.opacity = "0.1";
g.mask.style.backgroundColor = "black";
g.mask.style.zIndex = "9999998";
g.mask.style.webkitBackfaceVisibility = "hidden";
g.events()
},
open: function() {
var d = this;
d.wrap.style.display = "block";
setTimeout(function() {
d.inner.style.transform = "translate3d(0,0,0)";
d.inner.style.webkitTransform = "translate3d(0,0,0)";
d.mask.style.opacity = 0.1
}, 30);
if (d.opts.time) {
d.timer = setTimeout(function() {
d.close()
}, d.opts.time)
}
},
close: function() {
var d = this;
d.timer && clearTimeout(d.timer);
d.inner.style.webkitTransform = "translate3d(" + d.translate + ")";
d.inner.style.transform = "translate3d(" + d.translate + ")";
d.mask.style.opacity = 0;
setTimeout(function() {
d.wrap.style.display = "none";
d.timer = null;
d.opts.callback && d.opts.callback()
}, 300)
},
events: function() {
var d = this;
d.addEvent(d.mask, "touchmove", function(f) {
f.preventDefault()
});
d.addEvent(d.mask, (d.isMobile() ? "touchend" : "click"), function(f) {
if (d.opts.maskClose) {
d.close()
}
})
}
};
b.mSlider = a
})(window);
@@ -1,81 +0,0 @@
layui.define(['table', 'jquery', 'element'], function (exports) {
"use strict";
var MOD_NAME = 'frame',
$ = layui.jquery,
element = layui.element;
var pearFrame = function (opt) {
this.option = opt;
};
pearFrame.prototype.render = function (opt) {
var option = {
elem:opt.elem,
url:opt.url,
title:opt.title,
width:opt.width,
height:opt.height,
done:opt.done ? opt.done: function(){ console.log("菜单渲染成功");}
}
createFrameHTML(option);
$("#"+option.elem).width(option.width);
$("#"+option.elem).height(option.height);
return new pearFrame(option);
}
pearFrame.prototype.changePage = function(url,title,loading){
if(loading){
var loading = $("#"+this.option.elem).find(".pear-frame-loading");
loading.css({display:'block'});
}
$("#"+this.option.elem+" iframe").attr("src",url);
$("#"+this.option.elem+" .title").html(title);
if(loading){
var loading = $("#"+this.option.elem).find(".pear-frame-loading");
setTimeout(function(){
loading.css({display:'none'});
},800)
}
}
pearFrame.prototype.changePageByElement = function(elem,url,title,loading){
if(loading){
var loading = $("#"+elem).find(".pear-frame-loading");
loading.css({display:'block'});
}
$("#"+elem+" iframe").attr("src",url);
$("#"+elem+" .title").html(title);
if(loading){
var loading = $("#"+elem).find(".pear-frame-loading");
setTimeout(function(){
loading.css({display:'none'});
},800)
}
}
pearFrame.prototype.refresh = function (time) {
if(time!=false){
var loading = $("#"+this.option.elem).find(".pear-frame-loading");
loading.css({display:'block'});
if(time!=0){
setTimeout(function(){
loading.css({display:'none'});
},time)
}
}
$("#"+this.option.elem).find("iframe")[0].contentWindow.location.reload(true);
}
function createFrameHTML(option){
var header = "<div class='pear-frame-title'><div class='dot'></div><div class='title'>"+option.title+"</div></div>"
var iframe = "<iframe class='pear-frame-content' style='width:100%;height:100%;' scrolling='auto' frameborder='0' src='"+option.url+"' ></iframe>";
var loading = '<div class="pear-frame-loading">'+
'<div class="ball-loader">'+
'<span></span><span></span><span></span><span></span>'+
'</div>'+
'</div></div>';
$("#"+option.elem).html("<div class='pear-frame'>"+header+iframe+loading+"</div>");
}
exports(MOD_NAME,new pearFrame());
})
@@ -1,388 +0,0 @@
layui.define(['laypage', 'form'], function (exports) {
"use strict";
var IconPicker =function () {
this.v = '1.1';
}, _MOD = 'iconPicker',
_this = this,
$ = layui.jquery,
laypage = layui.laypage,
form = layui.form,
BODY = 'body',
TIPS = '请选择图标';
IconPicker.prototype.render = function(options){
var opts = options,
// DOM选择器
elem = opts.elem,
// 数据类型:fontClass/unicode
type = opts.type == null ? 'fontClass' : opts.type,
// 是否分页:true/false
page = opts.page == null ? true : opts.page,
// 每页显示数量
limit = opts.limit == null ? 12 : opts.limit,
// 是否开启搜索:true/false
search = opts.search == null ? true : opts.search,
// 每个图标格子的宽度:'43px'或'20%'
cellWidth = opts.cellWidth,
// 点击回调
click = opts.click,
// 渲染成功后的回调
success = opts.success,
// json数据
data = {},
// 唯一标识
tmp = new Date().getTime(),
// 是否使用的class数据
isFontClass = opts.type === 'fontClass',
// 初始化时input的值
ORIGINAL_ELEM_VALUE = $(elem).val(),
TITLE = 'layui-select-title',
TITLE_ID = 'layui-select-title-' + tmp,
ICON_BODY = 'layui-iconpicker-' + tmp,
PICKER_BODY = 'layui-iconpicker-body-' + tmp,
PAGE_ID = 'layui-iconpicker-page-' + tmp,
LIST_BOX = 'layui-iconpicker-list-box',
selected = 'layui-form-selected',
unselect = 'layui-unselect';
var a = {
init: function () {
data = common.getData[type]();
a.hideElem().createSelect().createBody().toggleSelect();
a.preventEvent().inputListen();
common.loadCss();
if (success) {
success(this.successHandle());
}
return a;
},
successHandle: function(){
var d = {
options: opts,
data: data,
id: tmp,
elem: $('#' + ICON_BODY)
};
return d;
},
/**
* 隐藏elem
*/
hideElem: function () {
$(elem).hide();
return a;
},
/**
* 绘制select下拉选择框
*/
createSelect: function () {
var oriIcon = '<i class="layui-icon">';
// 默认图标
if(ORIGINAL_ELEM_VALUE === '') {
if(isFontClass) {
ORIGINAL_ELEM_VALUE = 'layui-icon-circle-dot';
} else {
ORIGINAL_ELEM_VALUE = '&#xe617;';
}
}
if (isFontClass) {
oriIcon = '<i class="layui-icon '+ ORIGINAL_ELEM_VALUE +'">';
} else {
oriIcon += ORIGINAL_ELEM_VALUE;
}
oriIcon += '</i>';
var selectHtml = '<div class="layui-iconpicker layui-unselect layui-form-select" id="'+ ICON_BODY +'">' +
'<div class="'+ TITLE +'" id="'+ TITLE_ID +'">' +
'<div class="layui-iconpicker-item">'+
'<span class="layui-iconpicker-icon layui-unselect">' +
oriIcon +
'</span>'+
'<i class="layui-edge"></i>' +
'</div>'+
'</div>' +
'<div class="layui-anim layui-anim-upbit" style="">' +
'123' +
'</div>';
$(elem).after(selectHtml);
return a;
},
/**
* 展开/折叠下拉框
*/
toggleSelect: function () {
var item = '#' + TITLE_ID + ' .layui-iconpicker-item,#' + TITLE_ID + ' .layui-iconpicker-item .layui-edge';
a.event('click', item, function (e) {
var $icon = $('#' + ICON_BODY);
if ($icon.hasClass(selected)) {
$icon.removeClass(selected).addClass(unselect);
} else {
// 隐藏其他picker
$('.layui-form-select').removeClass(selected);
// 显示当前picker
$icon.addClass(selected).removeClass(unselect);
}
e.stopPropagation();
});
return a;
},
/**
* 绘制主体部分
*/
createBody: function () {
// 获取数据
var searchHtml = '';
if (search) {
searchHtml = '<div class="layui-iconpicker-search">' +
'<input class="layui-input">' +
'<i class="layui-icon">&#xe615;</i>' +
'</div>';
}
// 组合dom
var bodyHtml = '<div class="layui-iconpicker-body" id="'+ PICKER_BODY +'">' +
searchHtml +
'<div class="'+ LIST_BOX +'"></div> '+
'</div>';
$('#' + ICON_BODY).find('.layui-anim').eq(0).html(bodyHtml);
a.search().createList().check().page();
return a;
},
/**
* 绘制图标列表
* @param text 模糊查询关键字
* @returns {string}
*/
createList: function (text) {
var d = data,
l = d.length,
pageHtml = '',
listHtml = $('<div class="layui-iconpicker-list">')//'<div class="layui-iconpicker-list">';
// 计算分页数据
var _limit = limit, // 每页显示数量
_pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1), // 总计多少页
_id = PAGE_ID;
// 图标列表
var icons = [];
for (var i = 0; i < l; i++) {
var obj = d[i];
// 判断是否模糊查询
if (text && obj.indexOf(text) === -1) {
continue;
}
// 是否自定义格子宽度
var style = '';
if (cellWidth !== null) {
style += ' style="width:' + cellWidth + '"';
}
// 每个图标dom
var icon = '<div class="layui-iconpicker-icon-item" title="'+ obj +'" '+ style +'>';
if (isFontClass){
icon += '<i class="layui-icon '+ obj +'"></i>';
} else {
icon += '<i class="layui-icon">'+ obj.replace('amp;', '') +'</i>';
}
icon += '</div>';
icons.push(icon);
}
// 查询出图标后再分页
l = icons.length;
_pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1);
for (var i = 0; i < _pages; i++) {
// 按limit分块
var lm = $('<div class="layui-iconpicker-icon-limit" id="layui-iconpicker-icon-limit-' + tmp + (i+1) +'">');
for (var j = i * _limit; j < (i+1) * _limit && j < l; j++) {
lm.append(icons[j]);
}
listHtml.append(lm);
}
// 无数据
if (l === 0) {
listHtml.append('<p class="layui-iconpicker-tips">无数据</p>');
}
// 判断是否分页
if (page){
$('#' + PICKER_BODY).addClass('layui-iconpicker-body-page');
pageHtml = '<div class="layui-iconpicker-page" id="'+ PAGE_ID +'">' +
'<div class="layui-iconpicker-page-count">' +
'<span id="'+ PAGE_ID +'-current">1</span>/' +
'<span id="'+ PAGE_ID +'-pages">'+ _pages +'</span>' +
' (<span id="'+ PAGE_ID +'-length">'+ l +'</span>)' +
'</div>' +
'<div class="layui-iconpicker-page-operate">' +
'<i class="layui-icon" id="'+ PAGE_ID +'-prev" data-index="0" prev>&#xe603;</i> ' +
'<i class="layui-icon" id="'+ PAGE_ID +'-next" data-index="2" next>&#xe602;</i> ' +
'</div>' +
'</div>';
}
$('#' + ICON_BODY).find('.layui-anim').find('.' + LIST_BOX).html('').append(listHtml).append(pageHtml);
return a;
},
preventEvent: function() {
var item = '#' + ICON_BODY + ' .layui-anim';
a.event('click', item, function (e) {
e.stopPropagation();
});
return a;
},
page: function () {
var icon = '#' + PAGE_ID + ' .layui-iconpicker-page-operate .layui-icon';
$(icon).unbind('click');
a.event('click', icon, function (e) {
var elem = e.currentTarget,
total = parseInt($('#' +PAGE_ID + '-pages').html()),
isPrev = $(elem).attr('prev') !== undefined,
// 按钮上标的页码
index = parseInt($(elem).attr('data-index')),
$cur = $('#' +PAGE_ID + '-current'),
// 点击时正在显示的页码
current = parseInt($cur.html());
// 分页数据
if (isPrev && current > 1) {
current=current-1;
$(icon + '[prev]').attr('data-index', current);
} else if (!isPrev && current < total){
current=current+1;
$(icon + '[next]').attr('data-index', current);
}
$cur.html(current);
// 图标数据
$('#'+ ICON_BODY + ' .layui-iconpicker-icon-limit').hide();
$('#layui-iconpicker-icon-limit-' + tmp + current).show();
e.stopPropagation();
});
return a;
},
/**
* 搜索
*/
search: function () {
var item = '#' + PICKER_BODY + ' .layui-iconpicker-search .layui-input';
a.event('input propertychange', item, function (e) {
var elem = e.target,
t = $(elem).val();
a.createList(t);
});
return a;
},
/**
* 点击选中图标
*/
check: function () {
var item = '#' + PICKER_BODY + ' .layui-iconpicker-icon-item';
a.event('click', item, function (e) {
var el = $(e.currentTarget).find('.layui-icon'),
icon = '';
if (isFontClass) {
var clsArr = el.attr('class').split(/[\s\n]/),
cls = clsArr[1],
icon = cls;
$('#' + TITLE_ID).find('.layui-iconpicker-item .layui-icon').html('').attr('class', clsArr.join(' '));
} else {
var cls = el.html(),
icon = cls;
$('#' + TITLE_ID).find('.layui-iconpicker-item .layui-icon').html(icon);
}
$('#' + ICON_BODY).removeClass(selected).addClass(unselect);
$(elem).val(icon).attr('value', icon);
// 回调
if (click) {
click({
icon: icon
});
}
});
return a;
},
// 监听原始input数值改变
inputListen: function(){
var el = $(elem);
a.event('change', elem, function(){
var value = el.val();
})
// el.change(function(){
// });
return a;
},
event: function (evt, el, fn) {
$(BODY).on(evt, el, fn);
}
};
var common = {
/**
* 加载样式表
*/
loadCss: function () {
var css = '.layui-iconpicker {max-width: 280px;}.layui-iconpicker .layui-anim{display:none;width:280px;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;}.layui-iconpicker-item{border:1px solid #e6e6e6;width:90px;height:38px;border-radius:4px;cursor:pointer;position:relative;}.layui-iconpicker-icon{border-right:1px solid #e6e6e6;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;width:60px;height:100%;float:left;text-align:center;background:#fff;transition:all .3s;}.layui-iconpicker-icon i{line-height:38px;font-size:18px;}.layui-iconpicker-item > .layui-edge{left:70px;}.layui-iconpicker-item:hover{border-color:#D2D2D2!important;}.layui-iconpicker-item:hover .layui-iconpicker-icon{border-color:#D2D2D2!important;}.layui-iconpicker.layui-form-selected .layui-anim{display:block;}.layui-iconpicker-body{padding:6px;}.layui-iconpicker .layui-iconpicker-list{background-color:#fff;border:1px solid #ccc;border-radius:4px;}.layui-iconpicker .layui-iconpicker-icon-item{display:inline-block;width:21.1%;line-height:36px;text-align:center;cursor:pointer;vertical-align:top;height:36px;margin:4px;border:1px solid #ddd;border-radius:2px;transition:300ms;}.layui-iconpicker .layui-iconpicker-icon-item i.layui-icon{font-size:17px;}.layui-iconpicker .layui-iconpicker-icon-item:hover{background-color:#eee;border-color:#ccc;-webkit-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;-moz-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;box-shadow:0 0 2px #aaa,0 0 2px #fff inset;text-shadow:0 0 1px #fff;}.layui-iconpicker-search{position:relative;margin:0 0 6px 0;border:1px solid #e6e6e6;border-radius:2px;transition:300ms;}.layui-iconpicker-search:hover{border-color:#D2D2D2!important;}.layui-iconpicker-search .layui-input{cursor:text;display:inline-block;width:86%;border:none;padding-right:0;margin-top:1px;}.layui-iconpicker-search .layui-icon{position:absolute;top:11px;right:4%;}.layui-iconpicker-tips{text-align:center;padding:8px 0;cursor:not-allowed;}.layui-iconpicker-page{margin-top:6px;margin-bottom:-6px;font-size:12px;padding:0 2px;}.layui-iconpicker-page-count{display:inline-block;}.layui-iconpicker-page-operate{display:inline-block;float:right;cursor:default;}.layui-iconpicker-page-operate .layui-icon{font-size:12px;cursor:pointer;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit{display:none;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit:first-child{display:block;}';
var $style = $('head').find('style[iconpicker]');
if ($style.length === 0) {
$('head').append('<style rel="stylesheet" iconpicker>'+css+'</style>');
}
},
/**
* 获取数据
*/
getData: {
fontClass: function () {
var arr = ["layui-icon-rate-half","layui-icon-rate","layui-icon-rate-solid","layui-icon-cellphone","layui-icon-vercode","layui-icon-login-wechat","layui-icon-login-qq","layui-icon-login-weibo","layui-icon-password","layui-icon-username","layui-icon-refresh-3","layui-icon-auz","layui-icon-spread-left","layui-icon-shrink-right","layui-icon-snowflake","layui-icon-tips","layui-icon-note","layui-icon-home","layui-icon-senior","layui-icon-refresh","layui-icon-refresh-1","layui-icon-flag","layui-icon-theme","layui-icon-notice","layui-icon-website","layui-icon-console","layui-icon-face-surprised","layui-icon-set","layui-icon-template-1","layui-icon-app","layui-icon-template","layui-icon-praise","layui-icon-tread","layui-icon-male","layui-icon-female","layui-icon-camera","layui-icon-camera-fill","layui-icon-more","layui-icon-more-vertical","layui-icon-rmb","layui-icon-dollar","layui-icon-diamond","layui-icon-fire","layui-icon-return","layui-icon-location","layui-icon-read","layui-icon-survey","layui-icon-face-smile","layui-icon-face-cry","layui-icon-cart-simple","layui-icon-cart","layui-icon-next","layui-icon-prev","layui-icon-upload-drag","layui-icon-upload","layui-icon-download-circle","layui-icon-component","layui-icon-file-b","layui-icon-user","layui-icon-find-fill","layui-icon-loading","layui-icon-loading-1","layui-icon-add-1","layui-icon-play","layui-icon-pause","layui-icon-headset","layui-icon-video","layui-icon-voice","layui-icon-speaker","layui-icon-fonts-del","layui-icon-fonts-code","layui-icon-fonts-html","layui-icon-fonts-strong","layui-icon-unlink","layui-icon-picture","layui-icon-link","layui-icon-face-smile-b","layui-icon-align-left","layui-icon-align-right","layui-icon-align-center","layui-icon-fonts-u","layui-icon-fonts-i","layui-icon-tabs","layui-icon-radio","layui-icon-circle","layui-icon-edit","layui-icon-share","layui-icon-delete","layui-icon-form","layui-icon-cellphone-fine","layui-icon-dialogue","layui-icon-fonts-clear","layui-icon-layer","layui-icon-date","layui-icon-water","layui-icon-code-circle","layui-icon-carousel","layui-icon-prev-circle","layui-icon-layouts","layui-icon-util","layui-icon-templeate-1","layui-icon-upload-circle","layui-icon-tree","layui-icon-table","layui-icon-chart","layui-icon-chart-screen","layui-icon-engine","layui-icon-triangle-d","layui-icon-triangle-r","layui-icon-file","layui-icon-set-sm","layui-icon-add-circle","layui-icon-404","layui-icon-about","layui-icon-up","layui-icon-down","layui-icon-left","layui-icon-right","layui-icon-circle-dot","layui-icon-search","layui-icon-set-fill","layui-icon-group","layui-icon-friends","layui-icon-reply-fill","layui-icon-menu-fill","layui-icon-log","layui-icon-picture-fine","layui-icon-face-smile-fine","layui-icon-list","layui-icon-release","layui-icon-ok","layui-icon-help","layui-icon-chat","layui-icon-top","layui-icon-star","layui-icon-star-fill","layui-icon-close-fill","layui-icon-close","layui-icon-ok-circle","layui-icon-add-circle-fine"];
return arr;
},
unicode: function () {
return ["&amp;#xe6c9;","&amp;#xe67b;","&amp;#xe67a;","&amp;#xe678;","&amp;#xe679;","&amp;#xe677;","&amp;#xe676;","&amp;#xe675;","&amp;#xe673;","&amp;#xe66f;","&amp;#xe9aa;","&amp;#xe672;","&amp;#xe66b;","&amp;#xe668;","&amp;#xe6b1;","&amp;#xe702;","&amp;#xe66e;","&amp;#xe68e;","&amp;#xe674;","&amp;#xe669;","&amp;#xe666;","&amp;#xe66c;","&amp;#xe66a;","&amp;#xe667;","&amp;#xe7ae;","&amp;#xe665;","&amp;#xe664;","&amp;#xe716;","&amp;#xe656;","&amp;#xe653;","&amp;#xe663;","&amp;#xe6c6;","&amp;#xe6c5;","&amp;#xe662;","&amp;#xe661;","&amp;#xe660;","&amp;#xe65d;","&amp;#xe65f;","&amp;#xe671;","&amp;#xe65e;","&amp;#xe659;","&amp;#xe735;","&amp;#xe756;","&amp;#xe65c;","&amp;#xe715;","&amp;#xe705;","&amp;#xe6b2;","&amp;#xe6af;","&amp;#xe69c;","&amp;#xe698;","&amp;#xe657;","&amp;#xe65b;","&amp;#xe65a;","&amp;#xe681;","&amp;#xe67c;","&amp;#xe601;","&amp;#xe857;","&amp;#xe655;","&amp;#xe770;","&amp;#xe670;","&amp;#xe63d;","&amp;#xe63e;","&amp;#xe654;","&amp;#xe652;","&amp;#xe651;","&amp;#xe6fc;","&amp;#xe6ed;","&amp;#xe688;","&amp;#xe645;","&amp;#xe64f;","&amp;#xe64e;","&amp;#xe64b;","&amp;#xe62b;","&amp;#xe64d;","&amp;#xe64a;","&amp;#xe64c;","&amp;#xe650;","&amp;#xe649;","&amp;#xe648;","&amp;#xe647;","&amp;#xe646;","&amp;#xe644;","&amp;#xe62a;","&amp;#xe643;","&amp;#xe63f;","&amp;#xe642;","&amp;#xe641;","&amp;#xe640;","&amp;#xe63c;","&amp;#xe63b;","&amp;#xe63a;","&amp;#xe639;","&amp;#xe638;","&amp;#xe637;","&amp;#xe636;","&amp;#xe635;","&amp;#xe634;","&amp;#xe633;","&amp;#xe632;","&amp;#xe631;","&amp;#xe630;","&amp;#xe62f;","&amp;#xe62e;","&amp;#xe62d;","&amp;#xe62c;","&amp;#xe629;","&amp;#xe628;","&amp;#xe625;","&amp;#xe623;","&amp;#xe621;","&amp;#xe620;","&amp;#xe61f;","&amp;#xe61c;","&amp;#xe60b;","&amp;#xe619;","&amp;#xe61a;","&amp;#xe603;","&amp;#xe602;","&amp;#xe617;","&amp;#xe615;","&amp;#xe614;","&amp;#xe613;","&amp;#xe612;","&amp;#xe611;","&amp;#xe60f;","&amp;#xe60e;","&amp;#xe60d;","&amp;#xe60c;","&amp;#xe60a;","&amp;#xe609;","&amp;#xe605;","&amp;#xe607;","&amp;#xe606;","&amp;#xe604;","&amp;#xe600;","&amp;#xe658;","&amp;#x1007;","&amp;#x1006;","&amp;#x1005;","&amp;#xe608;"];
}
}
};
a.init();
return new IconPicker();
};
/**
* 选中图标
* @param filter lay-filter
* @param iconName 图标名称,自动识别fontClass/unicode
*/
IconPicker.prototype.checkIcon = function (filter, iconName){
var el = $('*[lay-filter='+ filter +']'),
p = el.next().find('.layui-iconpicker-item .layui-icon'),
c = iconName;
if (c.indexOf('#xe') > 0){
p.html(c);
} else {
p.html('').attr('class', 'layui-icon ' + c);
}
el.attr('value', c).val(c);
};
var iconPicker = new IconPicker();
exports(_MOD, iconPicker);
});
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-115
View File
@@ -1,115 +0,0 @@
.loader-main{
position: fixed;
width: 100%;
height: 100%;
background-color: whitesmoke;
z-index: 9999999;
margin-top:-70px;
padding-left: 0px;
}
.loader {
width: 50px;
height: 50px;
margin: 30px auto 40px;
margin-top: 20%;
position: relative;
z-index: 999999;
background-color: whitesmoke;
}
.loader:before {
content: "";
width: 50px;
height: 7px;
border-radius: 50%;
background: #000;
opacity: 0.1;
position: absolute;
top: 59px;
left: 0;
animation: shadow .5s linear infinite;
}
.loader:after {
content: "";
width: 50px;
height: 50px;
border-radius: 3px;
background-color: #5FB878;
position: absolute;
top: 0;
left: 0;
animation: loading .5s linear infinite;
}
@-webkit-keyframes loading {
17% {
border-bottom-right-radius: 3px;
}
25% {
transform: translateY(9px) rotate(22.5deg);
}
50% {
transform: translateY(18px) scale(1, 0.9) rotate(45deg);
border-bottom-right-radius: 40px;
}
75% {
transform: translateY(9px) rotate(67.5deg);
}
100% {
transform: translateY(0) rotate(90deg);
}
}
@keyframes loading {
17% {
border-bottom-right-radius: 3px;
}
25% {
transform: translateY(9px) rotate(22.5deg);
}
50% {
transform: translateY(18px) scale(1, 0.9) rotate(45deg);
border-bottom-right-radius: 40px;
}
75% {
transform: translateY(9px) rotate(67.5deg);
}
100% {
transform: translateY(0) rotate(90deg);
}
}
@-webkit-keyframes shadow {
0%,
100% {
transform: scale(1, 1);
}
50% {
transform: scale(1.2, 1);
}
}
@keyframes shadow {
0%,
100% {
transform: scale(1, 1);
}
50% {
transform: scale(1.2, 1);
}
}
File diff suppressed because it is too large Load Diff
-539
View File
@@ -1,539 +0,0 @@
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -1,429 +0,0 @@
{
"id": "1858883",
"name": "pe'a'rui",
"font_family": "iconfont",
"css_prefix_text": "pear-icon",
"description": "",
"glyphs": [
{
"icon_id": "14135885",
"name": "日历",
"font_class": "rili",
"unicode": "e615",
"unicode_decimal": 58901
},
{
"icon_id": "14135887",
"name": "书包",
"font_class": "shubao",
"unicode": "e616",
"unicode_decimal": 58902
},
{
"icon_id": "14135890",
"name": "测量",
"font_class": "celiang",
"unicode": "e617",
"unicode_decimal": 58903
},
{
"icon_id": "14136158",
"name": "放大镜",
"font_class": "fangdajing",
"unicode": "e618",
"unicode_decimal": 58904
},
{
"icon_id": "14136159",
"name": "地球仪",
"font_class": "diqiuyi",
"unicode": "e619",
"unicode_decimal": 58905
},
{
"icon_id": "14136160",
"name": "笔记",
"font_class": "biji",
"unicode": "e61a",
"unicode_decimal": 58906
},
{
"icon_id": "14136161",
"name": "学士帽",
"font_class": "xueshimao",
"unicode": "e61b",
"unicode_decimal": 58907
},
{
"icon_id": "14136171",
"name": "线上直播",
"font_class": "xianshangzhibo",
"unicode": "e61c",
"unicode_decimal": 58908
},
{
"icon_id": "15045228",
"name": "目录1",
"font_class": "mulu1",
"unicode": "e670",
"unicode_decimal": 58992
},
{
"icon_id": "15045229",
"name": "编辑",
"font_class": "bianji1",
"unicode": "e671",
"unicode_decimal": 58993
},
{
"icon_id": "15045230",
"name": "更多1",
"font_class": "gengduo1",
"unicode": "e672",
"unicode_decimal": 58994
},
{
"icon_id": "15057284",
"name": "搜素",
"font_class": "sousu",
"unicode": "e673",
"unicode_decimal": 58995
},
{
"icon_id": "15057286",
"name": "设置",
"font_class": "shezhi",
"unicode": "e674",
"unicode_decimal": 58996
},
{
"icon_id": "15057288",
"name": "下载",
"font_class": "xiazai1",
"unicode": "e675",
"unicode_decimal": 58997
},
{
"icon_id": "15057293",
"name": "我的",
"font_class": "wode1",
"unicode": "e676",
"unicode_decimal": 58998
},
{
"icon_id": "15057296",
"name": "工具箱",
"font_class": "gongjuxiang",
"unicode": "e677",
"unicode_decimal": 58999
},
{
"icon_id": "15057297",
"name": "警告",
"font_class": "jinggao",
"unicode": "e678",
"unicode_decimal": 59000
},
{
"icon_id": "15057298",
"name": "星球",
"font_class": "xingqiu",
"unicode": "e679",
"unicode_decimal": 59001
},
{
"icon_id": "15057299",
"name": "邮件",
"font_class": "youjian",
"unicode": "e67a",
"unicode_decimal": 59002
},
{
"icon_id": "15057302",
"name": "链接",
"font_class": "lianjie",
"unicode": "e67b",
"unicode_decimal": 59003
},
{
"icon_id": "15033675",
"name": "转换",
"font_class": "zhuanhuan",
"unicode": "e644",
"unicode_decimal": 58948
},
{
"icon_id": "15033678",
"name": "分类1",
"font_class": "fenlei1",
"unicode": "e647",
"unicode_decimal": 58951
},
{
"icon_id": "15033683",
"name": "扫码",
"font_class": "saoma",
"unicode": "e64a",
"unicode_decimal": 58954
},
{
"icon_id": "15033684",
"name": "二维码",
"font_class": "erweima",
"unicode": "e64b",
"unicode_decimal": 58955
},
{
"icon_id": "15042790",
"name": "定位",
"font_class": "dingwei",
"unicode": "e64c",
"unicode_decimal": 58956
},
{
"icon_id": "15042791",
"name": "关闭",
"font_class": "guanbi",
"unicode": "e64d",
"unicode_decimal": 58957
},
{
"icon_id": "15042792",
"name": "分享",
"font_class": "fenxiang",
"unicode": "e64e",
"unicode_decimal": 58958
},
{
"icon_id": "15042793",
"name": "分享1",
"font_class": "fenxiang1",
"unicode": "e64f",
"unicode_decimal": 58959
},
{
"icon_id": "15042794",
"name": "关闭1",
"font_class": "guanbi1",
"unicode": "e650",
"unicode_decimal": 58960
},
{
"icon_id": "15042795",
"name": "多云",
"font_class": "duoyun",
"unicode": "e651",
"unicode_decimal": 58961
},
{
"icon_id": "15042796",
"name": "发现",
"font_class": "faxian",
"unicode": "e652",
"unicode_decimal": 58962
},
{
"icon_id": "15042797",
"name": "我的",
"font_class": "wode",
"unicode": "e653",
"unicode_decimal": 58963
},
{
"icon_id": "15042798",
"name": "编辑",
"font_class": "bianji",
"unicode": "e654",
"unicode_decimal": 58964
},
{
"icon_id": "15042799",
"name": "消息",
"font_class": "xiaoxi",
"unicode": "e655",
"unicode_decimal": 58965
},
{
"icon_id": "15042800",
"name": "首页",
"font_class": "shouye",
"unicode": "e656",
"unicode_decimal": 58966
},
{
"icon_id": "15042801",
"name": "窗户",
"font_class": "chuanghu",
"unicode": "e657",
"unicode_decimal": 58967
},
{
"icon_id": "15042802",
"name": "账单",
"font_class": "zhangdan",
"unicode": "e658",
"unicode_decimal": 58968
},
{
"icon_id": "15042803",
"name": "导航",
"font_class": "daohang",
"unicode": "e659",
"unicode_decimal": 58969
},
{
"icon_id": "15042804",
"name": "文件夹1",
"font_class": "wenjianjia1",
"unicode": "e65a",
"unicode_decimal": 58970
},
{
"icon_id": "15042805",
"name": "鼠标",
"font_class": "shubiao",
"unicode": "e65b",
"unicode_decimal": 58971
},
{
"icon_id": "15042806",
"name": "生活",
"font_class": "shenghuo",
"unicode": "e65c",
"unicode_decimal": 58972
},
{
"icon_id": "15042807",
"name": "耳机",
"font_class": "erji",
"unicode": "e65d",
"unicode_decimal": 58973
},
{
"icon_id": "15042808",
"name": "删除",
"font_class": "shanchu",
"unicode": "e65e",
"unicode_decimal": 58974
},
{
"icon_id": "15042809",
"name": "更多",
"font_class": "gengduo",
"unicode": "e65f",
"unicode_decimal": 58975
},
{
"icon_id": "15042810",
"name": "语音",
"font_class": "yuyin",
"unicode": "e660",
"unicode_decimal": 58976
},
{
"icon_id": "15042811",
"name": "文件",
"font_class": "wenjian",
"unicode": "e661",
"unicode_decimal": 58977
},
{
"icon_id": "15042812",
"name": "信号",
"font_class": "xinhao",
"unicode": "e662",
"unicode_decimal": 58978
},
{
"icon_id": "15042813",
"name": "首页1",
"font_class": "shouye1",
"unicode": "e663",
"unicode_decimal": 58979
},
{
"icon_id": "15042814",
"name": "图片",
"font_class": "tupian",
"unicode": "e664",
"unicode_decimal": 58980
},
{
"icon_id": "15042815",
"name": "文件夹",
"font_class": "wenjianjia",
"unicode": "e665",
"unicode_decimal": 58981
},
{
"icon_id": "15042816",
"name": "锁",
"font_class": "suo",
"unicode": "e666",
"unicode_decimal": 58982
},
{
"icon_id": "15045217",
"name": "等级",
"font_class": "dengji",
"unicode": "e667",
"unicode_decimal": 58983
},
{
"icon_id": "15045218",
"name": "上传1",
"font_class": "shangchuan1",
"unicode": "e668",
"unicode_decimal": 58984
},
{
"icon_id": "15045220",
"name": "添加",
"font_class": "tianjia",
"unicode": "e669",
"unicode_decimal": 58985
},
{
"icon_id": "15045221",
"name": "返回",
"font_class": "fanhui",
"unicode": "e66a",
"unicode_decimal": 58986
},
{
"icon_id": "15045222",
"name": "账单",
"font_class": "zhangdan1",
"unicode": "e66b",
"unicode_decimal": 58987
},
{
"icon_id": "15045223",
"name": "下载",
"font_class": "xiazai",
"unicode": "e66c",
"unicode_decimal": 58988
},
{
"icon_id": "15045224",
"name": "目录",
"font_class": "mulu",
"unicode": "e66d",
"unicode_decimal": 58989
},
{
"icon_id": "15045226",
"name": "关闭",
"font_class": "guanbi2",
"unicode": "e66e",
"unicode_decimal": 58990
},
{
"icon_id": "15045227",
"name": "上传",
"font_class": "shangchuan",
"unicode": "e66f",
"unicode_decimal": 58991
}
]
}
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Some files were not shown because too many files have changed in this diff Show More