first commit

This commit is contained in:
编码猿
2024-09-27 01:32:49 +08:00
commit 28ebe05a64
7399 changed files with 1174529 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
/.idea
/.vscode
/vendor
*.log
thinkphp
.env
.DS_Store

View File

@@ -0,0 +1 @@
20c296fb-a66b-489a-9fc0-8a2774ad8236

View File

@@ -0,0 +1,42 @@
sudo: false
language: php
branches:
only:
- stable
cache:
directories:
- $HOME/.composer/cache
before_install:
- composer self-update
install:
- composer install --no-dev --no-interaction --ignore-platform-reqs
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip .
- composer require --update-no-dev --no-interaction "topthink/think-image:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0"
- composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0"
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip .
script:
- php think unit
deploy:
provider: releases
api_key:
secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw=
file:
- ThinkPHP_Core.zip
- ThinkPHP_Full.zip
skip_cleanup: true
on:
tags: true

View File

@@ -0,0 +1,927 @@
## V5.1.39 LTS2019-11-18
本次更新为常规更新,主要包括:
* 修正`memcached`驱动
* 改进`HasManyThrough`关联查询
* 改进`Request``isJson`方法
* 改进关联查询
* 改进`redis`驱动
* 增加 Model类`getWhere`方法对复合主键的支持
* 改进`newQuery`方法
* 改进闭包查询的参数绑定
* 修正`Validate`
* 修复某些情况下URL会多一个冒号
* 调整composer.json
* 修复使用`Cache::clear()`时,报错缓存文件不存在问题
* 使用File类的unlink方法进行文件删除
* 改进`paraseData`方法
* 修正image验证方法
* 改进Url生成
* 改进空操作对数字的支持
* 改进一处PHP7.4兼容性问题
## V5.1.38 LTS2019-8-8
本次更新为常规更新,主要包括:
* `Request`类增加`isJson`方法
* 改进浮点型查询
* 修正关联查询关联外键为空的查询错误
* 远程一对多支持关联统计和预载入查询
* 远程一对多关联支持`has`/`hasWhere`查询
* 优化`parseIn`解析
* 改进`parseLike`查询
* 改进Url生成
* 改进模型的`toArray`方法
* 修正`notIn`查询
* 改进`JSON`字段查询
* 改进Controller类`display`/`fetch`方法返回`ViewResponse`对象
* 改进`param`方法
* 改进`mysql`驱动`getExplain`方法
* 改进时间查询
* 改进模型关联的`has`/`hasWhere`方法对软删除的支持
* 修正社区反馈的BUG
## V5.1.37 LTS2019-5-26
本次更新为常规更新,主要更新如下:
* 改进关联数据更新
* 修正关联动态获取器
* 改进`redis`驱动
* 修复验证规则里面出现二维数组时的错误
* 改进跨域请求支持
* 完善模型`hidden`方法对关联属性的支持
* 改进`where`查询方法传入`Query`对象的支持`bind`数据
* 改进数据集对象的`load`方法
* 修正缓存类`clear`方法对`tag`的支持
## V5.1.36 LTS2019-4-28
本次更新为常规更新,主要更新如下:
* 修正`chunk`方法一处异常抛出的错误
* 修正模型输出的`visible`
* 改进环境变量加载
* 改进命令行日志的`level`配置支持
* 修复设置有缓存前缀时,无法清空缓存标签的问题
* HasMony对象`saveAll`方法兼容`Collection`格式参数格式
* 修正`whereOr`查询使用字符串的问题
* 改进`dateFormat`设置对写入数据的影响
* 修正查询缓存
* 记住指定的跳转地址
* 改进软删除
* 改进聚合查询SQL去除limit 1
* 改进缓存驱动
## V5.1.35 LTS2019-3-2
本次主要为常规更新,修正了一些反馈的问题。
* 修正验证类自定义验证方法执行两次的问题
* 模型增加`isEmpty`方法用于判断是否空模型
* 改进获取器对`append`的支持
* 修正一对多关联的`withCount`自关联问题
* facade类注释调整
* 改进关联属性的`visible``hidden`判断
* 修正路由分组的`MISS`路由
* 改进pgsql.sql
## V5.1.34 LTS2019-1-30
本次更新为常规更新,修正了一些反馈的问题。
* 改进Request类的`has`方法,支持`patch`
* 改进`unique`验证的多条件支持
* 修复自定义上传验证,检测文件大小
* 改进`in`查询支持表达式
* 改进路由的`getBind`方法
* 改进验证类的错误信息获取
* 改进`response`助手函数默认值
* 修正mysql的`regexp`查询
* 改进模型类型强制转换写入对`Expression`对象的支持
## V5.1.33 LTS2019-1-16
* 修复路由中存在多个相同替换的正则BUG
* 修正whereLike查询
* join方法支持参数绑定
* 改进union方法
* 修正多对多关联的attach方法
* 改进验证类的正则规则自定义
* 改进Request类method方法
* 改进File日志类型的CLI日志写入
* 改进文件日志time_format配置对JSON格式的支持
## V5.1.32 LTS2018-12-24
本次主要为常规更新,修正了一些反馈的问题。
* 改进多对多关联的`attach`方法
* 改进聚合查询的`field`处理
* 改进关联的`save`方法
* 修正模型`exists`方法返回值
* 改进时间字段写入和输出
* 改进控制器中间件的调用
* 改进路由变量替换的性能
* 改进缓存标签的处理机制
## V5.1.31 LTS (2018-12-9)
本次版本包含一个安全更新,建议升级。
* 改进`field`方法
* 改进`count`方法返回类型
* `download`函数增加在浏览器中显示文件功能
* 修正多对多模型的中间表数据写入
* 改进`sqlsrv`驱动支持多个Schemas模式查询
* 统一助手函数与\think\response\Download函数文件过期时间
* 完善关联模型的`save`方法 增加`make`方法仅创建对象不保存
* 修改条件表达式对静态变量的支持
* 修正控制器名获取
* 改进view方法的`field`解析
## V5.1.30 LTS2018-11-30
该版本为常规更新,修正了一些社区反馈的问题。
主要更新如下:
* 改进查询类的`execute`方法
* 判断路由规则定义添加对请求类型的判断
* 修复`orderRaw`异常
* 修正 `optimize:autoload`指令
* 改进软删除的`destroy`方法造成重复执行事件的问题
* 改进验证类对扩展验证规则 始终验证 不管是否`require`
* 修复自定义验证`remove`所有规则的异常
* 改进时间字段的自动写入支持微秒数据
* 改进`Connection`类的`getrealsql`方法
* 修正`https`地址的URL生成
* 修复 `array_walk_recursive` 在低于PHP7.1消耗内部指针问题
* 改进手动参数绑定使用
* 改进聚合查询方法的`field`参数支持`Expression`
## V5.1.29 LTS2018-11-11
该版本主要改进了参数绑定的解析问题和提升性能,并修正了一些反馈的问题。
* 改进手动参数绑定
* 修正MISS路由的分组参数无效问题
* 行为支持对象的方法
* 修正全局查询范围
* 改进`belongsto`关联的`has`方法
* 改进`hasMany`关联
* 改进模型观察者多次注册的问题
* 改进`query`类的默认查询参数处理
* 修正`parseBetween`解析方法
* 改进路由地址生成的本地域名支持
* 改进参数绑定的实际URL解析性能
* 改进`Env`类的`getEnv``get`方法
* 改进模板缓存的生成优化
* 修复验证类的多语言支持
* 修复自定义场景验证`remove`规则异常
* File类添加是否自动补全扩展名的选项
* 改进`strpos`对子串是否存在的判断
* 修复`choice`无法用值选择第一个选项问题
* 验证器支持多维数组取值验证
* 改进解析`extend``block`标签的正则
## V5.1.28 LTS2018-10-29
该版本主要修正了上一个版本存在的一些问题,并改进了关联查询
* 改进聚合查询方法的字段支持DISTINCT
* 改进定义路由后url函数的端口生成
* 改进控制器中间件对`swoole`等的支持
* 改进Log类`save`方法
* 改进验证类的闭包验证参数
* 多对多关联支持指定中间表数据的名称
* 关联聚合查询支持闭包方式指定聚合字段
* 改进Lang类`get`方法
* 多对多关联增加判断关联数据是否存在的方法
* 改进关联查询使用`fetchsql`的情况
* 改进修改器的是否已经执行判断
* 增加`afterWith``beforeWith`验证规则 用于比较日期字段
## V5.1.27 LTS2018-10-22
该版本主要修正了路由绑定的参数改进了修改器的执行多次问题并正式宣布为LTS版本
* 修正路由绑定的参数丢失问题
* 修正路由别名的参数获取
* 改进修改器会执行多次的问题
## V5.1.262018-10-12
该版本主要修正了上一个版本的一些问题,并改进了全局查询范围的支持,同时包含了一个安全更新。
* 修正单一模块下注解路由无效的问题
* 改进数据库的聚合查询的字段处理
* 模型类增加`globalScope`属性定义 用于指定全局的查询范围
* 模型的`useGlobalScope`方法支持传入数组 用于指定当前查询需要使用的全局查询范围
* 改进数据集的`order`方法对数字类型的支持
* 修正上一个版本`order`方法解析的一处BUG
* 排序字段不合法或者错误的时候抛出异常
* 改进`Request`类的`file`方法对上传文件的错误判断
## V5.1.252018-9-21
该版本主要改进了查询参数绑定的性能和对浮点型的支持,以及一些细节的完善。
* 修正一处命令行问题
* 改进`Socketlog`日志驱动,支持自定义默认展开日志类别
* 修正`MorphMany`一处bug
* 跳转到上次记住的url并支持默认值
* 改进模型的异常提示
* 改进参数绑定对浮点型的支持
* 改进`order`方法解析
* 改进`json`字段数据的自动编码
* 改进日志`log_write`可能造成的日志写入死循环
* Log类增加`log_level`行为标签位置,用于对某个类型的日志进行处理
* Route类增加`clear`方法清空路由规则
* 分布式数据库配置支持使用数组
* 单日志文件也支持`max_files`参数
* 改进查询参数绑定的性能
* 改进别名路由的URL后缀参数检测
* 控制器前置方法和控制器中间件的`only``except`定义不区分大小写
## V5.1.242018-9-5
该版本主要增加了命令行的表格输出功能,并增加了查看路由定义的指令,以及修正了社区的一些反馈问题。
* 修正`Request`类的`file`方法
* 修正路由的`cache`方法
* 修正路由缓存的一处问题
* 改进上传文件获取的异常处理
* 改进`fetchCollection`方法支持传入数据集类名
* 修正多级控制器的注解路由生成
* 改进`Middleware``clear`方法
* 增加`route:list`指令用于[查看定义的路由](752690) 并支持排序
* 命令行增加`Table`输出类
* `Command`类增加`table`方法用于输出表格
* 改进搜索器查询方法支持别名定义
* 命令行配置增加`auto_path`参数用于定义自动载入的命令类路径
* 增加`make:command`指令用于[快速生成指令](354146)
* 改进`make:controller`指令对操作方法后缀的支持
* 改进命令行的定义文件支持索引数组 用于指令对象的惰性加载
* 改进`value``column`方法对后续查询结果的影响
* 改进`RuleName`类的`setRule`方法
## V5.1.232018-8-23
该版本主要改进了数据集对象的处理,增加了`findOrEmpty`方法并且修正了一些社区反馈的BUG。
* 数据集类增加`diff`/`intersect`方法用于获取差集和交集(默认根据主键值比较)
* 数据集类增加`order`方法支持指定字段排序
* 数据集类增加`map`方法使用回调函数处理数据并返回新的数据集对象
* Db增加`allowEmpty`方法允许`find`方法在没有数据的时候返回空数组或者空模型对象而不是null
* Db增加`findOrEmpty`方法
* Db增加`fetchCollection`方法用于指定查询返回数据集对象
* 改进`order`方法的数组方式解析,增强安全性
* 改进`withSearch`方法,支持第三个参数传入字段前缀标识,用于多表查询字段搜索
* 修正`optimize:route`指令开启类库后缀后的注解路由生成
* 修正redis缓存及session驱动
* 支持指定`Yaconf`的独立配置文件
* 增加`yaconf`助手函数用于配置文件
## V5.1.222018-8-9
该版本主要增加了模型搜索器和`withJoin`方法,完善了模型输出和对`Yaconf`的支持修正了一些社区反馈的BUG。
* 改进一对一关联的`table`识别问题
* 改进内置`Facade`
* 增加`withJoin`方法支持`join`方式的[一对一关联](一对一关联.md)查询
* 改进`join`预载入查询的空数据问题
* 改进`Config`类的`load`方法支持快速加载配置文件
* 改进`execute`方法和事务的断线重连
* 改进`memcache`驱动的`has`方法
* 模型类支持定义[搜索器](搜索器.md)方法
* 完善`Config`类对`Yaconf`的支持
* 改进模型的`hidden/visible/append/withAttr`方法,支持在[查询前后调用](数组访问.md),以及支持数据集对象
* 数据集对象增加`where`方法根据字段或者关联数据[过滤数据](模型数据集.md)
* 改进AJAX请求的`204`判断
## V5.1.212018-8-2
该版本主要增加了下载响应对象和数组查询对象的支持,并修正了一些社区反馈的问题。
* 改进核心对象的无用信息调试输出
* 改进模型的`isRelationAttr`方法判断
* 模型类的`get``all`方法并入Db类
* 增加[下载响应对象](文件下载.md)和`download`助手函数
* 修正别名路由配置定义读取
* 改进`resultToModel`方法
* 修正开启类库后缀后的注解路由生成
* `Response`类增加`noCache`快捷方法
* 改进路由对象在`Swoole`/`Workerman`下面参数多次合并问题
* 修正路由`ajax`/`pjax`参数后路由变量无法正确获取的问题
* 增加清除中间件的方法
* 改进依赖注入的参数规范自动识别(便于对接前端小写+下划线规范)
* 改进`hasWhere`的数组条件的字段判断
* 增加[数组查询对象](高级查询.md)`Where`支持(喜欢数组查询的福音)
* 改进多对多关联的闭包支持
## V5.1.202018-7-25
该版本主要增加了Db和模型的动态获取器的支持并修正了一些已知问题。
* Db类添加[获取器支持](703981)
* 支持模型及关联模型字段[动态定义获取器](354046)
* 动态获取器支持`JSON`字段
* 改进路由的`before`行为执行(匹配后执行)
* `Config`类支持`Yaconf`
* 改进Url生成的端口问题
* Request类增加`setUrl``setBaseUrl`方法
* 改进页面trace的信息显示
* 修正`MorphOne`关联
* 命令行添加[查看版本指令](703994)
## V5.1.19 2018-7-13
该版本是一个小幅改进版本,针对`Swoole``Workerman``Cookie`支持做了一些改进,并修正了一些已知的问题。
* 改进query类`delete`方法对软删除条件判断
* 修正分表查询的软删除问题
* 模型查询的时候同时传入`table``name`属性
* 容器类增加`IteratorAggregate``Countable`接口支持
* 路由分组支持对下面的资源路由统一设置`only/except/vars`参数
* 改进Cookie类更好支持扩展
* 改进Request类`post`方法
* 改进模型自关联的自动识别
* 改进Request类对`php://input`数据的处理
## V5.1.18 2018-6-30
该版本主要完善了对`Swoole``Workerman``HttpServer`运行支持,改进`Request`类,并修正了一些已知的问题。
* 改进关联`append`方法的处理
* 路由初始化和检测方法分离
* 修正`destroy`方法强制删除
* `app_init`钩子位置移入`run`方法
* `think-swoole`扩展更新到2.0版本
* `think-worker`扩展更新到2.0版本
* 改进Url生成的域名自动识别
* `Request`类增加`setPathinfo`方法和`setHost`方法
* `Request`类增加`withGet`/`withPost`/`withHeader`/`withServer`/`withCookie`/`withEnv`方法进行赋值操作
* Route类改进`host`属性的获取
* 解决注解路由配置不生效的问题
* 取消Test日志驱动改为使用`close`设置关闭全局日志写入
* 修正路由的`response`参数
* 修正204响应输出的判断
## V5.1.17 2018-6-18
该版本主要增加了控制器中间件的支持,改进了路由功能,并且修正了社区反馈的一些问题。
* 修正软删除的`delete`方法
* 修正Query类`Count`方法
* 改进多对多`detach`方法
* 改进Request类`Session`方法
* 增加控制器中间件支持
* 模型类增加`jsonAssoc`属性用于定义json数据是否返回数组
* 修正Request类`method`方法的请求伪装
* 改进静态路由的匹配
* 分组首页路由自动完整匹配
* 改进sqlsrv的`column`方法
* 日志类的`apart_level`配置支持true自动生成对应类型的日志文件
* 改进`204`输出判断
* 修正cli下页面输出的BUG
* 验证类使用更高效的`ctype`验证机制
* 改进Request类`cookie`方法
* 修正软删除的`withTrashed`方法
* 改进多态一对多的预载入查询
* 改进Query类`column`方法的缓存读取
* Query类增加`whereBetweenTimeField`方法
* 改进分组下多个相同路由规则的合并匹配问题
* 路由类增加`getRule`/`getRuleList`方法获取定义的路由
## V5.1.16 2018-6-7
该版本主要修正了社区反馈的一些问题并对Request类做了进一步规范和优化。
* 改进Session类的`boot`方法
* App类的初始化方法可以单独执行
* 改进Request类的`param`方法
* 改进资源路由的变量替换
* Request类增加`__isset`方法
* 改进`useGlobalScope`方法对软删除的影响
* 修正命令行调用
* 改进Cookie类`init`方法
* 改进多对多关联删除的返回值
* 一对多关联写入支持`replace`
* 路由增加`filter`检测方法,用于通过请求参数检测路由是否匹配
* 取消Request类`session/env/server`方法的`filter`参数
* 改进关联的指定属性输出
* 模型删除操作删除后不清空对象数据仅作标记
* 调整模型的`save`方法返回值为布尔值
* 修正Request类`isAjax`方法
* 修正中间件的模块配置读取
* 取消Request类的请求变量的设置功能
* 取消请求变量获取的默认修饰符
* Request类增加`setAction/setModule/setController`方法
* 关联模型的`delete`方法调用Query类
* 改进URL生成的域名识别
* 改进URL检测对已定义路由的域名判断
* 模型类增加`isExists``isForce`方法
* 软删除的`destroy``restore`方法返回值调整为布尔值
## V5.1.15 2018-6-1
该版本主要改进了路由缓存的性能和缓存方式设置增加了JSON格式文件日志的支持并修正了社区反馈的一些问题。
* 容器类增加`exists`方法 仅判断是否存在对象实例
* 取消配置类的`autoload`方法
* 改进路由缓存大小提高性能
* 改进Dispatch类`init`方法
* 增加`make:validate`指令生成验证器类
* Config类`get`方法支持默认值参数
* 修正字段缓存指令
* 改进App类对`null`数据的返回
* 改进模型类的`__isset`方法判断
* 修正`Query`类的`withAggregate`方法
* 改进`RuleItem`类的`setRuleName`方法
* 修正依赖注入和参数的冲突问题
* 修正Db类对第三方驱动的支持
* 修正模型类查询对象问题
* 修正File缓存驱动的`has`方法
* 修正资源路由嵌套
* 改进Request类对`$_SERVER`变量的读取
* 改进请求缓存处理
* 路由缓存支持指定单独的缓存方式和参数
* 修正资源路由的中间件多次执行问题
* 修正`optimize:config`指令
* 文件日志支持`JSON`格式日志保存
* 修正Db类`connect`方法
* 改进Log类`write`方法不会自动写入之前日志
* 模型的关联操作默认启用事务
* 改进软删除的事件响应
## V5.1.14 2018-5-18
该版本主要对底层容器进行了一些优化改进,并增加了路由缓存功能,可以进一步提升路由性能。
* 依赖注入的对象参数传入改进
* 改进核心类的容器实例化
* 改进日期字段的读取
* 改进验证类的`getScene`方法
* 模型的`create`方法和`save`方法支持`replace`操作
* 改进`Db`类的调用机制
* App类调整为容器类
* 改进容器默认绑定
* `Loader`类增加工厂类的实例化方法
* 增加路由变量默认规则配置参数
* 增加路由缓存设计
* 错误处理机制改进
* 增加清空路由缓存指令
## V5.1.13 2018-5-11
该版本主要增加了MySQL的XA事务支持模型事件支持观察者以及对Facade类的改进。
* 改进自动缓存
* 改进Url生成
* 修正数据缓存
* 修正`value`方法的缓存
* `join`方法和`view`方法的条件支持使用`Expression`对象
* 改进驱动的`parseKey`方法
* 改进Request类`host`方法和`domain`方法对端口的处理
* 模型增加`withEvent`方法用于控制当前操作是否需要执行模型事件
* 模型`setInc/setDec`方法支持更新事件
* 模型添加`before_restore/after_restore`事件
* 增加模型事件观察者
* 路由增加`mobile`方法设置是否允许手机访问
* 数据库XA事务支持
* 改进索引数组查询对`IN`查询的支持
* 修正`invokeMethod`方法
* 修正空数据写入返回值的BUG
* redis驱动支持`predis`
* 改进`parseData`方法
* 改进模块加载
* App类初始化方法调整
* 改进数组查询对表达式`Expression`对象支持
* 改进闭包的依赖注入调用
* 改进多对多关联的中间表模型更新
* 增加容器中对象的自定义实例化
## V5.1.12 2018-4-25
该版本主要改进了主从查询的及时性,并支持动态设置请求数据。
* 支持动态设置请求数据
* 改进`comment`方法解析
* 修正App类`__unset`方法
* 改进url生成的域名绑定
* 改进主从查询的及时性
* 修正`value`的数据缓存功能
* 改进分页类的集合对象方法调用
* 改进Db类的代码提示
* SQL日志增加主从标记
## V5.1.11 2018-4-19
该版本为安全和修正版本改进了JSON查询的参数绑定问题和容器类对象实例获取并包含一处可能的安全隐患建议更新。
* 支持指定JSON数据查询的字段类型
* 修正`selectInsert`方法
* `whereColumn`方法支持数组方式
* 改进容器类`make`方法
* 容器类`delete`方法支持数组
* 改进`composer`自动加载
* 改进模板引擎
* 修正`like`查询的一处安全隐患
## V5.1.10 2018-4-16
该版本为修正版本修正上一个版本的一些BUG并增强了`think clear`指令。
* 改进`orderField`方法
* 改进`exists`查询
* 修改cli模式入口文件位置计算
* 修正`null`查询
* 改进`parseTime`方法
* 修正关联预载入查询
* 改进`mysql`驱动
* 改进`think clear`指令 支持 `-c -l -r `选项
* 改进路由规则对`/`结尾的支持
## V5.1.9 2018-4-12
该版本主要是一些改进和修正,并包含一个安全更新,是一个推荐更新版本。
* 默认模板渲染规则支持配置保持操作方法名
* 改进`Request`类的`ip`方法
* 支持模型软删除字段的默认值定义
* 改进路由变量规则对中文的支持
* 使用闭包查询的时候使用`cache(true)` 抛出异常提示
* 改进`Loader``loadComposerAutoloadFiles`方法
* 改进查询方法安全性
* 修正路由地址中控制器名驼峰问题
* 调整上一个版本的`module_init``app_begin`的钩子顺序问题
* 改进CLI命令行执行的问题
* 修正社区反馈的其它问题
## V5.1.8 2018-4-5
该版本主要改进了中间件的域名和模块支持,并同时修正了几个已知问题。
* 增加`template.auto_rule` 参数设置默认模板渲染的操作名自动转换规则
* 默认模板渲染规则改由视图驱动实现
* 修正路由标识定义
* 修正控制器路由方法
* 改进Request类`ip`方法支持自定义代理IP参数
* 路由注册中间件支持数组方式别名
* 改进命令行执行下的`composer`自动加载
* 添加域名中间件注册支持
* 全局中间件支持模块定义文件
* Log日志配置支持`close`参数可以全局关闭日志写入
* 中间件方法中捕获`HttpResponseException`异常
* 改进中间件的闭包参数传入
* 改进分组路由的延迟解析
* 改进URL生成对域名绑定的支持
* 改进文件缓存和文件日志驱动的并发支持
## V5.1.7 2018-3-28
该版本主要修正了路由的一些问题,并改进了查询的安全性。
* 支持`middleware`配置文件预先定义中间件别名方便路由调用
* 修正资源路由
* 改进`field`方法 自动识别`fieldRaw`
* 增加`Expression`
* Query类增加`raw`方法
* Query类的`field`/ `order`` where`方法都支持使用`raw`表达式查询
* 改进`inc/dec`查询 支持批量更新
* 改进路由分组
* 改进Response类`create`方法
* 改进composer自动加载
* 修正域名路由的`append`方法
* 修正操作方法的初始化方法获取不到问题
## V5.1.6 2018-3-26
该版本主要改进了路由规则的匹配算法,大幅提升了路由性能。并正式引入了中间件的支持,可以在路由中定义或者全局定义。另外包含了一个安全更新,是一个建议更新版本。
* 改进URL生成对路由`ext`方法的支持
* 改进查询缓存对不同数据库相同表名的支持
* 改进composer自动加载的性能
* 改进空路由变量对默认参数的影响
* mysql的`json`字段查询支持多级
* Query类增加`option`方法
* 优化路由匹配
* 修复验证规则数字键名丢失问题
* 改进路由Url生成
* 改进一对一关联预载入查询
* Request类增加`rootDomain`方法
* 支持API资源控制器生成 `make:controller --api`
* 优化Template类的标签解析
* 容器类增加删除和清除对象实例的方法
* 修正MorphMany关联的`eagerlyMorphToMany`方法一处错误
* Container类的异常捕获改进
* Domain对象支持`bind`方法
* 修正分页参数
* 默认模板的输出规则不受URL影响
* 注解路由支持多级控制器
* Query类增加`getNumRows`方法获取前次操作影响的记录数
* 改进查询条件的性能
* 改进模型类`readTransform`方法对序列化类型的处理
* Log类增加`close`方法可以临时关闭当前请求的日志写入
* 文件日志方式增加自动清理功能(设置`max_files`参数)
* 修正Query类的`getPk`方法
* 修正模板缓存的布局开关问题
* 修正Query类`select`方法的缓存
* 改进input助手函数
* 改进断线重连的信息判断
* 改进正则验证方法
* 调整语言包的加载顺序 放到`app_init`之前
* controller类`fetch`方法改为`final`
* 路由地址中的变量支持使用`<var>`方式
* 改进XMLResponse 支持传入编码过的xml内容
* 修正Query类`view`方法的数组表名支持
* 改进路由的模型闭包绑定
* 改进分组变量规则的继承
* 改进`cli-server`模式下的`composer`自动加载
* 路由变量规则异常捕获
* 引入中间件支持
* 路由定义增加`middleware`方法
* 增加生成中间件指令`make:middleware`
* 增加全局中间件定义支持
* 改进`optimize:config`指令对全局中间件的支持
* 改进config类`has`方法
* 改进时间查询的参数绑定
* 改进`inc/dec/exp`查询的安全性
## V5.1.5 2018-1-31
该版本主要增强了数据库的JSON查询并支持JSON字段的聚合查询改进了一些性能问题修正了路由的一些BUG主要更新如下
* 改进数据集查询对`JSON`数据的支持
* 改进聚合查询对`JSON`字段的支持
* 模型类增加`getOrFail`方法
* 改进数据库驱动的`parseKey`方法
* 改进Query类`join`方法的自关联查询
* 改进数据查询不存在不生成查询缓存
* 增加`run`命令行指令启动内置服务器
* `Request``pathinfo`方法改进对`cli-server`支持
* `Session`类增加`use_lock`配置参数设置是否启用锁机制
* 优化`File`缓存自动生成空目录的问题
* 域名及分组路由支持`append`方法传递隐式参数
* 改进日志的并发写入问题
* 改进`Query`类的`where`方法支持传入`Query`对象
* 支持设置单个日志文件的文件名
* 修正路由规则的域名条件约束
* `Request`类增加`subDomain`方法用于获取当前子域名
* `Response`类增加`allowCache`方法控制是否允许请求缓存
* `Request`类增加`sendData`方法便于扩展
* 改进`Env`类不依赖`putenv`方法
* 改进控制台`trace`显示错误
* 改进`MorphTo`关联
* 改进完整路由匹配后带斜线访问出错的情况
* 改进路由的多级分组问题
* 路由url地址生成支持多级分组
* 改进路由Url生成的`url_convert`参数的影响
* 改进`miss``auto`路由内部解析
* 取消预载入关联查询缓存功能
## V5.1.4 2018-1-19
该版本主要增强了数据库和模型操作,主要更新如下:
* 支持设置 `deleteTime`属性为`false` 关闭软删除
* 模型增加`getError`方法
* 改进Query类的`getTableFields`/`getFieldsType`方法 支持表名自动获取
* 模型类`toCollection`方法增加参数指定数据集类
* 改进`union`查询
* 关联预载入`with`方法增加缓存参数
* 改进模型类的`get``all`方法的缓存 支持关联缓存
* 支持`order by field`操作
* 改进`insertAll`分批写入
* 改进`json`字段数据支持
* 增加JSON数据的模型对象化操作
* 改进路由`ext`参数检测
* 修正`rule`方法的`method`参数使用 `get|post` 方式注册路由的问题
## V5.1.3 2018-1-12
该版本主要改进了路由及调整函数加载顺序,主要更新如下:
* 增加`env`助手函数;
* 增加`route`助手函数;
* 增加视图路由方法;
* 增加路由重定向方法;
* 路由默认区分最后的目录斜杆(支持设置不区分);
* 调整公共文件和配置文件的加载顺序(可以在配置文件中直接使用助手函数);
* 视图类增加`filter`方法设置输出过滤;
* `view`助手函数增加`filter`参数;
* 改进缓存生成指令;
* Session类的`get`方法支持获取多级;
* Request类`only`方法支持指定默认值;
* 改进路由分组;
* 修正使用闭包查询的时候自动数据缓存出错的情况;
* 废除`view_filter`钩子位置;
* 修正分组下面的资源路由;
* 改进session驱动;
## V5.1.2 2018-1-8
该版本改进了配置类及数据库类,主要更新如下:
* 修正嵌套路由分组;
* 修正自定义模板标签界定符后表达式语法出错的情况;
* 修正自关联的多次调用问题;
* 修正数组查询的`null`条件查询;
* 修正Query类的`order``field`的一处可能的BUG
* 配置参数设置支持三级;
* 配置对象支持`ArrayAccess`
* App类增加`path`方法用于设置应用目录;
* 关联定义增加`selfRelation`方法用于设置是否为自关联;
## V5.1.1 2018-1-3
修正一些反馈的BUG包括
* 修正Cookie类存取数组的问题
* 修正Controller的`fetch`方法
* 改进跨域请求
* 修正`insertAll`方法
* 修正`chunk`方法
## V5.1.0 2018-1-1
主要更新如下:
* 增加注解路由支持
* 路由支持跨域请求设置
* 增加`app_dispatch`钩子位置
* 修正多对多关联的`detach`方法
* 修正软删除的`destroy`方法
* Cookie类`httponly`参数默认为false
* 日志File驱动增加`single`参数配置记录同一个文件(不按日期生成)
* 路由的`ext``denyExt`方法支持不传任何参数
* 改进模型的`save`方法对`oracle`的支持
* Query类的`insertall`方法支持配合`data``limit`方法
* 增加`whereOr`动态查询支持
* 日志的ip地址记录改进
* 模型`saveAll`方法支持`isUpdate`方法
* 改进`Pivot`模型的实例化操作
* 改进Model类的`data`方法
* 改进多对多中间表模型类
* 模型增加`force`方法强制更新所有数据
* Hook类支持设置入口方法名称
* 改进验证类
* 改进`hasWhere`查询的数据重复问题
* 模型的`saveall`方法返回数据集对象
* 改进File缓存的`clear`方法
* 缓存添加统一的序列化机制
* 改进泛三级域名的绑定
* 改进泛域名的传值和取值
* Request类增加`panDomain`方法
* 改进废弃字段判断
* App类增加`create`方法用于实例化应用类库
* 容器类增加`has`方法
* 改进多数据库切换连接
* 改进断线重连的异常捕获
* 改进模型类`buildQuery`方法
* Query类增加`unionAll`方法
* 关联统计功能增强支持Sum/Max/Min/Avg
* 修正延迟写入
* chunk方法支持复合主键
* 改进JSON类型的写入
* 改进Mysql的insertAll方法
* Model类`save`方法改进复合主键包含自增的情况
* 改进Query类`inc``dec`方法的关键字处理
* File缓存inc和dec方法保持原来的有效期
* 改进redis缓存的有效期判断
* 增加checkRule方法用于单独数据的多个验证规则
* 修正setDec方法的延迟写入
* max和min方法增加force参数
* 二级配置参数区分大小写
* 改进join方法自关联的问题
* 修正关联模型自定义表名的情况
* Query类增加getFieldsType和getTableFields方法
* 取消视图替换功能及view_replace_str配置参数
* 改进域名绑定模块后的额外路由规则问题
* 改进mysql的insertAll方法
* 改进insertAll方法写入json字段数据的支持
* 改进redis长连接多编号库的情况
## RC3版本2017-11-6
主要更新如下:
* 改进redis驱动的`get`方法
* 修正Query类的`alias`方法
* `File`类错误信息支持多语言
* 修正路由的额外参数解析
* 改进`whereTime`方法
* 改进Model类`getAttr`方法
* 改进App类的`controller``validate`方法支持多层
* 改进`HasManyThrough`
* 修正软删除的`restore`方法
* 改进`MorpthTo`关联
* 改进数据库驱动类的`parseKey`方法
* 增加`whereField`动态查询方法
* 模型增加废弃字段功能
* 改进路由的`after`行为检查和`before`行为机制
* 改进路由分组的检查
* 修正mysql的`json`字段查询
* 取消Connection类的`quote`方法
* 改进命令行的支持
* 验证信息支持多语言
* 修正路由模型绑定
* 改进参数绑定类型对枚举类型的支持
* 修正模板的`{$Think.version} `输出
* 改进模板`date`函数解析
* 改进`insertAll`方法支持分批执行
* Request类`host`方法支持反向代理
* 改进`JumpResponse`支持区分成功和错误模板
* 改进开启类库后缀后的关联外键自动识别问题
* 修正一对一关联的JOIN方式预载入查询问题
* Query类增加`hidden`方法
## RC2版本2017-10-17
主要更新如下:
* 修正视图查询
* 修正资源路由
* 修正`HasMany`关联 修正`where`方法的闭包查询
* 一对一关联绑定属性到父模型后 关联属性不再保留
* 修正应用的命令行配置文件读取
* 改进`Connection`类的`getCacheKey`方法
* 改进文件上传的非法图像异常
* 改进验证类的`unique`规则
* Config类`get`方法支持获取一级配置
* 修正count方法对`fetchSql`的支持
* 修正mysql驱动对`socket`支持
* 改进Connection类的`getRealSql`方法
* 修正`view`助手函数
* Query类增加`leftJoin` `rightJoin``fullJoin`方法
* 改进app_namespace的获取
* 改进`append`方法对一对一`bind`属性的支持
* 改进关联的`saveall`方法的返回值
* 路由标识设置异常修复
* 改进Route类`rule`方法
* 改进模型的`table`属性设置
* 改进composer autofile的加载顺序
* 改进`exception_handle`配置对闭包的支持
* 改进app助手函数增加参数
* 改进composer的加载路径判断
* 修正路由组合变量的URL生成
* 修正路由URL生成
* 改进`whereTime`查询并支持扩展规则
* File类的`move`方法第二个参数支持`false`
* 改进Config类
* 改进缓存类`remember`方法
* 惯例配置文件调整 Url类当普通模式参数的时候不做`urlencode`处理
* 取消`ROOT_PATH``APP_PATH`常量定义 如需更改应用目录 自己重新定义入口文件
* 增加`app_debug``Env`获取
* 修正泛域名绑定
* 改进查询表达式的解析机制
* mysql增加`regexp`查询表达式 支持正则查询
* 改进查询表达式的异常判断
* 改进model类的`destroy`方法
* 改进Builder类 取消`parseValue`方法
* 修正like查询的参数绑定问题
* console和start文件移出核心纳入应用库
* 改进Db类主键删除方法
* 改进泛域名绑定模块
* 取消`BIND_MODULE`常量 改为在入口文件使用`bind`方法设置
* 改进数组查询
* 改进模板渲染的异常处理
* 改进控制器基类的架构方法参数
* 改进Controller类的`success``error`方法
* 改进对浏览器`JSON-Handle`插件的支持
* 优化跳转模板的移动端显示
* 修正模型查询的`chunk`方法对时间字段的支持
* 改进trace驱动
* Collection类增加`push`方法
* 改进Redis Session驱动
* 增加JumpResponse驱动
## RC12017-9-8
主要新特性为:
* 引入容器和Facade支持
* 依赖注入完善和支持更多场景
* 重构的(对象化)路由
* 配置和路由目录独立
* 取消系统常量
* 助手函数增强
* 类库别名机制
* 模型和数据库增强
* 验证类增强
* 模板引擎改进
* 支持PSR-3日志规范
* RC1版本取消了5.0多个字段批量数组查询的方式

View File

@@ -0,0 +1,32 @@
ThinkPHP遵循Apache2开源协议发布并提供免费使用。
版权所有Copyright © 2006-2018 by ThinkPHP (http://thinkphp.cn)
All rights reserved。
ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
Apache Licence是著名的非盈利开源组织Apache采用的协议。
该协议和BSD类似鼓励代码共享和尊重原作者的著作权
允许代码修改,再作为开源或商业软件发布。需要满足
的条件:
1 需要给代码的用户一份Apache Licence
2 如果你修改了代码,需要在被修改的文件中说明;
3 在延伸的代码中(修改和有源代码衍生的代码中)需要
带有原来代码中的协议,商标,专利声明和其他原来作者规
定需要包含的说明;
4 如果再发布的产品中包含一个Notice文件则在Notice文
件中需要带有本协议内容。你可以在Notice中增加自己的
许可但不可以表现为对Apache Licence构成更改。
具体的协议参考http://www.apache.org/licenses/LICENSE-2.0
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,180 @@
![](https://box.kancloud.cn/5a0aaa69a5ff42657b5c4715f3d49221)
ThinkPHP 5.1LTS版本 —— 12载初心你值得信赖的PHP框架
===============
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/top-think/framework/badges/quality-score.png?b=5.1)](https://scrutinizer-ci.com/g/top-think/framework/?branch=5.1)
[![Build Status](https://travis-ci.org/top-think/framework.svg?branch=master)](https://travis-ci.org/top-think/framework)
[![Total Downloads](https://poser.pugx.org/topthink/framework/downloads)](https://packagist.org/packages/topthink/framework)
[![Latest Stable Version](https://poser.pugx.org/topthink/framework/v/stable)](https://packagist.org/packages/topthink/framework)
[![PHP Version](https://img.shields.io/badge/php-%3E%3D5.6-8892BF.svg)](http://www.php.net/)
[![License](https://poser.pugx.org/topthink/framework/license)](https://packagist.org/packages/topthink/framework)
ThinkPHP5.1对底层架构做了进一步的改进,减少依赖,其主要特性包括:
+ 采用容器统一管理对象
+ 支持Facade
+ 注解路由支持
+ 路由跨域请求支持
+ 配置和路由目录独立
+ 取消系统常量
+ 助手函数增强
+ 类库别名机制
+ 增加条件查询
+ 改进查询机制
+ 配置采用二级
+ 依赖注入完善
+ 支持`PSR-3`日志规范
+ 中间件支持V5.1.6+
+ Swoole/Workerman支持V5.1.18+
> ThinkPHP5的运行环境要求PHP5.6以上。
## 安装
使用composer安装
~~~
composer create-project topthink/think tp
~~~
启动服务
~~~
cd tp
php think run
~~~
然后就可以在浏览器中访问
~~~
http://localhost:8000
~~~
更新框架
~~~
composer update topthink/framework
~~~
## 在线手册
+ [完全开发手册](https://www.kancloud.cn/manual/thinkphp5_1/content)
+ [升级指导](https://www.kancloud.cn/manual/thinkphp5_1/354155)
## 目录结构
初始的目录结构如下:
~~~
www WEB部署目录或者子目录
├─application 应用目录
│ ├─common 公共模块目录(可以更改)
│ ├─module_name 模块目录
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ └─ ... 更多类库目录
│ │
│ ├─command.php 命令行定义文件
│ ├─common.php 公共函数文件
│ └─tags.php 应用行为扩展定义文件
├─config 应用配置目录
│ ├─module_name 模块配置目录
│ │ ├─database.php 数据库配置
│ │ ├─cache 缓存配置
│ │ └─ ...
│ │
│ ├─app.php 应用配置
│ ├─cache.php 缓存配置
│ ├─cookie.php Cookie配置
│ ├─database.php 数据库配置
│ ├─log.php 日志配置
│ ├─session.php Session配置
│ ├─template.php 模板引擎配置
│ └─trace.php Trace配置
├─route 路由定义目录
│ ├─route.php 路由定义
│ └─... 更多
├─public WEB目录对外访问目录
│ ├─index.php 入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写
├─thinkphp 框架系统目录
│ ├─lang 语言文件目录
│ ├─library 框架类库目录
│ │ ├─think Think类库包目录
│ │ └─traits 系统Trait目录
│ │
│ ├─tpl 系统模板目录
│ ├─base.php 基础定义文件
│ ├─console.php 控制台入口文件
│ ├─convention.php 框架惯例配置文件
│ ├─helper.php 助手函数文件
│ ├─phpunit.xml phpunit配置文件
│ └─start.php 框架入口文件
├─extend 扩展类库目录
├─runtime 应用的运行时目录(可写,可定制)
├─vendor 第三方类库目录Composer依赖库
├─build.php 自动生成定义文件(参考)
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行入口文件
~~~
> 可以使用php自带webserver快速测试
> 切换到根目录后启动命令php think run
## 命名规范
`ThinkPHP5`遵循PSR-2命名规范和PSR-4自动加载规范并且注意如下规范
### 目录和文件
* 目录不强制规范,驼峰和小写+下划线模式均支持;
* 类库、函数文件统一以`.php`为后缀;
* 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;
* 类名和类文件名保持一致,统一采用驼峰法命名(首字母大写);
### 函数和类、属性命名
* 类的命名采用驼峰法,并且首字母大写,例如 `User``UserType`,默认不需要添加后缀,例如`UserController`应该直接命名为`User`
* 函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 `get_client_ip`
* 方法的命名使用驼峰法,并且首字母小写,例如 `getUserName`
* 属性的命名使用驼峰法,并且首字母小写,例如 `tableName``instance`
* 以双下划线“__”打头的函数或方法作为魔法方法例如 `__call``__autoload`
### 常量和配置
* 常量以大写字母和下划线命名,例如 `APP_PATH``THINK_PATH`
* 配置参数以小写字母和下划线命名,例如 `url_route_on``url_convert`
### 数据表和字段
* 数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 `think_user` 表和 `user_name`字段,不建议使用驼峰和中文作为数据表字段命名。
## 参与开发
请参阅 [ThinkPHP5 核心框架包](https://github.com/top-think/framework)。
## 版权信息
ThinkPHP遵循Apache2开源协议发布并提供免费使用。
本项目包含的第三方源码和二进制文件之版权信息另行标注。
版权所有Copyright © 2006-2018 by ThinkPHP (http://thinkphp.cn)
All rights reserved。
ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
更多细节参阅 [LICENSE.txt](LICENSE.txt)

View File

@@ -0,0 +1 @@
deny from all

View File

@@ -0,0 +1 @@
5c07980c-2e8b-4da1-8431-2ace6ab55cc2

View File

@@ -0,0 +1 @@
e588f057-12f7-4992-a56b-0257537f983f

View File

@@ -0,0 +1,34 @@
<?php
//后台公共文件
if (!function_exists('__log')) {
/**
* 写入系统日志
* @param $data 数据
* @param $type 日志类型
*/
function __log($data, $type) {
app('Log')::write(json_encode($data, JSON_UNESCAPED_UNICODE), $type);
}
}
if (!function_exists('replace_menu_title')) {
/**
* 格式化菜单名称进行输出
* @param $var 变量名
* @param int $number 循环次数
* @return string
*/
function replace_menu_title($var, $number = 1) {
$prefix = '';
for ($i = 1; $i < $number; $i++) {
$prefix .= '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
}
return $prefix . $var;
}
}

View File

@@ -0,0 +1 @@
090fb2ac-13d8-44d6-9c0b-25b80b00af7d

View File

@@ -0,0 +1,109 @@
<?php
/**
* 后台公用模型
*/
namespace app\admin\controller;
use think\Controller;
use think\exception\HttpResponseException;
use app\admin\service\ModelService;
use app\admin\service\AuthService;
class AdminController extends Controller
{
/**
* 开启登录控制
* @var bool
*/
protected $is_login = true;
/**
* 开启权限控制
* @var bool
*/
protected $is_auth = '';
/**
* 网站栏目
* @var string
*/
protected $nav = '';
/**
* 登录用户信息
* @var string
*/
protected $user = '';
/**
* 后台配置信息
* @var array
*/
protected $SysInfo = [];
/**
* 网站标题
* @var string
*/
protected $title = '';
/**
* 初始化数据
* Index constructor.
*/
public function __construct()
{
parent::__construct();
list($this->nav, $this->title, $this->is_login, $this->is_auth,) = ['', '', true, true];
$this->SysInfo = cache('SysInfo');
//检测登录情况
if ($this->is_login == true) {
$this->__checkLogin();
}
//判断是否有权限进行访问
if ($this->is_auth == true) {
$this->__checkAuth();
}
}
/**
* 检测登录
*/
public function __checkLogin()
{
$user = session('user');
//判断是否登录
if (empty($user)) {
$data = ['type' => 'error', 'code' => 1, 'msg' => '抱歉,您还没有登录获取访问权限!', 'url' => url('@admin/login')];
}
//判断登录是否过期
(isset($this->SysInfo['LoginDuration']) && !empty($this->SysInfo['LoginDuration'])) ? $LoginDuration = $this->SysInfo['LoginDuration'] : $LoginDuration = '';
if (!empty($LoginDuration) && !empty($user)) {
if (time() - $user['login_at'] >= $LoginDuration) {
\app\admin\service\LogService::loginLog($user['id'], 0, 1, "【登录过期】正在退出后台系统!");
$data = ['type' => 'error', 'code' => 1, 'msg' => '登录已过期,请重新登录!', 'url' => url('@admin/login')];
}
}
//返回错误信息
if (!empty($data)) {
session('user', null);
throw new HttpResponseException($this->request->isAjax() ? json($data) : exit(msg_error($data['msg'], $data['url'])));
}
$this->user = $user;
}
/**
* 检测登录情况
*/
public function __checkAuth()
{
if (AuthService::checkNode() == false) {
$data = ['type' => 'error', 'code' => 1, 'msg' => '抱歉,您暂无该权限,请联系管理员!', 'url' => url('@admin')];
throw new HttpResponseException($this->request->isAjax() ? json($data) : exit(msg_error($data['msg'], $data['url'])));
}
}
}

View File

@@ -0,0 +1,248 @@
<?php
namespace app\admin\controller;
use app\admin\controller\AdminController;
use think\facade\Cache;
class Auth extends AdminController {
/**
* Auth模型对象
*/
protected $model = null;
/**
* 初始化
* node constructor.
*/
public function __construct() {
parent::__construct();
$this->model = model('auth');
}
/**
* 角色列表
*/
public function index() {
if (!$this->request->isPost()) {
//ajax访问获取数据
if ($this->request->get('type') == 'ajax') {
$page = $this->request->get('page', 1);
$limit = $this->request->get('limit', 10);
$search = (array)$this->request->get('search', []);
return json($this->model->authList($page, $limit, $search));
}
//基础数据
$basic_data = [
'title' => '系统角色列表',
'data' => '',
'status' => [['id' => 1, 'title' => '启用'], ['id' => 0, 'title' => '禁用']],
];
return $this->fetch('', $basic_data);
} else {
$post = $this->request->post();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\Common.edit_field');
if (true !== $validate) return __error($validate);
//保存数据,返回结果
return $this->model->editField($post);
}
}
/**
* 添加角色
* @return mixed|\think\response\Json
*/
public function add() {
if (!$this->request->isPost()) {
//基础数据
$basic_data = [
'title' => '添加角色',
];
$this->assign($basic_data);
return $this->form();
} else {
$post = $this->request->post();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\Auth.add');
if (true !== $validate) return __error($validate);
//清空缓存
clear_menu();
//保存数据,返回结果
return $this->model->add($post);
}
}
/**
* 修改管理员信息
* @return mixed|string|\think\response\Json
*/
public function edit() {
if (!$this->request->isPost()) {
//查找所需修改角色
$auth = $this->model->where('id', $this->request->get('id'))->find();
if (empty($auth)) return msg_error('暂无数据,请重新刷新页面!');
//基础数据
$basic_data = [
'title' => '修改角色信息',
'auth' => $auth,
];
$this->assign($basic_data);
return $this->form();
} else {
$post = $this->request->post();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\Auth.edit');
if (true !== $validate) return __error($validate);
//清空菜单缓存
clear_menu();
//保存数据,返回结果
return $this->model->edit($post);
}
}
/**
* 表单模板
* @return mixed
*/
protected function form() {
return $this->fetch('form');
}
/**
* 删除角色
* @return \think\response\Json
* @throws \Exception
*/
public function del() {
$get = $this->request->get();
//验证数据
if (!is_array($get['id'])) {
$validate = $this->validate($get, 'app\admin\validate\Auth.del');
if (true !== $validate) return __error($validate);
}
//执行更新操作操作
if (!is_array($get['id'])) {
$del = $this->model->where('id', $get['id'])->delete();
model('auth_node')->where('auth', $get['id'])->delete();
} else {
$del = $this->model->whereIn('id', $get['id'])->delete();
model('auth_node')->whereIn('auth', $get['id'])->delete();
}
if ($del >= 1) {
//清空菜单缓存
clear_menu();
return __success('删除成功!');
} else {
return __error('数据有误,请刷新重试!');
}
}
/**
* 更改角色状态
* @return \think\response\Json
*/
public function status() {
$get = $this->request->get();
//验证数据
$validate = $this->validate($get, 'app\admin\validate\Auth.status');
if (true !== $validate) return __error($validate);
//判断菜单状态
$status = $this->model->where('id', $get['id'])->value('status');
$status == 1 ? list($msg, $status) = ['角色禁用成功', $status = 0] : list($msg, $status) = ['角色启用成功', $status = 1];
//执行更新操作操作
$update = $this->model->where('id', $get['id'])->update(['status' => $status]);
//清空菜单缓存
clear_menu();
if ($update >= 1) return __success($msg);
return __error('数据有误,请刷新重试!');
}
/**
* 授权信息
* @return mixed|string|\think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function authorize() {
if (!$this->request->isPost()) {
//查找所需授权角色
$auth = $this->model->where('id', $this->request->get('id'))->find();
if (empty($auth)) return msg_error('暂无数据,请重新刷新页面!');
$node = model('node')->where(['is_auth' => 1])->order('node asc')->select();
$auth_node = model('auth_node')->where(['auth' => $auth['id']])->select();
foreach ($node as &$vo) {
$i = 0;
foreach ($auth_node as $al) {
$vo['id'] == $al['node'] && $i++;
}
$i == 0 ? $vo['is_checked'] = false : $vo['is_checked'] = true;
}
//基础数据
$basic_data = [
'title' => '角色授权',
'auth' => $auth,
'node' => $node,
];
$this->assign($basic_data);
return $this->fetch();
} else {
$post = $this->request->post();
empty($post['node_id']) && $post['node_id'] = [];
//验证数据
$validate = $this->validate($post, 'app\admin\validate\Auth.authorize');
if (true !== $validate) return __error($validate);
$insertAll = [];
foreach ($post['node_id'] as $vo) {
$insertAll[] = [
'auth' => $post['auth_id'],
'node' => $vo,
];
}
//清空菜单缓存
clear_menu();
//清空旧数据
model('auth_node')->where(['auth' => $post['auth_id']])->delete();
//保存数据,返回结果
return model('auth_node')->authorize($insertAll);
}
}
}

View File

@@ -0,0 +1,61 @@
<?php
namespace app\admin\controller;
use app\admin\controller\AdminController;
/**
* 系统配置
* Class Config
* @package app\admin\controller
*/
class Config extends AdminController {
/**
* config模型对象
*/
protected $model = null;
/**
* 初始化
* node constructor.
*/
public function __construct() {
parent::__construct();
$this->model = model('config');
}
/**
* 系统配置信息列表
*/
public function index() {
if (!$this->request->isPost()) {
//ajax访问获取数据
if ($this->request->get('type') == 'ajax') {
$page = $this->request->get('page', 1);
$limit = $this->request->get('limit', 500);
$search = (array)$this->request->get('search', []);
return json($this->model->configList($page, $limit, $search));
}
//基础数据
$basic_data = [
'title' => '系统参数列表',
];
$this->assign($basic_data);
return $this->fetch('');
} else {
$post = $this->request->post();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\Common.edit_field');
if (true !== $validate) return __error($validate);
//保存数据,返回结果
return $this->model->editField($post);
}
}
}

View File

@@ -0,0 +1,33 @@
<?php
/**
* 图标管理
* Class Icon
* @package app\admin\controller
*/
namespace app\admin\controller;
use app\admin\controller\AdminController;
class Icon extends AdminController {
/**
* 图标列表
*/
public function index() {
$basic_data = [
'title' => '图标列表',
];
return $this->fetch('', $basic_data);
}
public function fa(){
$basic_data = [
'title' => 'fa图标列表',
];
return $this->fetch('', $basic_data);
}
}

View File

@@ -0,0 +1,49 @@
<?php
/*
* 首页
* */
namespace app\admin\controller;
use app\admin\controller\AdminController;
use think\facade\Cache;
use think\facade\Request;
class Index extends AdminController {
/**
* 首页
* @return mixed
*/
public function index() {
Cache::remember('Home', function () {
return model('menu')->getHome();
});
$apimenu = new \app\admin\controller\api\Menu();
$sys_info = Cache::get('SysInfo');
$basic_data = [
'title' => $sys_info['ManageName'],
'nav' => $apimenu->getNav(),
'home' => Cache::get('Home'),
'data' => '',
];
return $this->fetch('', $basic_data);
}
/**
* 首页欢迎界面
* @return mixed
*/
public function welcome() {
$basic_data = [
'quick_nav' => \app\admin\model\Nav::getQuickNav(),
];
return $this->fetch('', $basic_data);
}
}

View File

@@ -0,0 +1,111 @@
<?php
/*
* 后台登录
* */
namespace app\admin\controller;
use think\Controller;
use think\facade\Cache;
class Login extends Controller {
/**
* User模型对象
*/
protected $model = null;
/**
* 初始化
* Login constructor.
*/
public function __construct() {
parent::__construct();
$this->model = model('User');
$action = $this->request->action();
if (!empty(session('user.id')) && $action !== 'out' && $action !== 'change') return $this->redirect('@admin');
}
/**
* 后台登录
* @return mixed|\think\response\Json
*/
public function index() {
if ($this->request->isGet()) {
//基础数据
$basic_data = [
'title' => '伊莎洗衣后台登录',
'data' => '',
];
$this->assign($basic_data);
return $this->fetch('');
} else {
$post = $this->request->post();
//判断是否开启验证码登录选择验证规则
$SysInfo = Cache::get('SysInfo');
$SysInfo['VercodeType'] != 1 ? $validate_type = 'app\admin\validate\Login.index_off' : $validate_type = 'app\admin\validate\Login.index_on';
//验证参数
$validate = $this->validate($post, $validate_type);
if (true !== $validate) {
return __error($validate);
}
//判断登录是否成功
$login = $this->model->login($post['username'], $post['password']);
if ($login['code'] == 1) {
isset($login['user']['id']) ? $user_id = $login['user']['id'] : $user_id = '';
\app\admin\service\LogService::loginLog($user_id, 1, 0, "【账号登录】{$login['msg']}");
return __error($login['msg']);
}
//储存session数据
$login['user']['login_at'] = time();
session('user', $login['user']);
\app\admin\service\LogService::loginLog($login['user']['id'], 1, 1, '【账号登录】登录成功,正在进入系统!');
return __success($login['msg']);
}
}
/**
* 切换账户
* @return mixed
*/
public function change() {
if ($this->request->isGet()) {
//基础数据
$basic_data = [
'title' => '伊莎洗衣后台登录',
'data' => '',
];
$this->assign($basic_data);
return $this->fetch('index');
}
}
/**
* 退出登录
* @return \think\response\Json
*/
public function out() {
//记录日志
\app\admin\service\LogService::loginLog(session('user.id'), 0, 1, "【主动退出】正在退出后台系统!");
//删除自身菜单缓存
Cache::rm(session('user.id') . '_AdminMenu');
//清空sesion数据
session('user', null);
return msg_success('退出登录成功', url('@admin/login'));
}
}

View File

@@ -0,0 +1,207 @@
<?php
/**
* 菜单管理
* Class Menu
* @package app\admin\controller
*/
namespace app\admin\controller;
use app\admin\controller\AdminController;
use think\facade\Cache;
class Menu extends AdminController {
/**
* User模型对象
*/
protected $model = null;
/**
* 初始化
* User constructor.
*/
public function __construct() {
parent::__construct();
$this->model = model('menu');
}
/**
* 菜单栏列表
* @return mixed|\think\response\Json
*/
public function index() {
if (!$this->request->isPost()) {
//ajax访问
if ($this->request->get('type') == 'ajax') {
$search = (array)$this->request->get('search', []);
$menu_list = $this->model->menuList($search);
return json($menu_list);
}
//基础数据
$basic_data = [
'status' => [
['id' => 1, 'title' => '启用'],
['id' => 0, 'title' => '禁用'],
],
'title' => '菜单栏管理',
'data' => '',
];
return $this->fetch('', $basic_data);
} else {
$post = $this->request->post();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\Common.edit_field');
if (true !== $validate) return __error($validate);
//保存数据,返回结果
return $this->model->editField($post);
}
}
/**
* 添加菜单
* @return mixed|\think\response\Json
*/
public function add() {
if (!$this->request->isPost()) {
$pid = $this->request->get('pid', '');
$basic_data = [
'title' => '添加菜单',
];
!empty($pid) && $basic_data['menu'] = ['pid' => $pid];
$this->assign($basic_data);
return $this->form();
} else {
$post = $this->request->post();
unset($post['id']);
//验证数据
$validate = $this->validate($post, 'app\admin\validate\Menu.add');
if (true !== $validate) return __error($validate);
//清空菜单缓存
clear_menu();
return $this->model->add($post);
}
}
/**
* 修改菜单
* @return mixed
*/
public function edit() {
if (!$this->request->isPost()) {
//查找所需修改菜单
$menu = $this->model->where('id', $this->request->get('id'))->find();
if (empty($menu)) return msg_error('暂无数据,请重新刷新页面!');
strpos($menu['icon'], 'fa-') !== false ? $menu['icon_type'] = 'fa' : $menu['icon_type'] = 'layui';
//基础数据
$basic_data = [
'title' => '修改菜单',
'menu' => $menu,
];
$this->assign($basic_data);
return $this->form();
} else {
$post = $this->request->post();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\Menu.edit');
if (true !== $validate) return __error($validate);
//清空菜单缓存
clear_menu();
return $this->model->edit($post);
}
}
/**
* 表单模板
* @return mixed
*/
protected function form() {
$basic_data = [
'up_menu' => $this->model->getUpMenu(),
];
$this->assign($basic_data);
return $this->fetch('form');
}
/**
* 删除菜单
* @return \think\response\Json
* @throws \Exception
*/
public function del() {
$get = $this->request->get();
//验证数据
if (!is_array($get['id'])) {
$validate = $this->validate($get, 'app\admin\validate\Menu.del');
if (true !== $validate) return __error($validate);
}
//执行删除操作
if (!is_array($get['id'])) {
$del = $this->model->where('id', $get['id'])->delete();
} else {
$del = $this->model->whereIn('id', $get['id'])->delete();
}
if ($del >= 1) {
//清空菜单缓存
clear_menu();
return __success('菜单删除成功!');
} else {
return __error('数据有误,请刷新重试!');
}
}
/**
* 更改菜单状态
* @return \think\response\Json
*/
public function status() {
$get = $this->request->get();
if ($get['id'] == 1) return __error('首页不允许更改状态');
//验证数据
$validate = $this->validate($get, 'app\admin\validate\Menu.status');
if (true !== $validate) return __error($validate);
//判断菜单状态
$status = $this->model->where('id', $get['id'])->value('status');
if ($status == 1) {
$msg = '菜单禁用成功';
$status = 0;
} else {
$msg = '菜单启用成功';
$status = 1;
}
//执行更新操作操作
$update = $this->model->where('id', $get['id'])->update(['status' => $status]);
if ($update >= 1) {
//清空菜单缓存
clear_menu();
return __success($msg);
} else {
return __error('数据有误,请刷新重试!');
}
}
}

View File

@@ -0,0 +1,84 @@
<?php
/**
* 节点管理
* Class Node
* @package app\admin\controller
*/
namespace app\admin\controller;
use app\admin\controller\AdminController;
class Node extends AdminController {
/**
* node模型对象
*/
protected $model = null;
/**
* 初始化
* node constructor.
*/
public function __construct() {
parent::__construct();
$this->model = model('node');
}
/**
* 节点列表
*/
public function index() {
if (!$this->request->isPost()) {
//ajax访问获取数据
if (!empty($this->request->get('module'))) {
return json($this->model->nodeModuleList($this->request->get('module')));
}
$module_list = $this->model->where(['type' => 1])->order(['node'=>'asc'])->select()->toArray();
foreach ($module_list as $k => $val) $k == 0 ? $module_list[$k]['is_selectd'] = true : $module_list[$k]['is_selectd'] = false;
//基础数据
$basic_data = [
'title' => '系统节点列表',
'module_list' => $module_list,
];
$this->assign($basic_data);
return $this->fetch('');
} else {
$post = $this->request->post();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\Common.edit_field');
if (true !== $validate) return __error($validate);
//保存数据,返回结果
return $this->model->editField($post);
}
}
/**
* 更改节点状态
* @return \think\response\Json
*/
public function status() {
$get = $this->request->get();
//验证数据
$validate = $this->validate($get, 'app\admin\validate\Node.status');
if (true !== $validate) return __error($validate);
//判断菜单状态
$status = $this->model->where('id', $get['id'])->value('is_auth');
$status == 1 ? list($msg, $status) = ['节点禁用成功', $status = 0] : list($msg, $status) = ['节点启用成功', $status = 1];
//执行更新操作操作
$update = $this->model->where('id', $get['id'])->update(['is_auth' => $status]);
//清空菜单缓存
clear_menu();
if ($update >= 1) return __success($msg);
return __error('数据有误,请刷新重试!');
}
}

View File

@@ -0,0 +1,355 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/28
* Time: 13:54
*/
namespace app\admin\controller;
use think\Db;
use think\Exception;
use think\facade\Cache;
use think\Log;
class Shell
{
//修改新高考mykemu字段
public function updateMykemu(){
ignore_user_abort(true);
set_time_limit(0);
$id = Cache::store('redis')->get('recLikekemus');
if(empty($id)){
$id = 3793738;
}
$count = Db::table('rec_js')->where('id','between',[$id,7592360])->count();
$num = 1000;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i-1)*$num;
$result = Db::table('rec_js')->field('id,mykemu')->where('id','between',[$id,7592360])->limit($offet,$num)->select();
$level = config('setsub.levelArr');
foreach ($result as $key => $val) {
$val['mykemu'] = $result = explode(',',$val['mykemu']);
$res = '';
foreach($val['mykemu'] as $k=>$v){
$res .= $level[$v];
}
Db::table('rec_js')->where('id','=',$val['id'])->update(['mykemu'=>$res]);
Cache::store('redis')->set("recLikekemus",$val['id'],36000);
}
}
echo 1;die;
}
/*
* 江苏同步public和majorNum
* */
public function pubMajorNumTojs(){
ignore_user_abort(true);
set_time_limit(0);
$id = Cache::store('redis')->get('recjsIDs');
if(empty($id)){
$id = 0;
}
$count = Db::table('rec_js')->where('id','between',[$id,7592360])->count();
$num = 10000;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i - 1) * $num;
$result = Db::table('rec_js')->field("id,sch_id")->where('id','between',[$id,7592360])->limit($offet, $num)->select();
foreach ($result as $key => $val) {
$resSch = Db::table('yzy_school')->field("is_public")->where('sch_id', '=', $val['sch_id'])->find();
$resCount = Db::table('rec_js_major')->where('rec_id','=',$val['id'])->find();
$count = count(json_decode($resCount['professions']));
Db::table('rec_js')->where([['id', '=', $val['id']]])->update(['is_public' => $resSch['is_public'],'majorNum'=>$count]);
Cache::store('redis')->set("recjsIDs",$val['id'],36000);
}
}
echo 1;
}
/*
* 同步数据到yzy_major_score表sch_name,cost,typeName
*/
public function getSchNameTypeNameToJs(){
ignore_user_abort(true);
set_time_limit(0);
$id = Cache::store('redis')->get('majorScoreID');
if(empty($id)){
$id = 0;
}
$count = Db::table('yzy_major_score')->where('id','between',[$id,3626706])->count();
$num = 10000;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i - 1) * $num;
$result = Db::table('yzy_major_score')->field("id,sch_id,majorCode")->where('id','between',[$id,3626706])->limit($offet, $num)->select();
foreach ($result as $key => $val) {
$resCode = Db::table('yzy_majors')->field('pid')->where([['level','=',3],['code','=',$val['majorCode']]])->find();
$relCode = empty($resCode)?Db::table('yzy_majors')->field('pid,title')->where([['level','=',2],['code','=',$val['majorCode']]])->find():Db::table('yzy_majors')->field('title')->where('id','=',$resCode['pid'])->find();
if(empty($relCode)){
$relCode['title'] = '';
}
$resSch = Db::table('yzy_school')->field("title")->where('sch_id', '=', $val['sch_id'])->find();
Db::table('yzy_major_score')->where('id','=',$val['id'])->update(['sch_name'=>$resSch['title'],'typeName'=>$relCode['title']]);
Cache::store('redis')->set("majorScoreID",$val['id'],36000);
}
}
echo 1;
}
/*
* 修改rec_zhejiang_majors表将classify中文转换成数字
* */
public function updateCollegeType(){
$result = Db::table('rec_zhejiang_schs')->field('id,classify')->select();
$cate = config('setsub.cateArr');
foreach ($result as $key => $val) {
$cateid = $cate[$val['classify']];
Db::table('rec_zhejiang_schs')->where('id','=',$val['id'])->update(['collegeType'=>$cateid]);
}
}
/*
* 最低分和位次迁移
* */
public function updateMajor(){
$result = Db::table('rec_wen_major')->select();
foreach($result as $key=>$val){
$res = json_decode($val['professions']);
foreach($res as $k => $v){
$data['rec_id'] = $result[$key]['rec_id'];
$data['title'] = $v->alias;
$data['code'] = $v->majorCode;
$resRank = json_decode($v->extended);
$data['lowestRank'] = $resRank[0]->ls;
$data['minScore'] = $resRank[0]->ms;
$data['scoreLineYear'] = $v->scoreLineYear;
$data['year'] = $v->year;
$data['enterNum'] = $v->enterNum;
$data['planNum'] = $v->planNum;
$data['probability'] = $v->probability;
Db::table('rec_majors')->insert($data);
}
}
}
/*
* 新高考
* 数据迁移yzy_zj_major_score 新增字段 sch_cate rankOfCn
* */
public function updateMajorScore(){
$result = Db::table('yzy_zj_major_score')->field("id,sch_id")->select();
$cate = config('setsub.cateName');
foreach ($result as $key =>$val){
$resClass = Db::table('yzy_school')->field('cate_id')->where('sch_id','=',$val['sch_id'])->find();
$cateName = $cate[$resClass['cate_id']];
$resRank = Db::table("yzy_school_exts")->field('rankOfCn')->where("sch_id",'=',$val['sch_id'])->find();
Db::table('yzy_zj_major_score')->where([['id','=',$val['id']],['sch_id','=',$val['sch_id']]])->update(['classify'=>$cateName,'rankOfCn'=>$resRank['rankOfCn']]);
}
}
/*
* school表排名更新
* */
public function updateSchoolRank(){
$result = Db::table('yzy_school')->field("id,sch_id")->select();
foreach ($result as $key =>$val){
$resRank = Db::table("yzy_school_exts")->field('rankOfCn')->where("sch_id",'=',$val['sch_id'])->find();
Db::table('yzy_school')->where([['id','=',$val['id']],['sch_id','=',$val['sch_id']]])->update(['rankOfCn'=>$resRank['rankOfCn']]);
}
}
/*
* 新高考
* 专业数量同步到院校表
* */
public function majorCountToSch(){
set_time_limit(0);
$count = Db::table('rec_zhejiang_majors')->count();
$num = 1000;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i - 1) * $num;
$result = Db::table('rec_zhejiang_schs')->field("id")->limit($offet, $num)->select();
foreach ($result as $key => $val) {
$resMajor = Db::table('rec_zhejiang_schs_majors')->field('professions')->where('rec_id', '=', $val['id'])->find();
$count = count(json_decode($resMajor['professions']));
Db::table('rec_zhejiang_schs')->where('id', '=', $val['id'])->update(['majorNum' => $count]);
}
}
}
/*
* 院校logo地址查询
* */
public function getSchoolLogos(){
$result = Db::table('yzy_school')->field("sch_id,logo")->select();
return api_return('ok',$result);
}
/*
* 新高考院校表同步is_yldx,is_ylxk
* */
public function ylxkyldxToNewSch(){
set_time_limit(0);
$count = Db::table('rec_zhejiang_schs')->count();
$num = 100;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i - 1) * $num;
$result = Db::table('rec_zhejiang_schs')->field("id,collegeId")->limit($offet, $num)->select();
foreach ($result as $key => $val) {
$resSch = Db::table('yzy_school')->field("is_yldx,is_ylxk")->where('sch_id', '=', $val['collegeId'])->find();
Db::table('rec_zhejiang_schs')->where([['id', '=', $val['id']], ['collegeId', '=', $val['collegeId']]])->update(['is_yldx' => $resSch['is_yldx'], 'is_ylxk' => $resSch['is_ylxk']]);
}
}
}
/*
* 新高考專業表同步is_yldx,is_ylxk
* */
public function ylxkyldxToNewSchMajor(){
ignore_user_abort(true);
set_time_limit(0);
$id = Cache::store('redis')->get('NewSchMajorIDso');
if(empty($id)){
$id = 0;
}
$count = Db::table('rec_zhejiang_majors')->where('id','>',$id)->count();
$num = 10000;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i - 1) * $num;
$result = Db::table('rec_zhejiang_majors')->field("id,collegeId")->where('id','>',$id)->limit($offet, $num)->select();
try {
foreach ($result as $key => $val) {
$resSch = Db::table('yzy_school')->field("is_public")->where('sch_id', '=', $val['collegeId'])->find();
Db::table('rec_zhejiang_majors')->where([['id', '=', $val['id']]])->update(['is_public' => $resSch['is_public']]);
Cache::store('redis')->set("NewSchMajorIDso",$val['id'],36000);
\think\facade\Log::error($val['id']);
}
}catch (\Exception $exception){
\think\facade\Log::error($exception);
}
}
echo 1;
}
/*
* 普通高考院校文科同步雙一流字段和majorNum,public
* */
public function sylMajorNumToWen(){
ignore_user_abort(true);
set_time_limit(0);
$id = Cache::store('redis')->get('recWenIDso');
if(empty($id)){
$id = 0;
}
$count = Db::table('rec_wen')->where('id','between',[$id,8175158])->count();
$num = 10000;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i - 1) * $num;
$result = Db::table('rec_wen')->field("id,sch_id")->where('id','between',[$id,8175158])->limit($offet, $num)->select();
foreach ($result as $key => $val) {
$resSch = Db::table('yzy_school')->field("is_public")->where('sch_id', '=', $val['sch_id'])->find();
Db::table('rec_wen')->where([['id', '=', $val['id']]])->update(['is_public' => $resSch['is_public']]);
Cache::store('redis')->set("recWenIDso",$val['id'],36000);
}
}
echo 1;
}
/*
* 普通高考院校理科同步雙一流字段和majorNum
* */
public function sylMajorNumToLi(){
ignore_user_abort(true);
set_time_limit(0);
$id = Cache::store('redis')->get('recLikeIDo');
if(empty($id)){
$id = 0;
}
$count = Db::table('rec_li')->where('id','between',[$id,10491664])->count();
$num = 10000;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i - 1) * $num;
$result = Db::table('rec_li')->field("id,sch_id")->where('id','between',[$id,10491664])->limit($offet, $num)->select();
foreach ($result as $key => $val) {
$resSch = Db::table('yzy_school')->field("is_public")->where('sch_id', '=', $val['sch_id'])->find();
Db::table('rec_li')->where([['id', '=', $val['id']]])->update(['is_public' => $resSch['is_public']]);
Cache::store('redis')->set("recLikeIDo",$val['id'],36000);
}
}
echo 1;
}
}

View File

@@ -0,0 +1,212 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/28
* Time: 13:54
*/
namespace app\admin\controller;
use think\Db;
use think\Exception;
use think\facade\Cache;
use think\Log;
class Shellone
{
//修改新高考mykemu字段
public function updateMykemu(){
set_time_limit(0);
$count = Db::table('rec_js')->count();
$num = 100;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i-1)*$num;
$result = Db::table('rec_js')->field('id,mykemu')->limit($offet,$num)->select();
$level = config('setsub.levelArr');
foreach ($result as $key => $val) {
$val['mykemu'] = $result = explode(',',$val['mykemu']);
$res = '';
foreach($val['mykemu'] as $k=>$v){
$res .= $level[$v];
}
Db::table('rec_js')->where('id','=',$val['id'])->update(['mykemu'=>$res]);
}
}
echo ok;die;
}
/*
* 修改rec_zhejiang_majors表将classify中文转换成数字
* */
public function updateCollegeType(){
$result = Db::table('rec_zhejiang_schs')->field('id,classify')->select();
$cate = config('setsub.cateArr');
foreach ($result as $key => $val) {
$cateid = $cate[$val['classify']];
Db::table('rec_zhejiang_schs')->where('id','=',$val['id'])->update(['collegeType'=>$cateid]);
}
}
/*
* 最低分和位次迁移
* */
public function updateMajor(){
$result = Db::table('rec_wen_major')->select();
foreach($result as $key=>$val){
$res = json_decode($val['professions']);
foreach($res as $k => $v){
$data['rec_id'] = $result[$key]['rec_id'];
$data['title'] = $v->alias;
$data['code'] = $v->majorCode;
$resRank = json_decode($v->extended);
$data['lowestRank'] = $resRank[0]->ls;
$data['minScore'] = $resRank[0]->ms;
$data['scoreLineYear'] = $v->scoreLineYear;
$data['year'] = $v->year;
$data['enterNum'] = $v->enterNum;
$data['planNum'] = $v->planNum;
$data['probability'] = $v->probability;
Db::table('rec_majors')->insert($data);
}
}
}
/*
* 新高考
* 数据迁移yzy_zj_major_score 新增字段 sch_cate rankOfCn
* */
public function updateMajorScore(){
$result = Db::table('yzy_zj_major_score')->field("id,sch_id")->select();
$cate = config('setsub.cateName');
foreach ($result as $key =>$val){
$resClass = Db::table('yzy_school')->field('cate_id')->where('sch_id','=',$val['sch_id'])->find();
$cateName = $cate[$resClass['cate_id']];
$resRank = Db::table("yzy_school_exts")->field('rankOfCn')->where("sch_id",'=',$val['sch_id'])->find();
Db::table('yzy_zj_major_score')->where([['id','=',$val['id']],['sch_id','=',$val['sch_id']]])->update(['classify'=>$cateName,'rankOfCn'=>$resRank['rankOfCn']]);
}
}
/*
* school表排名更新
* */
public function updateSchoolRank(){
$result = Db::table('yzy_school')->field("id,sch_id")->select();
foreach ($result as $key =>$val){
$resRank = Db::table("yzy_school_exts")->field('rankOfCn')->where("sch_id",'=',$val['sch_id'])->find();
Db::table('yzy_school')->where([['id','=',$val['id']],['sch_id','=',$val['sch_id']]])->update(['rankOfCn'=>$resRank['rankOfCn']]);
}
}
/*
* 新高考
* 专业数量同步到院校表
* */
public function majorCountToSch(){
set_time_limit(0);
$count = Db::table('rec_zhejiang_majors')->count();
$num = 100;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i - 1) * $num;
$result = Db::table('rec_zhejiang_schs')->field("id")->limit($offet, $num)->select();
foreach ($result as $key => $val) {
$resMajor = Db::table('rec_zhejiang_schs_majors')->field('professions')->where('rec_id', '=', $val['id'])->find();
$count = count(json_decode($resMajor['professions']));
Db::table('rec_zhejiang_schs')->where('id', '=', $val['id'])->update(['majorNum' => $count]);
}
}
}
/*
* 院校logo地址查询
* */
public function getSchoolLogos(){
$result = Db::table('yzy_school')->field("sch_id,logo")->select();
return api_return('ok',$result);
}
/*
* 新高考院校表同步is_yldx,is_ylxk
* */
public function ylxkyldxToNewSch(){
set_time_limit(0);
$count = Db::table('rec_zhejiang_schs')->count();
$num = 1000;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i - 1) * $num;
$result = Db::table('rec_zhejiang_schs')->field("id,collegeId")->limit($offet, $num)->select();
foreach ($result as $key => $val) {
$resSch = Db::table('yzy_school')->field("is_yldx,is_ylxk")->where('sch_id', '=', $val['collegeId'])->find();
Db::table('rec_zhejiang_schs')->where([['id', '=', $val['id']], ['collegeId', '=', $val['collegeId']]])->update(['is_yldx' => $resSch['is_yldx'], 'is_ylxk' => $resSch['is_ylxk']]);
}
}
}
/*
* 新高考專業表同步is_yldx,is_ylxk
* */
public function ylxkyldxToNewSchMajor(){
ignore_user_abort(true);
ini_set('max_execution_time', '0');
set_time_limit(0);
$id = Cache::store('redis')->get('NewSchMajorID');
if(empty($id)){
$id = 3589199;
}
$count = Db::table('rec_zhejiang_majors')->where('id','>',$id)->count();
$num = 1000;//每次导入条数
$limit = ceil($count/$num);
for($i=1;$i<=$limit;$i++) {
$offet = ($i - 1) * $num;
$result = Db::table('rec_zhejiang_majors')->field("id,collegeId")->where('id','>',$id)->limit($offet, $num)->select();
try {
foreach ($result as $key => $val) {
$resSch = Db::table('yzy_school')->field("is_yldx,is_ylxk")->where('sch_id', '=', $val['collegeId'])->find();
Db::table('rec_zhejiang_majors')->where([['id', '=', $val['id']], ['collegeId', '=', $val['collegeId']]])->update(['is_yldx' => $resSch['is_yldx'], 'is_ylxk' => $resSch['is_ylxk']]);
Cache::store('redis')->set("NewSchMajorID",$val['id'],72000);
}
}catch (\Exception $exception){
\think\facade\Log::error($exception);
}
}
}
}

View File

@@ -0,0 +1,91 @@
<?php
/**
* 系统服务
* Class System
* @package app\admin\controller
*/
namespace app\admin\controller;
use app\admin\controller\AdminController;
use app\admin\model\SysNode;
use app\admin\service\NodeService;
use think\facade\Cache;
class System extends AdminController {
/**
* 刷新缓存
*/
public function refresh() {
if (app('cache')->clear()) {
echo '缓存刷新成功';
return msg_success('缓存刷新成功!');
} else {
echo '缓存刷新失败';
return msg_error('缓存刷新失败!');
}
}
/**
* 刷新节点
*/
public function refresh_node() {
if (!$this->request->isPost()) {
//get ajax 访问
if ($this->request->get('type') == 'ajax') {
$node_list = NodeService::refreshNode();
if (!empty($node_list)) return __success('节点刷新成功!');
return __error('暂无数据变化');
}
$modules = NodeService::getFolders(env('app_path'));
$module_list = [];
foreach ($modules as $k => $val) {
$node = model('node')->where(['node' => $val, 'type' => 1])->find();
!empty($node) ? $module_list[$k] = ['module' => $val, 'title' => $node['title']] : $module_list[$k] = ['module' => $val, 'title' => ''];
$val == 'admin' ? $module_list[$k]['is_checked'] = true : $module_list[$k]['is_checked'] = false;
}
$basic_data = [
'title' => '系统节点列表',
'module_list' => $module_list,
];
return $this->fetch('', $basic_data);
} else {
$post = $this->request->post();
if (empty($post['module'])) return __error('请选中需要刷新节点的模块!');
$node_list = NodeService::refreshNode($post['module']);
if ($node_list['code'] == 0) {
//清空菜单缓存
clear_menu();
return __success($node_list['msg']);
} else {
return __error($node_list['msg']);
}
}
}
/**
* 清除失效节点
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function clear_node() {
if (!$this->request->isPost()) {
$basic_data = [
'title' => '清除失效节点',
];
return $this->fetch('', $basic_data);
} else {
$clean = NodeService::cleanNode();
if ($clean['code'] == 0) {
return __success($clean['msg']);
} else {
return __error($clean['msg']);
}
}
}
}

View File

@@ -0,0 +1,161 @@
<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// +----------------------------------------------------------------------
// | github开源项目https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace app\admin\controller;
use app\admin\service\ModelService;
use app\common\service\CurlService;
use app\common\service\NodeService;
use think\Db;
use think\Controller;
use think\facade\Env;
use think\facade\Cache;
class Test extends Controller {
/**
* 测试
*/
public function index() {
return $this->fetch('');
}
public function upload() {
$data = [
'cur' => 'complete',
'url' => time() . '.jpg',
];
return json($data);
}
public function test() {
$redis = Cache::handler();
while (true) {
try {
$value = $redis->LPOP('click');
if (!$value) {
break;
}
echo $value . '<br>';
} catch (Exception $e) {
return $e->getMessage();
}
}
}
public function url() {
redirect('install/index/index');
exit;
}
public function curl() {
$test = curl()->Get('http://www.baidu.com');
dump($test);
}
public function add() {
$insert = [
'username' => 'admin',
'password' => password('bsafe2016'),
'id' => '1',
'auth_id' => '[]',
'status' => 1,
];
Db::startTrans();
try {
Db::table('system_user')->insert($insert);
Db::commit();
} catch (\Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
}
/**
* 生成数据库配置文件
* @return array
*/
private function mkDatabase($data = []) {
$code = <<<INFO
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
return [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '{$data['hostname']}',
// 数据库名
'database' => '{$data['database']}',
// 用户名
'username' => '{$data['username']}',
// 密码
'password' => '{$data['password']}',
// 端口
'hostport' => '{$data['hostport']}',
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => '{$data['prefix']}',
// 数据库调试模式
'debug' => false,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => false,
// 数据集返回类型
'resultset_type' => 'array',
// 自动写入时间戳字段
'auto_timestamp' => false,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 是否需要进行SQL性能分析
'sql_explain' => false,
// Builder类
'builder' => '',
// Query类
'query' => '\\think\\db\\Query',
];
INFO;
file_put_contents(Env::get('config_path') . 'database1.php', $code);
// 判断写入是否成功
$config = include Env::get('config_path') . 'database1.php';
if (empty($config['database']) || $config['database'] != $data['database']) {
return $this->error('[application/database.php]数据库配置写入失败!');
exit;
}
}
}

View File

@@ -0,0 +1,258 @@
<?php
/*
* 管理员信息管理
* */
namespace app\admin\controller;
use app\admin\controller\AdminController;
use think\facade\Cache;
class User extends AdminController {
/**
* User模型对象
*/
protected $model = null;
/**
* 初始化
* User constructor.
*/
public function __construct() {
parent::__construct();
$this->model = model('user');
}
/**
* 管理员列表
*/
public function index() {
//ajax访问
if ($this->request->get('type') == 'ajax') {
$page = $this->request->get('page', 1);
$limit = $this->request->get('limit', 10);
$search = (array)$this->request->get('search', []);
return json($this->model->userList($page, $limit, $search));
}
//基础数据
$basic_data = [
'title' => '管理员列表',
'data' => '',
];
return $this->fetch('', $basic_data);
}
/**
* 添加管理员
* @return mixed
*/
public function add() {
if (!$this->request->isPost()) {
//基础数据
$basic_data = [
'title' => '添加管理员',
'auth' => model('auth')->getList(),
];
$this->assign($basic_data);
return $this->form();
} else {
$post = $this->request->post();
!isset($post['auth_id']) && $post['auth_id'] = [];
//数组转json
$post['auth_id'] = json_encode($post['auth_id']);
//验证数据
$validate = $this->validate($post, 'app\admin\validate\User.add');
if (true !== $validate) return __error($validate);
//保存数据,返回结果
$post['password'] = password($post['password']);
return $this->model->add($post);
}
}
/**
* 修改管理员信息
* @return mixed|string|\think\response\Json
*/
public function edit() {
if (!$this->request->isPost()) {
//查找所需修改用户
$user = $this->model->where('id', $this->request->get('id'))->find();
if (empty($user)) return msg_error('暂无数据,请重新刷新页面!');
$auth = model('auth')->getList()->toArray();
$auth_id = json_decode($user['auth_id'], true);
foreach ($auth as $k => $val) {
$is_checked = false;
foreach ($auth_id as $k_1) $val['id'] == $k_1 && $is_checked = true;
$auth[$k]['is_checked'] = $is_checked;
}
//基础数据
$basic_data = [
'title' => '修改管理员信息',
'user' => $user->hidden(['password']),
'auth' => $auth,
];
$this->assign($basic_data);
return $this->form();
} else {
$post = $this->request->post();
!isset($post['auth_id']) && $post['auth_id'] = [];
//数组转json
$post['auth_id'] = json_encode($post['auth_id']);
//验证数据
$validate = $this->validate($post, 'app\admin\validate\User.edit');
if (true !== $validate) return __error($validate);
//清空菜单缓存
clear_menu();
//保存数据,返回结果
return $this->model->edit($post);
}
}
/**
* 表单模板
* @return mixed
*/
protected function form() {
return $this->fetch('form');
}
/**
* 管理员的删除
* @return \think\response\Json
*/
public function del() {
$get = $this->request->get();
//验证数据
if (!is_array($get['id'])) {
$validate = $this->validate($get, 'app\admin\validate\User.del');
if (true !== $validate) return __error($validate);
}
//执行删除操作
if (!is_array($get['id'])) {
$del = $this->model->where('id', $get['id'])->update(['is_deleted' => 1]);
} else {
$del = $this->model->whereIn('id', $get['id'])->update(['is_deleted' => 1]);
}
if ($del >= 1) {
//清空菜单缓存
clear_menu();
return __success('删除成功!');
} else {
return __error('数据有误,请刷新重试!');
}
}
/**
* 修改用户密码
* @return mixed|string|\think\response\Json
*/
public function edit_password() {
if (!$this->request->isPost()) {
if (empty($this->request->get('id'))) return msg_error('暂无用户信息!');
$where_user = [
'id' => $this->request->get('id'),
'is_deleted' => 0,
];
$user = $this->model->where($where_user)->field('id, username')->find();
if (empty($user)) return msg_error('暂无用户信息,请关闭页面刷新重试!');
$basic_data = [
'title' => '修改管理员密码',
'user' => $user,
];
return $this->fetch('', $basic_data);
} else {
$post = $this->request->post();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\User.edit_password');
if (true !== $validate) return __error($validate);
//修改密码数据
return $this->model->editPassword($post);
}
}
/**
* 更改管理员状态
* @return \think\response\Json
*/
public function status() {
$get = $this->request->get();
//验证数据
$validate = $this->validate($get, 'app\admin\validate\User.status');
if (true !== $validate) return __error($validate);
//判断管理员状态
$status = $this->model->where('id', $get['id'])->value('status');
$status == 1 ? list($msg, $status) = ['禁用成功', $status = 0] : list($msg, $status) = ['启用成功', $status = 1];
//执行更新操作操作
$update = $this->model->where('id', $get['id'])->update(['status' => $status]);
//清空菜单缓存
clear_menu();
if ($update >= 1) return __success($msg);
return __error('数据有误,请刷新重试!');
}
/**
* 修改自己的信息
* @return mixed|string|\think\response\Json
*/
public function edit_self() {
if (!$this->request->isPost()) {
//查找所需修改用户
$user = $this->model->where('id', $this->user['id'])->find();
if (empty($user)) return msg_error('暂无数据,请重新刷新页面!');
//基础数据
$basic_data = [
'title' => '修改管理员信息',
'user' => $user->hidden(['password']),
];
$this->assign($basic_data);
return $this->fetch('form_self');
} else {
$post = $this->request->post();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\User.editSelf');
if (true !== $validate) return __error($validate);
//清空菜单缓存
clear_menu();
//保存数据,返回结果
return $this->model->editSelf($post);
}
}
}

View File

@@ -0,0 +1 @@
44e9deb2-eea3-4463-8100-5169958e89b1

View File

@@ -0,0 +1,58 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/10/1
* Time: 1:10
*/
namespace app\admin\controller\api;
use app\admin\controller\AdminController;
use think\facade\Cache;
/**
* 后台公共接口
* Class Common
* @package app\api\controller\admin
*/
class Common extends AdminController {
/**
* 获取菜单接口
*/
public function getMenu() {
$SysInfo = Cache::get('SysInfo');
if (!isset($SysInfo['AdminModuleName'])) {
return __error('后台绑定模块名数据有误,请刷新缓存或修改数据库配置!');
}
$this->redirect(url("{$SysInfo['AdminModuleName']}.php\api.menu\getMenu"));
}
/**
* 打开图片上传窗口
* @return \think\response\Json
*/
public function uploadIamge($type = 'one') {
$SysInfo = Cache::get('SysInfo');
if (!isset($SysInfo['AdminModuleName'])) {
return __error('后台绑定模块名数据有误,请刷新缓存或修改数据库配置!');
}
$this->redirect(url("{$SysInfo['AdminModuleName']}.php\\tool.upload\image") . "?type=" . $type);
}
/**
* 后台刷新缓存接口
* @return \think\response\Json
*/
public function clearCache() {
if (app('cache')->clear()) {
return __success('缓存刷新成功!');
} else {
return __error('缓存刷新失败!');
}
}
}

View File

@@ -0,0 +1,62 @@
<?php
/*
* 菜单控制接口
* */
namespace app\admin\controller\api;
use app\admin\controller\AdminController;
use think\facade\Cache;
class Menu extends AdminController
{
/**
* 根据权限规则生成菜单栏数据
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getMenu()
{
if (!empty(Cache::tag('menu')->get(session('user.id') . '_AdminMenu'))) {
return json(Cache::get(session('user.id') . '_AdminMenu'));
} else {
$menu_list = \app\admin\model\Menu::getMenuApi();
Cache::tag('menu')->set(session('user.id') . '_AdminMenu', $menu_list, 86400);
return json($menu_list);
}
}
/**
* 获取顶部菜单栏
* @return mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getNav()
{
if (!empty(Cache::tag('menu')->get(session('user.id') . '_AdminMenu'))) {
$menu_list = Cache::get(session('user.id') . '_AdminMenu');
} else {
$menu_list = \app\admin\model\Menu::getMenuApi();
Cache::tag('menu')->set(session('user.id') . '_AdminMenu', $menu_list, 86400);
}
$memu_id_list = [];
foreach ($menu_list as $key => $val) {
$menu_id = explode("66ysx_", $key);
isset($menu_id[1]) && $memu_id_list[] = $menu_id[1];
}
$nav = model('menu')->whereIn('id', $memu_id_list)->field('id, title, icon')
->order([
'sort' => 'asc',
'create_at' => 'asc',
])->select();
foreach ($nav as $key => $val) {
(strpos($nav[$key]['icon'], 'fa-') !== false) ? $nav[$key]['icon_type'] = true : $nav[$key]['icon_type'] = false;
}
return $nav;
}
}

View File

@@ -0,0 +1,66 @@
<?php
/*
* 系统节点接口
* */
namespace app\admin\controller\api;
use app\admin\controller\AdminController;
class Node extends AdminController {
/**
* 获取对应角色的节点数据
* @param $id
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getNodeTree($id) {
$list = [];
$module = model('node')->where(['type' => 1, 'is_auth' => 1])->order(['node' => 'asc'])->select();
foreach ($module as $k => $val) {
$list[$k] = [
'title' => $this->__biuldGetNodeTree($val['node'], $val['title']),
'value' => $val['id'],
'data' => [],
];
$is_checked = model('auth_node')->where(['auth' => $id, 'node' => $val['id']])->find();
!empty($is_checked) && $list[$k]['checked'] = true;
$data_1 = model('node')->where([['type', '=', 2], ['is_auth', '=', 1], ['node', 'LIKE', "{$val['node']}/%"]])->select();
foreach ($data_1 as $k_1 => $val_1) {
$list[$k]['data'][$k_1] = [
'title' => $this->__biuldGetNodeTree($val_1['node'], $val_1['title']),
'value' => $val_1['id'],
'data' => [],
];
$is_checked_1 = model('auth_node')->where(['auth' => $id, 'node' => $val_1['id']])->find();
!empty($is_checked_1) && $list[$k]['data'][$k_1]['checked'] = true;
$data_2 = model('node')->where([['type', '=', 3], ['is_auth', '=', 1], ['node', 'LIKE', "{$val_1['node']}/%"]])->select();
foreach ($data_2 as $k_2 => $val_2) {
$list[$k]['data'][$k_1]['data'][$k_2] = [
'title' => $this->__biuldGetNodeTree($val_2['node'], $val_2['title']),
'value' => $val_2['id'],
'data' => [],
];
$is_checked_2 = model('auth_node')->where(['auth' => $id, 'node' => $val_2['id']])->find();
!empty($is_checked_2) && $list[$k]['data'][$k_1]['data'][$k_2]['checked'] = true;
}
}
}
return json($list);
}
/**
* 组合数据
* @param $node
* @param $title
* @return string
*/
protected function __biuldGetNodeTree($node, $title) {
if (empty($title)) return $node;
else return $title . '【' . $node . '】';
}
}

View File

@@ -0,0 +1,51 @@
<?php
/**
* 后台上传通用接口
* Class Upload
* @package app\admin\controller\api
*/
namespace app\admin\controller\api;
use app\admin\controller\AdminController;
use app\admin\service\QiniuService;
use think\Db;
class Upload extends AdminController {
/**
* 编辑器多图片上传
* @return \think\response\Json
*/
public function image() {
$files = request()->file();
if (is_array($files)) {
foreach ($files as $vo) {
$info = $vo->move('../public/static/uploads');
if ($info) {
$url[] = '/static/uploads/' . date('Ymd') . '/' . $info->getFilename();
} else {
return json(['code' => 1, 'msg' => $vo->getError()]);
}
}
} else {
$info = $files->move('../public/static/uploads');
if ($info) {
$url[] = '/static/uploads/' . date('Ymd') . '/' . $info->getFilename();
} else {
return json(['code' => 1, 'msg' => $files->getError()]);
}
}
//判断是否使用七牛云上传
$file_type = Db::name('SystemConfig')->where(['name' => 'FileType', 'group' => 'file'])->value('value');
if ($file_type == 2) {
foreach ($url as &$vo) {
$vo = QiniuService::upload($vo);
}
}
return json(['code' => 0, 'msg' => '上传成功!', 'url' => $url]);
}
}

View File

@@ -0,0 +1,17 @@
<?php
/**
* 欢迎页接口
* Class Welcome
* @package app\admin\controller\api
*/
namespace app\admin\controller\api;
use app\admin\controller\AdminController;
class Welcome extends AdminController {
}

View File

@@ -0,0 +1 @@
abd2f604-0e26-4a3e-ae75-60639c9df448

View File

@@ -0,0 +1,86 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/24
* Time: 15:05
*/
namespace app\admin\controller\custom;
use app\admin\controller\AdminController;
class Message extends AdminController
{
/**
* User模型对象
*/
protected $model = null;
/**
* 初始化
* User constructor.
*/
public function __construct() {
parent::__construct();
$this->model = new \app\admin\model\costom\Message;
}
/**
* 留言建议列表
*/
public function index() {
//ajax访问
if ($this->request->get('type') == 'ajax') {
$page = $this->request->get('page', 1);
$limit = $this->request->get('limit', 10);
$search = (array)$this->request->get('search', []);
return json($this->model->messageList($page, $limit, $search));
}
$basic_data = [
'title' => '留言建议列表',
'data' => '',
];
return $this->fetch('', $basic_data);
}
/**
* 留言回复
* @return mixed|string|\think\response\Json
*/
public function reply() {
if (!$this->request->isPost()) {
//查找所需修改的数据
$data = $this->model->where('id', $this->request->get('id'))->find();
if($data['img1']){
$data['img1'] = config('secure.mpic_url'). $data['img1'];
}
if($data['img2']){
$data['img2'] = config('secure.mpic_url'). $data['img2'];
}
if (empty($data)) return msg_error('暂无数据,请重新刷新页面!');
//基础数据
$basic_data = [
'title' => '工单回复',
'result' => $data,
];
return $this->fetch('form', $basic_data);
} else {
$post = $this->request->post();
$post['reply_time'] = time();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\custom\Message.reply');
if (true !== $validate) return __error($validate);
//保存数据,返回结果
return $this->model->reply($post);
}
}
}

View File

@@ -0,0 +1,130 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/24
* Time: 11:25
*/
namespace app\admin\controller\custom;
use app\admin\controller\AdminController;
use think\Db;
use app\admin\model\costom\Order as OrderModel;
class Order extends AdminController
{
/**
* User模型对象
*/
protected $model = null;
/**
* 初始化
* User constructor.
*/
public function __construct() {
parent::__construct();
$this->model = new \app\admin\model\costom\Order;
}
/**
* 订单列表
*/
public function index() {
//ajax访问
if ($this->request->get('type') == 'ajax') {
$page = $this->request->get('page', 1);
$limit = $this->request->get('limit', 10);
$search = (array)$this->request->get('search', []);
return json($this->model->orderList($page, $limit, $search));
}
//获取配置表的省份数据
$resProvince = config('province.province');
//基础数据
$basic_data = [
'title' => '订单列表',
'resProvince' => $resProvince,
'data' => '',
];
return $this->fetch('', $basic_data);
}
/*
* 订单详情
* */
public function details(){
//订单商品列表
if ($this->request->get('type') == 'ajax') {
$id = $this->request->get('user_id');
$result = Db::table('orders')->where('user_id','=',$id)->limit(30)->select();
empty($result) ? $msg = '暂无数据!' : $msg = '查询成功!';
//获取配置权限名称
$vipNameArr = config('product.vipName');
foreach($result as $key => $val){
$result[$key]['vipName'] = $vipNameArr[$val['vip']];
$result[$key]['add_time'] = date('Y-m-d H:i:s',$val['add_time']);
if($val['pay_time']){
$result[$key]['pay_time'] = date('Y-m-d H:i:s',$val['pay_time']);
}
$val['wenli'] = $val['wenli'] = config('setSub.subTypeName')[$val['wenli']];
//拼接用户信息
$result[$key]['userInfo'] = $val['province_title']."_".$val['score']."_".$val['wenli']."_".$val['mykemustr'];
}
$list = [
'code' => 0,
'msg' => $msg,
'data' => $result
];
return json($list);
}
$id = $this->request->get('id',0);
$basic_data = [
'title' => '订单详情列表',
'data' => '',
'user_id' => $id
];
$this->assign($basic_data);
return $this->fetch('custom/student/details');
}
/*
* 订单退款
* */
public function refundOrder(){
$post = $this->request->post();
$validate = $this->validate($post, 'app\admin\validate\custom\Student.refundOrder');
if (true !== $validate){
$list = [
'code' => 0,
'msg' => $validate
];
return $list;
exit;
};
$result = OrderModel::orderRefund($post);
if($result){
$list = [
'code' => 1,
'msg' => '退款成功!'
];
}else{
$list = [
'code' => 2,
'msg' => '退款失败!'
];
}
return $list;
}
}

View File

@@ -0,0 +1,128 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/25
* Time: 15:09
*/
namespace app\admin\controller\custom;
use app\admin\controller\AdminController;
use think\Db;
class Proscore extends AdminController
{
/**
* 默认模型对象
*/
protected $model = null;
/**
* 初始化
* User constructor.
*/
public function __construct() {
parent::__construct();
$this->model = new \app\admin\model\costom\Proscore();
}
/**
* 省控分數列表
* @return mixed|\think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function index() {
if (!$this->request->isPost()) {
if ($this->request->get('type') == 'ajax') {
$page = $this->request->get('page', 1);
$limit = $this->request->get('limit', 10);
$search = (array)$this->request->get('search', []);
return json($this->model->getList($page, $limit, $search));
}
//获取配置表的省份数据
$resProvince = config('province.province');
//基础数据
$basic_data = [
'title' => '省控分数列表',
'resProvince' => $resProvince,
'data' => '',
];
return $this->fetch('', $basic_data);
}
}
/**
* 添加
* @return mixed
*/
public function add() {
if (!$this->request->isPost()) {
$province_list = config('province.province');
$basic_data = [
'province_list' => $province_list,
'title' => '添加',
];
return $this->fetch('form', $basic_data);
} else {
$post = $this->request->post();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\custom\Proscore.add');
if (true !== $validate) return __error($validate);
//保存数据,返回结果
return $this->model->addData($post);
}
}
/**
* 修改
* @return mixed|string|\think\response\Json
*/
public function edit() {
if (!$this->request->isPost()) {
$province_list = config('province.province');
//查找所需修改的数据
$data = $this->model->where('id', $this->request->get('id'))->find();
if (empty($data)) return msg_error('暂无数据,请重新刷新页面!');
//基础数据
$basic_data = [
'title' => '修改信息',
'res' => $data,
'province_list'=> $province_list
];
return $this->fetch('form', $basic_data);
} else {
$post = $this->request->post();
//验证数据
$validate = $this->validate($post, 'app\admin\validate\custom\Proscore.edit');
if (true !== $validate) return __error($validate);
//保存数据,返回结果
return $this->model->editData($post);
}
}
/**
* 删除
* @return \think\response\Json
*/
public function del() {
$get = $this->request->get();
//验证数据
if (!is_array($get['id'])) {
$validate = $this->validate($get, 'app\admin\validate\custom\Proscore.del');
if (true !== $validate) return __error($validate);
}
//执行删除操作
return $this->model->delData($get['id'], true);
}
}

View File

@@ -0,0 +1,132 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/23
* Time: 8:53
*/
namespace app\admin\controller\custom;
use app\admin\controller\AdminController;
use think\Db;
use app\admin\model\costom\Order;
class Student extends AdminController
{
/**
* User模型对象
*/
protected $model = null;
/**
* 初始化
* User constructor.
*/
public function __construct() {
parent::__construct();
$this->model = new \app\admin\model\costom\User;
}
/**
* 用戶列表
*/
public function index() {
//ajax访问
if ($this->request->get('type') == 'ajax') {
$page = $this->request->get('page', 1);
$limit = $this->request->get('limit', 10);
$search = (array)$this->request->get('search', []);
return json($this->model->userList($page, $limit, $search));
}
//获取配置表的省份数据
$resProvince = config('province.province');
//基础数据
$basic_data = [
'title' => '用戶列表',
'resProvince' => $resProvince,
'data' => '',
];
return $this->fetch('', $basic_data);
}
/*
* 订单详情
* */
public function details(){
//订单商品列表
if ($this->request->get('type') == 'ajax') {
$id = $this->request->get('user_id');
$result = Db::table('orders')->where('user_id','=',$id)->limit(30)->select();
empty($result) ? $msg = '暂无数据!' : $msg = '查询成功!';
//获取配置权限名称
$vipNameArr = config('product.vipName');
foreach($result as $key => $val){
$result[$key]['vipName'] = $vipNameArr[$val['vip']];
$result[$key]['add_time'] = date('Y-m-d H:i:s',$val['add_time']);
if($val['pay_time']){
$result[$key]['pay_time'] = date('Y-m-d H:i:s',$val['pay_time']);
}
$val['wenli'] = $val['wenli'] = config('setSub.subTypeName')[$val['wenli']];
//拼接用户信息
$result[$key]['userInfo'] = $val['province_title']."_".$val['score']."_".$val['wenli']."_".$val['mykemustr'];
}
$list = [
'code' => 0,
'msg' => $msg,
'data' => $result
];
return json($list);
}
$id = $this->request->get('id',0);
$basic_data = [
'title' => '订单详情列表',
'data' => '',
'user_id' => $id
];
$this->assign($basic_data);
return $this->fetch();
}
/*
* 订单退款
* */
public function refundOrder(){
$post = $this->request->post();
$validate = $this->validate($post, 'app\admin\validate\custom\Student.refundOrder');
if (true !== $validate){
$list = [
'code' => 0,
'msg' => $validate
];
return $list;
exit;
};
$result = Order::orderRefund($post);
if($result){
$list = [
'code' => 1,
'msg' => '退款成功!'
];
}else{
$list = [
'code' => 2,
'msg' => '退款失败!'
];
}
return $list;
}
}

View File

@@ -0,0 +1 @@
69df9137-96a1-4de5-a0ee-79d0e3e649fd

View File

@@ -0,0 +1,38 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/10/15
* Time: 21:51
*/
namespace app\admin\controller\tool;
use app\admin\controller\AdminController;
/**
* 图标管理
* Class Icon
* @package app\admin\controller
*/
class Icon extends AdminController {
/**
* 图标列表
*/
public function index() {
$basic_data = [
'title' => '图标列表',
];
return $this->fetch('', $basic_data);
}
public function fa(){
$basic_data = [
'title' => 'fa图标列表',
];
return $this->fetch('', $basic_data);
}
}

View File

@@ -0,0 +1,29 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/10/15
* Time: 21:58
*/
namespace app\admin\controller\tool;
use app\admin\controller\AdminController;
/**
* 上传图片插件
* Class Upload
* @package app\admin\controller\tool
*/
class Upload extends AdminController {
/**
* 上传图片
* @param string $type ['multi','one']
* @return mixed
*/
public function image($type = 'one') {
return $this->fetch('', ['type' => $type]);
}
}

View File

@@ -0,0 +1 @@
4bd183af-4f0c-4a12-9e0b-6a6be05cb63e

View File

@@ -0,0 +1,11 @@
<?php
/*
* 文章模型
* */
namespace app\admin\model;
class Article {
}

View File

@@ -0,0 +1,124 @@
<?php
/**
* 权限组模型
* Class Auth
* @package app\admin\model
*/
namespace app\admin\model;
use app\admin\service\ModelService;
class Auth extends ModelService {
/**
* 绑定的数据表
* @var string
*/
protected $table = 'system_auth';
/**
* 获取权限组
* @return array|\PDOStatement|string|\think\Collection
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getList() {
$where_auth = [
['status', '=', 1],
];
$order_auth = [
'id' => 'asc',
];
$auth = $this->where($where_auth)->field('id, title, status')->order($order_auth)->select();
return $auth;
}
/**
* 权限角色列表
* @param int $page
* @param int $limit
* @param array $search
* @param array $where
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function authList($page = 1, $limit = 10, $search = [], $where = []) {
//搜索条件
foreach ($search as $key => $value) {
if ($key == 'status' && $value != '') {
$where[] = [$key, '=', $value];
} elseif ($key == 'create_at' && $value != '') {
$value_list = explode(" - ", $value);
$where[] = [$key, 'BETWEEN', ["{$value_list[0]} 00:00:00", "{$value_list[1]} 23:59:59"]];
} else {
!empty($value) && $where[] = [$key, 'LIKE', '%' . $value . '%'];
}
}
$field = 'id, title , remark, status, sort, create_at';
$count = $this->where($where)->count();
$data = $this->where($where)->field($field)->page($page, $limit)->order(['sort asc'])->select();
empty($data) ? $msg = '暂无数据!' : $msg = '查询成功!';
$info = [
'limit' => $limit,
'page_current' => $page,
'page_sum' => ceil($count / $limit),
];
$list = [
'code' => 0,
'msg' => $msg,
'count' => $count,
'info' => $info,
'data' => $data,
];
return $list;
}
/**
* 保存节点
* @param $insert
* @return \think\response\Json
*/
public function add($insert) {
$save = $this->save($insert);
if ($save == 1) {
return __success('保存成功!');
} else {
return __error('保存失败!');
}
}
/**
* 更新节点
* @param $update
* @return \think\response\Json
*/
public function edit($update) {
$data = $this->where('id', $update['id'])->update($update);
if ($data == 1) {
return __success('更新成功!');
} else {
return __error('数据没有修改!');
}
}
/**
* 修改系统节点字段值
* @param $update
* @return \think\response\Json
*/
public function edit_field($update) {
$data = $this->where('id', $update['id'])->update([$update['field'] => $update['value']]);
if ($data == 1) {
return __success('修改成功!');
} else {
return __error('数据没有修改!');
}
}
}

View File

@@ -0,0 +1,30 @@
<?php
/*
*权限节点模型
* */
namespace app\admin\model;
use app\admin\service\ModelService;
class AuthNode extends ModelService {
/**
* 绑定的数据表
* @var string
*/
protected $table = 'system_auth_node';
/**
* 保存授权信息
* @param $insertAll
* @return \think\response\Json
* @throws \Exception
*/
public function authorize($insertAll) {
$save = $this->saveAll($insertAll);
if (!empty($save)) return __success('保存成功!');
return __error('保存失败');
}
}

View File

@@ -0,0 +1,87 @@
<?php
/**
* 系统配置模板
*/
namespace app\admin\model;
use app\admin\service\ModelService;
/**
* 系统配置信息
* Class Config
* @package app\admin\model
*/
class Config extends ModelService {
/**
* 绑定数据表
* @var string
*/
protected $table = 'system_config';
/**
* 获取系统基础配置信息
* @return array|\PDOStatement|string|\think\Collection
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getBasicConfig() {
$basic = $this->where('group', 'basic')->column('name,value');
return $basic;
}
/**
* 获取系统配置列表
* @param int $page
* @param int $limit
* @param array $search
* @param array $where
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function configList($page = 1, $limit = 500, $search = [], $where = []) {
//搜索条件
foreach ($search as $key => $value) {
!empty($value) && $where[] = [$key, 'LIKE', '%' . $value . '%'];
}
$field = 'id, group , name, value, remark, sort, create_at';
$count = $this->where($where)->count();
$data = $this->where($where)->field($field)->order(['sort asc'])->select();
empty($data) ? $msg = '暂无数据!' : $msg = '查询成功!';
$info = [
'limit' => $limit,
'page_current' => $page,
'page_sum' => ceil($count / $limit),
];
$list = [
'code' => 0,
'msg' => $msg,
'count' => $count,
'info' => $info,
'data' => $data,
];
return $list;
}
/**
* 修改字段值
* @param $update
* @return \think\response\Json
*/
public function edit_field($update) {
$data = $this->where('id', $update['id'])->update([$update['field'] => $update['value']]);
if ($data == 1) {
return __success('修改成功!');
} else {
return __error('数据没有修改!');
}
}
}

View File

@@ -0,0 +1,301 @@
<?php
/*
* 菜单模型
* */
namespace app\admin\model;
use app\admin\service\ModelService;
class Menu extends ModelService {
/**
* 绑定数据表
* @var string
*/
protected $table = 'system_menu';
/**
* 新增菜单数据
* @param $insert
* @return \think\response\Json
* @throws \think\exception\PDOException
*/
public function add($insert) {
//使用事物保存数据
$this->startTrans();
$save = $this->save($insert);
if (!$save) {
$this->rollback();
return __error('数据有误,请稍后再试!');
}
$this->commit();
return __success('菜单添加成功!');
}
/**
* 修改菜单数据
* @param $update
* @return \think\response\Json
*/
public function edit($update) {
$data = $this->where('id', $update['id'])->update($update);
if ($data == 1) {
return __success('菜单更新成功!');
} else {
return __error('数据没有修改!');
}
}
/**
* 获取首页信息
* @return array|null|\PDOStatement|string|\think\Model
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getHome() {
$where_home = [
['id', '=', 1],
['status', '=', 1],
];
$home = $this->field('id, title, icon, href')->where($where_home)->find();
!empty($home) && $home['href'] = url($home['href']);
return $home;
}
/**
* 获取菜单栏头部
* @return array|\PDOStatement|string|\think\Collection
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public static function getNav() {
$where_nav = [
['id', '<>', 1],
['pid', '=', 0],
['status', '=', 1],
];
$order_nav = [
'sort' => 'asc',
'create_at' => 'asc',
];
//查询顶级菜单栏数据
$nav = self::field('id, title, icon')->where($where_nav)->order($order_nav)->select();
//去除空菜单
foreach ($nav as $k => $val) {
$menu = self::where(['pid' => $nav[$k]['id'], 'status' => 1])->select()->toArray();
if (empty($menu)) unset($nav[$k]);
}
//判断图标类型
foreach ($nav as $key => $val) (strpos($nav[$key]['icon'], 'fa-') !== false) ? $nav[$key]['icon_type'] = true : $nav[$key]['icon_type'] = false;
return $nav;
}
/**
* 获取菜单栏数据
* @param array $search 搜索条件
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function menuList($search = [], $where = []) {
if (empty($search)) {
$menu_list = $this->getMenu();
empty($menu_list) ? $msg = '暂无数据!' : $msg = '查询成功!';
return [
'code' => 0,
'msg' => $msg,
'count' => count($menu_list),
'data' => $menu_list,
];
} else {
//搜索条件
foreach ($search as $key => $value) {
if ($key == 'status' && $value != '') {
$where[] = [$key, '=', $value];
} elseif ($key == 'create_at' && $value != '') {
$value_list = explode(" - ", $value);
$where[] = [$key, 'BETWEEN', ["{$value_list[0]} 00:00:00", "{$value_list[1]} 23:59:59"]];
} else {
!empty($value) && $where[] = [$key, 'LIKE', '%' . $value . '%'];
}
}
$menu_list = $this->where($where)->order(['pid' => 'asc', 'sort' => 'asc', 'create_at' => 'desc'])->select();
empty($menu_list) ? $msg = '暂无数据!' : $msg = '查询成功!';
//修改菜单栏数据格式
$this->__buildMenu($menu_list);
return [
'code' => 0,
'msg' => $msg,
'count' => count($menu_list),
'data' => $menu_list,
];
}
}
/**
* 修改搜索菜单栏数据格式
* @param $list
* @param int $i
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function __buildMenu(&$list) {
foreach ($list as &$vo) {
$i = 1;
if ($vo['pid'] != 0) {
$i++;
$nav = $this->where('id', $vo['pid'])->find();
!empty($nav) && ($nav['pid'] != 0 && $i++);
}
$vo['title'] = replace_menu_title($vo['title'], $i);
($vo['id'] == 1 || $i >= 3) ? $vo['is_add'] = false : $vo['is_add'] = true;
}
}
/**
* 使用回调获取菜单栏数据
* @param int $pid 上级id
* @param array $menu 菜单数据
* @param int $i 序号
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getMenu($pid = 0, &$menu = [], $i = 0) {
$i++;
$field = 'id, pid, title, icon, href, target, sort, status, create_at, create_by';
$where_nav = [
['pid', '=', $pid],
];
$order = [
'sort' => 'asc',
'create_at' => 'desc',
];
$nav = $this->field($field)->where($where_nav)->order($order)->select();
foreach ($nav as $vo) {
($vo['id'] == 1 || $i >= 3) ? $vo['is_add'] = false : $vo['is_add'] = true;
$vo['title'] = replace_menu_title($vo['title'], $i);
$menu[] = $vo;
$this->getMenu($vo['id'], $menu, $i);
}
return $menu;
}
/**
* 创建菜单时获取上级的菜单
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function getUpMenu() {
$field = 'id, pid, title';
$where_nav = [
['id', '<>', 1],
['pid', '=', 0],
];
$order = [
'sort' => 'asc',
'create_at' => 'desc',
];
//最顶级
$first_list = $this->where($where_nav)->field($field)->order($order)->select();
//组合菜单数据
$menu_list[] = [
'id' => 0,
'pid' => 0,
'title' => '顶级菜单',
];
foreach ($first_list as &$vo) {
$vo['title'] = replace_menu_title($vo['title'], 1);
$menu_list[] = $vo;
$where_second = [['pid', '=', $vo['id']]];
$second_list = $this->where($where_second)->field($field)->order($order)->select();
foreach ($second_list as &$vl) {
$vl['title'] = replace_menu_title($vl['title'], 2);
$menu_list[] = $vl;
}
}
return $menu_list;
}
/**
* 获取系统导航菜单
* @param array $menu_list
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public static function getMenuApi($menu_list = []) {
$field = 'id, pid, title, icon, href, spread, target';
$order = ['sort' => 'asc', 'create_at' => 'desc'];
$nav = self::getNav()->toArray();
foreach ($nav as $vo) {
$i = 0;
$where_first_menu = [['pid', '=', $vo['id']], ['status', '=', 1]];
$first_menu = self::field($field)->where($where_first_menu)->order($order)->select()->toArray();
foreach ($first_menu as $vo_1) {
if (auth($vo_1['href'])) {
if (!empty($vo_1['href']) && $vo_1['href'] != "#") {
$vo_1['href'] = url($vo_1['href']);
}
$vo_1['spread'] = (bool)$vo_1['spread'];
$menu_list['66ysx_' . $vo['id']][$i] = $vo_1;
$where_second_menu = [['pid', '=', $vo_1['id']], ['status', '=', 1]];
$second_menu = self::field($field)->where($where_second_menu)->order($order)->select()->toArray();
foreach ($second_menu as $vo_2) {
if (auth($vo_2['href'])) {
if (!empty($vo_2['href']) && $vo_2['href'] != "#") {
$vo_2['href'] = url($vo_2['href']);
}
$vo_2['spread'] = (bool)$vo_2['spread'];
$menu_list['66ysx_' . $vo['id']][$i]['children'][] = $vo_2;
}
}
//去除空菜单
if (!isset($menu_list['66ysx_' . $vo['id']][$i]['children'])) {
if ($menu_list['66ysx_' . $vo['id']][$i]['href'] == '#' || $menu_list['66ysx_' . $vo['id']][$i]['href'] == '') {
unset($menu_list['66ysx_' . $vo['id']][$i]);
} else {
$i++;
}
} else {
$i++;
}
}
}
}
return array_filter($menu_list);
}
/**
* 更新字段值
* @param $update
* @return \think\response\Json
*/
public function edit_field($update) {
$data = $this->where('id', $update['id'])->update([$update['field'] => $update['value']]);
if ($data == 1) {
return __success('修改成功!');
} else {
return __error('数据没有修改!');
}
}
}

View File

@@ -0,0 +1,35 @@
<?php
/*
* 导航模型
* */
namespace app\admin\model;
use app\admin\service\ModelService;
class Nav extends ModelService {
/**
* 绑定数据表
* @var string
*/
protected $table = 'system_nav';
/**
* 获取快捷导航
* @param int $limit
* @return array|\PDOStatement|string|\think\Collection
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public static function getQuickNav($limit = 6) {
$list = self::where(['status' => 1])->order(['sort' => 'desc', 'create_at' => 'desc'])
->limit($limit)->select()->each(function ($item, $key) {
$item['href'] = url($item['href']);
});
return $list;
}
}

View File

@@ -0,0 +1,142 @@
<?php
/*
* 节点模型
* */
namespace app\admin\model;
use app\admin\service\ModelService;
class Node extends ModelService {
/**
* 绑定的数据表
* @var string
*/
protected $table = 'system_node';
/**
* 节点列表
* @param int $page 当前页
* @param int $limit 每页显示数量
* @param array $search 搜索条件 array
* @param array $where 组成的条件
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function nodeList($page = 1, $limit = 10, $search = [], $where = []) {
//搜索条件
foreach ($search as $key => $value) {
if ($key == 'is_auth' && $value != '') {
$where[] = [$key, '=', $value];
} elseif ($key == 'create_at' && $value != '') {
$value_list = explode(" - ", $value);
$where[] = [$key, 'BETWEEN', ["{$value_list[0]} 00:00:00", "{$value_list[1]} 23:59:59"]];
} else {
!empty($value) && $where[] = [$key, 'LIKE', '%' . $value . '%'];
}
}
$field = 'id, node, title , is_auth, create_at';
$count = $this->where($where)->count();
$data = $this->where($where)->field($field)->page($page, $limit)->order(['node asc'])->select();
empty($data) ? $msg = '暂无数据!' : $msg = '查询成功!';
$info = [
'limit' => $limit,
'page_current' => $page,
'page_sum' => ceil($count / $limit),
];
$list = [
'code' => 0,
'msg' => $msg,
'count' => $count,
'info' => $info,
'data' => $data,
];
return $list;
}
/**
* 保存节点
* @param $insert
* @return \think\response\Json
*/
public function add($insert) {
$save = $this->save($insert);
if ($save == 1) {
return __success('保存成功!');
} else {
return __error('保存失败!');
}
}
/**
* 更新节点
* @param $update
* @return \think\response\Json
*/
public function edit($update) {
$data = $this->where('id', $update['id'])->update($update);
if ($data == 1) {
return __success('更新成功!');
} else {
return __error('数据没有修改!');
}
}
/**
* 修改系统节点字段值
* @param $update
* @return \think\response\Json
*/
public function edit_field($update) {
$data = $this->where('id', $update['id'])->update([$update['field'] => $update['value']]);
if ($data == 1) {
return __success('修改成功!');
} else {
return __error('数据没有修改!');
}
}
/**
* 根据模块名称获取节点
* @param $module
* @param array $node_list
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function nodeModuleList($module, $node_list = []) {
$modules = $this->where(['type' => 1, 'node' => $module])->order(['node'=>'asc'])->select()->toArray();
foreach ($modules as &$vo_m) {
$i = 1;
$vo_module = $vo_m;
$vo_module['node'] = replace_menu_title($vo_module['node'], $i);
$node_list[] = $vo_module;
$controller = $this->where([['type', '=', 2], ['node', 'LIKE', "{$vo_m['node']}/%"]])->order(['node'=>'asc'])->select()->toArray();
foreach ($controller as &$vo_c) {
$i = 2;
$vo_controller = $vo_c;
$vo_controller['node'] = replace_menu_title($vo_controller['node'], $i);
$node_list[] = $vo_controller;
$action = $this->where([['type', '=', 3], ['node', 'LIKE', "{$vo_c['node']}/%"]])->order(['node'=>'asc'])->select()->toArray();
foreach ($action as &$vo_a) {
$i = 3;
$vo_action = $vo_a;
$vo_action['node'] = replace_menu_title($vo_action['node'], $i);
$node_list[] = $vo_action;
}
}
}
return [
'code' => 0,
'msg' => '查询成功',
'count' => count($node_list),
'data' => $node_list,
];
}
}

View File

@@ -0,0 +1,193 @@
<?php
/**
* 系统管理员模型
* Class User
* @package app\admin\model
*/
namespace app\admin\model;
use app\admin\service\ModelService;
class User extends ModelService {
/**
* 绑定数据表
* @var string
*/
protected $table = 'system_user';
/**
* 关联角色表数据
* @return \think\model\relation\HasOne
*/
public function auth() {
return $this->hasOne("Auth", "id", "auth_id")->joinType('left')->field('title');
}
/**
* 启用或者禁用管理员账户
* @param $id
* @return User|bool
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function operate($id) {
$where_operate = [
['id', '=', $id],
['is_deleted', '=', 0],
['status', 'In', [0, 1]],
];
$operate = $this->where($where_operate)->find();
if (!empty($operate)) {
$operate['status'] == 0 ? $status = 1 : $status = 0;
$status == 0 ? $msg = '账户停用成功!' : $msg = '账户启用成功';
$update = $this->where($where_operate)->update(['status' => $status]);
if ($update >= 1) return ['code' => 0, 'msg' => $msg];
return ['code' => 1, 'msg' => '账户状态更改失败,请检查!'];
}
return false;
}
/**
* 登录验证
* @param $username 管理员账户
* @param $password 管理员密码
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function login($username, $password) {
$where_login = [
['username', '=', $username],
['is_deleted', 'In', [0, 1]],
['status', 'In', [0, 1]],
];
$login = $this->where($where_login)->find();
if (empty($login)) return ['code' => 1, 'msg' => '账户不存在,请重新输入!', 'user' => $login];
if ($login['password'] != password($password)) return ['code' => 1, 'msg' => '密码不正确,请重新输入!', 'user' => $login];
if ($login['is_deleted'] == 1) return ['code' => 1, 'msg' => '该账户已被删除,请联系超级管理员!', 'user' => $login];
if ($login['status'] == 0) return ['code' => 1, 'msg' => '该账户已被停用,请联系超级管理员!', 'user' => $login];
unset($login['password']);
return ['code' => 0, 'msg' => '登录成功,正在进入后台系统!', 'user' => $login];
}
/**
* 添加管理员
* @param $insert 需要插入的数据
* @return \think\response\Json
* @throws \think\exception\PDOException
*/
public function add($insert) {
//使用事物保存数据
$this->startTrans();
$save = $this->save($insert);
if (!$save) {
$this->rollback();
return __error('数据有误,请稍后再试!');
}
$this->commit();
return __success('管理员账户添加成功!');
}
/**
* 修改管理员信息
* @param $update 需要修改的数据
* @return \think\response\Json
*/
public function edit($update) {
$update = $this->where('id', $update['id'])->update($update);
if ($update >= 1) return __success('信息修改成功');
return __error('数据没有修改!');
}
/**
* 修改管理员自己的信息
* @param $update
* @return \think\response\Json
*/
public function editSelf($data) {
$this->where('id', $data['id'])->update($data);
//重新刷新session
$user = $this->where('id', $data['id'])->find();
unset($user['password']);
$user['login_at'] = time();
session('user', $user);
return __success('信息修改成功');
}
/**
* 修改管理员密码
* @param $update 需要修改的数据
* @return \think\response\Json
*/
public function editPassword($update) {
$this->startTrans();
try {
$this->where('id', $update['id'])->update(['password' => password($update['password'])]);
$this->commit();
} catch (\Exception $e) {
$this->rollback();
return __error($e->getMessage());
}
return __success('密码修改成功');
}
/**
* 获取用户列表信息
* @param int $page 当前页
* @param int $limit 每页显示数量
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function userList($page = 1, $limit = 10, $search = []) {
$where = [['is_deleted', '=', 0]];
//搜索条件
foreach ($search as $key => $value) {
if ($key == 'status' && $value != '') {
$where[] = [$key, '=', $value];
} elseif ($key == 'create_at' && $value != '') {
$value_list = explode(" - ", $value);
$where[] = [$key, 'BETWEEN', ["{$value_list[0]} 00:00:00", "{$value_list[1]} 23:59:59"]];
} else {
!empty($value) && $where[] = [$key, 'LIKE', '%' . $value . '%'];
}
}
$field = 'id, auth_id, username, head_img, qq, mail, phone, remark, status, create_by, create_at';
$count = $this->where($where)->count();
$data = $this->where($where)->field($field)->page($page, $limit)->select()
->each(function ($item, $key) {
list($auth_id_list, $auth_title) = [json_decode($item['auth_id'], true), ''];
foreach ($auth_id_list as $auth_id) {
$title = model('auth')->where(['id' => $auth_id, 'status' => 1])->value('title');
$auth_title = empty($auth_title) ? $title : "{$auth_title}{$title}";
}
$create_by_username = $this->where(['id' => $item['create_by'], 'status' => 1, 'is_deleted' => 0])->value('username');
empty($auth_title) ? $item['auth_title'] = '暂无权限信息' : $item['auth_title'] = $auth_title;
empty($create_by_username) ? $item['create_by_username'] = '暂未创建者信息' : $item['create_by_username'] = $create_by_username;
});
empty($data) ? $msg = '暂无数据!' : $msg = '查询成功!';
$info = [
'limit' => $limit,
'page_current' => $page,
'page_sum' => ceil($count / $limit),
];
$list = [
'code' => 0,
'msg' => $msg,
'count' => $count,
'info' => $info,
'data' => $data,
];
return $list;
}
}

View File

@@ -0,0 +1 @@
a1519cd4-363d-4c2a-87f6-0e9a0023bd99

View File

@@ -0,0 +1,107 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/24
* Time: 15:06
*/
namespace app\admin\model\costom;
use think\Model;
class Message extends Model
{
protected $table = 'user_message';
/**
* 获取留言建议列表信息
* @param int $page 当前页
* @param int $limit 每页显示数量
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public static function messageList($page = 1, $limit = 10, $search = []){
$where = [];
//搜索条件
foreach ($search as $key => $value) {
if (!empty($value)) {
switch ($key) {
case 'add_time':
$value_list = explode(" - ", $value);
$value_list[0] = strtotime($value_list[0]);
$value_list[1] = strtotime($value_list[1]);
$where[] = [$key, 'BETWEEN', ["$value_list[0]", "$value_list[1]"]];
break;
case 'status':
$where[] = [$key, '=', $value];
break;
case 'telnum':
$where[] = [$key, '=', $value];
break;
case 'type':
$where[] = [$key, '=', $value-1];
break;
default:
!empty($value) && $where[] = [$key, 'LIKE', '%' . $value . '%'];
}
}
}
$count = self::where($where)->count();
$data = self::where($where)->page($page, $limit)->order([ 'add_time' => 'desc'])->select();
empty($data) ? $msg = '暂无数据!' : $msg = '查询成功!';
foreach ($data as $key => $val){
$val['add_time'] = date('Y-m-d H:i:s',$val['add_time']);
if($val['reply_time']){
$val['reply_time'] = date('Y-m-d H:i:s',$val['reply_time']);
}
$val['img1'] = config('secure.mpic_url'). $val['img1'];
$val['img2'] = config('secure.mpic_url'). $val['img2'];
if($val['type']){
$val['type'] = config('setmes.mesName')[$val['type']];
}else{
$val['type'] = '考生建议';
}
}
$info = [
'limit' => $limit,
'page_current' => $page,
'page_sum' => ceil($count / $limit),
];
$list = [
'code' => 0,
'msg' => $msg,
'count' => $count,
'info' => $info,
'data' => $data,
];
return $list;
}
/*
* 回复问题
* */
public function reply($post){
$post['reply'] = $post['replyCon'];
$post['status'] = 2;
unset($post['replyCon']);
try {
self::where('id', $post['id'])->update($post);
} catch (\Exception $e) {
return __error($e->getMessage());
}
return __success('回复成功');
}
}

View File

@@ -0,0 +1,188 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/23
* Time: 19:02
*/
namespace app\admin\model\costom;
use think\Exception;
use think\facade\Log;
use think\Model;
require '../extend/WxPay/WxPay.Api.php';
class Order extends Model
{
protected $table = 'orders';
public static function orderRefund($post){
$resOrder = self::field('ord_no,status,money')->where([['id','=',$post['id']],['status','=',1],['pay_way','=',$post['payWay']]])->find();
//订单状态是否已支付
if(!$resOrder){
return 2;
}
if($post['payWay'] == 1){
//退款参数赋值
$data['order_no'] = $resOrder['ord_no'];
$data['total_price'] = $resOrder['money'];
$data['reason'] = $post['reason'];
$data['op_user_id'] = config('wxpay.mch_id');
$result = self::refund($data);
if($result['result_code'] == 'SUCCESS'){
self::where([['id','=',$post['id']],['status','=',1]])->update(['status' => 2,'refund_time'=>time()]);
return true;
}
return false;
}else{
$data['order_no'] = $resOrder['ord_no'];
$data['total_price'] = $resOrder['money'];
$data['reason'] = $post['reason'];
$result = self::aliRefund($data);
if($result->code == 10000 && $result->msg == 'Success'){
self::where([['id','=',$post['id']],['status','=',1],['pay_way','=',$post['payWay']]])->update(['status' => 2,'refund_time'=>time()]);
return true;
}
}
}
/**
* 微信支付退款
* @param $orderInfo
* @throws \WxPayException
*/
private static function refund($orderInfo)
{
$inputObj = new \WxPayUnifiedOrder();
$out_refund_no = date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
$inputObj->SetOut_trade_no($orderInfo['order_no']);
$inputObj->SetOut_refund_no($out_refund_no);
$inputObj->SetTotal_fee(intval($orderInfo['total_price']*100));
$inputObj->SetRefund_fee(intval($orderInfo['total_price']*100));
$inputObj->SetRefund_desc($orderInfo['reason']);
$inputObj->SetOp_user_id( $orderInfo['op_user_id']);
$wxOrder = \WxPayApi::refund($inputObj);
return $wxOrder;
}
/**
* 支付寶退款
* @param $orderInfo
*/
private static function aliRefund($orderInfo)
{
require '../extend/alipay/wappay/buildermodel/AlipayTradeRefundContentBuilder.php';// 加载交易服务
require '../extend/alipay/wappay/service/AlipayTradeService.php';// 加载交易服务
$out_trade_no = trim($orderInfo['order_no']);
//退款金额,不能大于订单总金额
$refund_amount=trim($orderInfo['total_price']);
//退款的原因说明
$refund_reason=trim($orderInfo['reason']);
$config = config('alipay.');
$RequestBuilder = new \AlipayTradeRefundContentBuilder();
$RequestBuilder->setOutTradeNo($out_trade_no);
$RequestBuilder->setRefundAmount($refund_amount);
$RequestBuilder->setRefundReason($refund_reason);
$Response = new \AlipayTradeService($config);
$result=$Response->Refund($RequestBuilder);
return $result;
}
/**
* 获取订单列表信息
* @param int $page 当前页
* @param int $limit 每页显示数量
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function orderList($page = 1, $limit = 10, $search = []) {
$where = [];
//搜索条件
foreach ($search as $key => $value) {
if (!empty($value)) {
switch ($key) {
case 'add_time':
$value_list = explode(" - ", $value);
$value_list[0] = strtotime($value_list[0]);
$value_list[1] = strtotime($value_list[1]);
$where[] = [$key, 'BETWEEN', ["$value_list[0]", "$value_list[1]"]];
break;
case 'stu_yzy_province':
$where[] = [$key, '=', $value];
break;
case 'telnum':
$where[] = [$key, '=', $value];
break;
case 'ord_no':
$where[] = [$key, '=', $value];
break;
case 'pay_way':
$where[] = [$key, '=', $value];
break;
case 'status':
if($value > 0){
$where[] = [$key, '=', $value-1];
}
break;
default:
!empty($value) && $where[] = [$key, 'LIKE', '%' . $value . '%'];
}
}
}
$count = self::where($where)->count();
$data = self::field('id,score,add_time,pay_time,vip,wenli,mykemustr,wenli,province_title,telnum,money,ord_no,refund_time,status,user_id,pay_way')->where($where)->page($page, $limit)->order([ 'add_time' => 'desc'])->select();
empty($data) ? $msg = '暂无数据!' : $msg = '查询成功!';
//获取配置权限名称
$vipNameArr = config('product.vipName');
foreach ($data as $key => $val){
$data[$key]['order_time'] = '';
$data[$key]['vipName'] = $vipNameArr[$val['vip']];
$data[$key]['order_time'] .= "下单:".date('Y-m-d H:i:s',$val['add_time']);
if($val['pay_time']){
$data[$key]['order_time'] .="_支付:". date('Y-m-d H:i:s',$val['pay_time']);
}
if($val['refund_time']){
$data[$key]['order_time'] .="_退款:". date('Y-m-d H:i:s',$val['refund_time']);
}
$val['wenli'] = $val['wenli'] = config('setSub.subTypeName')[$val['wenli']];
//拼接用户信息
$data[$key]['userInfo'] = $val['province_title']."_".$val['score']."_".$val['wenli']."_".$val['mykemustr'];
}
$info = [
'limit' => $limit,
'page_current' => $page,
'page_sum' => ceil($count / $limit),
];
$list = [
'code' => 0,
'msg' => $msg,
'count' => $count,
'info' => $info,
'data' => $data,
];
return $list;
}
}

View File

@@ -0,0 +1,64 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/25
* Time: 15:11
*/
namespace app\admin\model\costom;
use app\admin\service\ModelService;
class Proscore extends ModelService
{
/**
* 绑定数据表
* @var string
*/
protected $table = 'yzy_province_lines2020';
/**
* 获取省控分数列表
* @param int $page
* @param int $limit
* @param array $search
* @return array
*/
public static function getList($page = 1, $limit = 10, $search = []) {
$where = [];
//搜索条件
foreach ($search as $key => $value) {
if (!empty($value)) {
switch ($key) {
case 'province_id':
$where[] = [$key, '=', $value];
break;
default:
!empty($value) && $where[] = [$key, 'LIKE', '%' . $value . '%'];
}
}
}
$count = self::where($where)->count();
$data = self::where($where)->page($page, $limit)->select();
empty($data) ? $msg = '暂无数据!' : $msg = '查询成功!';
$info = [
'limit' => $limit,
'page_current' => $page,
'page_sum' => ceil($count / $limit),
];
$list = [
'code' => 0,
'msg' => $msg,
'count' => $count,
'info' => $info,
'data' => $data,
];
return $list;
}
}

View File

@@ -0,0 +1,82 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/23
* Time: 8:57
*/
namespace app\admin\model\costom;
use app\admin\service\ModelService;
class User extends ModelService
{
protected $table = 'users';
/**
* 获取用户列表信息
* @param int $page 当前页
* @param int $limit 每页显示数量
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function userList($page = 1, $limit = 10, $search = []) {
$where = [];
//搜索条件
foreach ($search as $key => $value) {
if (!empty($value)) {
switch ($key) {
case 'add_time':
$value_list = explode(" - ", $value);
$value_list[0] = strtotime($value_list[0]);
$value_list[1] = strtotime($value_list[1]);
$where[] = [$key, 'BETWEEN', ["$value_list[0]", "$value_list[1]"]];
break;
case 'phone':
$where[] = [$key, '=', $value];
break;
case 'province':
$where[] = [$key, '=', $value];
break;
default:
!empty($value) && $where[] = [$key, 'LIKE', '%' . $value . '%'];
}
}
}
$count = self::where($where)->count();
$data = self::field('id,score,add_time,province,phone,wenli,mykemu')->where($where)->page($page, $limit)->order([ 'add_time' => 'desc'])->select();
empty($data) ? $msg = '暂无数据!' : $msg = '查询成功!';
//获取省份数组
$provinceArr = config('province.province');
foreach ($data as $key => $val){
$val['province'] = $provinceArr[$val['province']]['title'];
$val['add_time'] = date('Y-m-d H:i:s',$val['add_time']);
$val['wenli'] = config('setSub.subTypeName')[$val['wenli']];
if($val['mykemu']){
$val['mykemu'] = changeSubString($val['mykemu']);
}
$data[$key]['userInfo'] = $val['province']."_".$val['score']."_".$val['wenli']."_".$val['mykemu'];
}
$info = [
'limit' => $limit,
'page_current' => $page,
'page_sum' => ceil($count / $limit),
];
$list = [
'code' => 0,
'msg' => $msg,
'count' => $count,
'info' => $info,
'data' => $data,
];
return $list;
}
}

View File

@@ -0,0 +1 @@
1869b3c6-ad2e-4621-aeea-d2243390b75f

View File

@@ -0,0 +1,70 @@
<?php
/**
* 访问权限控制
* Class AuthService
* @package app\admin\service
*/
namespace app\admin\service;
class AuthService {
/**
* 判断是否有权限访问该节点
* @param $node 节点
* @return bool true有权限false无权限
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public static function checkNode($node = '') {
//如果没有传参,默认获取当前位置 模块/控制器/方法 (小写)
if (empty($node)) $node = self::getNode();
//判断当前登录是否为超级管理员
if (session('user.id') == 1) return true;
//判断是否加入RABC控制
$is_auth = model('SysNode')->where(['node' => $node, 'is_auth' => 1])->find();
if (empty($is_auth)) return true;
//获取当前用户角色组信息 ,拆表
$user = new \app\admin\model\User;
$auth_id_list = json_decode($user->where(['id' => session('user.id'), 'status' => 1, 'is_deleted' => 0])->value('auth_id'), true);
//去除失效的角色组信息
foreach ($auth_id_list as $k => $val) {
if (empty(model('SysAuth')->where(['id' => $val, 'status' => 1])->find())) unset($auth_id_list[$k]);
}
//判断是否有权限访问
foreach ($auth_id_list as $vo) {
if ($vo == 0) return true; //超级管理员组权限
$is_auth_node = model('SysAuthNode')->where(['auth' => $vo, 'node' => $is_auth['id']])->find();
if (!empty($is_auth_node)) return true;
}
return false;
}
/**
* 获取当前节点
* @return string 节点信息
*/
public static function getNode() {
$node = app('request')->module() . '/' . app('request')->controller() . '/' . app('request')->action();
return self::parseNodeStr($node);
}
/**
* 驼峰转下划线规则
* @param string $node
* @return string
*/
public static function parseNodeStr($node) {
$tmp = [];
foreach (explode('/', $node) as $name) {
$tmp[] = strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
}
return str_replace('._', '.', trim(join('/', $tmp), '/'));
}
}

View File

@@ -0,0 +1,17 @@
<?php
/**
* 验证码服务类
* Class CodeService
* @package app\admin\service
*/
namespace app\admin\service;
class CodeService {
public static function validate() {
}
}

View File

@@ -0,0 +1,38 @@
<?php
/**
* 日志服务
* Class LogService
* @package app\admin\service
*/
namespace app\admin\service;
use think\Db;
class LogService {
/**
* 登录日志
* @param $user_id 系统用户编号
* @param $type 登录类型 0退出1登录
* @param bool $status 状态0失败1成功
* @param string $remark
*/
public static function loginLog($user_id, $type = 1, $status = 1, $remark = '') {
$location_info = get_location();
$insert = [
'type' => $type,
'user_id' => $user_id,
'ip' => get_ip(),
'country' => $location_info['country'],
'region' => $location_info['region'],
'city' => $location_info['city'],
'isp' => $location_info['isp'],
'location' => $location_info['country'] . $location_info['region'] . $location_info['city'] . $location_info['isp'],
'remark' => $remark,
'status' => $status,
];
Db::name('SystemLoginRecord')->insert($insert);
}
}

View File

@@ -0,0 +1,77 @@
<?php
/*
* 邮件服务类
* */
namespace app\admin\service;
use app\admin\model\User;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use think\Db;
/**
* 邮箱服务类
* Class MailService
* @package app\admin\service
*/
class MailService {
/**
* @var 邮箱服务类对象
*/
public static $mail;
/**
* 初始化服务类
* MailService constructor.
*/
public static function __init() {
$mailInfo = Db::name('SystemConfig')->where('group', 'mail')->column('name,value');//获取邮箱配置信息
self::$mail = new PHPMailer();
self::$mail->isSMTP();// 使用SMTP服务
self::$mail->CharSet = "utf8";// 编码格式为utf8不设置编码的话中文会出现乱码
self::$mail->Host = $mailInfo['MailHost'];// 发送方的SMTP服务器地址
self::$mail->SMTPAuth = true;// 是否使用身份验证
self::$mail->Username = $mailInfo['MailUsername'];// 发送方的QQ邮箱用户名就是自己的邮箱名
self::$mail->Password = $mailInfo['MailPassword'];// 发送方的邮箱密码,不是登录密码,是qq的第三方授权登录码,要自己去开启,在邮箱的设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 里面
self::$mail->setFrom($mailInfo['MailUsername'], $mailInfo['MailNickname']);// 设置发件人信息,如邮件格式说明中的发件人,
self::$mail->addReplyTo($mailInfo['MailReplyTo'], $mailInfo['MailNickname']);// 设置回复人信息,指的是收件人收到邮件后,如果要回复,回复邮件将发送到的邮箱地址
self::$mail->SMTPSecure = "ssl";// 使用ssl协议方式,
self::$mail->Port = 465;// QQ邮箱的ssl协议方式端口号是465/587
}
/**
* 发送邮箱信息
* @param $toemail 邮箱 可以为单个1111@qq.com 可以为数组:[1111@qq.com, 2222@qq.com]
* @param $title 标题
* @param $info 内容
* @return array
*/
public static function send($toemail, $title, $info) {
self::__init();
self::$mail->Subject = $title;
self::$mail->Body = $info;
// self::$mail->addCC("xxx@163.com");// 设置邮件抄送人,可以只写地址,上述的设置也可以只写地址(这个人也能收到邮件)
// self::$mail->addBCC("xxx@163.com");// 设置秘密抄送人(这个人也能收到邮件)
// self::$mail->addAttachment("bug0.jpg");// 添加附件
// self::$mail->AltBody = "纯文本";// 这个是设置纯文本方式显示的正文内容如果不支持Html方式就会用到这个基本无用
//判断是否为群发信息
if (is_array($toemail)) {
foreach ($toemail as $vo) {
self::$mail->addAddress($vo, 'send');
!self::$mail->send() ? $msg[] = ['mail' => $vo, 'msg' => self::$mail->ErrorInfo] : $msg[] = ['mail' => $vo, 'msg' => '邮箱发送成功!'];
}
return ['code' => 1, 'msg' => $msg];
} else {
self::$mail->addAddress($toemail, 'send');
if (!self::$mail->send()) {
return ['code' => 1, 'msg' => self::$mail->ErrorInfo];
} else {
return ['code' => 0, 'msg' => '邮箱发送成功!'];
}
}
}
}

View File

@@ -0,0 +1,95 @@
<?php
/**
* 模型基础数据服务
* Class ModelService
* @package service
*/
namespace app\admin\service;
use think\Model;
class ModelService extends Model {
/**
* 主键定义
* @var string
*/
protected $pk = 'id';
/**
* 格式化分页
* @param array $query 分页参数 ['word' => $word]
*/
public function formatQuery($query = []) {
$format_query = [
'query' => [],
];
foreach ($query as $k => $val) {
$format_query['query'] = [$k, $val];
}
return $format_query;
}
/**
* 修改字段值
* @param $update
* @return \think\response\Json
*/
public static function editField($update) {
$data = self::where('id', $update['id'])->update([$update['field'] => $update['value']]);
if ($data == 1) {
return __success('修改成功!');
} else {
return __error('数据没有修改!');
}
}
/**
* 新增
* @param $post
* @return \think\response\Json
* @throws \think\exception\PDOException
*/
public static function addData($post) {
try {
self::insert($post);
} catch (\Exception $e) {
return __error($e->getMessage());
}
return __success('添加成功');
}
/**
* 修改
* @param $post
* @return \think\response\Json
*/
public static function editData($post) {
try {
self::where('id', $post['id'])->update($post);
} catch (\Exception $e) {
return __error($e->getMessage());
}
return __success('修改成功');
}
/**
* 软删除操作
* @param $id 列ID
* @param bool $type 删除类型 false:软删除true:真实删除)
* @return bool|ModelService
* @throws \Exception
*/
public function delData($id, $type = false) {
is_array($id) ? $model = self::whereIn('id', $id) : $model = self::where('id', $id);
$del = $model->delete();
if ($del >= 1) return __success('删除成功');
return __error('删除失败,请检查!');
}
}

View File

@@ -0,0 +1,187 @@
<?php
/**
* 系统节点服务类
* Class NodeService
* @package app\admin\service
*/
namespace app\admin\service;
use app\common\model\SysNode;
use think\Env;
use think\Db;
class NodeService {
/**
* 获取指定模块的所有节点,默认获取所有模块的所有节点(树形形状)
* @param array $module $module['admin','index'] 不传默认为所有模块
* @return array
*/
public static function getNodeTree($module = []) {
empty($module) && $module = self::getFolders();
$node_list = [];
foreach ($module as &$vo_m) {
$controller = self::getControllers('../application/' . $vo_m . '/controller');
foreach ($controller as &$vo_c) {
if ($vo_c != 'Login') {
$action = self::getActions('app\\' . $vo_m . '\\controller\\' . $vo_c);
foreach ($action as &$vo_a) $vo_a = AuthService::parseNodeStr($vo_m . '/' . $vo_c . '/' . $vo_a);
!empty($action) && $node_list[AuthService::parseNodeStr($vo_m)][AuthService::parseNodeStr($vo_m . '/' . $vo_c)] = $action;
}
}
}
return $node_list;
}
/**
* 获取指定目录下的所有文件夹名称
* @param $dir
* @return array
*/
public static function getFolders($dir) {
$pathList = glob($dir . '/*');
$folder_list = [];
foreach ($pathList as $vo) {
if (is_dir($vo)) {
$folder_list[] = str_replace($dir . '/', '', $vo);
}
}
return $folder_list;
}
/**
* 获取指定模块中的控制器
* @param $dir
* @return array|mixed
*/
public static function getControllers($dir) {
list($folders, $pathList, $controllerList) = [self::getFolders($dir), glob($dir . '/*.php'), []];
foreach ($folders as $folder) {
$pathFolders = glob("{$dir}/{$folder}/*.php");
foreach ($pathFolders as $pathFolder) {
$pathList[] = $pathFolder;
}
}
foreach ($pathList as $vo) {
$className = explode("/controller/", $vo);
$className = str_replace('.php', '', end($className));
$className = str_replace('/', '.', $className);
$controllerList[] = $className;
}
return $controllerList;
}
/**
* 获取控制器中的方法
* @param $className
* @return array|mixed
*/
public static function getActions($className) {
list($actions, $actionList) = [get_class_methods($className), []];
if (!empty($actions)) {
foreach ($actions as $action) {
if (strpos($action, '_') !== 0 && $action !== 'initialize') {
$actionList[] = $action;
}
}
}
return $actionList;
}
/**
* 获取系统节点
* @param array $modules 模块名
* @return array|mixed 节点列表
*/
public static function getNodeList($modules = []) {
list($nodeList, $appPath, $appNamespace) = [[], '../application', env('app_namespace')];
empty($modules) && $modules = self::getFolders($appPath);
foreach ($modules as $module) {
$nodeList[] = AuthService::parseNodeStr($module);
$modulePath = "{$appPath}/{$module}/controller";
$controllers = self::getControllers($modulePath);
foreach ($controllers as $controller) {
$nodeList[] = AuthService::parseNodeStr("{$module}/{$controller}");
$controller_replace = str_replace('.', '\\', $controller);
$controllerPath = "{$appNamespace}\\{$module}\\controller\\{$controller_replace}";
$actions = self::getActions($controllerPath);
foreach ($actions as $action) {
$nodeList[] = AuthService::parseNodeStr("{$module}/{$controller}/{$action}");
}
}
}
return $nodeList;
}
/**
* 刷新系统节点
* @param array $modules
*/
public static function refreshNode($modules = []) {
empty($modules) && $modules = self::getFolders(env('app_path'));
list($nodeList, $insertNode) = [self::getNodeList($modules), []];
foreach ($nodeList as $vo) {
$nodeInfo = Db::name('SystemNode')->where(['node' => $vo])->find();
if (empty($nodeInfo)) {
list($nodeCount, $nodeType) = [substr_count($vo, '/'), 0];
switch ($nodeCount) {
case 0:
$nodeType = 1;
break;
case 1:
$nodeType = 2;
break;
case 2:
$nodeType = 3;
break;
}
$insertNode[] = ['type' => $nodeType, 'node' => $vo];
}
}
if (!empty($insertNode)) {
Db::startTrans();
try {
Db::name('SystemNode')->insertAll($insertNode);
Db::commit();
} catch (\Exception $e) {
Db::rollback();
return ['code' => 1, 'msg' => $e->getMessage()];
}
return ['code' => 0, 'msg' => '节点刷新成功!'];
} else {
return ['code' => 1, 'msg' => '节点数据暂无变化!'];
}
}
/**
* 清除失效节点
* @param array $modules
*/
public static function cleanNode($modules = []) {
empty($modules) && $modules = self::getFolders(env('app_path'));
$nodeList = Db::name('SystemNode')->where(['is_auto' => 0])->select();
$autoNodeList = self::getNodeList($modules);
foreach ($nodeList as $voNode) {
$is_exist = false;
foreach ($autoNodeList as $voAutoNode) {
$voNode['node'] == $voAutoNode && $is_exist = true;
}
$is_exist == false && $delete[] = $voNode['id'];
}
if (!empty($delete)) {
Db::startTrans();
try {
Db::name('SystemNode')->delete($delete);
Db::commit();
} catch (\Exception $e) {
Db::rollback();
return ['code' => 1, 'msg' => $e->getMessage()];
}
return ['code' => 0, 'msg' => '清除失效节点成功!'];
} else {
return ['code' => 1, 'msg' => '无失效节点!'];
}
}
}

View File

@@ -0,0 +1,81 @@
<?php
/*
* 七牛云cdn服务类
* */
namespace app\admin\service;
use think\Db;
use think\facade\Config;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
class QiniuService {
/**
* 上传至七牛云
* @param string $filePath 要上传文件的本地路径
* @param string $key 上传到七牛后保存的文件名
* @return mixed
* @throws \Exception
*/
public static function upload($filePath = '') {
// 需要填写你的 Access Key 和 Secret Key
$accessKey = Config::get('qiniu.AccessKey');
$secretKey = Config::get('qiniu.SecretKey');
$bucket = Config::get('qiniu.Bucket');
// 构建鉴权对象
$auth = new Auth($accessKey, $secretKey);
// 生成上传 Token
$token = $auth->uploadToken($bucket);
// 初始化 UploadManager 对象并进行文件的上传。
$uploadMgr = new UploadManager();
// 要上传文件的本地路径
$filePath = ".{$filePath}";
// 上传到七牛后保存的文件名
$key = md5($filePath) . ToolService::getSuffix($filePath);
// 初始化 UploadManager 对象并进行文件的上传。
$uploadMgr = new UploadManager();
// 调用 UploadManager 的 putFile 方法进行文件的上传。
list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
if ($err !== null) {
return $err;
} else {
$url = Config::get('qiniu.url') . '/' . $ret['key'];
return $url;
}
}
public static function base64($base64, $key) {
$accessKey = Config::get('qiniu.AccessKey');
$secretKey = Config::get('qiniu.SecretKey');
$bucket = Config::get('qiniu.Bucket');
$auth = new Auth($accessKey, $secretKey);
$token = $auth->uploadToken($bucket);
$uploadMgr = new UploadManager();
// 上传字符串到七牛
list($ret, $err) = $uploadMgr->put($token, $key, $base64);
if ($err !== null) {
return $err;
} else {
return $ret;
}
}
/**
* 获取七牛云上传token
* @return string
*/
public static function getToken() {
// 需要填写你的 Access Key 和 Secret Key
$accessKey = Config::get('qiniu.AccessKey');
$secretKey = Config::get('qiniu.SecretKey');
$bucket = Config::get('qiniu.Bucket');
// 构建鉴权对象
$auth = new Auth($accessKey, $secretKey);
// 生成上传 Token
$token = $auth->uploadToken($bucket);
return $token;
}
}

View File

@@ -0,0 +1,75 @@
<?php
/*
* 工具服务类
* */
namespace app\admin\service;
class ToolService {
/**
* 获取文件后缀名
* @param $filename
* @return string
*/
public static function getSuffix($filename) {
return strrchr($filename, '.');
}
/**
* 加密
* @param $data 加密内容
* @param $key 秘钥
* @return string
*/
public static function encrypt($data, $key) {
$key = md5($key);
$x = 0;
$len = strlen($data);
$l = strlen($key);
list($char, $str) = ['', ''];
for ($i = 0; $i < $len; $i++) {
if ($x == $l) {
$x = 0;
}
$char .= $key{$x};
$x++;
}
for ($i = 0; $i < $len; $i++) {
$str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
}
return base64_encode($str);
}
/**
* 解密
* @param $data 解密内容
* @param $key 秘钥
* @return string
*/
public static function decrypt($data, $key) {
$key = md5($key);
$x = 0;
$data = base64_decode($data);
$len = strlen($data);
$l = strlen($key);
list($char, $str) = ['', ''];
for ($i = 0; $i < $len; $i++) {
if ($x == $l) {
$x = 0;
}
$char .= substr($key, $x, 1);
$x++;
}
for ($i = 0; $i < $len; $i++) {
if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
$str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
} else {
$str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
}
}
return $str;
}
}

View File

@@ -0,0 +1,21 @@
<?php
// 应用行为扩展定义文件
return [
// 应用初始化
'app_init' => [],
// 应用开始
'app_begin' => [],
// 模块初始化
'module_init' => [],
// 操作开始执行
'action_begin' => [],
// 视图内容过滤
'view_filter' => [],
// 日志写入
'log_write' => [],
// 应用结束
'app_end' => [],
];

View File

@@ -0,0 +1 @@
37fbe7a9-70d7-4042-8f14-2d23774bee5e

View File

@@ -0,0 +1,86 @@
<?php
/*
* 权限验证规则
* */
namespace app\admin\validate;
use think\Validate;
class Auth extends Validate {
/**
* 验证规则
* @var array
*/
protected $rule = [
'id' => 'require|number|checkAuthId',
'title' => 'require|max:30',
'sort' => 'member',
'remark' => 'require|max:250',
'auth_id' => 'require',
'node_id' => 'require',
'field' => 'require',
'value' => 'require|max:30',
];
/**
* 错误提示
* @var array
*/
protected $message = [
'id.require' => '编号必须',
'title.require' => '角色权限必须',
'id.number' => '编号为数字',
'field.require' => '字段必须',
'value.require' => '修改值必须',
'value.max' => '修改值最多不能超过30个字符',
'title.max' => '权限角色名称最多不能超过30个字符',
];
/**
* 应用场景
* @var array
*/
protected $scene = [
//添加系统角色
'add' => ['title'],
//授权
'authorize' => ['auth_id, node_id'],
//修改系统角色字段值
'edit_field' => ['id', 'field', 'value'],
//删除角色
'del' => ['id'],
//更改角色状态
'status' => ['id'],
];
/**
* 自定义验证场景
* @return Node
*/
public function sceneEdit() {
return $this->only(['id', 'remark', 'title'])
->remove('id', 'checkAuthId');
}
/**
* 检测ID是否存在
* @param $value
* @param $rule
* @param array $data
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function checkAuthId($value, $rule, $data = []) {
$user = \app\admin\model\Auth::where(['id' => $value])->find();
if (empty($user)) return '暂无角色数据,请稍后再试!';
return true;
}
}

View File

@@ -0,0 +1,45 @@
<?php
/**
*公共验证规则
*/
namespace app\admin\validate;
use think\Validate;
/**
* 公共验证规则
* Class Common
* @package app\admin\validate
*/
class Common extends Validate {
/**
* 验证规则
* @var array
*/
protected $rule = [
'id' => 'require|number',
'field' => 'require',
'value' => 'require|max:30',
];
/**
* 错误提示
* @var array
*/
protected $message = [
'id.require' => '编号必须',
'field.require' => '字段必须',
'value.require' => '修改值必须',
];
/**
* 验证场景
* @var array
*/
protected $scene = [
//修改字段值
'edit_field' => ['id', 'field', 'value'],
];
}

View File

@@ -0,0 +1,63 @@
<?php
/*
* 系统参数验证
* */
namespace app\admin\validate;
use think\Validate;
/**
* 系统参数验证
* Class Config
* @package app\admin\validate
*/
class Config extends Validate {
/**
* 验证规则
* @var array
*/
protected $rule = [
'id' => 'require|number|checkConfigId',
'field' => 'require',
'value' => 'require|max:250',
];
/**
* 错误提示
* @var array
*/
protected $message = [
'id.require' => '编号必须',
'field.require' => '字段必须',
'value.require' => '修改值必须',
'value.max' => '修改值最多不能超过250个字符',
];
/**
* 应用场景
* @var array
*/
protected $scene = [
//修改字段值
'edit_field' => ['id', 'field', 'value'],
];
/**
* 检测ID是否存在
* @param $value
* @param $rule
* @param array $data
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function checkConfigId($value, $rule, $data = []) {
$config = \app\admin\model\Config::where(['id' => $value])->find();
if (empty($config)) return '暂无数据,请稍后再试!';
return true;
}
}

View File

@@ -0,0 +1,51 @@
<?php
/*
* 登录验证
* */
namespace app\admin\validate;
use think\Validate;
use think\captcha\Captcha;
/**
* 后台登录验证类
* Class Login
* @package app\admin\validate
*/
class Login extends Validate {
/**
* 验证规则
* @var array
*/
protected $rule = [
'username' => 'require|max:15',
'password' => 'require|max:20',
'vercode' => 'require|captcha',
];
/**
* 错误提示
* @var array
*/
protected $message = [
'username.require' => '登录名必须',
'username.max' => '登录名最多不能超过15个字符',
'password.require' => '密码必须',
'password.max' => '密码最多不能超过20个字符',
'vercode.require' => '验证码不能为空',
'vercode.captcha' => '验证码不正确,请重新输入',
];
/**
* 应用场景
* @var array
*/
protected $scene = [
//开启验证码登录
'index_on' => ['username', 'password', 'vercode'],
//关闭验证码登录
'index_off' => ['username', 'password'],
];
}

View File

@@ -0,0 +1,86 @@
<?php
/*
* 菜单验证规则
* */
namespace app\admin\validate;
use think\Validate;
/**
* 菜单管理验证类
* Class Menu
* @package app\admin\validate
*/
class Menu extends Validate {
/**
* 验证规则
* @var array
*/
protected $rule = [
'id' => 'require|number|checkId',
'pid' => 'require|number',
'title' => 'require|max:10',
'href' => 'max:100',
'icon' => 'max:20',
'sort' => 'max:10|number',
'status' => 'require|in:0,1',
'remark' => 'max:250',
'field' => 'require',
'value' => 'require|max:30',
];
/**
* 错误提示
* @var array
*/
protected $message = [
'pid.require' => '上级菜单必须',
'pid.number' => '上级菜单数据有误',
'title.require' => '菜单名称必须',
'title.max' => '名称最多不能超过10个字符',
'href.max' => '链接最多不能超过100个字符',
'status.in' => '启用状态格式有误',
'sort.number' => '排序必须为数字',
'field.require' => '字段必须',
'value.require' => '修改值必须',
];
/**
* 应用场景
* @var array
*/
protected $scene = [
//添加菜单
'add' => ['pid', 'title', 'href', 'icon', 'sort', 'remark'],
//修改菜单
'edit' => ['id', 'pid', 'title', 'href', 'icon', 'sort', 'remark'],
//删除菜单
'del' => ['id'],
//更改菜单状态
'status' => ['id'],
//修改字段值
'edit_field' => ['id', 'field', 'value'],
];
/**
* 检测菜单是否存在
* @param $value
* @param $rule
* @param array $data
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function checkId($value, $rule, $data = []) {
$menu = \app\admin\model\menu::where(['id' => $value])->find();
if (empty($menu)) return '暂无菜单数据,请稍后再试!';
return true;
}
}

View File

@@ -0,0 +1,97 @@
<?php
/*
* 系统节点验证
* */
namespace app\admin\validate;
use think\Validate;
class Node extends Validate {
/**
* 验证规则
* @var array
*/
protected $rule = [
'id' => 'require|number|checkNodeId',
'field' => 'require',
'value' => 'require|max:30',
'node' => 'require|checkNode',
'title' => 'require|max:30',
];
/**
* 错误提示
* @var array
*/
protected $message = [
'id.require' => '编号必须',
'node.require' => '系统节点必须',
'id.number' => '编号为数字',
'field.require' => '字段必须',
'value.require' => '修改值必须',
'value.max' => '修改值最多不能超过30个字符',
'title.max' => '修改值最多不能超过30个字符',
];
/**
* 应用场景
* @var array
*/
protected $scene = [
//添加系统节点
'add' => ['node', 'title'],
//修改系统节点字段值
'edit_field' => ['id', 'field', 'value'],
//删除节点
'del' => ['id'],
//更改节点状态
'status' => ['id'],
];
/**
* 自定义验证场景
* @return Node
*/
public function sceneEdit()
{
return $this->only(['id','node','title'])
->remove('node', 'checkNode');
}
/**
* 检测节点id是否存在
* @param $value
* @param $rule
* @param array $data
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function checkNodeId($value, $rule, $data = []) {
$user = \app\admin\model\node::where(['id' => $value])->find();
if (empty($user)) return '暂无节点数据,请稍后再试!';
return true;
}
/**
* 检测系统节点是否存在
* @param $value
* @param $rule
* @param array $data
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function checkNode($value, $rule, $data = []) {
$user = \app\admin\model\node::where(['node' => $value])->find();
if (!empty($user)) return '已存在该系统节点,无需再次添加!';
return true;
}
}

View File

@@ -0,0 +1,218 @@
<?php
/*
* 后台管理员验证
* */
namespace app\admin\validate;
use think\Validate;
/**
* 后台管理员验证类
* Class User
* @package app\admin\validate
*/
class User extends Validate {
/**
* 验证规则
* @var array
*/
protected $rule = [
'id' => 'require|number|checkDelId',
'head_img' => 'require',
'username' => 'require|min:5|max:15|checkUsername',
'old_password' => 'require|min:6|max:20|checkOldPassword',
'password' => 'require|min:6|max:20|checkPassword',
'password1' => 'require|min:6|max:20|checkPassword',
'phone' => 'require|number|mobile|checkPhone',
'mail' => 'email|max:20|checkMail',
'auth_id' => 'require',
'qq' => 'number',
'remark' => 'max:250',
];
/**
* 错误提示
* @var array
*/
protected $message = [
'id.require' => '编号必须',
'username.require' => '名称必须',
'head_img.require' => '头像必须',
'username.min' => '名称不能少于5个字符',
'username.max' => '名称最多不能超过15个字符',
'password.require' => '密码必须',
'password.min' => '密码不能少于6个字符',
'password.max' => '密码最多不能超过20个字符',
'password1.require' => '第二次密码必须',
'password1.max' => '第二次密码最多不能超过20个字符',
'auth_id.number' => '角色编号必须是数字',
'mail.email' => '邮箱格式错误',
'phone.email' => '手机号格式错误',
'qq.number' => 'QQ必须为数字',
'remark.max' => '备注最多不能超过250个字符',
];
/**
* 应用场景
* @var array
*/
protected $scene = [
//添加管理员
'add' => ['username', 'password', 'password1', 'phone', 'mail', 'auth_id', 'qq', 'remark'],
//修改管理员
'edit' => ['username', 'phone', 'mail', 'auth_id', 'qq', 'remark'],
//修改登录密码
'edit_password' => ['id', 'password', 'password1'],
//删除管理员
'del' => ['id'],
//更改管理员状态
'status' => ['id'],
];
/**
* 修改信息验证场景
* @return User
*/
public function sceneEdit() {
return $this->only(['head_img', 'phone', 'mail', 'auth_id'])
->remove('phone', 'checkPhone')
->remove('mail', 'checkMail');
}
/**
* 修改自己的信息
* @return User
*/
public function sceneEditSelf() {
return $this->only(['head_img', 'phone', 'mail', 'remark'])
->remove('phone', 'checkPhone')
->remove('mail', 'checkMail');
}
/**
* 检测删除时用户ID
* @param $value
* @param $rule
* @param array $data
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function checkDelId($value, $rule, $data = []) {
$user = \app\admin\model\user::where(['id' => $value])->find();
if (empty($user)) return '暂无账户数据,请稍后再试!';
if ($user['is_deleted'] == 1) return '该账户已被删除,无需再次删除!';
return true;
}
/**
* 检测启用或者禁用时的用户ID
* @param $value
* @param $rule
* @param array $data
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function checkOperateId($value, $rule, $data = []) {
$user = \app\admin\model\user::where(['id' => $value])->find();
if (empty($user)) return '暂无账户数据,请稍后再试!';
if ($user['is_deleted'] == 1) return '该账户已被删除,无需再次删除!';
return true;
}
/**
* 检查用户名是否已存在
* @param $value
* @param $rule
* @param array $data
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function checkUsername($value, $rule, $data = []) {
$where_user = [
'username' => $value,
'status' => 1,
'is_deleted' => 0,
];
$user = \app\admin\model\user::where($where_user)->find();
return empty($user) ? true : '已有相同登录账号,请更换进行注册!';
}
/**
* 判断两个输入的密码是否一致
* @param $value
* @param $rule
* @param array $data
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function checkPassword($value, $rule, $data = []) {
return $data['password'] == $data['password1'] ? true : '两次输入的密码不一致,请重新输入!';
}
protected function checkOldPassword($value, $rule, $data = []) {
$where_user = [
'id' => $data['id'],
'status' => 1,
'is_deleted' => 0,
];
$user = \app\admin\model\user::where($where_user)->find();
if (empty($user)) return '暂无改管理员信息,请刷新重试!';
return $user['password'] == password($value) ? true : '旧密码不正确,请重新输入!';
}
/**
* 判断是否存在相同的手机号
* @param $value
* @param $rule
* @param array $data
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function checkPhone($value, $rule, $data = []) {
$where_user = [
'phone' => $value,
'status' => 1,
'is_deleted' => 0,
];
$user = \app\admin\model\user::where($where_user)->find();
return empty($user) ? true : '已有相同手机号码,请更换进行注册!';
}
/**
* 判断是否存在相同的邮箱
* @param $value
* @param $rule
* @param array $data
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function checkMail($value, $rule, $data = []) {
$where_user = [
'mail' => $value,
'status' => 1,
'is_deleted' => 0,
];
$user = \app\admin\model\user::where($where_user)->find();
return empty($user) ? true : '已有相同邮箱,请更换进行注册!';
}
}

View File

@@ -0,0 +1 @@
c680dcfe-9dbd-441e-b1b2-418eecefa5dd

View File

@@ -0,0 +1,46 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/24
* Time: 16:17
*/
namespace app\admin\validate\custom;
use think\Validate;
class Message extends Validate
{
/**
* 验证规则
* @var array
*/
protected $rule = [
'id' => 'require|number',
'replyCon' => 'require'
];
/**
* 错误提示
* @var array
*/
protected $message = [
'id.require' => '编号必须',
'id.number' => '编号为数字',
'replyCon.require' => '请输入回复内容',
];
/**
* 应用场景
* @var array
*/
protected $scene = [
//授权
'reply' => ['id','replyCon'],
];
}

View File

@@ -0,0 +1,62 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/25
* Time: 18:26
*/
namespace app\admin\validate\custom;
use think\Validate;
class Proscore extends Validate
{
/**
* 验证规则
* @var array
*/
protected $rule = [
'id' => 'require|number',
'province_id' => 'require|number',
'province_title' => 'require',
'year' => 'require',
'GaoKaoTotal' => 'require|number',
'ArtsScore' => 'require|number',
'SciencesScore' => 'require|number',
'batch' => 'require|number',
'batchName' => 'require',
];
/**
* 错误提示
* @var array
*/
protected $message = [
'id.require' => '编号必须',
'province_id.number' => '省份id必须为数字',
'GaoKaoTotal.number' => '高考总分必须为数字',
'ArtsScore.require' => '文科分数必填',
'ArtsScore.number' => '文科分数必须为数字',
'batch.require' => '批次序列必须',
'batch.number' => '批次序列必须数字',
'SciencesScore.require' => '理科分数必须',
'SciencesScore.number' => '理科分数必须为数字',
];
/**
* 应用场景
* @var array
*/
protected $scene = [
'add' => ['province_id','province_title','batch','batchName','ArtsScore','GaoKaoTotal','SciencesScore','year'],
'edit' => ['id'],
'del' => ['id']
];
}

View File

@@ -0,0 +1,46 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/4/23
* Time: 18:58
*/
namespace app\admin\validate\custom;
use think\Validate;
class Student extends Validate
{
/**
* 验证规则
* @var array
*/
protected $rule = [
'id' => 'require|number',
'reason' => 'require|max:200'
];
/**
* 错误提示
* @var array
*/
protected $message = [
'id.require' => '编号必须',
'id.number' => '编号为数字',
'reason.require' => '退款原因必须',
'reason.max' => '退款原因最多不能超过200个字符'
];
/**
* 应用场景
* @var array
*/
protected $scene = [
//授权
'refundOrder' => ['id','reason'],
];
}

View File

@@ -0,0 +1 @@
a07dda94-8d69-4b80-95dc-fa4b03c3bff4

View File

@@ -0,0 +1 @@
64ec7537-7e26-4b75-9eed-3c7f9429a7fa

View File

@@ -0,0 +1,87 @@
{extend name="admin@public/basic" /}
{block name="style"}
<style type="text/css">
form {
margin: 10px auto;
width: 500px
}
h1, h2, h3 {
padding: 10px 0
}
a {
color: #1C86EE;
text-align: right;
font-size: 18px
}
.xtree_contianer {
overflow: auto;
margin-bottom: 30px;
padding: 10px 0 25px 5px;
width: 500px;
border: 1px solid #9C9C9C;
background-color: #fff
}
.div-btns {
margin: 20px 0
}
.layui-form-label {
width: 60px !important
}
</style>
{/block}
{block name="cotent"}
<form class="layui-form">
<h1>{$auth.title|default=''}</h1>
<h3>授权节点:</h3>
<div id="xtree3" class="xtree_contianer"></div>
<input type="hidden" id="auth_id" name="auth_id" value="{$auth.id|default=''}">
<div class="layui-form-item layui-row layui-col-xs12">
<div class="layui-input-block">
<button class="layui-btn layui-btn-sm" id="submitBtn">提交</button>
<button type="reset" class="layui-btn layui-btn-sm layui-btn-primary">取消</button>
</div>
</div>
</form>
{/block}
{block name="script"}
<script type="text/javascript" src="__STATIC__/plugs/layui-xtree2.0/layui-xtree.js"></script>
<script type="text/javascript">
layui.use(['form', 'layer'], function () {
var form = layui.form
layer = parent.layer === undefined ? layui.layer : top.layer,
$ = layui.jquery;
var xtree3 = new layuiXtree({
elem: 'xtree3'
, form: form
, data: "{:url('admin/api.node/getNodeTree')}?id={$auth.id}"
, isopen: true //加载完毕后的展开状态默认值true
});
$("#submitBtn").click(function () {
var node_id = [];
var oCks = xtree3.GetChecked();
for (var i = 0; i < oCks.length; i++) {
node_id.push(oCks[i].value);
}
$.request.post("{:url('@admin/auth/authorize')}", {
auth_id: $("#auth_id").val(),
node_id: node_id,
}, function (res) {
$.msg.success(res.msg, function () {
$.tool.reload('open');
});
});
return false;
});
});
</script>
{/block}

View File

@@ -0,0 +1,55 @@
{extend name="admin@public/basic" /}
{block name="style"}{/block}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
{block name="cotent"}
<form class="layui-form form-width-99admin">
<br>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">权限角色</label>
<div class="layui-input-block">
<input type="text" id="title" class="layui-input" lay-verify="required" value="{$auth.title|default=''}" placeholder="请输入系统角色">
</div>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">备注信息</label>
<div class="layui-input-block">
<textarea id="remark" placeholder="请输入备注信息" class="layui-textarea">{$auth.remark|default=''}</textarea>
</div>
</div>
{if !empty($auth)}
<input type="hidden" id="id" value="{$auth.id|default=''}">
{/if}
<div class="layui-form-item layui-row layui-col-xs12">
<div class="layui-input-block">
<button class="layui-btn layui-btn-sm" id="submitBtn">提交</button>
<button class="layui-btn layui-btn-sm layui-btn-primary" data-close="closeOpen">取消</button>
</div>
</div>
</form>
{/block}
{block name="script"}
<script>
/**
* 添加、编辑
*/
$("#submitBtn").on("click", function () {
var url = "{if empty($auth)}{:url('@admin/auth/add')}{else/}{:url('@admin/auth/edit')}{/if}";
var data = {
id: $("#id").val(),
title: $("#title").val(),
remark: $("#remark").val(),
};
$.request.post(url, data, function (res) {
$.msg.success(res.msg, function () {
$.tool.reload('open');
})
})
return false;
});
</script>
{/block}

View File

@@ -0,0 +1,121 @@
{extend name="admin@public/basic" /}
{block name="style"}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
{/block}
{block name="cotent"}
<form class="layui-form">
<!--顶部操作栏--开始-->
<blockquote id="searchBlock" class="layui-elem-quote quoteBox">
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">角色名称</label>
<div class="layui-input-inline">
<input type="text" id="title" class="layui-input" placeholder="请输入权限角色名称"/>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">角色状态</label>
<div class="layui-input-inline">
<select id="status" class="status" lay-filter="status">
<option value="">请选择角色状态</option>
{foreach $status as $vo}
<option value="{$vo.id|default=''}">{$vo.title|default=''}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">创建时间</label>
<div class="layui-input-inline">
<input type="text" id="create_at" class="layui-input" placeholder="请选择创建时间">
</div>
</div>
<div class="layui-form-item layui-inline">
<a class="layui-btn" data-search="currentTableId">搜索</a>
</div>
{if auth("$thisClass/add")}
<div class="layui-form-item layui-inline">
<a class="layui-btn layui-btn-normal" data-open='{:url("$thisClass/add")}' data-title="添加文章">添加</a>
</div>
{/if}
{if auth("$thisClass/del")}
<div class="layui-form-item layui-inline">
<a class="layui-btn layui-btn-danger layui-btn-normal" data-title="确定批量删除?" data-del-all='{:url("$thisClass/del")}' data-table-id="currentTableId">删除</a>
</div>
{/if}
</blockquote>
<!--顶部操作栏--结束-->
<!--主表单渲染--开始-->
<table id="currentTable" lay-filter="currentTable"></table>
<!--主表单渲染--结束-->
<!--表单模板绑定--开始-->
<script type="text/html" id="checkStatus">
<input type="checkbox" name="{{d.id}}" value="{{d.status}}" lay-skin="switch" lay-text="启用|禁用" lay-filter="modifyStatus" {{ d.status== 1 ? 'checked' : '' }}>
</script>
<!--表单模板绑定--结束-->
<!--表单操作栏--开始-->
<script type="text/html" id="currentTableBar">
{if auth("$thisClass/authorize")}
<a class="layui-btn layui-btn-xs layui-btn-green" data-open='{:url("$thisClass/authorize")}?id={{d.id}}' data-title="角色授权">授权</a>
{/if}
{if auth("$thisClass/edit")}
<a class="layui-btn layui-btn-xs" data-open='{:url("$thisClass/edit")}?id={{d.id}}' data-title="修改菜单信息">编辑</a>
{/if}
{if auth("$thisClass/del")}
<a class="layui-btn layui-btn-xs layui-btn-danger" data-title="确定批量删除?" data-del='{:url("$thisClass/del")}?id={{d.id}}'>删除</a>
{/if}
</script>
<!--表单操作栏--结束-->
</form>
{/block}
{block name="script"}
<script>
/**
* 生成表单
*/
$.form.table('current', '{:url("$thisRequest")}?type=ajax', [[
{type: "checkbox", fixed: "left", width: 50,},
{field: 'sort', title: '排序', width: 100, edit: 'text', align: "center", sort: true},
{field: 'title', title: '角色名称', minWidth: 200, align: 'center', sort: true},
{field: 'remark', title: '备注信息', edit: 'text', minWidth: 200, align: "center", style: 'background-color: #009688; color: #fff;', sort: true},
{field: 'create_at', title: '创建时间', align: 'center', sort: true},
{field: 'status', title: '启用状态', width: 110, templet: '#checkStatus', unresize: true, align: "center"},
/**{if auth("$thisClass/authorize") || auth("$thisClass/edit") || auth("$thisClass/del")}**/
{title: '操作', minWidth: 110, templet: '#currentTableBar', fixed: "right", align: "center"},
/**{/if}**/
]]);
/**
* 日期范围
*/
$.laydate.range('create_at');
/**
* 监听字段值编辑
*/
$.form.editField('currentTable', '{:url("$thisRequest")}');
/**
* 修改状态
*/
$.form.switch('modifyStatus', '{:url("$thisClass/status")}');
</script>
{/block}

View File

@@ -0,0 +1 @@
62a2bb75-3d37-42b5-9225-578334abf58f

View File

@@ -0,0 +1,41 @@
{extend name="admin@public/basic" /}
{block name="style"}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
{/block}
{block name="cotent"}
<form class="layui-form">
<!--主表单渲染--开始-->
<table id="currentTable" lay-filter="currentTable"></table>
<!--主表单渲染--结束-->
</form>
{/block}
{block name="script"}
<script>
/**
* 生成表单
*/
$.form.table('current', '{:url("$thisRequest")}?type=ajax', [[
{field: 'sort', title: '排序', width: 100, edit: 'text', align: "center", sort: true},
{field: 'remark', title: '参数说明', align: 'center'},
{field: 'value', title: '参数值', edit: 'text', minWidth: 200, align: "center", style: 'background-color: #009688; color: #fff; border-radius: 15px;'},
{field: 'name', title: '参数名', align: 'center', sort: true},
{field: 'group', title: '组名', width: 200, align: 'center', sort: true},
]], false, 'line', 'lg', false);
/**
* 监听字段值编辑
*/
$.form.editField('currentTable', '{:url("$thisRequest")}');
/**
* 修改状态
*/
$.form.switch('modifyStatus', '{:url("$thisClass/status")}');
</script>
{/block}

View File

@@ -0,0 +1 @@
5fbf78c3-8f20-4a2a-a835-665bcbbe1cac

View File

@@ -0,0 +1 @@
6e5d5f40-ba96-41b6-9534-423eabfbbf03

View File

@@ -0,0 +1,82 @@
{extend name="admin@public/basic" /}
{block name="style"}{/block}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
{block name="cotent"}
<form class="layui-form form-width-99admin">
<br>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">联系电话</label>
<div class="layui-input-block">
<input type="text" id="telnum" class="layui-input" lay-verify="required" value="{$result.telnum|default=''}" placeholder="请输入菜单名称" readonly>
</div>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">问题</label>
<div class="layui-input-block">
<textarea id="content" class="layui-textarea" readonly>{$result.content|default=''}</textarea>
</div>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">图片</label>
<div class="layui-input-block" id="photo-list">
{if !empty($result.img1)}
<img style="width: 100px; height: 100px;" src="{$result.img1}" data-image="open" lay-filter="modifyHeadImg">
{/if}
{if !empty($result.img2)}
<img style="width: 100px; height: 100px;" src="{$result.img2}" data-image="open" lay-filter="modifyHeadImg">
{/if}
</div>
</div>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">回复内容</label>
<div class="layui-input-block">
<textarea id="replyCon" class="layui-textarea" placeholder="请输入回复内容">{$result.reply|default=''}</textarea>
</div>
</div>
{if !empty($result)}
<input type="hidden" class="id" id="id" value="{$result.id|default=''}">
{/if}
<div class="layui-form-item layui-row layui-col-xs12">
<div class="layui-input-block">
<button class="layui-btn layui-btn-sm" id="submitBtn">点击回复</button>
<button class="layui-btn layui-btn-sm layui-btn-primary" data-close="closeOpen">取消</button>
</div>
</form>
{/block}
{block name="script"}
<script>
$(function () {
$('#photo-list img').on('click', function () {
layer.photos({
photos: '#photo-list',
shadeClose: false,
closeBtn: 2,
anim: 0
});
})
});
/**
* 添加、编辑
*/
$("#submitBtn").on("click", function () {
var url = '{if empty($result)}{:url("$thisClass/reply")}{/if}';
var data = {
id: $("#id").val(),
replyCon: $("#replyCon").val()
};
$.request.post(url, data, function (res) {
$.msg.success(res.msg, function () {
$.tool.reload('open');
})
})
return false;
});
</script>
{/block}

View File

@@ -0,0 +1,132 @@
{extend name="admin@public/basic" /}
{block name="style"}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
{/block}
{block name="cotent"}
<form class="layui-form">
<!--顶部操作栏--开始-->
<blockquote id="searchBlock" class="layui-elem-quote quoteBox">
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">手机号码</label>
<div class="layui-input-inline">
<input type="text" id="telnum" class="layui-input" placeholder="请输入手机号"/>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">类型</label>
<div class="layui-input-inline">
<select name="type" lay-verify="required" lay-search id="type">
<option value="0">直接选择或搜索选择</option>
<option value="1">考生建议</option>
<option value="2">账号问题</option>
<option value="3">成绩问题</option>
<option value="4">付费问题</option>
<option value="5">其他问题</option>
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">状态</label>
<div class="layui-input-inline">
<select name="status" lay-verify="required" lay-search id="status">
<option value="0">直接选择或搜索选择</option>
<option value="1">未回复</option>
<option value="2">已回复</option>
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">创建时间</label>
<div class="layui-input-inline">
<input type="text" id="add_time" class="layui-input " placeholder="请选择创建时间">
</div>
</div>
<div class="layui-form-item layui-inline">
<a class="layui-btn" data-search="currentTableId">搜索</a>
</div>
</blockquote>
<!--顶部操作栏--结束-->
<!--主表单渲染--开始-->
<table id="currentTable" lay-filter="currentTable"></table>
<!--主表单渲染--结束-->
<!--表单模板绑定--开始-->
<script type="text/html" id="bindImg1">
<img style="width: 30px; height: 30px;" src="{{d.img1}}" layer-src="{{d.img1}}" data-image="open" lay-filter="modifyHeadImg">
</script>
<script type="text/html" id="bindImg2">
<img style="width: 30px; height: 30px;" src="{{d.img2}}" layer-src="{{d.img2}}" data-image="open" lay-filter="modifyHeadImg">
</script>
<script type="text/html" id="checkStatus">
{{#if(d.status == 1){}}
<div id="status{{d.id}}" style="color:red">未回复</div>
{{#}else{}}
<div id="status{{d.id}}" style="color:green">已回复</div>
{{#}}}
</script>
<!--表单模板绑定--结束-->
<!--表单操作栏--开始-->
<script type="text/html" id="currentTableBar">
{if auth("$thisClass/details")}
<a class="layui-btn layui-btn-xs layui-btn-sm" data-open='{:url("$thisClass/reply")}?id={{d.id}}' style="background: #0d8ddb" data-title="回复留言" >回复</a>
{/if}
</script>
<!--表单操作栏--结束-->
</form>
{/block}
{block name="script"}
<script>
/**
* 生成表单
*/
$.form.table('current', '{:url("$thisRequest")}?type=ajax', [[
{type: "checkbox", fixed: "left", width: 50},
{field: 'telnum', title: '联系电话', align: 'center'},
{field: 'type', title: '类型', align: 'center'},
{field: 'img1', title: '图片1', templet: '#bindImg1',align: 'center'},
{field: 'img2', title: '图片1',templet: '#bindImg2', align: 'center'},
{field: 'content', title: '问题', align: 'center'},
{field: 'status', title: '状态', templet: '#checkStatus',align: 'center'},
{field: 'reply', title: '回复内容', align: 'center'},
{field: 'add_time', title: '时间', align: 'center'},
{title: '操作', minWidth: 50, templet: '#currentTableBar', fixed: "right", align: "center"},
]]);
/**
* 日期范围
*/
$.laydate.range('add_time');
/**
* 监听字段值编辑
*/
$.form.editField('currentTable', '{:url("$thisRequest")}');
/**
* 修改状态
*/
$.form.switch('modifyStatus', '{:url("$thisClass/status")}');
setTimeout(()=> {
localStorage.setItem("fdith", document.body.clientWidth)
},300)
</script>
{/block}

View File

@@ -0,0 +1 @@
2c14bef3-a0c4-4e0e-996a-ac6b1b104498

View File

@@ -0,0 +1,149 @@
{extend name="admin@public/basic" /}
{block name="style"}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
{/block}
{block name="cotent"}
<form class="layui-form">
<!--顶部操作栏--开始-->
<blockquote id="searchBlock" class="layui-elem-quote quoteBox">
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">考生所在省份</label>
<div class="layui-input-inline">
<select name="stu_yzy_province" lay-verify="required" lay-search id="stu_yzy_province">
<option value="0">直接选择或搜索选择</option>
{volist name="resProvince" id="vo"}
<option value="{$vo.code}">{$vo.title}</option>
{/volist}
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">订单号</label>
<div class="layui-input-inline">
<input type="text" id="ord_no" class="layui-input" placeholder="请输入订单号"/>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">手机号码</label>
<div class="layui-input-inline">
<input type="text" id="telnum" class="layui-input" placeholder="请输入手机号"/>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">支付方式</label>
<div class="layui-input-inline">
<select name="province" lay-verify="required" lay-search id="pay_way">
<option value="0">直接选择或搜索选择</option>
<option value="1">微信</option>
<option value="2">支付宝</option>
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">订单状态</label>
<div class="layui-input-inline">
<select name="province" lay-verify="required" lay-search id="status">
<option value="0">直接选择或搜索选择</option>
<option value="1">未支付</option>
<option value="2">已支付</option>
<option value="3">已退款</option>
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">创建时间</label>
<div class="layui-input-inline">
<input type="text" id="add_time" class="layui-input " placeholder="请选择创建时间">
</div>
</div>
<div class="layui-form-item layui-inline">
<a class="layui-btn" data-search="currentTableId">搜索</a>
</div>
</blockquote>
<!--顶部操作栏--结束-->
<!--主表单渲染--开始-->
<table id="currentTable" lay-filter="currentTable"></table>
<!--主表单渲染--结束-->
<script type="text/html" id="payWay">
{{#if(d.pay_way == 1){}}
<div>微信</div>
{{#}else{}}
<div >支付宝</div>
{{#}}}
</script>
<script type="text/html" id="checkStatus">
{{#if(d.status == 1){}}
<div id="status{{d.id}}" style="color:green">已支付</div>
{{#}else if(d.status == 2){}}
<div id="status{{d.id}}" style="color:red">已退款</div>
{{#}else{}}
<div id="status{{d.id}}">待支付</div>
{{#}}}
</script>
<!--表单模板绑定--结束-->
<!--表单操作栏--开始-->
<script type="text/html" id="currentTableBar">
{if auth("$thisClass/details")}
<a class="layui-btn layui-btn-xs layui-btn-sm" data-open='{:url("$thisClass/details")}?id={{d.user_id}}' style="background: #0d8ddb" data-title="订单详情" >用戶全部订单</a>
{/if}
</script>
<!--表单操作栏--结束-->
</form>
{/block}
{block name="script"}
<script>
/**
* 生成表单
*/
$.form.table('current', '{:url("$thisRequest")}?type=ajax', [[
{field: 'ord_no', title: '订单号',fixed: "left", align: 'center'},
{field: 'telnum', title: '手机号', align: 'center'},
{field: 'userInfo', title: '考生信息', align: 'center'},
{field: 'vipName', title: '权限类型', align: 'center'},
{field: 'pay_way', title: '支付方式', align: 'center',templet: '#payWay'},
{field: 'money', title: '金額', align: 'center'},
{field: 'status', title: '状态', templet: '#checkStatus',align: 'center'},
{field: 'order_time', title: '时间', align: 'center',width: 400, fixed: "right"},
{title: '操作', minWidth: 110, templet: '#currentTableBar', fixed: "right", align: "center"},
]]);
/**
* 日期范围
*/
$.laydate.range('add_time');
/**
* 监听字段值编辑
*/
$.form.editField('currentTable', '{:url("$thisRequest")}');
/**
* 修改状态
*/
$.form.switch('modifyStatus', '{:url("$thisClass/status")}');
setTimeout(()=> {
localStorage.setItem("fdith", document.body.clientWidth)
},300)
</script>
{/block}

View File

@@ -0,0 +1 @@
3e12f413-d76d-4196-a193-03ac1cb602ca

View File

@@ -0,0 +1,107 @@
{extend name="admin@public/basic" /}
{block name="style"}{/block}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
<link href="__STATIC__/plugs/tag-it/css/jquery.tagit.css" rel="stylesheet" type="text/css">
<link href="__STATIC__/plugs/tag-it/css/tagit.ui-zendesk.css" rel="stylesheet" type="text/css">
{block name="cotent"}
<form class="layui-form form-width-99admin" action="">
<br>
<div class="layui-form-item">
<label class="layui-form-label">省份</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<select name="province_id" lay-verify="required" id="province_id" lay-filter="province_id">
<option value="0">请选择省份</option>
{foreach $province_list as $vo}
<option value="{$vo.code|default=''}" {if !empty($res.province_id) and $res.province_id eq $vo.code}selected{/if}>{$vo.title|default=''}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">批次名称</label>
<div class="layui-input-block">
<input type="text" id="batchName" class="layui-input" lay-verify="required" value="{$res.batchName|default=''}" placeholder="批次名称">
</div>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">批次序列</label>
<div class="layui-input-block">
<input type="text" id="batch" class="layui-input" lay-verify="required" value="{$res.batch|default=''}" placeholder="批次序列">
</div>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">年份</label>
<div class="layui-input-block">
<input type="text" id="year" class="layui-input" lay-verify="required" value="{$res.year|default=''}" placeholder="请输入年份如2020">
</div>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">高考总分</label>
<div class="layui-input-block">
<input type="text" id="GaoKaoTotal" class="layui-input" lay-verify="required" value="{$res.GaoKaoTotal|default=''}" placeholder="请输入高考总分">
</div>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">文科分数线</label>
<div class="layui-input-block">
<input type="text" id="ArtsScore" class="layui-input" lay-verify="required" value="{$res.ArtsScore|default=''}" placeholder="文科分数线">
</div>
</div>
<div class="layui-form-item layui-row layui-col-xs12">
<label class="layui-form-label">理科分数线</label>
<div class="layui-input-block">
<input type="text" id="SciencesScore" class="layui-input" lay-verify="required" value="{$res.SciencesScore|default=''}" placeholder="理科分数线">
</div>
</div>
{if !empty($res)}
<input type="hidden" class="id" id="id" value="{$res.id|default=''}">
{/if}
<div class="layui-form-item layui-row layui-col-xs12">
<div class="layui-input-block">
<button class="layui-btn layui-btn-sm" id="submitBtn">提交</button>
<button class="layui-btn layui-btn-sm layui-btn-primary" data-close="closeOpen">取消</button>
</div>
</div>
</form>
{/block}
{block name="script"}
<script type="text/javascript" src="/static/plugs/tag-it/js/jquery-ui.min.js"></script>
<script type="text/javascript" src="__STATIC__/plugs/tag-it/js/tag-it.js" charset="utf-8"></script>
<script>
/**
* 添加、编辑
*/
$("#submitBtn").on("click", function () {
var url = '{if empty($res)}{:url("$thisClass/add")}{else/}{:url("$thisClass/edit")}{/if}';
var data = {
id: $("#id").val(),
province_id: $("#province_id").val(),
province_title: $("#province_id option:selected").text(),
batch: $("#batch").val(),
year: $("#year").val(),
batchName: $("#batchName").val(),
GaoKaoTotal: $("#GaoKaoTotal").val(),
ArtsScore: $("#ArtsScore").val(),
SciencesScore: $("#SciencesScore").val()
};
$.request.post(url, data, function (res) {
$.msg.success(res.msg, function () {
$.tool.reload('open');
})
})
return false;
});
</script>
{/block}

View File

@@ -0,0 +1,97 @@
{extend name="admin@public/basic" /}
{block name="style"}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
{/block}
{block name="cotent"}
<form class="layui-form">
<!--顶部操作栏--开始-->
<blockquote id="searchBlock" class="layui-elem-quote quoteBox">
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">省份</label>
<div class="layui-input-inline">
<select name="province_id" lay-verify="required" lay-search id="province_id">
<option value="0">直接选择或搜索选择</option>
{volist name="resProvince" id="vo"}
<option value="{$vo.code}">{$vo.title}</option>
{/volist}
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<a class="layui-btn" data-search="currentTableId">搜索</a>
</div>
{if auth("$thisClass/add")}
<div class="layui-form-item layui-inline">
<a class="layui-btn layui-btn-normal" data-open='{:url("$thisClass/add")}' data-title="添加" data-width="500px" data-height="500px">添加</a>
</div>
{/if}
</blockquote>
<!--顶部操作栏--结束-->
<!--主表单渲染--开始-->
<table id="currentTable" lay-filter="currentTable"></table>
<!--主表单渲染--结束-->
<!--表单操作栏--开始-->
<script type="text/html" id="currentTableBar">
{if auth("$thisClass/edit")}
<a class="layui-btn layui-btn-xs" data-open='{:url("$thisClass/edit")}?id={{d.id}}' data-title="修改分类信息" data-width="500px" data-height="500px">编辑</a>
{/if}
{if auth("$thisClass/del")}
<a class="layui-btn layui-btn-xs layui-btn-danger" data-title="确定删除?" data-del='{:url("$thisClass/del")}?id={{d.id}}'>删除</a>
{/if}
</script>
<!--表单操作栏--结束-->
</form>
{/block}
{block name="script"}
<script>
/**
* 生成表单
*/
$.form.table('current', '{:url("$thisRequest")}?type=ajax', [[
{type: "checkbox", width: 50, fixed: "left"},
{field: 'province_title', title: '省份', width: 100, align: "center"},
{field: 'batchName', title: '批次', minWidth: 100, align: 'center'},
{field: 'GaoKaoTotal', title: '高考总分', minWidth: 100, align: 'center'},
{field: 'ArtsScore', title: '文科分数线', align: 'center', minWidth: 150},
{field: 'SciencesScore', title: '理科分数线', align: 'center', minWidth: 150},
/**{if auth("$thisClass/edit") || auth("$thisClass/del")}**/
{title: '操作', minWidth: 100, templet: '#currentTableBar', fixed: "right", align: "center"}
/**{/if}**/
]]);
/**
* 日期范围
*/
$.laydate.range('create_time');
/**
* 监听字段值编辑
*/
$.form.editField('currentTable', '{:url("$thisRequest")}');
/**
* 修改状态
*/
$.form.switch('modifyStatus', '{:url("$thisClass/status")}');
</script>
{/block}

View File

@@ -0,0 +1 @@
7ea1ae97-7216-43e8-929c-40c53b51ddc4

View File

@@ -0,0 +1,127 @@
{extend name="admin@public/basic" /}
{block name="style"}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
{/block}
{block name="cotent"}
<form class="layui-form">
<table id="currentTable" lay-filter="currentTable"></table>
<script type="text/html" id="returnStatus">
{{#if(d.return_status == 1){}}
<div id="returnStatus{{d.id}}">未退款</div>
{{#}else if(d.return_status == 2){}}
<div id="returnStatus{{d.id}}">待退款</div>
{{#}else if(d.return_status == 3){}}
<div id="returnStatus{{d.id}}">部分退款</div>
{{#}else{}}
<div id="returnStatus{{d.id}}">已退款</div>
{{#}}}
</script>
<script type="text/html" id="payWay">
{{#if(d.pay_way == 1){}}
<div>微信</div>
{{#}else{}}
<div >支付宝</div>
{{#}}}
</script>
<!--表单操作栏--开始-->
<script type="text/html" id="currentTableBar">
{{#if(d.status == 1){}}
{{#if(d.pay_way == 1){}}
<a class="layui-btn layui-btn-xs layui-btn-danger" data-title="确定退款?" onclick="returnOrder('{{d.id}}','{{d.pay_way}}')" id="clickStatus{{d.id}}">微信退款</a>
{{#}else{}}
<a class="layui-btn layui-btn-xs layui-btn-danger" data-title="确定退款?" onclick="returnOrder('{{d.id}}','{{d.pay_way}}')" id="clickStatus{{d.id}}">支付宝退款</a>
{{#}}}
{{#}}}
</script>
<script type="text/html" id="checkStatus">
{{#if(d.status == 1){}}
<div id="status{{d.id}}" style="color:green">已支付</div>
{{#}else if(d.status == 2){}}
<div id="status{{d.id}}" style="color:red">已退款</div>
{{#}else{}}
<div id="status{{d.id}}">待支付</div>
{{#}}}
</script>
</form>
{/block}
{block name="script"}
<script>
var screenWith = localStorage.getItem("fdith") / 8 - 3;
/**
* 生成表单
*/
$.form.table('current', '{:url("$thisRequest")}?type=ajax&user_id={$user_id}', [[
{field: 'ord_no', title: '订单号', width: screenWith,fixed: "left", align: "center"},
{field: 'userInfo', title: '考生信息', width:screenWith, align: "center"},
{field: 'vipName', title: '权限类型',width:screenWith,align: "center"},
{field: 'money', title: '价格', width:screenWith, align: "center"},
{field: 'pay_way', title: '支付方式',width:screenWith, align: "center",templet: '#payWay'},
{field: 'status', title: '状态',templet: '#checkStatus',width:screenWith, align: "center"},
{field: 'add_time', title: '下单时间',width:screenWith, align: "center"},
{field: 'pay_time', title: '支付时间', width:screenWith,align: "center"},
{title: '操作', templet: '#currentTableBar',width:screenWith, fixed: "right", align: "center"},
]], false, 'line', 'lg', true);
/**
* 监听字段值编辑
*/
$.form.editField('currentTable', '{:url("$thisRequest")}');
//退款
function returnOrder(id,payWay) {
layer.open({
type: 1,
skin: 'layui-layer-rim', //加上边框
title: '退款',
area: ['300px', '180px'], //宽高
content: '<div class="layui-form-item layui-inline" div style="padding:10px 40px">\n' +
'<div class="layui-input-inline">\n' +
'<input type="text" class="layui-input selectBlock" value="网络原因" />\n' +
'</div>\n' +
'</div> <div style="padding:5px 60px"><a class="layui-btn layui-btn-normal" id="statusDiv'+id+'">点击退款</a></div>',
success: function(layero, index){
$('#statusDiv'+id).click(function(){
var reason = layero.find('input')[0].value;
$.ajax({
type: "POST",
url: '{:url("$thisClass/refundOrder")}',
data: "id=" + id + '&reason='+reason+'&payWay='+payWay,
success: function (data) {
if (data.code == 0) {
layer.alert(data.msg);
} else if (data.code == 1) {
layer.alert(data.msg);
$("#status" + id).html('<span style="color:red">已退款</span>');
layer.close(index);
$(".layui-btn#clickStatus" + id).css("display", "none");
} else {
layer.closeAll();
layer.alert('退款失败');
}
}
})
})
}
})
}
</script>
{/block}

View File

@@ -0,0 +1,107 @@
{extend name="admin@public/basic" /}
{block name="style"}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
{/block}
{block name="cotent"}
<form class="layui-form">
<!--顶部操作栏--开始-->
<blockquote id="searchBlock" class="layui-elem-quote quoteBox">
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">手机号码</label>
<div class="layui-input-inline">
<input type="text" id="phone" class="layui-input" placeholder="请输入手机号"/>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">考生所在省份</label>
<div class="layui-input-inline">
<select name="province" lay-verify="required" lay-search id="province">
<option value="0">直接选择或搜索选择</option>
{volist name="resProvince" id="vo"}
<option value="{$key}">{$vo.title}</option>
{/volist}
</select>
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label-99admin">创建时间</label>
<div class="layui-input-inline">
<input type="text" id="add_time" class="layui-input " placeholder="请选择创建时间">
</div>
</div>
<div class="layui-form-item layui-inline">
<a class="layui-btn" data-search="currentTableId">搜索</a>
</div>
</blockquote>
<!--顶部操作栏--结束-->
<!--主表单渲染--开始-->
<table id="currentTable" lay-filter="currentTable"></table>
<!--主表单渲染--结束-->
<!--表单模板绑定--开始-->
<script type="text/html" id="bindHeadImg">
<img style="width: 30px; height: 30px;" src="{{d.head_img}}" layer-src="{{d.head_img}}" alt="{{d.nickname}}" data-image="open" lay-filter="modifyHeadImg">
</script>
<!--表单模板绑定--结束-->
<!--表单操作栏--开始-->
<script type="text/html" id="currentTableBar">
{if auth("$thisClass/details")}
<a class="layui-btn layui-btn-xs layui-btn-sm" data-open='{:url("$thisClass/details")}?id={{d.id}}' style="background: #0d8ddb" data-title="订单详情" >查看订单</a>
{/if}
</script>
<!--表单操作栏--结束-->
</form>
{/block}
{block name="script"}
<script>
/**
* 生成表单
*/
$.form.table('current', '{:url("$thisRequest")}?type=ajax', [[
{type: "checkbox", fixed: "left", width: 50},
{field: 'phone', title: '用户手机', align: 'center'},
{field: 'userInfo', title: '考生信息', align: 'center'},
{field: 'add_time', title: '创建时间', align: 'center', minWidth: 150},
/**{if auth("$thisClass/edit_password") || auth("$thisClass/edit") || auth("$thisClass/del")}**/
{title: '操作', minWidth: 110, templet: '#currentTableBar', fixed: "right", align: "center"},
/**{/if}**/
]]);
/**
* 日期范围
*/
$.laydate.range('add_time');
/**
* 监听字段值编辑
*/
$.form.editField('currentTable', '{:url("$thisRequest")}');
/**
* 修改状态
*/
$.form.switch('modifyStatus', '{:url("$thisClass/status")}');
setTimeout(()=> {
localStorage.setItem("fdith", document.body.clientWidth)
},300)
</script>
{/block}

View File

@@ -0,0 +1 @@
9d762c35-05b2-4218-a300-4a5945fda3fa

View File

@@ -0,0 +1,778 @@
{extend name="admin@public/basic" /}
{block name="style"}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
<style>
h4{ font-size:18px;font-family:"Microsoft YaHei","Simsun",Arial; font-weight:normal; line-height:1; padding:0; margin:0;}
.section{ padding:20px;}
.section h4 span{ color:#0084e9;}
.fa {font-size: 25px !important;}
.fa:hover {font-size: 50px !important;}
</style>
{/block}
{block name="cotent"}
<div class="section" id="all">
<h4><span>全部图标</span> Web Application Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-adjust"></i><span>fa-adjust</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-anchor"></i><span>fa-anchor</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-archive"></i><span>fa-archive</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-area-chart"></i><span>fa-area-chart</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrows"></i><span>fa-arrows</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrows-h"></i><span>fa-arrows-h</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrows-v"></i><span>fa-arrows-v</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-asterisk"></i><span>fa-asterisk</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-at"></i><span>fa-at</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-automobile"></i><span>fa-automobile</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-ban"></i><span>fa-ban</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bank"></i><span>fa-bank</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bar-chart"></i><span>fa-bar-chart</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bar-chart-o"></i><span>fa-bar-chart-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-barcode"></i><span>fa-barcode</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bars"></i><span>fa-bars</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bed"></i><span>fa-bed</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-beer"></i><span>fa-beer</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bell"></i><span>fa-bell</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bell-o"></i><span>fa-bell-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bell-slash"></i><span>fa-bell-slash</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bell-slash-o"></i><span>fa-bell-slash-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bicycle"></i><span>fa-bicycle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-binoculars"></i><span>fa-binoculars</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-birthday-cake"></i><span>fa-birthday-cake</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bolt"></i><span>fa-bolt</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bomb"></i><span>fa-bomb</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-book"></i><span>fa-book</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bookmark"></i><span>fa-bookmark</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bookmark-o"></i><span>fa-bookmark-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-briefcase"></i><span>fa-briefcase</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bug"></i><span>fa-bug</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-building"></i><span>fa-building</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-building-o"></i><span>fa-building-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bullhorn"></i><span>fa-bullhorn</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bullseye"></i><span>fa-bullseye</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bus"></i><span>fa-bus</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cab"></i><span>fa-cab</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-calculator"></i><span>fa-calculator</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-calendar"></i><span>fa-calendar</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-calendar-o"></i><span>fa-calendar-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-camera"></i><span>fa-camera</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-camera-retro"></i><span>fa-camera-retro</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-car"></i><span>fa-car</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-square-o-down"></i><span>fa-caret-square-o-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-square-o-left"></i><span>fa-caret-square-o-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-square-o-right"></i><span>fa-caret-square-o-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-square-o-up"></i><span>fa-caret-square-o-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cart-arrow-down"></i><span>fa-cart-arrow-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cart-plus"></i><span>fa-cart-plus</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc"></i><span>fa-cc</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-certificate"></i><span>fa-certificate</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-check"></i><span>fa-check</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-check-circle"></i><span>fa-check-circle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-check-circle-o"></i><span>fa-check-circle-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-check-square"></i><span>fa-check-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-check-square-o"></i><span>fa-check-square-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-child"></i><span>fa-child</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-circle"></i><span>fa-circle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-circle-o"></i><span>fa-circle-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-circle-o-notch"></i><span>fa-circle-o-notch</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-circle-thin"></i><span>fa-circle-thin</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-clock-o"></i><span>fa-clock-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-close"></i><span>fa-close</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cloud"></i><span>fa-cloud</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cloud-download"></i><span>fa-cloud-download</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cloud-upload"></i><span>fa-cloud-upload</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-code"></i><span>fa-code</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-code-fork"></i><span>fa-code-fork</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-coffee"></i><span>fa-coffee</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cog"></i><span>fa-cog</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cogs"></i><span>fa-cogs</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-comment"></i><span>fa-comment</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-comment-o"></i><span>fa-comment-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-comments"></i><span>fa-comments</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-comments-o"></i><span>fa-comments-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-compass"></i><span>fa-compass</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-copyright"></i><span>fa-copyright</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-credit-card"></i><span>fa-credit-card</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-crop"></i><span>fa-crop</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-crosshairs"></i><span>fa-crosshairs</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cube"></i><span>fa-cube</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cubes"></i><span>fa-cubes</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cutlery"></i><span>fa-cutlery</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-dashboard"></i><span>fa-dashboard</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-database"></i><span>fa-database</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-desktop"></i><span>fa-desktop</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-diamond"></i><span>fa-diamond</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-dot-circle-o"></i><span>fa-dot-circle-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-download"></i><span>fa-download</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-edit"></i><span>fa-edit</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-ellipsis-h"></i><span>fa-ellipsis-h</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-ellipsis-v"></i><span>fa-ellipsis-v</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-envelope"></i><span>fa-envelope</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-envelope-o"></i><span>fa-envelope-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-envelope-square"></i><span>fa-envelope-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-eraser"></i><span>fa-eraser</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-exchange"></i><span>fa-exchange</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-exclamation"></i><span>fa-exclamation</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-exclamation-circle"></i><span>fa-exclamation-circle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-exclamation-triangle"></i><span>fa-exclamation-triangle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-external-link"></i><span>fa-external-link</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-external-link-square"></i><span>fa-external-link-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-eye"></i><span>fa-eye</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-eye-slash"></i><span>fa-eye-slash</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-eyedropper"></i><span>fa-eyedropper</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-fax"></i><span>fa-fax</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-female"></i><span>fa-female</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-fighter-jet"></i><span>fa-fighter-jet</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-archive-o"></i><span>fa-file-archive-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-audio-o"></i><span>fa-file-audio-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-code-o"></i><span>fa-file-code-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-excel-o"></i><span>fa-file-excel-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-image-o"></i><span>fa-file-image-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-movie-o"></i><span>fa-file-movie-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-pdf-o"></i><span>fa-file-pdf-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-photo-o"></i><span>fa-file-photo-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-picture-o"></i><span>fa-file-picture-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-powerpoint-o"></i><span>fa-file-powerpoint-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-sound-o"></i><span>fa-file-sound-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-video-o"></i><span>fa-file-video-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-word-o"></i><span>fa-file-word-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-zip-o"></i><span>fa-file-zip-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-film"></i><span>fa-film</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-filter"></i><span>fa-filter</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-fire"></i><span>fa-fire</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-fire-extinguisher"></i><span>fa-fire-extinguisher</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-flag"></i><span>fa-flag</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-flag-checkered"></i><span>fa-flag-checkered</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-flag-o"></i><span>fa-flag-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-flash"></i><span>fa-flash</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-flask"></i><span>fa-flask</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-folder"></i><span>fa-folder</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-folder-o"></i><span>fa-folder-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-folder-open"></i><span>fa-folder-open</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-folder-open-o"></i><span>fa-folder-open-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-frown-o"></i><span>fa-frown-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-futbol-o"></i><span>fa-futbol-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-gamepad"></i><span>fa-gamepad</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-gavel"></i><span>fa-gavel</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-gear"></i><span>fa-gear</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-gears"></i><span>fa-gears</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-genderless"></i><span>fa-genderless</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-gift"></i><span>fa-gift</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-glass"></i><span>fa-glass</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-globe"></i><span>fa-globe</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-graduation-cap"></i><span>fa-graduation-cap</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-group"></i><span>fa-group</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-hdd-o"></i><span>fa-hdd-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-headphones"></i><span>fa-headphones</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-heart"></i><span>fa-heart</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-heart-o"></i><span>fa-heart-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-heartbeat"></i><span>fa-heartbeat</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-history"></i><span>fa-history</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-home"></i><span>fa-home</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-hotel"></i><span>fa-hotel</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-image"></i><span>fa-image</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-inbox"></i><span>fa-inbox</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-info"></i><span>fa-info</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-info-circle"></i><span>fa-info-circle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-institution"></i><span>fa-institution</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-key"></i><span>fa-key</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-keyboard-o"></i><span>fa-keyboard-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-language"></i><span>fa-language</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-laptop"></i><span>fa-laptop</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-leaf"></i><span>fa-leaf</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-legal"></i><span>fa-legal</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-lemon-o"></i><span>fa-lemon-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-level-down"></i><span>fa-level-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-level-up"></i><span>fa-level-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-life-bouy"></i><span>fa-life-bouy</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-life-buoy"></i><span>fa-life-buoy</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-life-ring"></i><span>fa-life-ring</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-life-saver"></i><span>fa-life-saver</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-lightbulb-o"></i><span>fa-lightbulb-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-line-chart"></i><span>fa-line-chart</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-location-arrow"></i><span>fa-location-arrow</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-lock"></i><span>fa-lock</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-magic"></i><span>fa-magic</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-magnet"></i><span>fa-magnet</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mail-forward"></i><span>fa-mail-forward</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mail-reply"></i><span>fa-mail-reply</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mail-reply-all"></i><span>fa-mail-reply-all</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-male"></i><span>fa-male</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-map-marker"></i><span>fa-map-marker</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-meh-o"></i><span>fa-meh-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-microphone"></i><span>fa-microphone</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-microphone-slash"></i><span>fa-microphone-slash</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-minus"></i><span>fa-minus</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-minus-circle"></i><span>fa-minus-circle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-minus-square"></i><span>fa-minus-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-minus-square-o"></i><span>fa-minus-square-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mobile"></i><span>fa-mobile</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mobile-phone"></i><span>fa-mobile-phone</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-money"></i><span>fa-money</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-moon-o"></i><span>fa-moon-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mortar-board"></i><span>fa-mortar-board</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-motorcycle"></i><span>fa-motorcycle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-music"></i><span>fa-music</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-navicon"></i><span>fa-navicon</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-newspaper-o"></i><span>fa-newspaper-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-paint-brush"></i><span>fa-paint-brush</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-paper-plane"></i><span>fa-paper-plane</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-paper-plane-o"></i><span>fa-paper-plane-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-paw"></i><span>fa-paw</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pencil"></i><span>fa-pencil</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pencil-square"></i><span>fa-pencil-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pencil-square-o"></i><span>fa-pencil-square-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-phone"></i><span>fa-phone</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-phone-square"></i><span>fa-phone-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-photo"></i><span>fa-photo</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-picture-o"></i><span>fa-picture-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pie-chart"></i><span>fa-pie-chart</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-plane"></i><span>fa-plane</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-plug"></i><span>fa-plug</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-plus"></i><span>fa-plus</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-plus-circle"></i><span>fa-plus-circle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-plus-square"></i><span>fa-plus-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-plus-square-o"></i><span>fa-plus-square-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-power-off"></i><span>fa-power-off</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-print"></i><span>fa-print</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-puzzle-piece"></i><span>fa-puzzle-piece</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-qrcode"></i><span>fa-qrcode</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-question"></i><span>fa-question</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-question-circle"></i><span>fa-question-circle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-quote-left"></i><span>fa-quote-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-quote-right"></i><span>fa-quote-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-random"></i><span>fa-random</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-recycle"></i><span>fa-recycle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-refresh"></i><span>fa-refresh</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-remove"></i><span>fa-remove</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-reorder"></i><span>fa-reorder</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-reply"></i><span>fa-reply</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-reply-all"></i><span>fa-reply-all</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-retweet"></i><span>fa-retweet</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-road"></i><span>fa-road</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-rocket"></i><span>fa-rocket</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-rss"></i><span>fa-rss</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-rss-square"></i><span>fa-rss-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-search"></i><span>fa-search</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-search-minus"></i><span>fa-search-minus</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-search-plus"></i><span>fa-search-plus</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-send"></i><span>fa-send</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-send-o"></i><span>fa-send-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-server"></i><span>fa-server</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-share"></i><span>fa-share</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-share-alt"></i><span>fa-share-alt</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-share-alt-square"></i><span>fa-share-alt-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-share-square"></i><span>fa-share-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-share-square-o"></i><span>fa-share-square-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-shield"></i><span>fa-shield</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-ship"></i><span>fa-ship</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-shopping-cart"></i><span>fa-shopping-cart</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sign-in"></i><span>fa-sign-in</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sign-out"></i><span>fa-sign-out</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-signal"></i><span>fa-signal</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sitemap"></i><span>fa-sitemap</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sliders"></i><span>fa-sliders</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-smile-o"></i><span>fa-smile-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-soccer-ball-o"></i><span>fa-soccer-ball-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sort"></i><span>fa-sort</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sort-alpha-asc"></i><span>fa-sort-alpha-asc</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sort-alpha-desc"></i><span>fa-sort-alpha-desc</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sort-amount-asc"></i><span>fa-sort-amount-asc</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sort-amount-desc"></i><span>fa-sort-amount-desc</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sort-asc"></i><span>fa-sort-asc</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sort-desc"></i><span>fa-sort-desc</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sort-down"></i><span>fa-sort-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sort-numeric-asc"></i><span>fa-sort-numeric-asc</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sort-numeric-desc"></i><span>fa-sort-numeric-desc</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sort-up"></i><span>fa-sort-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-space-shuttle"></i><span>fa-space-shuttle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-spinner"></i><span>fa-spinner</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-spoon"></i><span>fa-spoon</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-square"></i><span>fa-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-square-o"></i><span>fa-square-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-star"></i><span>fa-star</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-star-half"></i><span>fa-star-half</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-star-half-empty"></i><span>fa-star-half-empty</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-star-half-full"></i><span>fa-star-half-full</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-star-half-o"></i><span>fa-star-half-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-star-o"></i><span>fa-star-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-street-view"></i><span>fa-street-view</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-suitcase"></i><span>fa-suitcase</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sun-o"></i><span>fa-sun-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-support"></i><span>fa-support</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-tablet"></i><span>fa-tablet</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-tachometer"></i><span>fa-tachometer</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-tag"></i><span>fa-tag</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-tags"></i><span>fa-tags</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-tasks"></i><span>fa-tasks</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-taxi"></i><span>fa-taxi</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-terminal"></i><span>fa-terminal</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-thumb-tack"></i><span>fa-thumb-tack</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-thumbs-down"></i><span>fa-thumbs-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-thumbs-o-down"></i><span>fa-thumbs-o-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-thumbs-o-up"></i><span>fa-thumbs-o-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-thumbs-up"></i><span>fa-thumbs-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-ticket"></i><span>fa-ticket</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-times"></i><span>fa-times</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-times-circle"></i><span>fa-times-circle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-times-circle-o"></i><span>fa-times-circle-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-tint"></i><span>fa-tint</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-toggle-down"></i><span>fa-toggle-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-toggle-left"></i><span>fa-toggle-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-toggle-off"></i><span>fa-toggle-off</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-toggle-on"></i><span>fa-toggle-on</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-toggle-right"></i><span>fa-toggle-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-toggle-up"></i><span>fa-toggle-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-trash"></i><span>fa-trash</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-trash-o"></i><span>fa-trash-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-tree"></i><span>fa-tree</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-trophy"></i><span>fa-trophy</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-truck"></i><span>fa-truck</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-tty"></i><span>fa-tty</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-umbrella"></i><span>fa-umbrella</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-university"></i><span>fa-university</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-unlock"></i><span>fa-unlock</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-unlock-alt"></i><span>fa-unlock-alt</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-unsorted"></i><span>fa-unsorted</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-upload"></i><span>fa-upload</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-user"></i><span>fa-user</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-user-plus"></i><span>fa-user-plus</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-user-secret"></i><span>fa-user-secret</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-user-times"></i><span>fa-user-times</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-users"></i><span>fa-users</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-video-camera"></i><span>fa-video-camera</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-volume-down"></i><span>fa-volume-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-volume-off"></i><span>fa-volume-off</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-volume-up"></i><span>fa-volume-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-warning"></i><span>fa-warning</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-wheelchair"></i><span>fa-wheelchair</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-wifi"></i><span>fa-wifi</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-wrench"></i><span>fa-wrench</span></li>
</ul>
</div>
<div class="section" id="transportation">
<h4><span>运输工具</span> Transportation Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-ambulance"></i><span>fa-ambulance</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-car"></i><span>fa-car</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bicycle"></i><span>fa-bicycle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bus"></i><span>fa-bus</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-taxi"></i><span>fa-taxi</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-fighter-jet"></i><span>fa-fighter-jet</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-motorcycle"></i><span>fa-motorcycle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-plane"></i><span>fa-plane</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-rocket"></i><span>fa-rocket</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-ship"></i><span>fa-ship</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-space-shuttle"></i><span>fa-space-shuttle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-subway"></i><span>fa-subway</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-train"></i><span>fa-train</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-truck"></i><span>fa-truck</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-wheelchair"></i><span>fa-wheelchair</span></li>
</ul>
</div>
<div class="section" id="gender">
<h4><span>性别</span> Gender Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-circle-thin"></i><span>fa-circle-thin</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mars"></i><span>fa-mars</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mars-double"></i><span>fa-mars-double</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mars-stroke"></i><span>fa-mars-stroke</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mars-stroke-h"></i><span>fa-mars-stroke-h</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mars-stroke-v"></i><span>fa-mars-stroke-v</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-mercury"></i><span>fa-mercury</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-neuter"></i><span>fa-neuter</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-transgender"></i><span>fa-transgender</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-transgender-alt"></i><span>fa-transgender-alt</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-venus"></i><span>fa-venus</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-venus-double"></i><span>fa-venus-double</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-venus-mars"></i><span>fa-venus-mars</span></li>
</ul>
</div>
<div class="section" id="file">
<h4><span>文件类型</span> File Type Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file"></i><span>fa-file</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-archive-o"></i><span>fa-file-archive-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-audio-o"></i><span>fa-file-audio-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-code-o"></i><span>fa-file-code-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-excel-o"></i><span>fa-file-excel-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-image-o"></i><span>fa-file-image-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-video-o"></i><span>fa-file-video-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-o"></i><span>fa-file-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-pdf-o"></i><span>fa-file-pdf-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-powerpoint-o"></i><span>fa-file-powerpoint-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-text"></i><span>fa-file-text</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-text-o"></i><span>fa-file-text-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-word-o"></i><span>fa-file-word-o</span></li>
</ul>
</div>
<div class="section" id="spinner">
<h4><span>旋转加载</span> Spinner Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cog"></i><span>fa-cog</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-circle-o-notch"></i><span>fa-circle-o-notch</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-refresh"></i><span>fa-refresh</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-spinner"></i><span>fa-spinner</span></li>
</ul>
</div>
<div class="section" id="form">
<h4><span>表单控件</span> Form Control Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-check-square"></i><span>fa-check-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-check-square-o"></i><span>fa-check-square-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-circle"></i><span>fa-circle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-circle-o"></i><span>fa-circle-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-dot-circle-o"></i><span>fa-dot-circle-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-minus-square"></i><span>fa-minus-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-minus-square-o"></i><span>fa-minus-square-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-plus-square"></i><span>fa-plus-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-plus-square-o"></i><span>fa-plus-square-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-square"></i><span>fa-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-square-o"></i><span>fa-square-o</span></li>
</ul>
</div>
<div class="section" id="payment">
<h4><span>支付方式</span> Payment Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-amex"></i><span>fa-cc-amex</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-discover"></i><span>fa-cc-discover</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-mastercard"></i><span>fa-cc-mastercard</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-paypal"></i><span>fa-cc-paypal</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-stripe"></i><span>fa-cc-stripe</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-visa"></i><span>fa-cc-visa</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-credit-card"></i><span>fa-credit-card</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-google-wallet"></i><span>fa-google-wallet</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-paypal"></i><span>fa-paypal</span></li>
</ul>
</div>
<div class="section" id="chart">
<h4><span>统计</span> Chart Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-area-chart"></i><span>fa-area-chart</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bar-chart"></i><span>fa-bar-chart</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-line-chart"></i><span>fa-line-chart</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pie-chart"></i><span>fa-pie-chart</span></li>
</ul>
</div>
<div class="section" id="currency">
<h4><span>货币</span> Currency Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-btc"></i><span>fa-btc</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-jpy"></i><span>fa-jpy</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-usd"></i><span>fa-usd</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-eur"></i><span>fa-eur</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-gbp"></i><span>fa-gbp</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-ils"></i><span>fa-ils</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-inr"></i><span>fa-inr</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-krw"></i><span>fa-krw</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-money"></i><span>fa-money</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-rub"></i><span>fa-rub</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-try"></i><span>fa-try</span></li>
</ul>
</div>
<div class="section" id="text">
<h4><span>文本编辑</span> Text Editor Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-align-center"></i><span>fa-align-center</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-align-justify"></i><span>fa-align-justify</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-align-left"></i><span>fa-align-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-align-right"></i><span>fa-align-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bold"></i><span>fa-bold</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-font"></i><span>fa-font</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-italic"></i><span>fa-italic</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-header"></i><span>fa-header</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-underline"></i><span>fa-underline</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-text-width"></i><span>fa-text-width</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-text-height"></i><span>fa-text-height</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-strikethrough"></i><span>fa-strikethrough</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-subscript"></i><span>fa-subscript</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-superscript"></i><span>fa-superscript</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-link"></i><span>fa-link</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-chain-broken"></i><span>fa-chain-broken</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-clipboard"></i><span>fa-clipboard</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-files-o"></i><span>fa-files-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-scissors"></i><span>fa-scissors</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-columns"></i><span>fa-columns</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-eraser"></i><span>fa-eraser</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file"></i><span>fa-file</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-o"></i><span>fa-file-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-text"></i><span>fa-file-text</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-file-text-o"></i><span>fa-file-text-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-floppy-o"></i><span>fa-floppy-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-repeat"></i><span>fa-repeat</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-undo"></i><span>fa-undo</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-outdent"></i><span>fa-outdent</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-indent"></i><span>fa-indent</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-list"></i><span>fa-list</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-list-alt"></i><span>fa-list-alt</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-list-ol"></i><span>fa-list-ol</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-list-ul"></i><span>fa-list-ul</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-paperclip"></i><span>fa-paperclip</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-paragraph"></i><span>fa-paragraph</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-table"></i><span>fa-table</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-th"></i><span>fa-th</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-th-large"></i><span>fa-th-large</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-th-list"></i><span>fa-th-list</span></li>
</ul>
</div>
<div class="section" id="directional">
<h4><span>方向性</span> Directional Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-angle-double-down"></i><span>fa-angle-double-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-angle-double-left"></i><span>fa-angle-double-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-angle-double-right"></i><span>fa-angle-double-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-angle-double-up"></i><span>fa-angle-double-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-angle-down"></i><span>fa-angle-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-angle-left"></i><span>fa-angle-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-angle-right"></i><span>fa-angle-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-angle-up"></i><span>fa-angle-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-circle-down"></i><span>fa-arrow-circle-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-circle-left"></i><span>fa-arrow-circle-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-circle-right"></i><span>fa-arrow-circle-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-circle-up"></i><span>fa-arrow-circle-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-circle-o-down"></i><span>fa-arrow-circle-o-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-circle-o-left"></i><span>fa-arrow-circle-o-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-circle-o-right"></i><span>fa-arrow-circle-o-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-circle-o-up"></i><span>fa-arrow-circle-o-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-down"></i><span>fa-arrow-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-left"></i><span>fa-arrow-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-right"></i><span>fa-arrow-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrow-up"></i><span>fa-arrow-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrows"></i><span>fa-arrows</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrows-alt"></i><span>fa-arrows-alt</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrows-h"></i><span>fa-arrows-h</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrows-v"></i><span>fa-arrows-v</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-down"></i><span>fa-caret-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-left"></i><span>fa-caret-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-right"></i><span>fa-caret-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-up"></i><span>fa-caret-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-square-o-down"></i><span>fa-caret-square-o-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-square-o-left"></i><span>fa-caret-square-o-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-square-o-right"></i><span>fa-caret-square-o-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-caret-square-o-up"></i><span>fa-caret-square-o-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-chevron-circle-down"></i><span>fa-chevron-circle-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-chevron-circle-left"></i><span>fa-chevron-circle-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-chevron-circle-right"></i><span>fa-chevron-circle-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-chevron-circle-up"></i><span>fa-chevron-circle-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-chevron-down"></i><span>fa-chevron-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-chevron-left"></i><span>fa-chevron-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-chevron-right"></i><span>fa-chevron-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-chevron-up"></i><span>fa-chevron-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-hand-o-down"></i><span>fa-hand-o-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-hand-o-left"></i><span>fa-hand-o-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-hand-o-right"></i><span>fa-hand-o-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-hand-o-up"></i><span>fa-hand-o-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-long-arrow-down"></i><span>fa-long-arrow-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-long-arrow-left"></i><span>fa-long-arrow-left</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-long-arrow-right"></i><span>fa-long-arrow-right</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-long-arrow-up"></i><span>fa-long-arrow-up</span></li>
</ul>
</div>
<div class="section" id="video">
<h4><span>播放器控件</span> Video Player Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-arrows-alt"></i><span>fa-arrows-alt</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-backward"></i><span>fa-backward</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-compress"></i><span>fa-compress</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-eject"></i><span>fa-eject</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-expand"></i><span>fa-expand</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-fast-backward"></i><span>fa-fast-backward</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-fast-forward"></i><span>fa-fast-forward</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-forward"></i><span>fa-forward</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pause"></i><span>fa-pause</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-play"></i><span>fa-play</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-play-circle"></i><span>fa-play-circle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-play-circle-o"></i><span>fa-play-circle-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-step-backward"></i><span>fa-step-backward</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-step-forward"></i><span>fa-step-forward</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-stop"></i><span>fa-stop</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-youtube-play"></i><span>fa-youtube-play</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-volume-off"></i><span>fa-volume-off</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-volume-down"></i><span>fa-volume-down</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-volume-up"></i><span>fa-volume-up</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-random"></i><span>fa-random</span></li>
</ul>
</div>
<div class="section" id="medical">
<h4><span>医疗</span> Medical Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-ambulance"></i><span>fa-ambulance</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-h-square"></i><span>fa-h-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-heart"></i><span>fa-heart</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-heart-o"></i><span>fa-heart-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-heartbeat"></i><span>fa-heartbeat</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-hospital-o"></i><span>fa-hospital-o</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-medkit"></i><span>fa-medkit</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-plus-square"></i><span>fa-plus-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-stethoscope"></i><span>fa-stethoscope</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-user-md"></i><span>fa-user-md</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-wheelchair"></i><span>fa-wheelchair</span></li>
</ul>
</div>
<div class="section" id="brand">
<h4><span>品牌</span> Brand Icons</h4>
<hr>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-adn"></i><span>fa-adn</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-android"></i><span>fa-android</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-angellist"></i><span>fa-angellist</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-apple"></i><span>fa-apple</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-behance"></i><span>fa-behance</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-behance-square"></i><span>fa-behance-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bitbucket"></i><span>fa-bitbucket</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-bitbucket-square"></i><span>fa-bitbucket-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-btc"></i><span>fa-btc</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-buysellads"></i><span>fa-buysellads</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-amex"></i><span>fa-cc-amex</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-discover"></i><span>fa-cc-discover</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-mastercard"></i><span>fa-cc-mastercard</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-paypal"></i><span>fa-cc-paypal</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-stripe"></i><span>fa-cc-stripe</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-cc-visa"></i><span>fa-cc-visa</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-codepen"></i><span>fa-codepen</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-connectdevelop"></i><span>fa-connectdevelop</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-css3"></i><span>fa-css3</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-dashcube"></i><span>fa-dashcube</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-delicious"></i><span>fa-delicious</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-deviantart"></i><span>fa-deviantart</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-digg"></i><span>fa-digg</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-dribbble"></i><span>fa-dribbble</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-dropbox"></i><span>fa-dropbox</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-drupal"></i><span>fa-drupal</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-empire"></i><span>fa-empire</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-facebook"></i><span>fa-facebook</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-facebook-official"></i><span>fa-facebook-official</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-facebook-square"></i><span>fa-facebook-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-flickr"></i><span>fa-flickr</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-forumbee"></i><span>fa-forumbee</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-foursquare"></i><span>fa-foursquare</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-git"></i><span>fa-git</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-git-square"></i><span>fa-git-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-github"></i><span>fa-github</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-github-alt"></i><span>fa-github-alt</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-github-square"></i><span>fa-github-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-gratipay"></i><span>fa-gratipay</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-google"></i><span>fa-google</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-google-plus"></i><span>fa-google-plus</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-google-plus-square"></i><span>fa-google-plus-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-google-wallet"></i><span>fa-google-wallet</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-hacker-news"></i><span>fa-hacker-news</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-html5"></i><span>fa-html5</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-instagram"></i><span>fa-instagram</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-ioxhost"></i><span>fa-ioxhost</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-joomla"></i><span>fa-joomla</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-jsfiddle"></i><span>fa-jsfiddle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-lastfm"></i><span>fa-lastfm</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-lastfm-square"></i><span>fa-lastfm-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-leanpub"></i><span>fa-leanpub</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-linkedin"></i><span>fa-linkedin</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-linkedin-square"></i><span>fa-linkedin-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-linux"></i><span>fa-linux</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-maxcdn"></i><span>fa-maxcdn</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-meanpath"></i><span>fa-meanpath</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-medium"></i><span>fa-medium</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-openid"></i><span>fa-openid</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pagelines"></i><span>fa-pagelines</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-paypal"></i><span>fa-paypal</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pied-piper"></i><span>fa-pied-piper</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pied-piper-alt"></i><span>fa-pied-piper-alt</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pinterest"></i><span>fa-pinterest</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pinterest-p"></i><span>fa-pinterest-p</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-pinterest-square"></i><span>fa-pinterest-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-qq"></i><span>fa-qq</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-rebel"></i><span>fa-rebel</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-reddit"></i><span>fa-reddit</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-reddit-square"></i><span>fa-reddit-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-renren"></i><span>fa-renren</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-sellsy"></i><span>fa-sellsy</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-share-alt"></i><span>fa-share-alt</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-share-alt-square"></i><span>fa-share-alt-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-shirtsinbulk"></i><span>fa-shirtsinbulk</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-simplybuilt"></i><span>fa-simplybuilt</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-skyatlas"></i><span>fa-skyatlas</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-skype"></i><span>fa-skype</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-slack"></i><span>fa-slack</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-slideshare"></i><span>fa-slideshare</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-soundcloud"></i><span>fa-soundcloud</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-spotify"></i><span>fa-spotify</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-stack-exchange"></i><span>fa-stack-exchange</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-stack-overflow"></i><span>fa-stack-overflow</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-steam"></i><span>fa-steam</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-steam-square"></i><span>fa-steam-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-stumbleupon"></i><span>fa-stumbleupon</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-stumbleupon-circle"></i><span>fa-stumbleupon-circle</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-tencent-weibo"></i><span>fa-tencent-weibo</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-trello"></i><span>fa-trello</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-tumblr"></i><span>fa-tumblr</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-tumblr-square"></i><span>fa-tumblr-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-twitch"></i><span>fa-twitch</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-twitter"></i><span>fa-twitter</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-twitter-square"></i><span>fa-twitter-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-viacoin"></i><span>fa-viacoin</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-vimeo-square"></i><span>fa-vimeo-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-vine"></i><span>fa-vine</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-vk"></i><span>fa-vk</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-weixin"></i><span>fa-weixin</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-weibo"></i><span>fa-weibo</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-whatsapp"></i><span>fa-whatsapp</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-windows"></i><span>fa-windows</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-wordpress"></i><span>fa-wordpress</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-xing"></i><span>fa-xing</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-xing-square"></i><span>fa-xing-square</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-yahoo"></i><span>fa-yahoo</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-yelp"></i><span>fa-yelp</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-youtube"></i><span>fa-youtube</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-youtube-play"></i><span>fa-youtube-play</span></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="fa fa-youtube-square"></i><span>fa-youtube-square</span></li>
</ul>
</div>
{/block}
{block name="script"}
<script>
layui.use(['form', 'layer', 'jquery'], function () {
var form = layui.form,
layer = parent.layer === undefined ? layui.layer : top.layer,
element = layui.element;
$ = layui.jquery;
/**
* 复制图标编码至粘贴板
*/
$("body").on("click", ".icons li", function () {
console.log('复制');
console.log($(this).text());
window.sessionStorage.setItem("icon", $(this).text());
var selectIcon = parent.layer.getFrameIndex(window.name);
parent.layer.close(selectIcon);
})
})
</script>
{/block}

View File

@@ -0,0 +1,180 @@
{extend name="admin@public/basic" /}
{block name="style"}
<link rel="stylesheet" href="__STATIC__/css/admin/public.css" media="all"/>
<style>
.layui-icon {font-size: 25px !important;}
.layui-icon:hover {font-size: 50px !important;}
</style>
{/block}
{block name="cotent"}
<textarea id="copyText"></textarea>
<ul class="icons layui-row">
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-rate-half"></i><div class="doc-icon-code" >&amp;#xe6c9;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-rate"></i><div class="doc-icon-code">&amp;#xe67b;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-rate-solid"></i><div class="doc-icon-code">&amp;#xe67a;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-cellphone"></i><div class="doc-icon-code">&amp;#xe678;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-vercode"></i><div class="doc-icon-code">&amp;#xe679;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-login-wechat"></i><div class="doc-icon-code">&amp;#xe677;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-login-qq"></i><div class="doc-icon-code">&amp;#xe676;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-login-weibo"></i><div class="doc-icon-code">&amp;#xe675;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-password"></i><div class="doc-icon-code">&amp;#xe673;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-username"></i><div class="doc-icon-code">&amp;#xe66f;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-refresh-3"></i><div class="doc-icon-code">&amp;#xe9aa;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-auz"></i><div class="doc-icon-code">&amp;#xe672;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-spread-left"></i><div class="doc-icon-code">&amp;#xe66b;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-shrink-right"></i><div class="doc-icon-code">&amp;#xe668;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-snowflake"></i><div class="doc-icon-code">&amp;#xe6b1;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-tips"></i><div class="doc-icon-code">&amp;#xe702;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-note"></i><div class="doc-icon-code">&amp;#xe66e;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-home"></i><div class="doc-icon-code">&amp;#xe68e;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-senior"></i><div class="doc-icon-code">&amp;#xe674;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-refresh"></i><div class="doc-icon-code">&amp;#xe669;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-refresh-1"></i><div class="doc-icon-code">&amp;#xe666;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-flag"></i><div class="doc-icon-code">&amp;#xe66c;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-theme"></i><div class="doc-icon-code">&amp;#xe66a;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-notice"></i><div class="doc-icon-code">&amp;#xe667;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-website"></i><div class="doc-icon-code">&amp;#xe7ae;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-console"></i><div class="doc-icon-code">&amp;#xe665;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-face-surprised"></i><div class="doc-icon-code">&amp;#xe664;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-set"></i><div class="doc-icon-code">&amp;#xe716;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-template-1"></i><div class="doc-icon-code">&amp;#xe656;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-app"></i><div class="doc-icon-code">&amp;#xe653;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-template"></i><div class="doc-icon-code">&amp;#xe663;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-praise"></i><div class="doc-icon-code">&amp;#xe6c6;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-tread"></i><div class="doc-icon-code">&amp;#xe6c5;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-male"></i><div class="doc-icon-code">&amp;#xe662;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-female"></i><div class="doc-icon-code">&amp;#xe661;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-camera"></i><div class="doc-icon-code">&amp;#xe660;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-camera-fill"></i><div class="doc-icon-code">&amp;#xe65d;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-more"></i><div class="doc-icon-code">&amp;#xe65f;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-more-vertical"></i><div class="doc-icon-code">&amp;#xe671;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-rmb"></i><div class="doc-icon-code">&amp;#xe65e;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-dollar"></i><div class="doc-icon-code">&amp;#xe659;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-diamond"></i><div class="doc-icon-code">&amp;#xe735;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-fire"></i><div class="doc-icon-code">&amp;#xe756;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-return"></i><div class="doc-icon-code">&amp;#xe65c;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-location"></i><div class="doc-icon-code">&amp;#xe715;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-read"></i><div class="doc-icon-code">&amp;#xe705;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-survey"></i><div class="doc-icon-code">&amp;#xe6b2;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-face-smile"></i><div class="doc-icon-code">&amp;#xe6af;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-face-cry"></i><div class="doc-icon-code">&amp;#xe69c;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-cart-simple"></i><div class="doc-icon-code">&amp;#xe698;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-cart"></i><div class="doc-icon-code">&amp;#xe657;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-next"></i><div class="doc-icon-code">&amp;#xe65b;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-prev"></i><div class="doc-icon-code">&amp;#xe65a;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-upload-drag"></i><div class="doc-icon-code">&amp;#xe681;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-upload"></i><div class="doc-icon-code">&amp;#xe67c;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-download-circle"></i><div class="doc-icon-code">&amp;#xe601;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-component"></i><div class="doc-icon-code">&amp;#xe857;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-file-b"></i><div class="doc-icon-code">&amp;#xe655;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-user"></i><div class="doc-icon-code">&amp;#xe770;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-find-fill"></i><div class="doc-icon-code">&amp;#xe670;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-loading layui-icon layui-anim layui-anim-rotate layui-anim-loop"></i><div
class="doc-icon-code">&amp;#xe63d;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-loading-1 layui-icon layui-anim layui-anim-rotate layui-anim-loop"></i><div class="doc-icon-code">&amp;#xe63e;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-add-1"></i><div class="doc-icon-code">&amp;#xe654;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-play"></i><div class="doc-icon-code">&amp;#xe652;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-pause"></i><div class="doc-icon-code">&amp;#xe651;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-headset"></i><div class="doc-icon-code">&amp;#xe6fc;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-video"></i><div class="doc-icon-code">&amp;#xe6ed;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-voice"></i><div class="doc-icon-code">&amp;#xe688;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-speaker"></i><div class="doc-icon-code">&amp;#xe645;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-fonts-del"></i><div class="doc-icon-code">&amp;#xe64f;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-fonts-code"></i><div class="doc-icon-code">&amp;#xe64e;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-fonts-html"></i><div class="doc-icon-code">&amp;#xe64b;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-fonts-strong"></i><div class="doc-icon-code">&amp;#xe62b;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-unlink"></i><div class="doc-icon-code">&amp;#xe64d;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-picture"></i><div class="doc-icon-code">&amp;#xe64a;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-link"></i><div class="doc-icon-code">&amp;#xe64c;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-face-smile-b"></i><div class="doc-icon-code">&amp;#xe650;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-align-left"></i><div class="doc-icon-code">&amp;#xe649;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-align-right"></i><div class="doc-icon-code">&amp;#xe648;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-align-center"></i><div class="doc-icon-code">&amp;#xe647;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-fonts-u"></i><div class="doc-icon-code">&amp;#xe646;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-fonts-i"></i><div class="doc-icon-code">&amp;#xe644;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-tabs"></i><div class="doc-icon-code">&amp;#xe62a;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-radio"></i><div class="doc-icon-code">&amp;#xe643;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-circle"></i><div class="doc-icon-code">&amp;#xe63f;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-edit"></i><div class="doc-icon-code">&amp;#xe642;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-share"></i><div class="doc-icon-code">&amp;#xe641;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-delete"></i><div class="doc-icon-code">&amp;#xe640;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-form"></i><div class="doc-icon-code">&amp;#xe63c;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-cellphone-fine"></i><div class="doc-icon-code">&amp;#xe63b;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-dialogue"></i><div class="doc-icon-code">&amp;#xe63a;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-fonts-clear"></i><div class="doc-icon-code">&amp;#xe639;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-layer"></i><div class="doc-icon-code">&amp;#xe638;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-date"></i><div class="doc-icon-code">&amp;#xe637;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-water"></i><div class="doc-icon-code">&amp;#xe636;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-code-circle"></i><div class="doc-icon-code">&amp;#xe635;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-carousel"></i><div class="doc-icon-code">&amp;#xe634;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-prev-circle"></i><div class="doc-icon-code">&amp;#xe633;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-layouts"></i><div class="doc-icon-code">&amp;#xe632;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-util"></i><div class="doc-icon-code">&amp;#xe631;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-templeate-1"></i><div class="doc-icon-code">&amp;#xe630;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-upload-circle"></i><div class="doc-icon-code">&amp;#xe62f;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-tree"></i><div class="doc-icon-code">&amp;#xe62e;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-table"></i><div class="doc-icon-code">&amp;#xe62d;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-chart"></i><div class="doc-icon-code">&amp;#xe62c;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-chart-screen"></i><div class="doc-icon-code">&amp;#xe629;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-engine"></i><div class="doc-icon-code">&amp;#xe628;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-triangle-d"></i><div class="doc-icon-code">&amp;#xe625;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-triangle-r"></i><div class="doc-icon-code">&amp;#xe623;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-file"></i><div class="doc-icon-code">&amp;#xe621;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-set-sm"></i><div class="doc-icon-code">&amp;#xe620;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-add-circle"></i><div class="doc-icon-code">&amp;#xe61f;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-404"></i><div class="doc-icon-code">&amp;#xe61c;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-about"></i><div class="doc-icon-code">&amp;#xe60b;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-up"></i><div class="doc-icon-code">&amp;#xe619;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-down"></i><div class="doc-icon-code">&amp;#xe61a;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-left"></i><div class="doc-icon-code">&amp;#xe603;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-right"></i><div class="doc-icon-code">&amp;#xe602;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-circle-dot"></i><div class="doc-icon-code">&amp;#xe617;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-search"></i><div class="doc-icon-code">&amp;#xe615;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-set-fill"></i><div class="doc-icon-code">&amp;#xe614;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-group"></i><div class="doc-icon-code">&amp;#xe613;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-friends"></i><div class="doc-icon-code">&amp;#xe612;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-reply-fill"></i><div class="doc-icon-code">&amp;#xe611;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-menu-fill"></i><div class="doc-icon-code">&amp;#xe60f;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-log"></i><div class="doc-icon-code">&amp;#xe60e;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-picture-fine"></i><div class="doc-icon-code">&amp;#xe60d;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-face-smile-fine"></i><div class="doc-icon-code">&amp;#xe60c;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-list"></i><div class="doc-icon-code">&amp;#xe60a;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-release"></i><div class="doc-icon-code">&amp;#xe609;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-ok"></i><div class="doc-icon-code">&amp;#xe605;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-help"></i><div class="doc-icon-code">&amp;#xe607;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-chat"></i><div class="doc-icon-code">&amp;#xe606;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-top"></i><div class="doc-icon-code">&amp;#xe604;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-star"></i><div class="doc-icon-code">&amp;#xe600;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-star-fill"></i><div class="doc-icon-code">&amp;#xe658;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-close-fill"></i><div class="doc-icon-code">&amp;#x1007;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-close"></i><div class="doc-icon-code">&amp;#x1006;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-ok-circle"></i><div class="doc-icon-code">&amp;#x1005;</div></li>
<li class='layui-col-xs4 layui-col-sm3 layui-col-md2 layui-col-lg1 '><i class="layui-icon layui-icon-add-circle-fine"></i><div class="doc-icon-code">&amp;#xe608;</div></li>
</ul>
{/block}
{block name="script"}
<script>
layui.use(['form', 'layer', 'jquery'], function () {
var form = layui.form,
layer = parent.layer === undefined ? layui.layer : top.layer,
element = layui.element;
$ = layui.jquery;
/**
* 复制图标编码至粘贴板
*/
$("body").on("click",".icons li",function(){
var copyText = document.getElementById("copyText");
copyText.innerText = $(this).html();
copyText.select();
document.execCommand("copy");
window.sessionStorage.setItem("icon",$(this).text());
var selectIcon = parent.layer.getFrameIndex(window.name);
parent.layer.close(selectIcon);
})
})
</script>
{/block}

View File

@@ -0,0 +1 @@
59924c0d-7dc1-4d19-b04f-1625973c2510

View File

@@ -0,0 +1,47 @@
{extend name="admin@public/basic" /}
{block name="style"}
<link rel="stylesheet" href="__STATIC__/css/admin/index.css" media="all" />
{/block}
{block name="cotent"}
<div class="layui-layout layui-layout-admin">
{include file="admin@public/header" /}
{include file="admin@public/menu" /}
<!-- 右侧内容 -->
<div class="layui-body layui-form">
<div class="layui-tab mag0" lay-filter="bodyTab" id="top_tabs_box">
<ul class="layui-tab-title top_tab" id="top_tabs">
<li class="layui-this" lay-id=""><i class="layui-icon">{$home.icon|raw|default=''}</i> <cite>{$home.title|default=''}</cite></li>
</ul>
<ul class="layui-nav closeBox">
<li class="layui-nav-item">
<a href="javascript:;"><i class="layui-icon caozuo">&#xe643;</i> 页面操作</a>
<dl class="layui-nav-child">
<!--<dd><a href="javascript:;" class="refresh refreshThis"><i class="layui-icon">&#xe9aa;</i> 刷新当前</a></dd>-->
<dd><a href="javascript:;" class="closePageOther"><i class="seraph icon-prohibit"></i> 关闭其他</a></dd>
<dd><a href="javascript:;" class="closePageAll"><i class="seraph icon-guanbi"></i> 关闭全部</a></dd>
</dl>
</li>
</ul>
<div class="layui-tab-content clildFrame">
<div class="layui-tab-item layui-show">
<iframe src="{$home.href|default=''}"></iframe>
</div>
</div>
</div>
</div>
{include file="admin@public/footer" /}
</div>
<!-- 移动导航 -->
<div class="site-tree-mobile layui-hide"><i class="layui-icon">&#xe602;</i></div>
<div class="site-mobile-shade" ></div>
{/block}
{block name="script"}
<script type="text/javascript" src="__STATIC__/js/admin/index.js"></script>
<script type="text/javascript" src="__STATIC__/js/admin/cache.js"></script>
{/block}

View File

@@ -0,0 +1,30 @@
{extend name="admin@public/basic" /}
{block name="style"}
<link rel="stylesheet" href="__STATIC__/css/admin/login.css" media="all">
<style>
.layadmin-backlog-body p em {
font-style: normal;
font-size: 30px;
font-weight: 300;
color: #009688 !important;
}
.layadmin-backlog-body cite {
padding-bottom: 10px;
font-size: 12px;
font-weight: 500;
color: #333;
}
</style>
{/block}
{block name="cotent"}
<body style="background-color: #f2f2f2;">
<div class="layui-fluid">
<div style="font-size:30px;">欢迎使用聚志愿后台管理系统</div>
</div>
</body>
{/block}
{block name="script"}
{/block}

View File

@@ -0,0 +1 @@
a766b3d5-5347-4a29-92d5-c870e7319cbc

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