wanghuirong 5 éve
commit
4428a537e6
100 módosított fájl, 7683 hozzáadás és 0 törlés
  1. 2 0
      .gitignore
  2. 42 0
      .travis.yml
  3. 1236 0
      CHANGELOG.md
  4. 32 0
      LICENSE.txt
  5. 141 0
      README.md
  6. 1 0
      application/.htaccess
  7. 15 0
      application/admin/config.php
  8. 193 0
      application/admin/controller/Article.php
  9. 35 0
      application/admin/controller/Base.php
  10. 95 0
      application/admin/controller/Column.php
  11. 108 0
      application/admin/controller/Demo.php
  12. 235 0
      application/admin/controller/Index.php
  13. 57 0
      application/admin/controller/Login.php
  14. 126 0
      application/admin/controller/Tags.php
  15. 206 0
      application/admin/controller/Tests.php
  16. 19 0
      application/admin/model/ArticleModel.php
  17. 18 0
      application/admin/model/ColumnModel.php
  18. 15 0
      application/admin/model/IndexModel.php
  19. 15 0
      application/admin/model/LogModel.php
  20. 15 0
      application/admin/model/TagsModel.php
  21. 3 0
      application/admin/view/Base/fotter.html
  22. 119 0
      application/admin/view/Base/left.html
  23. 109 0
      application/admin/view/Base/top.html
  24. 226 0
      application/admin/view/article/add.html
  25. 267 0
      application/admin/view/article/edit.html
  26. 277 0
      application/admin/view/article/lst.html
  27. 74 0
      application/admin/view/column/add.html
  28. 74 0
      application/admin/view/column/edit.html
  29. 178 0
      application/admin/view/column/lst.html
  30. 82 0
      application/admin/view/index/add.html
  31. 90 0
      application/admin/view/index/edit.html
  32. 115 0
      application/admin/view/index/log.html
  33. 265 0
      application/admin/view/index/lst.html
  34. 168 0
      application/admin/view/index/server.html
  35. 552 0
      application/admin/view/login/lst.html
  36. 74 0
      application/admin/view/tags/add.html
  37. 73 0
      application/admin/view/tags/edit.html
  38. 261 0
      application/admin/view/tags/lst.html
  39. 12 0
      application/command.php
  40. 147 0
      application/common.php
  41. 251 0
      application/config.php
  42. 159 0
      application/data/site.sql
  43. 55 0
      application/database.php
  44. 14 0
      application/extra/queue.php
  45. 12 0
      application/index/config.php
  46. 93 0
      application/index/controller/Base.php
  47. 77 0
      application/index/controller/Index.php
  48. 20 0
      application/index/view/base/fotter.html
  49. 74 0
      application/index/view/base/right.html
  50. 75 0
      application/index/view/base/search.html
  51. 75 0
      application/index/view/base/searchtop.html
  52. 137 0
      application/index/view/base/top.html
  53. 81 0
      application/index/view/index/articlelb.html
  54. 72 0
      application/index/view/index/articlexq.html
  55. 140 0
      application/index/view/index/index.html
  56. 23 0
      application/route.php
  57. 28 0
      application/tags.php
  58. 25 0
      build.php
  59. 34 0
      composer.json
  60. 6 0
      desktop.ini
  61. 97 0
      extend/catetree/Catetree.php
  62. 283 0
      extend/page/Page.php
  63. 8 0
      public/.htaccess
  64. BIN
      public/favicon.ico
  65. 19 0
      public/index.php
  66. 2 0
      public/robots.txt
  67. 20 0
      public/router.php
  68. BIN
      public/static/admin/images/admin.png
  69. BIN
      public/static/admin/images/favicon.png
  70. BIN
      public/static/admin/images/fire.png
  71. BIN
      public/static/admin/images/jt.png
  72. BIN
      public/static/admin/images/noimage.png
  73. BIN
      public/static/admin/images/pdf.png
  74. BIN
      public/static/admin/images/yl1.jpg
  75. BIN
      public/static/admin/images/zan.png
  76. 1 0
      public/static/admin/layui2.5.6/css/layui.css
  77. 1 0
      public/static/admin/layui2.5.6/css/layui.mobile.css
  78. 2 0
      public/static/admin/layui2.5.6/css/modules/code.css
  79. 1 0
      public/static/admin/layui2.5.6/css/modules/laydate/default/laydate.css
  80. BIN
      public/static/admin/layui2.5.6/css/modules/layer/default/icon-ext.png
  81. BIN
      public/static/admin/layui2.5.6/css/modules/layer/default/icon.png
  82. 1 0
      public/static/admin/layui2.5.6/css/modules/layer/default/layer.css
  83. BIN
      public/static/admin/layui2.5.6/css/modules/layer/default/loading-0.gif
  84. BIN
      public/static/admin/layui2.5.6/css/modules/layer/default/loading-1.gif
  85. BIN
      public/static/admin/layui2.5.6/css/modules/layer/default/loading-2.gif
  86. BIN
      public/static/admin/layui2.5.6/font/iconfont.eot
  87. 25 0
      public/static/admin/layui2.5.6/font/iconfont.svg
  88. BIN
      public/static/admin/layui2.5.6/font/iconfont.ttf
  89. BIN
      public/static/admin/layui2.5.6/font/iconfont.woff
  90. BIN
      public/static/admin/layui2.5.6/font/iconfont.woff2
  91. BIN
      public/static/admin/layui2.5.6/images/face/0.gif
  92. BIN
      public/static/admin/layui2.5.6/images/face/1.gif
  93. BIN
      public/static/admin/layui2.5.6/images/face/10.gif
  94. BIN
      public/static/admin/layui2.5.6/images/face/11.gif
  95. BIN
      public/static/admin/layui2.5.6/images/face/12.gif
  96. BIN
      public/static/admin/layui2.5.6/images/face/13.gif
  97. BIN
      public/static/admin/layui2.5.6/images/face/14.gif
  98. BIN
      public/static/admin/layui2.5.6/images/face/15.gif
  99. BIN
      public/static/admin/layui2.5.6/images/face/16.gif
  100. BIN
      public/static/admin/layui2.5.6/images/face/17.gif

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+.idea
+composer.lock

+ 42 - 0
.travis.yml

@@ -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

+ 1236 - 0
CHANGELOG.md

@@ -0,0 +1,1236 @@
+## 2019-1-11 V5.0.24
+
+本次更新包含了一个安全更新,建议更新
+
+- 改进关联的save方法
+- 改进模型数据验证
+- Collection增加values方法
+- 改进unique验证方法
+- 改进Request类的method方法
+
+## 2018-12-9 V5.0.23
+
+本次版本更新主要涉及一个安全更新,推荐尽快更新到最新版本。
+
+* Query支持调用模型的查询范围
+* 聚合查询字段支持`DISTINCT`
+* 改进闭包验证的参数
+* 多对多关联支持指定中间表数据名称
+* after/before验证支持指定字段验证
+* 改进多对多关联
+* 改进验证类
+* 增加`afterWith`和`beforeWith`验证规则 用于比较日期字段
+* 完善规则提示
+* 改进断线重连
+* 修正软删除的`destroy`方法
+* 修复模型的`save`方法当`data`变量为空 数据不验证
+* 模型增加`replace`方法
+* MorphOne 增加 make 方法创建关联对象实例
+* 改进`count`方法返回值类型
+* 改进聚合查询方法的正则判断
+* 改进`sqlsrv`驱动
+* 完善关联的`save`方法
+* 修正控制器名获取
+
+
+## 2018-10-22 V5.0.22
+
+该版本主要增加了JSON日志格式的支持,并且包含了一个安全更新。
+
+* 调试模式下关闭路由解析缓存
+* 改进Log类支持`json`日志格式
+* 改进聚合查询的安全性
+* 改进`count`查询的返回值类型
+
+## 2018-9-7 V5.0.21
+
+该版本主要做了一些已知问题的修正,改进了对Swoole的支持,以及增加路由解析缓存功能。
+
+* 增加路由解析缓存功能
+* 改进url生成的端口问题
+* 改进缓存驱动
+* 改进value方法的缓存处理
+* 修正Builder类的insertAll方法
+* 改进对Swoole的支持(使用参考:[xavier-swoole](https://github.com/xavieryang007/xavier-swoole))
+
+## 2018-5-11 V5.0.20
+
+该版本为修正版本,修正了一些已知的问题。
+
+* `join`方法的条件支持传入`Expression`对象
+* 改进驱动的`parseKey`方法
+* 改进Request类的`host`方法
+* 使用`exp`表达式更新数据的异常提示
+* 修正查询
+* 改进多对多关联的中间表模型更新
+
+## 2018-4-25 V5.0.19
+
+该版本属于改进版本,主要改进了composer自动加载及内置模板引擎的一处可能的安全隐患。
+
+* 改进composer自动加载
+* 改进模板引擎一处安全隐患
+* 改进`comment`方法解析
+* 改进分布式写入数据后及时读取的问题
+* 改进url操作方法的自动转换
+* 改进分页类魔术方法的返回值
+* SQL日志增加主从标记
+
+## 2018-4-14 V5.0.18
+
+该版本主要修正上一个发布的一些BUG,并且改进了`exp`表达式查询/写入的严谨性。
+
+* 修正`field`方法`*`兼容问题;
+* 修正`inc/dec`方法;
+* 修正`setInc/setDec`方法;
+* 改进`insertAll`方法;
+* 改进`parseTime`方法;
+* 改进`exp`表达式查询/写入的严谨性;
+
+## 2018-4-12 V5.0.17
+
+该版本主要是一些修正和改进,并且包含了一个安全更新。
+
+* 改进Response类`create`方法
+* 改进`inc/dec`查询
+* 默认模板渲染规则支持直接使用操作方法名
+* 改进视图驱动
+* 改进Request类ip方法 支持代理设置
+* 修正request类的`create`方法
+* 闭包查询使用`cache(true)`抛出异常
+* 改进composer自动加载文件
+* 增加`Expression`类及相关方法
+
+## 2018-3-26 V5.0.16
+
+该版本主要做了一些修正和改进,由于包含了一个安全更新,是一个推荐更新的版本。
+
+* 改进Url生成
+* 改进composer自动加载性能
+* 改进一对一查询
+* 改进查询缓存
+* 改进field方法
+* 优化Template类
+* 修正分页参数
+* 改进默认模板的自动识别
+* 改进Query类查询
+* Collection类改进
+* 改进模型类`readTransform`方法对序列化类型的处理
+* 改进trace显示
+* 文件日志支持自动清理
+* 改进断线重连的判断
+* 改进验证方法
+* 修正Query类view方法的数组表名定义
+* 改进参数绑定
+* 改进文件缓存的并发删除
+* 改进`inc/dec/exp`更新的安全性
+* 增加控制台配置
+
+## 2018-1-31 V5.0.15
+
+该版本主要进行了一些修正和完善
+
+* 改进View类
+* 改进chunk方法
+* 改进模板引擎的表达式语法
+* 改进自关联查询多级调用问题
+* 关联定义增加`selfRelation`方法用于设置是否自关联
+* 改进file类型的缓存`inc`和`dec`方法不改变缓存有效期
+* 改进软删除 支持设置`deleteTime`属性关闭
+* 改进`union`查询
+* 改进查询缓存
+* 优化File缓存自动生成空目录的问题
+* 改进日志写入并发问题
+* 修正`MorphTo`关联
+* 改进`join`自关联查询
+* 改进`case`标签解析
+* 改进Url类对`url_convert`配置的支持
+
+
+## 2018-1-1 V5.0.14
+
+V5.0.14版本主对复合主键进行了更多支持,改进了PHP7的兼容性,并且对数据库的一些问题做了改进。
+
+主要更新如下:
+
+* 改进Validate类的unique验证
+* Validate类增加checkRule方法用于静态验证多个规则
+* 改进多对多关联的save方法
+* 改进多对多的pivot对象
+* 修正setDec方法的延迟写入
+* max和min方法增加第二个参数用于设置是否强制转换数字
+* 改进View类
+* 改进join关联自身的问题
+* 改进union查询
+* 改进Url类
+* 改进同名路由不同请求的注册
+* 改进Builder类parseData对空数组的判断
+* 改进模板替换
+* 调整BelongsTo的hasWhere方法
+* 改进模板的编译缓存命名规则 增加布局模板的标识
+* 改进insertall方法
+* 改进chunk方法支持复合主键
+* 改进Error类的一个兼容问题
+* 改进model类的save方法的复合主键包含自增的情况
+* save方法改进复合主键的支持
+* 改进mysql的insertAll方法
+* 改进redis长连接多编号库的情况
+
+## 2017-12-12 V5.0.13
+
+`V5.0.13`主要是对模型和日志方面做了一些改进
+
+### [数据库和模型]
+
+* 改进Model类`save`方法对`oracle`的支持
+* 改进中间表模型的实例化
+* 改进`Pivot`类
+* 模型`saveall`方法支持配合`isUpdate`方法
+* 模型类增加`force`方法设置是否强制更新所有数据
+* 关联自动删除增加一对多关联删除支持
+* 改进`hasWhere`查询的数据重复问题
+* 改进一对多`with`关联查询的`field`支持
+* 模型`saveall`方法支持返回数据集 读取`resultSetType`属性
+* 改进废弃字段判断
+* 模型的`hasWhere`方法增加`fields`参数
+* 改进断线重连异常捕获机制
+* 修正Query类的`inc`和`dec`方法的Mysql关键词问题
+* 修正数据集对象的BUG
+
+### [其它]
+
+* 增加`app_dispatch`钩子位置
+* cookie类`httponly`参数默认改为false
+* File日志驱动增加`single`参数配置是否记录单个文件日志
+* 单个日志文件支持大小设置
+* 改进日志记录的ip地址
+* Redis缓存驱动改用`serialize`序列化替代json序列化
+* 改进异常捕获
+* 改进上传文件验证
+* 修正redis驱动
+* 改进File缓存的`clear`方法
+* 代码格式化规范
+* 改进一处PHP7.2的兼容问题
+* 调试模式下不读取字段缓存文件
+* `default_filter`支持在模块中配置生效
+
+## 2017-11-06 V5.0.12
+
+5.0.12是一个修正版本,包含了上个版本发布以来的一些修正和完善,主要包括:
+
+* 上传类和验证类的多语言支持;
+* 模型增加排除和废弃字段支持;
+* 改进insertAll方法的分批处理;
+* 改进对枚举类型的参数绑定支持;
+* 修正社区反馈的问题;
+
+
+### [数据库和模型]
+
+* 改进Connection类的getRealSql方法
+* 改进append方法支持一对一关联的bind设置
+* 改进whereTime查询
+* 改进model类的`destroy`方法
+* 修正softdelete
+* 修正`chunk`方法对时间字段的支持
+* Collection类增加`push`方法
+* 改进alias方法 
+* 修正模型类的`append`处理
+* 改进`appendRelationAttr`方法
+* 改进HasManyThrough关联
+* 改进MorphTo关联
+* 模型增加废除字段`disuse`定义
+* 增加排除字段方法`except`
+* 修正`has`方法 
+* 改进参数绑定类型对枚举类型的支持
+* 改进`insertAll`方法的分批处理
+
+
+### [其它]
+
+* 改进Loader类`controller`和`validate`方法支持多层
+* 验证提示信息支持多语言
+* File类错误信息支持多语言 
+* 模板渲染异常处理
+* 修正rest控制器
+* 改进trace驱动
+* 改进Cache类的`remember`方法 
+* 改进`url_common_param`的情况下urlencode的问题
+* 改进Url类
+* 改进`exception_handle`配置参数对闭包的支持 
+* 执行路由缓存命令前检测RUNTIME_PATH是否存在 
+* 调整部分`CacheDriver::dec`在为空的时候递减的行为
+* 优化移动端的显示
+* 改进对JSON-Handle插件的支持
+* 改进redis的`get`方法
+* 改进Request类的`host`方法
+
+
+## 2017-09-08 V5.0.11
+
+5.0.11是一个安全及修正版本,包含了上个版本发布以来的一些修正和完善,更新了几处可能的安全问题,主要包括:
+
+* 完善缓存驱动;
+* 改进数据库查询;
+* 改进URL生成类;
+* 缓存有效期支持指定过期时间;
+
+### [数据库和模型]
+
+* 改进数据库驱动类
+* 改进`group`方法的字段关键字冲突
+* 修正聚合查询返回null的问题
+* 改进Db类的强制重连
+* 改进关联的属性绑定
+* 修正事务的断线重连
+* 修正对象的条件查询
+* Db类增加`clear`方法
+* 改进数组查询条件中的`null`查询
+* 改进Query类的`chunk`方法支持排序设置
+* 改进HasOne和HasMany关联的`has`方法
+* 改进软删除的关联删除
+* 改进一个字段多次查询条件
+
+### [其它]
+
+* 缓存有效期支持指定过期时间(`DateTime`);
+* 改进Url生成对端口号的支持
+* 改进`RouteNotFound`异常提示
+* 改进路由分组的全局完整路由匹配
+* 修正部分验证规则的错误提示问题
+* 支持数据集和模型的XML响应输出
+* 改进模板的三元运算标签
+* 改进控制器不存在的错误提示
+* input助手函数支持`route`变量获取
+* 支持在配置文件中读取额外配置参数
+* 完善分页类
+* 修复Trait命名空间重复问题
+* 修正Request类的env方法
+* 优先使用Cookie中的多语言设置
+* 获取缓存标签的时候过滤无效的缓存标识
+* 修正路由批量注册的一个BUG
+* `exception_handle`配置参数支持使用闭包定义`render`处理
+* 请求缓存支持缓存标签设置
+* 缓存类`remember`方法增加并发锁定机制
+* 改进上传类对`swf`的支持
+* 改进Session类的`prefix`方法
+
+## 2017-07-04 V5.0.10
+
+5.0.10是一个修正版本,并包含了一个安全更新,推荐更新,主要包含:
+
+* 数据库和模型的多处改进
+* 添加新的行为监听
+* 路由支持Response设置
+* 改进调试模式下数据库敏感信息暴露
+
+### [数据库和模型]
+
+* 修正join其他表时生成的delete语句错误
+* 修正远程一对多
+* insertall支持replace
+* 修正多对多默认的中间表获取
+* 改进更新后的模型`update_time`数据更新
+* model类增加`removeRelation`方法
+* 模型类增加`setInc`和`setDec`方法
+* 模型类增加`autoWriteTimestamp`方法动态设置时间字段写入
+* 改进驱动类方法的断线重连判断
+* 改进多对多的数据更新
+* 改进BelongsToMany关联查询
+* 修正Query类的value和column方法
+* 改进in查询的去重问题
+* 修正模型类的scope方法传值问题
+* 调整模型的save方法`before_update`检查位置
+* 修改器和获取器方法支持第三个关联数据参数
+
+### [其它]
+
+* 默认关闭调试模式
+* 修复配置extra目录临时文件的错误加载
+* 添加log存储完成行为监听 `log_write_done`
+* 改进Build类生成公共文件的目录判断
+* 增加`response_send`行为监听 
+* 路由增加response参数用于绑定response处理行为
+* 改进redirect的参数传入
+* 改进环境变量的布尔值读取
+* 改进Url类的域名传入
+* 修正命令行文件生成
+* 改进命令行下面的URL生成
+* 添加`app_host`参数设置默认的URL根地址
+* 改进`Request`类`isSsl`方法判断支持CDN
+* 增加`record_trace`配置参数用于日志记录trace信息
+
+## 2017-05-20 V5.0.9
+
+5.0.9是一个修正版本,推荐更新,主要更新包含:
+
+### [数据库和模型]
+
+* 修正关联自动写入
+* 修正模型数据变化判断对为空数据的支持
+* 修正Query类的useSoftDelete方法返回值
+* 修正一对一嵌套关联数组定义的问题
+* 修正使用了手动参数绑定的时候的缓存BUG
+* 改进数据库类的一处不能嵌套查询的缺陷
+* 改进数据库断线重连判断
+* 改进模型的appendRelationAttr方法
+* 改进模型类destroy方法传入空数组的时候不进行任何删除操作
+* 改进一对多关联数据的输出
+* 改进模型的save方法对allowField方法的支持
+* 改进分页类的toarray方法 增加总页数
+* 比较运算增加闭包子查询支持
+* db助手函数默认不再强制重新连接
+* 改进belongsToMany的查询字段指定
+* 分页类增加each方法
+
+### [其它]
+
+* 修正路由分组的路由规则大小写识别问题
+* 修正命令行的日志切割生成
+* 修复URL生成时路由规则中的参数没有进行 urlencode
+* 改进Request类的filter过滤机制 支持正则
+* 改进Response类支持手动设置contentType
+* 修正异常模板中助手函数未定义错误
+
+## 2017-04-28 V5.0.8
+
+### 主要调整
+
+* 改进关联模型
+* 改进日志记录
+* 增加多态一对一关联
+* 修正社区反馈的一些BUG
+
+### [ 请求和路由 ]
+
+* 修正Request类`cookie`方法对前缀的支持
+* 改进全局请求缓存的缓存标识
+* 改进Request类`param`方法
+* 修正别名路由
+
+### [ 模型和数据库 ]
+
+* 改进模型数据的更新检查
+* 改进Query类的`column`方法
+* 改进软删除条件在使用闭包查询情况下多次生成的问题
+* belongsToMany增加数据同步方法
+* 查询范围支持静态调用
+* 增加多态一对一(MorphOne)关联
+* 改进BelongsTo关联
+* 改进多态关联支持关联数据添加和注销
+* 改进多对多关联,支持中间表模型自定义 并且定义的时候不需要使用完整表名
+* 改进浮点数类型转换避免出现逗号
+* 调整关联模型的save方法返回值
+* 模型类的get方法第一个参数必须 如果传入null则返回null
+* model的save方法改进如果数据没有更新不执行
+* Query增加`useSoftDelete`方法可以单独设置软删除条件
+* 重载BelongsToMany的`selectOrFail`和`findOrFail`方法
+* 重载BelongsToMany的`select` 、`find`和 `paginate`方法
+* 增加模型和`Pivot`对象的`parent`属性
+* 多对多关联支持设置中间表模型
+* 改进Query类的`view`方法中字段的关键字问题
+* 主从数据库的时候开启事务始终操作主库
+
+### [ 其它 ]
+
+* 改进Cookie类的`get`方法支持获取全部
+* `schema`指令增加`config`参数,支持传入数据库连接配置
+* 改进cache类的`store`方法为当次有效
+* 修正cache助手函数对`option`传参的支持
+* 修复`optimize:autoload`命令在`EXTEND_PATH`目录不存在的情况下,类库映射生成错误问题
+* 支持自定义的根命名空间也可以生成类库映射缓存
+* 验证字段比较支持对比其他字段
+* 修复`Session::prefix('xxx');`设置当前作用域BUG
+* 改进`optimize::schema`指令
+* 修复`clear`指令无法删除多级目录下文件的问题
+* 改进默认语言读取和自动侦测
+* 改进日志记录格式 并且命令行下面日志改为实时写入
+* 修正模板标签默认值某些情况无效bug
+* 改进Url生成对完整域名的支持
+* 改进`Clear`指令不删除`.gitignore` 文件
+* 修复Memcache缓存驱动的`inc`方法
+
+### 调整
+
+* 如果自定义了应用的命名空间的话,原来的`app_namespace`配置参数改为`APP_NAMESPACE`常量在入口文件中定义
+* 多对多关联的中间表名称不需要添加表前缀
+* 模型的scope方法之后只能使用数据库查询方法而不能使用模型的方法
+
+## 2017-02-24 V5.0.7
+
+### 主要调整
+
+本次更新主要为BUG修正和改进,主要改进如下:
+
+* 改进全局请求缓存对子域名的支持;
+* 改进数据缓存自动更新机制;
+* 关联统计支持指定统计属性名;
+* 模型嵌套关联支持数组方式;
+* HasOne关联支持`has`和`hasWhere`方法;
+* 路由的`ext`和`deny_ext`参数允许设置为空(表示不允许任何后缀或者必须使用后缀访问);
+
+### 修正如下
+
+* 修正 IN / NOT IN 型查询条件为空导致的 sql 语法错误
+* 修正分页类的`toArray`方法对简洁模式的支持
+* 修正Model类`delete`方法对多主键的处理
+* 修正软删除对`Mongodb`的支持
+* 修正`Connection`类一处可能的错误
+* 改进Query类的find方法的缓存机制
+* 修正BelongsTo关联
+* 修正JOIN方式一对一关联预载入闭包查询
+* 修正Query类的`insert`方法一处可能存在的警告错误
+* 修正Model类一处Collection的`use`冲突
+* 修正Model类`hasWhere`方法
+* 修正URl生成对`ext`参数的支持
+* 文件缓存`clear`方法会删除空目录
+* 修正Route类的`parseUrlPath`方法一处问题
+
+### 调整如下
+
+* 默认关闭session的安全参数`secure`,此选项仅能在HTTPS下设置开启
+
+## 2017-02-07 V5.0.6
+
+### 主要调整:
+
+本次更新主要为BUG修正及优化(可无缝升级):
+
+* 数据库支持断线重连机制;
+* 改进查询事件的回调参数;
+* 改进数据自动缓存机制;
+* 增加时间字段自动格式转换设置;
+* `MongoDb`和`Oracle`扩展更新至最新核心框架;
+
+### [数据库和模型]
+
+* 修正hasMany关联的`has`方法
+* 去除一些数据库惯例配置 避免使用数据库扩展的时候影响
+* 改进多对多的`attach`方法的返回值
+* 增加Mysql的断线重连机制和开关
+* 改进Query类的`find`方法数据缓存机制
+* 改进Query类查询事件的回调参数
+* 改进Query类的自动缓存更新
+* Model类增加`readonly`方法
+* 改进Model类的`has`和`hasWhere`方法
+* 改进模型类的`get`和`all`方法 第二个参数为true或者数字表示缓存参数
+* 修复闭包查询条件为空导致的 sql 语法错误
+* 改进Query类的`setBuilder`方法 避免因自定义连接器类后找不到生成器类
+* 删除Connection类废弃属性`resultSetType`
+* 优化Connection类`close`方法
+* 修正Connection类的`bindParam`方法对存储过程的支持
+* 数据库配置参数`datetime_format` 设置为`false`表示关闭时间字段自动转换输出
+* 改进软删除的数据库兼容性问题 支持`Mongodb`
+
+### [其它]
+
+* 改进Url类生成 `root`为`/`的情况
+* redirect助手函数和controller类的redirect方法增加with参数
+* 全局请求缓存添加排除规则 添加request_cache_except配置参数
+* Cache类store方法参数允许为空 表示获取当前缓存驱动句柄
+* 改进Validate类的ip验证规则
+
+## 2017-01-23 V5.0.5
+### 主要调整:
+
+本次更新主要改进了数据访问层和模型关联:
+
+* 增加快捷查询及设置方法;
+* 增加关联统计功能;
+* 增加关联查询延迟预载入功能;
+* 增加关联一对一自动写入和删除;
+* 改进存储过程查询;
+* 改进关联数据输出;
+* 优化查询性能;
+* 模型时间字段自动格式化输出;
+
+### [请求和路由]
+
+* 改进路由定义的后缀检测
+* Route类的`rest`方法支持覆盖定义
+* 改进Request类的`put`和`post`方法对`json`格式参数的接收
+* Request类增加`contentType`方法
+* 改进Route类`setRule`方法 
+* 改进Request类的`create`方法
+* 改进路由到控制器类的方法对默认渲染模板的影响
+* 修正Url类`build`方法定义路由别名后的BUG
+
+### [数据库和模型]
+
+* 增加关联统计功能
+* 增加一对一关联自动写入功能
+* 修正聚合模型的`delete`方法
+* 改进Model类的`useGlobalScope`方法
+* Model类的日期类型支持设置为类名
+* Query类增加`data`/`inc`/`dec`/`exp`方法用于快捷设置数据 `insert`和`update`方法参数可以为空 读取`data`设置数据
+* 优化Connection的查询性能
+* 修正Builder类的`parseOrder`方法
+* 修正BelongsToMany类的`attach`方法
+* BelongsToMany类的`attach`方法改进 支持批量写入
+* 改进BelongsToMany类的`saveall`方法 增加第三个参数 用于指定额外参数是否一致
+* Query类的`order`方法支持多次调用合并
+* 改进`count`方法对`group`查询的支持
+* 增加时间戳自动写入的判断
+* 改进Model类`writeTransform`方法
+* 改进Model的时间戳字段写入和读取
+* 写入数据为对象的时候检测是否有`__toString`方法
+* 改进Mysql驱动的`getFields`方法
+* 改进自动时间字段的输出
+* `like`查询条件支持数组
+* 自动时间字段的获取自动使用时间格式化
+* 改进单个字段多次Or查询情况的查询
+* 修正`null`查询的条件合并
+* 改进Query类`paginate`方法第一个参数可以使用数组参数
+* 改进数据集对象的返回,由Query类的select方法进行数据集转换,原生查询不再支持返回数据集对象
+* 增加`whereNull`、`whereIn`等一系列快捷查询方法
+* `fetchPdo`方法调整
+* 改进对存储过程调用的支持 改进`getRealSql`的调用机制 改进数据表字段使用中划线的参数绑定支持
+* 数据库配置参数增加`result_type` 用于设置数据返回类型 方法参数名称调整
+* 改进Query类的`whereTime`方法支持更多的时间日期表达式(默认查询条件为大于指定时间表达式)
+* 取消`min`/`max`/`sum`/`avg`方法的参数默认值
+* Query类增加`getPdo`方法用于返回`PDOStatement`对象
+* 改进`today`的日期表达式查询
+* 改进关联属性的获取
+* 改进关联定义中包含查询条件后重复执行的问题
+* 改进参数绑定支持中文字段自动绑定
+* 改进Builder类的`insertall`方法 增加对null和对象数据的处理
+* 改进参数绑定类型 支持`bit`类型自动绑定
+* Connection类`model`方法更改为`getQuery`
+* 优化Connection类`__call`方法
+* 修正聚合模型
+* 一对一关联预载入默认改为IN查询方式
+* 增加`collection`助手函数用于数据集转换
+* 增加`load_relation`助手函数用于数组的延迟预载入
+* 改进Model类的`has`方法第二个参数支持使用数组和闭包,无需再使用`hasWhere`
+* `relation`方法支持嵌套关联查询
+* 增加`think\model\Collection`作为模型的数据集查询集合对象
+* 取消关联定义的`alias`参数(仅`morphTo`保留)
+* Model类的`delete`方法,支持没有主键的情况
+* Model类的`allowField`方法支持逗号分割的字符串
+* 改进写入数据的自动参数绑定的参数名混淆问题
+* 关联预载入查询的属性名默认使用小写+下划线命名
+* Query类的`with`和`relation`方法支持多次调用
+* Collection类增加`hidden`、`visible`和`append`方法
+* 修正软删除的强制删除方法
+
+### [其它]
+
+* `unique`验证规则支持指定完整模型类 并且默认会优先检测模型类是否存在 不存在则检测数据表
+* 改进`Loader`类的`model`、`controller` 和 `validate`方法 支持直接传入类名实例化
+* `Session`类增加安全选项`httponly`和`secure`
+* 可以允许自定义`Output`的driver,以适应命令行模式下调用其它命令行指令 
+* 改进`loader`类`action`的参数污染问题
+* Validate类的`confirm`验证改为恒等判断
+* 改进`Validate`类的错误信息处理
+* 修正`Validate`类的布尔值规则验证
+* 改进`cookie`助手函数对前缀的支持
+* 文件缓存默认开启子目录缓存避免文件过多导致性能问题
+
+### [调整]
+* Connection类`model`方法更改为`getQuery`
+* 原生查询不再支持返回数据集对象
+* 分页查询返回类型变成`think\Paginator`(用法不变)
+* 模型的时间日期字段会自动进行格式化输出,不需要进行额外处理。
+* Session类添加了`secure`和`httponly`参数,并且默认是true
+
+## 2016-12-20 V5.0.4
+### 主要调整:
+
+* 关联模型重构并增加多态一对多关联;
+* 数据库支持一个字段多次调用不同查询条件;
+* 增加数据库CURD事件支持;
+* 路由到类和控制器的方法支持传入额外参数;
+* 支持全局模板变量赋值;
+* 模型支持独立设置查询数据集对象;
+* 日志针对命令行及调试做出改进;
+* 改进Hook类的行为方法调用
+
+### [请求和路由]
+* 请求缓存支持模块单独开启
+* Request类`post`方法支持获取`json`方式的请求数据
+* 路由到类的方法和控制器方法 支持传入额外参数,用于方法的参数
+* 改进控制器自动搜索的目录规范
+* 改进请求缓存
+* 改进自动参数绑定
+* 修正路由的请求缓存设置
+* 改进Route类name方法
+
+### [数据库和模型]
+* 增加数据库查询(CURD)事件
+* 改进多表更新的字段不存在问题
+* 改进Model类的`useGlobalScope`方法
+* 修正子查询作为表名查询的问题
+* Model类增加`resultSetType`属性 用于指定模型查询的数据集对象(默认为空返回数组) 
+* Model类增加`toCollection`方法(自动调用)
+* 关联模型架构调整
+* 改进预载入`with`方法的参数支持小写和下划线定义
+* 修正关联多对多一处错误
+* 改进关联多对多的查询
+* 关联模型支持多态一对多关联
+* 预载入关联查询支持关联对象属性绑定到当前模型
+* 支持追加关联对象的属性到当前模型数据
+* 一对一关联预载入支持JOIN和IN两种方式(默认为JOIN)
+* 改进多对多查询
+* 改进模型更新的数据变化比较规则
+* 查询支持一个字段多次查询条件
+* 改进sql日志的sql语句
+* 修正`join`自身表的别名覆盖问题
+* 模型类的`connection`属性和数据库默认配置合并
+* 改进`in`和`between`查询条件的自动参数绑定
+* 改进Query类对数据集对象以及关联字段排序的支持
+* 增加模型的快捷事件方法
+* 改进Query类的`getTableInfo`方法缓存读取
+* model类的`saveAll`方法支持调用`allowField`方法进行字段过滤
+* 修正关联查询的时候 `whereTime`方法的bug
+* 改进Query类的聚合查询
+* table方法支持字符串方式的子查询
+* 修正`count` `avg`方法使用`fetchsql`无法正确返回sql的问题
+
+### [其它]
+* 改进命令行下的日志记录
+* 部署模式下简化日志记录
+* 增加debug日志类型 仅限调试模式记录
+* 改进Template类`parseTemplateFile`方法
+* 改进Validate类的`getRuleMsg`方法
+* 控制器的`error`方法在AJAX请求默认返回url为空
+* Validate类架构方法增加`field`参数 用于设置验证字段的描述
+* 改进App类`invokeMethod`方法对架构函数依赖注入的支持
+* 增加RedirectResponse的`restore`方法返回值
+* View类增加`share`静态方法 用于静态赋值模板变量
+* 验证类增加`hasScene`方法判断是否存在某个场景的验证配置
+* 修正redis和session驱动的`destroy`方法返回值
+* 空操作方法的参数传入去掉操作方法后缀
+* 在控制器中调用request和view增加类型提示
+* 改进`input`助手函数支持多维数据获取
+* Cache类增加`pull`和`remember`方法
+* 改进验证类的`confirm`验证规则 支持自动规则识别
+* 改进验证类的错误信息定义
+* 增加Validate类自定义验证错误信息的替换规则
+* Cookie类增加`forever`方法用于永久保存
+* 模板渲染支持从视图根目录读取模板
+* 改进Hook类的exec方法
+
+### [调整]
+* Db类查询不再支持设置自定义数据集对象
+* 废除Query类的`fetchClass`方法
+* 控制器的`error`方法在AJAX请求默认返回的url为空
+* 关联方法定义不支持使用小写下划线,必须使用驼峰法
+* 行为类的方法必须使用驼峰法命名
+
+## 2016-11-11 V5.0.3
+### 主要调整:
+* 请求缓存增强;
+* 路由增强;
+* 数据库和模型完善;
+* 支持反射的异常捕获;
+* File类改进;
+* 修正社区反馈的一些BUG;
+
+### [ 请求和路由 ]
+
+* 资源路由自动注册的路由规则的时候会记录当前使用的资源标识;
+* 增强请求缓存功能和规则定义,支持全局自动缓存
+* 修正控制器自动搜索的大小写问题
+* 修正路由绑定到命名空间后 类的自动定位
+* 改进Route类的parseRule方法 路由地址中的变量替换不自动去除路由变量
+* 改进控制器自动搜索
+* Route类增加setOption和getOption方法 用于记录当前路由执行过程中的参数信息
+* 优化路由分组方法
+* 改进分组路由的url生成
+
+### [ 数据库和模型 ]
+
+* 一对一关联查询方法支持定义`field`方法
+* 聚合模型支持设置`field`属性
+* 改进Query类的`alias`方法
+* 改进Query类`join`和`view`方法的table参数
+* 改进Query类`where`方法
+* 改进Query类的`paginate`方法,支持`order`方法
+* 改进Query类的`min`和`max`方法支持日期类型
+* 修正软删除`withTrashed`方法
+* 优化Connection类的`getRealSql`方法生成的sql
+
+### [ 其它 ]
+* 增加request_cache和request_cache_expire配置参数用于配置全局请求缓存;
+* 修正input助手函数的数组过滤
+* cache助手函数支持清空操作
+* 改进Config类load方法 一级配置名称强制转为小写
+* 修正Url多次生成的问题
+* File类修正某些环境下面无法识别上传文件的问题
+* 改进App类的空操作方法调用
+* 域名部署URL生成不依赖 url_domain_deploy 配置参数
+* 修正Url类域名部署的问题
+* 视图文件目录支持集中式存放 不放入模块目录
+* cache助手函数支持 remember方法
+* Request类的input方法或者input助手函数的`filter`参数支持传入null 表示不过滤
+
+## 2016-10-24 V5.0.2
+### 主要调整:
+
+* 数据库和模型完善;
+* 路由功能完善;
+* 增加`yaml`配置格式支持;
+* 依赖注入完善;
+* Session类完善;
+* Cookie类完善;
+* Validate类完善;
+* 支持反射类的异常捕获;
+* 修正社区反馈BUG;
+
+### [ 请求和路由 ]
+* 依赖注入的类如果定义了`invoke`方法则自动调用
+* Request类的`header`方法增加自定义header支持
+* Request类禁止直接实例化调用
+* 改进Request类ip方法
+* 路由变量规则支持闭包定义
+* 路由参数增加`ajax`和`pjax`判断
+* 别名路由增加允许和排除操作
+* 改进路由域名绑定后的url生成
+* 路由生成改进对路由到类的支持
+* 路由生成支持`url_param_type`配置参数
+* 路由生成支持别名路由
+* Route重定向规则支持更多` schema`
+* 别名路由支持定义单独方法的请求类型
+* 改进路由分组的url生成
+* 路由规则的组合变量支持可选分隔符定义
+* 改进路由合并参数的获取
+* 路由规则支持单独设置url分隔符,路由参数为 `param_depr`
+* 自动搜索控制器支持自定义访问控制器层的情况
+* 改进路由标识不区分大小写
+* 改进路由地址是否定义过路由规则的检测
+
+### [ 数据库和模型 ]
+* 改进Query类的join方法
+* 改进Query类分页方法的参数绑定
+* 修正软删除方法
+* 修正Query类parseOrder方法一处错误
+* 修正sqlsrv驱动parseOrder方法
+* 修正Query类setInc和setDec方法
+* 改进Model类的save方法支持非自增主键的处理
+* 整型字段的参数绑定如果为空写入默认值0
+* 改进Model类has和hasWhere方法
+* 改进Query类的value方法缓存判断
+* 改进Query类join方法对子查询支持
+* 改进Query类的table方法和alias方法用法
+* 关联预载入支持`hasOne`自关联
+* 改进Builder类的parseKey方法
+* 改进Builder类的join/alias/table方法的解析
+* 改进全局查询范围
+* 改进Query类的聚合查询方法的返回值
+* 改进关联属性的读取
+* 改进聚合模型主键和关联键相同的情况
+* 改进模型在开启`class_suffix`参数情况下的name属性的识别
+
+### [ 其它 ]
+* Cache类增加`remember`方法 用于当获取的缓存不存在的时候自动写入
+* Session类增加`flash`方法用于设置下一次请求有效的值 
+* Session类增加`flush`方法用于清空当前请求有效的值 
+* Session类增加`push`方法用于更新数组数据
+* 增加yaml配置格式支持
+* 改进App类的反射异常无法捕获问题
+* 修正session助手函数的清空操作
+* 改进验证类的`image`方法
+* 改进验证类的`activeUrl`方法 
+* 改进自定义验证规则的使用
+* 改进控制器自动搜索后的控制器名获取
+* 修正import方法加载extend目录类库
+* 修正json_encode时 "Failed calling XXX::jsonSerialize()" 的异常
+* 改进Loader类model和validate方法的单例问题
+* 改进方法执行的日志记录
+* 改进模板引擎的Think变量解析
+* 改进Lang类`load`方法
+* 验证错误信息支持多语言读取
+* 改进ROOT_PATH常量
+* 改进语言包加载
+* 改进模板session和cookie变量获取,自动判断前缀
+* 缓存驱动统一增加handler方法用于获取操作对象的句柄(某些缓存类型可能为null)
+* File类增加`__call`方法用于兼容5.0版本的`md5`和 `sha1`方法
+* 改进文件缓存驱动的`clear`方法
+* Lang类增加`setLangCookieExpire`方法设置多语言cookie过期时间
+* 增加`route_complete_match`配置参数
+
+### [ 调整 ]
+下列模型属性和方法由原来的静态(static)定义改为动态定义:
+* 聚合模型的`relationModel`属性
+* Model类的`useGlobalScope `属性
+* 全局查询范围方法`base`改为动态方法
+* 软删除属性 `deleteTime`属性
+
+
+## 2016-9-28 V5.0.1
+### 主要调整:
+* [依赖注入](215849)完善;
+* [扩展配置](118027)文件位置调整;
+* 新增数据表[字段缓存命令](211524);
+* 支持设置当前的查询对象;
+* 支持[请求和路由缓存](215850);
+
+### [ 请求和路由 ]
+* 改进Controller类的`success`和`error`方法的跳转地址识别 支持更多Scheme
+* 操作方法和架构方法支持任何对象自动注入
+* Requesst类增加`getInput`方法 用于获取` php://input`值
+* 路由到方法的时候 支持架构方法注入请求对象
+* 改进Route类路由到类的判断
+* Request增加`cache`方法,支持请求缓存
+* 绑定到模块后 路由依然优先检查
+* 路由增加请求缓存参数
+* 修正路由组合变量的可选变量的BUG
+
+### [ 数据库 ]
+* 修正`pgsql`数据库驱动的数据表字段信息读取
+* 改进Query类的`view`方法 第二个参数默认值更改为true 获取全部的字段
+* 数据库配置信息增加`query`参数用于配置查询对象名称
+* 型类增加`query`属性用于配置模型需要的查询对象名称
+* 改进数据表字段缓存读取
+* 改进数据表字段缓存生成 模型为抽象类或者 没有继承Model类 不生成字段缓存
+* 改进模型的字段缓存 虚拟模型不生成字段缓存
+* 改进数据表字段缓存生成 支持读取模块的模型生成
+* 改进聚合模型的`save`方法 主键写入
+* 模型类的field属性定义简化 取消`Query`类的`allowField`和`setFieldType`方法及相关属性
+* 改进数据表字段缓存生成 支持生成多个数据库的
+* 更新数据库驱动类 改进`getTables`方法
+* 增加` optimize:schema` 命令 用于生成数据表字段信息缓存
+* 修正一个查询条件多个条件的时候的参数绑定BUG
+* 分页查询方法`paginate`第二个参数传入数字表示总记录数
+* 修正mysql的`JSON`字段查询
+* 改进Query类的getOptions方法 当name参数不存在的时候返回null
+
+### [ 模型和关联 ]
+* 模型类的field属性不需要添加字段类型定义
+* 改进Model类 添加`getDb`静态方法获取db查询对象
+* 改进聚合模型`save`方法返回值
+* 改进Relation类`save`方法
+* 修正关联模型 多对多`save`方法一处问题
+* 改进Model类的save方法 修正不按主键查询的更新问题
+* 时间字段获取器获取的时候为NULL则不做转换
+
+### [ 其它 ]
+
+* 改进配置缓存生成 支持扩展配置
+* 取消`extra_config_list`配置参数 扩展配置文件直接放到 `extra`目录下面即可自动加载(数据库配置文件位置不变)
+* cache助手函数支持判断缓存是否有效
+* 修正 模板引擎驱动类的`config`方法
+* 修复在配置Model属性field=true情况下,通过`__call`调用db()引发的BUG
+* 改进模板引擎驱动的config方法 支持获取配置参数值
+* 改进redirct的url地址解析
+* 删除`File`类的`md5`和`sha1`方法 改为`hash`方法 支持更多的散列值类型生成
+* 增加`response_end`行为标签
+* 改进默认语言的加载
+
+## 2016-9-15 V5.0
+
+### [ 请求和路由 ]
+
+* Request对象支持动态绑定属性
+* 定义了路由规则的URL原地址禁止访问
+* 改进路由规则存储结构
+* 路由分组功能增强,支持嵌套和虚拟分组
+* 路由URL高效反解
+* 改进Request对象param方法获取优先级
+* 路由增加name方法设置和获取路由标识
+* 增加MISS和AUTO路由规则
+* Route类增加auto方法 支持注册一个自动解析URL的路由
+* 路由规则支持模型绑定
+* 路由变量统一使用param方法获取
+* 路由规则标识功能和自动标识
+* 增加生成路由缓存指令 optimize:route
+* Request对象增加route方法单独获取路由变量
+* Request对象的param get post put request delete server cookie env方法的第一个参数传入false 则表示获取原始数据 不进行过滤
+* 改进自动路由标识生成 支持不同的路由规则 指向同一个路由标识,改进Url自动生成对路由标识的支持
+* 改进Request类 filter属性的初始化
+* 改进Request类的isAjax和isPjax方法
+* Request类增加token方法
+* 路由配置文件支持多个 使用 route_config_file 配置参数配置
+* 域名绑定支持https检测
+* 改进域名绑定 支持同时绑定模块和其他 支持绑定到数组定义的路由规则,取消域名绑定到分组
+* 路由规则增加PATCH请求类型支持
+* 增加route_complete_match配置参数设置全局路由规则定义是否采用完整匹配 可以由路由规则的参数complete_match 进行覆盖
+* 改进路由的 后缀参数识别 优先于系统的伪静态后缀参数
+* Url类增加root方法用于指定当前root地址(不含域名)
+* 改进Url生成对可选参数的支持
+
+### [ 数据库 ]
+
+* 查询条件自动参数绑定
+* 改进分页方法支持参数绑定
+* Query类的cache方法增加缓存标签参数
+* Query类的update和delete方法支持调用cache方法 会自动清除指定key的缓存 配合查询方法的cache方法一起使用 
+* 改进Query类的延迟写入方法
+* Query类的column和value方法支持fetchsql
+* 改进日期查询方法
+* 改进存储过程方法exec的支持
+* 改进Connection类的getLastInsID方法获取
+* 记录数据库的连接日志(连接时间和DSN)
+* 改进Query类的select方法的返回结果集判断  
+* Connection类增加getNumRows方法
+* 数据库事务方法取消返回值
+* 改进Query类的chunk方法对主键的获取
+* 改进当数据库驱动类型使用完整命名空间的时候 Query类的builder方法的问题
+
+### [ 模型 ]
+
+* 增加软删除功能
+* 关联模型和预载入改进
+* 关联预载入查询闭包支持更多的连贯操作
+* 完善savell方法支持更新和验证
+* 关联定义统一返回Relation类
+* Model类的has和hasWhere方法对join类型的支持
+* Model类的data方法 批量赋值数据的时候 清空原始数据
+* Model类的get方法第三个参数传入true的时候会自动更新缓存
+* Model类增加只读字段支持
+* Model类增加useGlobalScope方法设置是否启用全局查询范围
+* Model类的base方法改为静态定义 全局多次调用有效
+* Model类支持设定主键、字段信息和字段类型,不依赖自动获取,提高性能
+* Model类的data方法 支持修改器
+* 改进Relation类对非数字类型主键的支持
+* 改进Relation类的一对多删除
+* 修正Relation类的一对多关联预载入查询
+
+### [ 日志和缓存 ]
+
+* 支持日志类型分离存储
+* 日志允许设置记录级别
+* 增加缓存标签功能
+* 缓存类增加pull方法用于获取并删除
+* cache助手函数增加tag参数
+* 简化日志信息,隐藏数据库密码
+* 增加cache/session redis驱动的库选择逻辑;
+* memcached驱动的配置参数支持option参数
+* 调试模式下面 日志记录增加页面的header和param参数记录
+* memcached缓存驱动增加连接账号密码参数
+* 缓存支持设置complex类型 支持配置多种缓存并用store切换
+* 缓存类增加tag方法 用于缓存标签设置 clear方法支持清除某个缓存标签的数据
+* File类型日志驱动支持设置单独文件记录不同的日志级别
+* 改进文件缓存和日志的存储文件名命名规范
+* 缓存类增加inc和dec方法 针对数值型数据提供自增和自减操作
+* Cache类增加has方法 get方法支持默认值
+
+### [ 其它 ]
+
+* 视图类支持设置模板引擎参数
+* 增加表单令牌生成和验证
+* 增加中文验证规则
+* 增加image和文件相关验证规则
+* 重定向Response对象支持with方法隐含传参
+* 改进Session类自动初始化
+* session类增加pull方法用于获取并删除
+* 增加Env类用于获取环境变量
+* Request类get/post/put等更改赋值后param方法依然有效
+* 改进Jump跳转地址支持Url::build 解析
+* 优化Hook类
+* 应用调试模式和页面trace支持环境变量设置
+* config助手函数支持 config('?name') 用法
+* 支持使用BIND_MODULE常量的方式绑定模块
+* 入口文件自动绑定模块功能
+* 改进验证异常类的错误信息和模板输出,支持批量验证的错误信息抛出
+* 完善console 增加output一些常用的方法
+* 增加token助手函数 用于在页面快速显示令牌
+* 增加halt方法用于变量调试并中断输出
+* 改进Validate类的number验证规则 和 integer区分开
+* optimize:autoload增加对extend扩展目录的扫描
+* 改进Validate类的boolean验证规则 支持表单数据
+* 改进cookie助手函数支持 判断是否存在某个cookie值
+* 改进abort助手函数 支持抛出HttpResponseException异常
+* 改进File类增加对上传错误的处理
+* 改进File类move方法的返回对象增加上传表单信息,增加获取文件散列值的方法
+* 改进File类的move方法的返回对象改为返回File对象实例
+* 增加clear和optimize:config 指令
+* 改进File类和Validate类的图像文件类型验证
+* 控制器的操作方法支持注入Request之外的对象实例
+* Request类 param(true) 支持获取带文件的数据
+* input助手函数第一个参数增加默认值
+* Validate类增加image验证规则 并改进max min length支持多种数据类型
+* json输出时数据编码失败后抛出异常
+
+### [ 调整 ]
+* 废除路由映射(静态路由)定义
+* 取消url_deny_suffix配置 改由路由的deny_ext参数设置
+* 模型save方法返回值改为影响的记录数,取消getId参数
+* Request对象controller方法返回驼峰控制器名
+* 控制器前置操作方法不存在则抛出异常
+* Loader类db方法增加name标识参数
+* db助手函数增加第三个参数用于指定连接标识
+* Sqlsrv驱动默认不对数据表字段进行小写转换
+* 移除sae驱动 改为扩展包
+* Oracle驱动移出核心包
+* Firebird驱动移出核心包
+* 取消别名定义文件alias.php
+* 配置参数读取的时候取消环境变量判断 需要读取环境变量的时候使用Env类
+* 环境变量定义文件更改为 .env 由原来的PHP数组改为ini格式定义(支持数组方式)
+* 状态配置和扩展配置的加载顺序调整 便于状态配置文件中可以更改扩展配置的参数
+* 取消域名绑定到路由分组功能
+* 控制器类的success和error方法url参数支持传入空字符串,则不做任何处理
+* 控制器的error success result redirect方法均不需要使用return
+* 创建目录的权限修改为0644
+
+
+## 2016-7-1 RC4版本
+### [ 底层架构 ]
+* 增加Request类 并支持自动注入
+* 统一Composer的自动加载机制
+* 增加Response类的子类扩展
+* 增加File类用于上传和文件操作
+* 取消模式扩展 SAE支持降权
+* 优化框架入口文件
+* 改进异常机制
+* App类输入/输出调整
+* 单元测试的完美支持
+* 增加新的控制台指令
+* 取消系统路径之外的大部分常量定义
+* 类库映射文件由命令行动态生成 包含应用类库
+
+### [ 数据库 ]
+
+* 增加分表规则方法
+* 增加日期和时间表达式查询方法
+* 增加分页查询方法
+* 增加视图查询方法
+* 默认保持数据表字段大小写
+* 数据缓存自动更新机制
+* 完善事务嵌套支持
+* 改进存储过程数据读取
+* 支持设置数据库查询数据集返回类型
+
+### [ 模型 ]
+* 增加Merge扩展模型
+* 模型支持动态查询
+* 增加更多的类型自动转换支持
+* 增加全局查询范围
+* toJson/toArray支持隐藏和增加属性输出
+* 增加远程一对多关联
+
+### [ 其它 ]
+* 日志存储结构调整
+* Trace调试功能从日志类独立并增强
+* 原Input类功能并入Request类
+* 类库映射文件采用命令行生成 包含应用类库
+* 验证类的check方法data数据取消引用传参
+* 路由增加MISS路由规则
+* 路由增加路由别名功能
+
+## 2016-4-23 RC3版本
+### [ 底层架构 ]
+* 框架核心仓库和应用仓库分离 便于composer独立更新
+* 数据库类重构,拆分为Connection(连接器)/Query(查询器)/Builder(SQL生成器)
+* 模型类重构,更加对象化
+
+### [ 数据库 ]
+
+* 新的查询语法
+* 闭包查询和闭包事务
+* Query对象查询
+* 数据分批处理
+* 数据库SQL执行监听
+
+### [ 模型 ]
+* 对象化操作
+* 支持静态调用(查询)
+* 支持读取器/修改器
+* 时间戳字段
+* 对象/数组访问
+* JSON序列化
+* 事件触发
+* 命名范围
+* 类型自动转换
+* 数据验证和完成
+* 关联查询/写入
+* 关联预载入
+
+### [ 其它更新 ]
+* 路由类增加快速路由支持
+* 验证Validate类重构
+* Build类增加快速创建模块的方法
+* Url生成类改进
+* Validate类改进
+* View类及模板引擎驱动设计改进
+* 取消模板引擎的模板主题设计
+* 修正社区反馈的一些问题
+* 助手函数重新命名
+* `router.php`文件位置移动
+
+## 2016-3-11 RC2版本
+
+* 重新设计的自动验证和自动完成机制(原有自动验证和完成支持采用traits\model\Auto兼容);
+* 验证类Validate独立设计;
+* 自动生成功能交给Console完成;
+* 对数据表字段大小写的处理;
+* 改进Controller类(取消traits\contorller\View);
+* 改进Input类;
+* 改进Url类;
+* 改进Cookie类;
+* 优化Loader类;
+* 优化Route类;
+* 优化Template类;
+* Session类自动初始化;
+* 增加traits\model\Bulk模型扩展用于大批量数据写入和更新;
+* 缓存类和日志类增加Test驱动;
+* 对异常机制和错误处理的改进;
+* 增加URL控制器和操作是否自动转换开关;
+* 支持类名后缀设置;
+* 取消操作绑定到类的功能;
+* 取消use_db_switch参数设计;
+
+## 2016-1-30 RC1版本
+### [ 底层架构 ]
+
+*   真正的惰性加载
+*   核心类库组件化
+*   框架引导文件
+*   完善的类库自动加载(支持Composer)
+*   采用Traits扩展
+*   API友好(输出、异常和调试)
+*   文件命名规范调整
+
+### [ 调试和异常 ]
+
+*   专为API开发而设计的输出、调试和异常处理
+*   日志类支持本地文件/SAE/页面Trace/SocketLog输出,可以实现远程浏览器插件调试
+*   内置trace方法直接远程调试
+*   异常预警通知驱动设计
+*   数据库SQL性能分析支持
+
+### [ 路由 ]
+
+*   动态注册路由
+*   自定义路由检测方法
+*   路由分组功能
+*   规则路由中的变量支持采用正则规则定义(包括全局和局部)
+*   闭包路由
+*   支持路由到多层控制器
+
+### [ 控制器 ]
+
+*   控制器类无需继承controller类
+*   灵活的多层控制器支持
+*   可以Traits引入高级控制器功能
+*   rest/yar/rpc/hprose/jsonrpc控制器扩展
+*   前置操作方法支持排除和指定操作
+
+
+### [ 模型 ]
+
+*   简化的核心模型
+*   Traits引入高级模型/视图模型/关联模型
+*   主从分布时候主数据库读操作支持
+*   改进的join方法和order方法
+
+### [ 视图 ]
+
+*   视图解析驱动设计(模板引擎)
+*   所有方法不再直接输出而是返回交由系统统一输出处理
+*   动态切换模板主题设计
+*   动态切换模板引擎设计
+
+### [ 数据库 ]
+
+*   完全基于PDO实现
+*   简化的数据库驱动设计
+*   SQL性能监控(需要开启数据库调试模式)
+*   PDO参数绑定改进
+
+### [ 其他方面 ]
+
+*   目录和MVC文件自动生成支持
+*   I函数默认添加变量修饰符为/s
+*   一个行为类里面支持为多个标签位定义不同的方法
+*   更多的社交扩展类库

+ 32 - 0
LICENSE.txt

@@ -0,0 +1,32 @@
+
+ThinkPHP遵循Apache2开源协议发布,并提供免费使用。
+版权所有Copyright © 2006-2017 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.

+ 141 - 0
README.md

@@ -0,0 +1,141 @@
+#访问方式
+
+(后台)admin/index/lst
+
+(前台)index/indexs/index
+
+
+    
+ThinkPHP 5.0
+===============
+
+[![Total Downloads](https://poser.pugx.org/topthink/think/downloads)](https://packagist.org/packages/topthink/think)
+[![Latest Stable Version](https://poser.pugx.org/topthink/think/v/stable)](https://packagist.org/packages/topthink/think)
+[![Latest Unstable Version](https://poser.pugx.org/topthink/think/v/unstable)](https://packagist.org/packages/topthink/think)
+[![License](https://poser.pugx.org/topthink/think/license)](https://packagist.org/packages/topthink/think)
+
+ThinkPHP5在保持快速开发和大道至简的核心理念不变的同时,PHP版本要求提升到5.4,对已有的CBD模式做了更深的强化,优化核心,减少依赖,基于全新的架构思想和命名空间实现,是ThinkPHP突破原有框架思路的颠覆之作,其主要特性包括:
+
+ + 基于命名空间和众多PHP新特性
+ + 核心功能组件化
+ + 强化路由功能
+ + 更灵活的控制器
+ + 重构的模型和数据库类
+ + 配置文件可分离
+ + 重写的自动验证和完成
+ + 简化扩展机制
+ + API支持完善
+ + 改进的Log类
+ + 命令行访问支持
+ + REST支持
+ + 引导文件支持
+ + 方便的自动生成定义
+ + 真正惰性加载
+ + 分布式环境支持
+ + 更多的社交类库
+
+> ThinkPHP5的运行环境要求PHP5.4以上。
+
+详细开发文档参考 [ThinkPHP5完全开发手册](http://www.kancloud.cn/manual/thinkphp5)
+
+## 目录结构
+
+初始的目录结构如下:
+
+~~~
+www  WEB部署目录(或者子目录)
+├─application           应用目录
+│  ├─common             公共模块目录(可以更改)
+│  ├─module_name        模块目录
+│  │  ├─config.php      模块配置文件
+│  │  ├─common.php      模块函数文件
+│  │  ├─controller      控制器目录
+│  │  ├─model           模型目录
+│  │  ├─view            视图目录
+│  │  └─ ...            更多类库目录
+│  │
+│  ├─command.php        命令行工具配置文件
+│  ├─common.php         公共函数文件
+│  ├─config.php         公共配置文件
+│  ├─route.php          路由配置文件
+│  ├─tags.php           应用行为扩展定义文件
+│  └─database.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                 命令行入口文件
+~~~
+
+> router.php用于php自带webserver支持,可用于快速测试
+> 切换到public目录后,启动命令:php -S localhost:8888  router.php
+> 上面的目录结构和名称是可以改变的,这取决于你的入口文件和配置参数。
+
+## 命名规范
+
+`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)

+ 1 - 0
application/.htaccess

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

+ 15 - 0
application/admin/config.php

@@ -0,0 +1,15 @@
+<?php
+
+return [
+
+    // 视图输出字符串内容替换
+    'view_replace_str'       => [
+        '__ROOT__'=>'/static/admin/layui2.5.6',
+        '__IMAGES__'=>'/static/admin/images',
+        '__UPLOAD__'=>'/static/uploads',//上传图片地址
+        '__SP__'=>'/static/admin/special',//上传图片地址
+    ],
+
+
+
+];

+ 193 - 0
application/admin/controller/Article.php

@@ -0,0 +1,193 @@
+<?php
+namespace app\admin\controller;
+use think\Controller;
+use think\Request;
+use app\admin\model\ArticleModel;
+class Article extends Base
+{
+     
+
+    public function lst()//文章列表
+    {
+
+        return view(); 
+       
+         
+    }
+
+
+
+    public function lst_data(Request $request){//文章列表json数据动态表格显示(分页)
+        $user = new ArticleModel();
+        $title = request()->param('title');//接收请求数据id
+      
+        $where='1=1';//没有搜索条件则默认查询所有数据
+        if(!empty($title)){//不为空执行搜索条件,为空则跳过判断条件直接显示列表页,
+            $where = ['title'=>$title];
+        }   
+        //数据表获取总记录数           
+        $count = $user->where($where)->count();
+        //获取每页显示的条数
+        $limit= $request->param('limit');
+        //获取当前页码
+        $page= $request->param('page');
+        //limit的起始位置
+        $start=($page-1)*$limit;
+        $list = $user
+                ->alias('a')
+                ->field('a.*,b.catename')
+                ->join('column b','a.column_id=b.id')
+                ->limit("$start,$limit")
+                ->where($where)
+                ->select();
+        
+        return ["code"=>0,"msg"=>"成功","count"=>$count,"data"=>$list];
+
+    }
+
+     public function add(){//添加
+        $user = new ArticleModel();
+        if(request()->isPost()){
+            $data = input('post.');
+
+            if($_FILES['pic']['tmp_name']){//上传图片
+                $data['pic']=$this->upload();//调用upload方法
+            }
+            if($data['keywords']==''){//解决keywords为''
+                $data['keywords']=null;
+            }
+            $data['time']=date('Y-m-d',time());
+            $add=$user->insert($data);
+            if($add){
+                 echo  "<script>alert('添加信息成功!');window.parent.location.reload()</script>";//后台直接实现弹窗,操作完成并显示列表页
+            }else{
+                 echo  "<script>alert('添加信息失败');location.href='".url('article/add')."'</script>";
+            }
+        }
+         $column = db('column')->select();
+         $this->assign([
+             'column'=>$column,//栏目列表
+         ]);
+
+        return view();
+        
+    }
+
+
+    public function edit(){//编辑 
+        $user = new ArticleModel();
+        $id = input('id');
+        $db = $user->where('id',$id)->find();
+        if(request()->isPost()){
+            $data = input('post.');
+            //处理图片上传
+            if($_FILES['pic']['tmp_name']){
+                $oldarticles=db('article')->field('pic')->find($data['id']);
+                $oldarticleImg=ADMINIMG.$oldarticles['pic'];
+                if(file_exists($oldarticleImg)){   
+                    @unlink($oldarticleImg);
+                }
+                $data['pic']=$this->upload();
+            }
+            if($data['keywords']==''){//解决keywords为''
+                $data['keywords']=null;
+            }
+            $save=$user->update($data);
+            if($save!==false){
+                echo "<script>alert('修改信息成功!');window.parent.location.reload()</script>";//后台直接实现弹窗,操作完成并显示列表页
+            }else{
+                echo  "<script>alert('修改信息失败');location.href='".url('article/edit')."'</script>";
+            }
+        }
+        $column = db('column')->select();
+        $this->assign([
+            'db'=>$db,//文章数据
+            'column'=>$column,//导航栏数据
+        ]);
+        return view();
+    } 
+ 
+
+    public function del(){//删除
+        $user = new ArticleModel();
+        if(request()->isPost()){
+            $id = input('id');
+            //先删除本地文件夹的图片
+            $pic=$user->field('pic')->where('id',$id)->find();
+            if(!empty($pic)){//判断不为空
+                $picSrc=ADMINIMG.$pic['pic'];
+                if(file_exists($picSrc)){
+                    @unlink($picSrc);
+                }
+            }
+            
+            //在删除数据库信息
+            $del=$user->where('id',$id)->delete();
+            if($del){
+                return 1;//删除成功
+                  
+            }else{
+                return 2;//删除失败
+                
+            }
+        }
+
+
+    } 
+
+    public function pdel(){//批量删除
+        $user = new ArticleModel();
+        if(request()->isPost()){
+
+            $id = input('post.');//接收前台id
+            $ids = implode(',',$id);//将id用逗号进行隔开
+            $where = [
+                'id'=>['in',$ids],
+            ];
+            //批量删除本地图片
+            $pic=$user->where($where)->column('pic');//查询满足条件的pic字段数组信息
+            if(!empty($pic)){//判断不为空
+                $pi = implode(',',$pic);//将pic(图片路径)字段用逗号进行隔开
+                foreach ($pic as $value) {//将拆分的路径进行循环输出
+                    $picSrc = ADMINIMG.$value;//将入口文件(public/index.php)定义的本地图片存放路径和$value(图片名称)进行拼接
+                    if(file_exists($picSrc)){//如果该路径下有满足条件的图片名称则进行删除,file_exists():判断文件是否存在
+                        @unlink($picSrc);//@unlink():删除图片
+                    }  
+                }
+            }
+            $list = $user->where($where)->delete();
+            if($list){
+               return 1;//删除成功
+            }else{
+                return 2;//删除失败    
+            }
+        }
+
+    }
+
+
+
+    //上传图片
+    public function upload(){
+        // 获取表单上传文件 例如上传了001.jpg
+        $file = request()->file('pic');
+        
+        // 移动到框架应用根目录/public/uploads/ 目录下
+        if($file){
+            $info = $file->move(ROOT_PATH . 'public' . DS . 'static'. DS .'uploads');
+            if($info){
+                return $info->getSaveName();
+            }else{
+                // 上传失败获取错误信息
+                echo $file->getError();die;
+            }
+        }
+    }
+       
+
+
+ 
+
+
+        
+}

+ 35 - 0
application/admin/controller/Base.php

@@ -0,0 +1,35 @@
+<?php
+namespace app\admin\controller;
+use think\Controller;
+
+use think\Request;
+
+class Base extends Controller//公共控制器
+{ 
+
+
+    protected function _initialize()
+    {
+        //判断有无uname或者id的session,如果没有,跳转到登陆界面
+        if(!session('admin_auth.uname')||!session('admin_auth.id')){
+             $this->redirect(url('/lst'));//url("/lst"):为后台登录地址,设置路由进行替换的(在route.php中查看)
+        }
+
+        $request=Request::instance();
+        $moudle=$request->module(); //获取当前模型名称
+        $con=$request->controller(); //获取当前控制器名称
+        $action=$request->action();  //获取当前方法名称
+        
+
+        $this->assign(array(
+            'con'=>$con,
+            'action'=>$action,
+        ));
+        
+
+    }
+
+    
+
+   
+}

+ 95 - 0
application/admin/controller/Column.php

@@ -0,0 +1,95 @@
+<?php
+namespace app\admin\controller;
+
+use think\Request;
+use app\admin\model\ColumnModel;
+use catetree\Catetree;
+class Column extends Base
+{
+    
+
+    public function lst()//栏目列表
+    {   
+        $user = new ColumnModel();
+        $list = $user->order('sort desc')->paginate(10);
+
+        $this->assign('list',$list);
+
+        return view();  
+   
+    }
+
+
+
+
+    public function add(){//添加      
+        if(request()->isPost()){
+            $user = new ColumnModel();
+            $data = input('post.');
+            $Column = $user->where('catename',$data['catename'])->find();
+            if(empty($Column)){
+                $user->save($data);
+                return 1;
+            }else{
+                return 2;
+            }
+        }
+        return view();
+
+    }
+
+    public function edit(){//修改
+        $user = new ColumnModel();
+        $id = input('id');
+        $list = $user->where('id',$id)->find();
+        if(request()->isPost()){
+            $data = input('post.');
+            if($list['catename']!=$data['catename']){
+                $user->update($data);
+                return 1;
+            }else{
+                return 2;
+            }
+        }
+        $this->assign([
+            'list'=>$list,
+        ]);
+        return view();
+    }
+
+
+    public function del(){//删除
+        $user = new ColumnModel();
+        $id = input('id');
+        $del=$user->where('id',$id)->delete();
+        if($del){
+            return ['data'=>200,'msg'=>'删除成功'];
+        }else{
+            return ['data'=>0,'msg'=>'删除失败'];
+        }
+        return view();
+
+
+    } 
+
+
+
+    //更新排序
+    public function sort(){
+        if(request()->isPOST()){
+            $data=input(); //获取ajax提交所有数据
+            $table=db('column'); //要更新的表
+            $cate=new Catetree;  //实例化拓展类  使用排序方法
+            $cate->cateSort($data['sort'],$table);
+            return 1;
+        }
+
+    }
+       
+    
+        
+ 
+
+
+        
+}

+ 108 - 0
application/admin/controller/Demo.php

@@ -0,0 +1,108 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: win 10
+ * Date: 2020/9/2
+ * Time: 10:33
+ */
+
+namespace app\admin\controller;
+use think\Controller;
+use QL\QueryList;//内容采集类
+//测试功能专用
+
+
+class Demo extends Controller
+{
+    public function gather(){//网页数据采集
+        set_time_limit(0);//网页处理永不超时
+        //采集网址
+//        $url = 'https://shareably.net/';
+//        $range ='.fullwidth>.row';
+
+
+//1-10页的图片都有了  下次采集就从11页开始,前10页内容和图片都已经采集
+        $url ="https://smartlifetricks.com/category/living/page/2";
+        $range ='.td-main-content>.td-ss-main-content';
+
+//       采集规则
+        $rules = array (
+
+            'title'=>array(
+                'div>div>div>h3',//选择div下的第一个p标签
+                'html',//需要翻译功能的时候就改为text
+            ),
+
+            'img'=>array(
+                'div>div>div>div>div>a',//选择div下的第一个p标签
+                'html',//需要翻译功能的时候就改为text
+            ),
+
+//            'time'=>array(
+//                'time',
+//                'datetime',
+//            ),
+
+
+        );
+
+        $data = QueryList::get($url)->rules($rules)->range($range)->queryData();
+
+
+        dump($data);die;
+
+        $pa = '/(src)="(.*?(jpg|jpeg|gif|png))/i';//匹配img的src链接
+        preg_match_all($pa, $data[0]['img'], $matches);
+        $imur = $matches[2];
+
+
+        $reg3 = '/<a[^>]*([\s\S]*?)<\/a>/i';//匹配a标签中的内容,不需要带超链接就加上[^>]:/<a[^>]*([\s\S]*?)<\/a>/i
+        preg_match_all($reg3,$data[0]['title'],$acontent);
+        $ma = $acontent[1];
+
+
+        /*        $reg4 ='/<a .*?href="(.*?)".*?>/is';//匹配a标签的href地址*/
+//        preg_match_all($reg4,$data[0]['content'],$acontents);
+//        $mas = $acontents[1];
+
+        $result=[];
+        foreach ($ma as $key=>$content) {
+            $temp = ['title'=>$content];
+//            $contentapi  =json_decode(file_get_contents("http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=".$te),true);
+            $dss['title'] = $temp['title'];
+            $temp['img'] = isset($imur[$key])?$imur[$key]:'';
+            $baseName = basename($temp['img']);//获取图片文件名
+            $pattern = "/^(http|https):\/\/.*$/i";//正则匹配链接地址
+            $dss['img'] = preg_replace($pattern, '/static/uploads/images/' . $baseName . '', $temp['img']);//将网页图片地址替换成本地图片存放地址
+            $ds['content'] = '<img src="' . $dss['img'] . '">';
+            $ds['title']=$dss['title'];
+            $ds['author']='爱奇君';
+            $ds['time'] = date('Y-m-d',time());
+
+            $result[] = $ds;
+        }
+        dump($result);
+
+//        db('article')->insertAll($result);//将采取数据插入到数据表
+
+//        $pregStrs = '/<(h[1-6])>([\S\s]*?)<\/\1>/';//匹配h标签相同元素值(内容)
+//        preg_match_all($pregStrs, $data[0]['content'], $maths);
+//        $ma = $maths[2];
+
+//        $pa = '/(src)="(.*?(jpg|jpeg|gif|png))/i';//匹配img的src链接
+//        preg_match_all($pa, $data[0]['img'], $matches);
+//        $imur = $matches[2];
+//`
+
+//        $pregStr='/<h3[^>].*>(.*)<\/h3>/';//匹配相同标的元素值
+//        preg_match_all($pregStr,$data[0]['title'],$math);
+//        $mas = $math[1];
+
+    }
+
+
+
+
+
+
+}

+ 235 - 0
application/admin/controller/Index.php

@@ -0,0 +1,235 @@
+<?php
+namespace app\admin\controller;
+
+use think\Session;
+use think\Cache;
+use think\Request; 
+use app\admin\model\LogModel;
+use app\admin\model\IndexModel;
+
+class Index extends Base
+{
+	public function server(){//运行环境
+        $info = array(
+            '操作系统'=>PHP_OS,
+            '运行环境'=>$_SERVER["SERVER_SOFTWARE"],
+            'PHP运行方式'=>php_sapi_name(),
+            '上传附件限制'=>ini_get('upload_max_filesize'),
+            '执行时间限制'=>ini_get('max_execution_time').'秒',
+            '服务器时间'=>date("Y年n月j日 H:i:s"),
+            '北京时间'=>gmdate("Y年n月j日 H:i:s",time()+8*3600),
+            'ThinkPHP版本'=>THINK_VERSION,
+        );
+
+        //登录次数echarts统计图-----------------------------------------
+        $today = date('Y-m-d');
+        //取当前时间的前十四天
+        $date = [];
+        $date_string = '';
+        for ($i=9; $i >0 ; $i--) { 
+            $date[] = date("Y-m-d",strtotime("-{$i} day"));
+            $date_string.= date("Y-m-d",strtotime("-{$i} day")) . ',';
+        }
+        $date[] = $today;
+        $date_string.= $today;
+        $web['date_string'] = $date_string;
+
+        $login_sum = '';
+        foreach ($date as $k => $val) {
+            $min_time = strtotime($val);
+            $max_time = $min_time + 60*60*24;
+            $where['create_time'] = [['>=',$min_time],['<=',$max_time]];
+            // dump($where);die;
+            $where['remark']= "登录操作";
+            $login_sum.= db('user_log')->where($where)->count() . ',';
+        }
+        $web['login_sum'] = $login_sum;
+        //end--------------------------------------------------------
+
+        $this->assign('web',$web);
+        $this->assign('info',$info);
+        return view();
+	}
+
+	public function clears(){//清楚缓存
+        Cache::clear();
+        $this->success('index/lst');
+    }
+
+    public function lst_data(Request $request){//用户列表json数据动态表格显示(分页)
+
+    	$user = new IndexModel();
+        $uname = request()->param('uname');//接收请求数据id
+        $where='1=1';
+        if(!empty($uname)){//不为空执行搜索条件,为空则跳过判断条件直接显示列表页,
+            $where = ['uname'=>$uname];
+        }
+        //数据表获取总记录数
+        $count = $user->where($where)->count();
+        //获取每页显示的条数
+        $limit= $request->param('limit');
+        //获取当前页码
+        $page= $request->param('page');
+        //limit的起始位置
+        $start=($page-1)*$limit;
+        // 查询出当前页数显示的数据
+        $list = $user//关联查询
+                ->limit("$start,$limit")
+                ->where($where)
+                ->select();
+        foreach($list as $k=>$v){   /*循环时间戳转时间格式*/
+            $list[$k]['last_login_time'] = date('Y-m-d H:i:s',$v['last_login_time']);
+        }
+        //返回数据
+        return ["code"=>0,"msg"=>"成功","count"=>$count,"data"=>$list];
+
+    }
+
+    
+    public function lst()//用户列表
+    {
+
+        return view(); 
+       
+        
+    }
+
+
+    public function edit(){//用户信息编辑 
+        $user = new IndexModel();
+        $id = input('id');
+        $db = db('user')->where('id',$id)->find();
+        if(request()->isPost()){
+            $data['id'] = $id;
+            $data['uname'] = input('uname');
+            $data['upass'] =input('upass');
+            if(empty($data['upass'])){
+                $data['upass']=$db['upass'];
+                $edit = $user->where('id',$id)->update($data);
+                if($edit){
+                    return 1;
+                }else{
+                    return 2;
+                }
+            }else{
+                $data['upass']=md5(input('upass'));
+                $edit = $user->where('id',$id)->update($data);
+                if($edit){
+                    return 1;
+                }else{
+                    return 2;
+                }
+            }      
+        }
+        
+        $this->assign([
+            'db'=>$db,//本身id
+        ]);
+        return view();
+    } 
+
+ 
+    public function add(){//添加
+        $user = new IndexModel();
+        if(request()->isPost()){
+            $data['uname'] = input('uname');
+            $data['upass'] = input('upass');
+            $list = $user->where('uname',trim($data['uname']))->select();
+            if(empty($list)){
+                $data['upass']=md5(trim($data['upass']));
+                if($user->save($data)){
+                    return 1;
+                }else{
+                    return 2;
+                }        
+            }else{
+                return 2;
+            }
+        }
+        
+        return view();
+       
+    }
+
+ 
+    public function del(){//删除
+        $user = new IndexModel();
+    	$id = input('id');
+        $where = [
+            'id'=>$id,
+        ];
+        if($id==1){
+            return 3;//超级管理员不允许删除
+        }
+        $list = $user->where($where)->delete();
+        if($list){
+            return 1;
+        }else{
+            return 2;
+        }
+    }
+
+
+    public function pdel(){//批量删除
+        $user = new IndexModel();
+        if(request()->isPost()){
+            $id = input('post.');
+            $ids = implode(',',$id);
+            $where = [
+                'id'=>['in',$ids],
+            ];
+
+            $list = $user->where($where)->delete();
+            if($list){
+               return 1;
+            }else{
+                return 2;//删除失败
+            }
+        }
+
+    }
+
+
+    public function log_data(Request $request)//日志记录列表接口
+    {
+        $user = new LogModel();
+        // $data = $user->select();
+        //数据表获取总记录数
+        $count = $user->count();
+        //获取每页显示的条数
+        $limit= $request->param('limit');
+        //获取当前页码
+        $page= $request->param('page');
+        //limit的起始位置
+        $start=($page-1)*$limit;
+        // 查询出当前页数显示的数据
+        $list = $user
+                ->limit("$start,$limit")
+                ->select();
+
+        //返回数据
+        return ["code"=>0,"msg"=>"成功","count"=>$count,"data"=>$list];
+    }
+
+    public function log()//日志记录列表
+    {
+        
+        return view();
+    }
+
+
+    public function truncate()//一键清除日志记录
+    {
+        if(request()->isPost()){
+            $trun = db()->query('TRUNCATE ' . config('database.prefix') . 'user_log');
+            return 1;//删除成功
+        }else{
+            return 2;//为空或者没有权限
+        }
+        
+    }
+    
+
+
+
+}

+ 57 - 0
application/admin/controller/Login.php

@@ -0,0 +1,57 @@
+<?php
+namespace app\admin\controller;
+use think\Controller;
+use think\Request;
+use think\Db;
+
+class Login extends Controller{
+
+    public function lst(){
+
+        //判断是否是post方法发送的数据:如果是则开始登陆
+        is_admin_login() && $this->redirect('admin/index/server'); // 如果已经登录过的用户重复登录就直接跳转到首页
+        if (request()->isPost()){
+            $data['uname'] = input('uname');
+            $data['upass'] = md5(input('upass'));
+            //从数据库读取数据           
+            $info = db('user')->where($data)->find();
+            if($info){
+                
+                $login_data['last_login_time']=time(); //获取当前登录时间
+                $login_data['last_login_ip'] = $this->request->ip();//获取当前登录ip
+                $login = db('user')->where($data)->update($login_data);// 更新当前用户信息
+                if($login){
+//                    session('uname',$info['uname']);
+//                    session('id',$info['id']);
+                    session('admin_auth',$info);//$info(相当于直接将这个数组中id 和uname存入session)
+                    session('admin_auth_sign', data_auth_sign($info));//data_auth_sign():数据签名认证
+                    insert_admin_log('登录操作');//写入日志表
+                    return 1;
+                }else{
+                    return 3;
+                }
+
+            }else{
+                return 2;
+            }
+        }else{
+             //如果不是post,则返回登陆界面
+             return view();
+        }
+           
+        
+    
+    }
+
+    
+    public function logout(){
+        //退出登录
+        session(null);//退出清空session
+        //url("/lst"):为后台登录地址,设置路由进行替换的(在route.php中查看)
+        return $this->redirect(url('/lst'));//跳转到登录页面
+
+    }
+
+
+}
+

+ 126 - 0
application/admin/controller/Tags.php

@@ -0,0 +1,126 @@
+<?php
+namespace app\admin\controller;
+
+use think\Request;
+use app\admin\model\TagsModel;
+
+class Tags extends Base
+{
+    
+
+    public function lst()//栏目列表(自己做的)
+    {   
+
+        return view(); 
+       
+         
+    }
+
+
+
+    public function lst_data(Request $request){//栏目列表json数据动态表格显示(分页)
+        $user = new TagsModel();
+        $id = request()->param('id');//接收请求数据id
+        $where='1=1';
+        if(!empty($id)){//不为空执行搜索条件,为空则跳过判断条件直接显示列表页,
+            $where = ['id'=>$id];
+        }
+        //数据表获取总记录数           
+        $count = $user->where($where)->count();
+        //获取每页显示的条数
+        $limit= $request->param('limit');
+        //获取当前页码
+        $page= $request->param('page');
+        //limit的起始位置
+        $start=($page-1)*$limit;
+        $list = $user
+                ->limit("$start,$limit")
+                ->where($where)
+                ->select();
+        //返回数据
+        return ["code"=>0,"msg"=>"成功","count"=>$count,"data"=>$list];
+
+    }
+
+
+    public function add(){      
+        if(request()->isPost()){
+            $user = new TagsModel();
+            $data = input('post.');
+            $Tags = $user->where('tagname',$data['tagname'])->find();
+            if(empty($Tags)){
+                $user->save($data);
+                return 1;
+            }else{
+                return 2;
+            }
+        }
+        return view();
+
+    }
+
+    public function edit(){
+        $user = new TagsModel();
+        $id = input('id');
+        $list = $user->where('id',$id)->find();
+        if(request()->isPost()){
+            $data = input('post.');
+            if($list['tagname']!=$data['tagname']){
+                $user->update($data);
+                return 1;
+            }else{
+                return 2;
+            }
+        }
+        $this->assign([
+            'list'=>$list,
+        ]);
+        return view();
+    }
+
+
+    public function del(){//删除
+        $user = new TagsModel();
+        if(request()->isPost()){
+            $id = input('id');
+            $del=$user->where('id',$id)->delete();
+            if($del){
+                return 1;//删除成功             
+            }else{
+                return 2;//删除失败        
+            }
+        }
+      
+
+
+    } 
+
+    public function pdel(){//批量删除
+        $user = new TagsModel();
+        if(request()->isPost()){
+
+            $id = input('post.');//接收前台id
+            $ids = implode(',',$id);//将id用逗号进行隔开
+            $where = [
+                'id'=>['in',$ids],
+            ];
+            $list = $user->where($where)->delete();
+            if($list){
+               return 1;//删除成功
+              
+            }else{
+                return 2;//删除失败
+                
+            }
+        }
+       
+
+    }
+
+    
+        
+ 
+
+
+        
+}

+ 206 - 0
application/admin/controller/Tests.php

@@ -0,0 +1,206 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: win 10
+ * Date: 2020/8/14
+ * Time: 9:49
+ */
+
+namespace app\admin\controller;
+use Aliyun\Common\Utilities\DateUtils;
+use phpDocumentor\Reflection\FqsenResolver;
+use think\Controller;
+use tp5redis\redis\driver\Redis;//redis扩展类
+use think\Request;
+use QL\QueryList;//内容采集类
+//测试功能专用
+
+class Tests extends Controller
+{
+
+    public function gather(){//网页数据采集
+        set_time_limit(0);//网页处理永不超时
+        //采集网址
+//        $url = 'https://shareably.net/';
+//        $range ='.fullwidth>.row';
+
+
+//1-10页的图片都有了  下次采集就从11页开始,前10页内容和图片都已经采集
+        $url ="https://smartlifetricks.com/category/living/page/2";
+        $range ='.td-main-content>.td-ss-main-content';
+
+//       采集规则
+        $rules = array (
+
+            'title'=>array(
+                'div>div>div>h3',//选择div下的第一个p标签
+                'html',//需要翻译功能的时候就改为text
+            ),
+
+            'img'=>array(
+                'div>div>div>div>div>a',//选择div下的第一个p标签
+                'html',//需要翻译功能的时候就改为text
+            ),
+
+//            'time'=>array(
+//                'time',
+//                'datetime',
+//            ),
+
+
+        );
+
+        $data = QueryList::get($url)->rules($rules)->range($range)->queryData();
+
+
+        dump($data);die;
+
+        $pa = '/(src)="(.*?(jpg|jpeg|gif|png))/i';//匹配img的src链接
+        preg_match_all($pa, $data[0]['img'], $matches);
+        $imur = $matches[2];
+
+
+        $reg3 = '/<a[^>]*([\s\S]*?)<\/a>/i';//匹配a标签中的内容,不需要带超链接就加上[^>]:/<a[^>]*([\s\S]*?)<\/a>/i
+        preg_match_all($reg3,$data[0]['title'],$acontent);
+        $ma = $acontent[1];
+
+
+/*        $reg4 ='/<a .*?href="(.*?)".*?>/is';//匹配a标签的href地址*/
+//        preg_match_all($reg4,$data[0]['content'],$acontents);
+//        $mas = $acontents[1];
+
+        $result=[];
+        foreach ($ma as $key=>$content) {
+            $temp = ['title'=>$content];
+//            $contentapi  =json_decode(file_get_contents("http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=".$te),true);
+            $dss['title'] = $temp['title'];
+            $temp['img'] = isset($imur[$key])?$imur[$key]:'';
+            $baseName = basename($temp['img']);//获取图片文件名
+            $pattern = "/^(http|https):\/\/.*$/i";//正则匹配链接地址
+            $dss['img'] = preg_replace($pattern, '/static/uploads/images/' . $baseName . '', $temp['img']);//将网页图片地址替换成本地图片存放地址
+            $ds['content'] = '<img src="' . $dss['img'] . '">';
+            $ds['title']=$dss['title'];
+            $ds['author']='爱奇君';
+            $ds['time'] = date('Y-m-d',time());
+
+            $result[] = $ds;
+        }
+        dump($result);
+
+//        db('article')->insertAll($result);//将采取数据插入到数据表
+
+
+
+
+
+//        $data = QueryList::get($url)->rules($rules)->range($range)->queryData();
+//        //dump($data);
+
+//        $pregStrs = '/<(h[1-6])>([\S\s]*?)<\/\1>/';//匹配h标签相同元素值(内容)
+//        preg_match_all($pregStrs, $data[0]['content'], $maths);
+//        $ma = $maths[2];
+//
+//        $pa = '/(src)="(.*?(jpg|jpeg|gif|png))/i';//匹配img的src链接
+//        preg_match_all($pa, $data[0]['img'], $matches);
+//        $imur = $matches[2];
+//`
+//        $result=[];
+//        foreach ($ma as $key=>$content) {
+//            $temp = ['content'=>$content];
+//            $contentapi = json_decode(file_get_contents("http://fanyi.youdao.com/openapi.do?keyfrom=xujiangtao&key=1490852988&type=data&doctype=json&version=1.1&q=".$temp['content']),true);
+// $contentapi  =json_decode(file_get_contents("http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=".$temp['content']),true);
+//            $dss['content'] = $contentapi['translation'][0];
+//
+//            $temp['img'] = isset($imur[$key])?$imur[$key]:'';
+//            $baseName = basename($temp['img']);//获取图片文件名
+//            $pattern = "/^(http|https):\/\/.*$/i";//正则匹配链接地址
+//
+//            $dss['img'] = preg_replace($pattern, '/static/uploads/images/' . $baseName . '', $temp['img']);//将网页图片地址替换成本地图片存放地址
+//
+//            $ds['content'] = '
+//                <p>' . $dss['content'] . '</p>
+//
+//                <img src="' . $dss['img'] . '">';
+//
+//            $ds['title']="生活";
+//            $ds['author']='爱奇君';
+//            $ds['time'] = date('Y-m-d',time());
+//
+//            $result[] = $ds;
+//        }
+////        dump($result);
+//        db('article')->insertAll($result);//将采取数据插入到数据表
+
+
+
+
+//        $pregStr='/<h3[^>].*>(.*)<\/h3>/';//匹配相同标的元素值
+//        preg_match_all($pregStr,$data[0]['title'],$math);
+//        $mas = $math[1];
+
+    }
+
+
+    //下载网页图片到本地
+    /**
+     * $imgUrl:图片地址
+     */
+    public function saveImg($imgUrl){
+        set_time_limit(0);
+        $ext=strrchr($imgUrl,'.');
+        if(!in_array($ext,['.jpg','.png','.jpeg','.gif']))
+            return $imgUrl;
+        $baseName=basename($imgUrl);//获取文件名
+        $saveUrl="/upload/img/".$baseName;
+        //文件保存绝对路径
+        $path=__DIR__.DS.'../../../public/static/uploads'.DS.$baseName;
+        $img = file_get_contents($imgUrl);
+
+        file_put_contents($path,$img);
+        return $saveUrl;
+    }
+
+    public function downImg(){//批量下载网页图片保存到本地项目文件下
+        set_time_limit(0);
+//        $url = 'https://shareably.net/';
+//        $range ='.fullwidth>.row';
+//
+//        $rules = array (
+//            'img'=>array(
+//                'div>ol>li>div>div',//选择div下的第一个p标签
+//                'html',//需要翻译功能的时候就改为text
+//            )
+//        );
+        $url = 'https://smartlifetricks.com/category/living/page/11';
+        $range ='.td-main-content>.td-ss-main-content';
+
+        $rules = array (
+            'img'=>array(
+                'div>div>div>div>div>a',//选择div下的第一个p标签
+                'html',//需要翻译功能的时候就改为text
+            ),
+        );
+        $data = QueryList::get($url)->rules($rules)->range($range)->queryData();
+
+        $pa = '/(src)="(.*?(jpg|jpeg|gif|png))/i';//匹配img的src链接
+        preg_match_all($pa, $data[0]['img'], $matches);
+        $imur = $matches[2];
+        dump($imur);die;
+        foreach ( $imur as $url ) {//因为 $imgUrl是一个数组,里面有多张图片路径,所以直接循环调用 saveImg()方法
+          $this->saveImg($url);
+
+        }
+
+    }
+
+
+
+
+
+
+
+
+
+
+
+}

+ 19 - 0
application/admin/model/ArticleModel.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2017/10/22
+ * Time: 21:15
+ */
+namespace app\admin\model;
+
+use think\Model;
+
+class ArticleModel extends Model
+{
+    protected $table = 'bp_article';//文章表
+
+
+
+    
+}

+ 18 - 0
application/admin/model/ColumnModel.php

@@ -0,0 +1,18 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2017/10/22
+ * Time: 21:15
+ */
+namespace app\admin\model;
+
+use think\Model;
+
+class ColumnModel extends Model
+{
+    protected $table = 'bp_column';//栏目表
+
+
+    
+}

+ 15 - 0
application/admin/model/IndexModel.php

@@ -0,0 +1,15 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2017/10/22
+ * Time: 21:15
+ */
+namespace app\admin\model;
+
+use think\Model;
+
+class IndexModel extends Model
+{
+    protected $table = 'bp_user';//用户表
+}

+ 15 - 0
application/admin/model/LogModel.php

@@ -0,0 +1,15 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2017/10/22
+ * Time: 21:15
+ */
+namespace app\admin\model;
+
+use think\Model;
+
+class LogModel extends Model
+{
+    protected $table = 'bp_user_log';//用户日志表
+}

+ 15 - 0
application/admin/model/TagsModel.php

@@ -0,0 +1,15 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2017/10/22
+ * Time: 21:15
+ */
+namespace app\admin\model;
+
+use think\Model;
+
+class TagsModel extends Model
+{
+    protected $table = 'bp_tags';//标签表
+}

+ 3 - 0
application/admin/view/Base/fotter.html

@@ -0,0 +1,3 @@
+<div class="layui-footer">
+   Copyright © 2019 Powered by Mosheng  渝ICP备14004903号<!-- 底部固定区域 -->
+</div>

+ 119 - 0
application/admin/view/Base/left.html

@@ -0,0 +1,119 @@
+<!--<style>-->
+    <!--.layui-bg-black{-->
+        <!--background-color: #EEEEEE;!important;-->
+    <!--}-->
+<!--</style>-->
+
+<div class="layui-side layui-bg-black">
+  <div class="layui-side-scroll">
+
+    <ul class="layui-nav layui-nav-tree"  lay-filter="test">
+
+        <li class="layui-nav-item">
+          
+            <a href="javascript:;">
+              <i class="layui-icon">&#xe672;</i>&nbsp;系统<span class="layui-nav-more"></span>
+            </a>
+
+          <dl class="layui-nav-child">
+
+            <dd>
+              <a href="{:url('Index/server')}" class="layui-this">
+                <i class="layui-icon">&#xe67f;</i>&nbsp;控制台
+              </a>
+            </dd>
+            
+          </dl>
+
+        </li>
+
+
+
+        <li class="layui-nav-item {if condition="$con eq 'Index'"}hover layui-nav-itemed{/if}">
+          <a href="javascript:;">
+            <i class="layui-icon">&#xe673;</i>&nbsp;管理员管理<span class="layui-nav-more"></span>
+          </a>
+
+          <dl class="layui-nav-child">
+
+            <dd>
+              <a href="{:url('Index/lst')}" class="layui-this">
+                 <i class="layui-icon">&#xe66f;</i>&nbsp;管理员信息
+              </a>
+            </dd>
+
+            <dd>
+              <a href="{:url('Index/log')}" class="layui-this">
+                 <i class="layui-icon">&#xe63c;</i>&nbsp;管理员日志
+              </a>
+            </dd>
+
+          </dl>
+
+        </li>
+
+
+      <li class="layui-nav-item {if condition="$con eq 'Article'"}hover layui-nav-itemed{/if}">
+          <a href="javascript:;">
+            <i class="layui-icon">&#xe656;</i>&nbsp;文章管理<span class="layui-nav-more"></span>
+          </a>
+
+          <dl class="layui-nav-child">
+
+            <dd>
+              <a href="{:url('Article/lst')}" {if condition="$con eq 'Article' && $action eq 'lst'"}class="layui-this"{/if}>
+                 <i class="layui-icon">&#xe647;</i>&nbsp;文章列表
+              </a>
+            </dd>
+
+          </dl>
+
+        </li>
+
+
+        <li class="layui-nav-item {if condition="$con eq 'Column'"}hover layui-nav-itemed{/if}">
+        <a href="javascript:;">
+            <i class="layui-icon">&#xe653;</i>&nbsp;栏目管理<span class="layui-nav-more"></span>
+        </a>
+
+        <dl class="layui-nav-child">
+
+            <dd>
+                <a href="{:url('Column/lst')}" {if condition="$con eq 'Column' && $action eq 'lst'"}class="layui-this"{/if}>
+                <i class="layui-icon">&#xe647;</i>&nbsp;栏目列表
+                </a>
+            </dd>
+
+        </dl>
+
+        </li>
+
+
+        <li class="layui-nav-item {if condition="$con eq 'Tags'"}hover layui-nav-itemed{/if}">
+        <a href="javascript:;">
+            <i class="layui-icon">&#xe66e;</i>&nbsp;标签管理<span class="layui-nav-more"></span>
+        </a>
+
+        <dl class="layui-nav-child">
+
+            <dd>
+                <a href="{:url('Tags/lst')}" {if condition="$con eq 'Tags' && $action eq 'lst'"}class="layui-this"{/if}>
+                <i class="layui-icon">&#xe647;</i>&nbsp;标签列表
+                </a>
+            </dd>
+
+        </dl>
+
+        </li>
+
+
+
+
+
+
+
+
+    </ul>
+
+  </div>
+</div>

+ 109 - 0
application/admin/view/Base/top.html

@@ -0,0 +1,109 @@
+<!DOCTYPE html> 
+<html>
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+  <title>站群后台管理系统</title>
+  <link rel="icon" href="__IMAGES__/favicon.png" type="image/x-icon">
+  <link rel="stylesheet" href="__ROOT__/css/layui.css" media="all"> 
+  <script src="__ROOT__/layui.js"></script>
+  <script src="__ROOT__/lay/modules/jquery.js"></script>
+  <script src="/static/extr/echarts/echarts.min.js"></script>
+
+    <!--<link href="//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">-->
+  
+</head>
+<body>
+    <div class="layui-layout layui-layout-admin">
+        <div class="layui-header">
+        <div class="layui-logo">站群后台管理系统</div>
+
+            <ul class="layui-nav layui-layout-right">
+
+              <li class="layui-nav-item">
+                <!-- 天气插件(远程库) -->
+                  <iframe scrolling="no" src="https://tianqiapi.com/api.php?style=tf&skin=mango&color=009688"  frameborder="0" width="200" height="16" allowtransparency="true">
+                  </iframe>
+              </li>
+
+              <li class="layui-nav-item">
+
+                  <a href="javascript:;">
+                    <img src="__IMAGES__/admin.png" class="layui-nav-img">  
+                    欢迎你,{$Think.session.admin_auth.uname}
+                   </a>
+                  <dl class="layui-nav-child">
+                      <dd><a href="{:url('index/index/index')}">前台首页</a></dd>
+                      <dd><a id="clears">清除缓存</a></dd>
+                  </dl>
+              </li>
+
+              <li class="layui-nav-item"><a id="logout">退出登录</a></li>
+
+            </ul>
+
+
+     </div>
+
+     
+
+     
+  
+<script>
+    layui.use(['form', 'layedit', 'jquery','element'], function(){
+        var form = layui.form
+            ,element = layui.element
+            ,layer = layui.layer
+            ,$ = layui.jquery
+        ;
+
+        $("#clears").click(function(){
+            $.post("{:url('index/clears')}",function(res){
+                layer.msg('清除成功',function(){
+                    location.href = res.url;
+                })
+            })
+        });
+ 
+        $("#logout").click(function(){
+            $.post("{:url('login/logout')}",function(res){
+                layer.msg('退出成功',function(){
+                    location.href = res.url;
+                })
+            })
+        });
+
+
+
+
+
+
+
+        //监听提交
+        form.on('submit(form)', function(data){
+            var url=document.URL;
+            $.post(url,data.field,function(res){
+                layer.msg(res.msg);
+                if(res.url&&res.url!=''){
+                    setTimeout(function(){
+                        location.href=res.url;
+                    },2000);
+                }
+                if(res.url==''){
+                    setTimeout(function(){
+                        location.reload();
+                    },1000);
+                }
+            });
+            return false;
+        });
+
+
+    });
+
+</script>
+
+</body>
+</html>
+
+

+ 226 - 0
application/admin/view/article/add.html

@@ -0,0 +1,226 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+  <title>站群后台管理系统</title>
+  <link rel="stylesheet" href="__ROOT__/css/layui.css" media="all">
+  <script src="__ROOT__/layui.js"></script>
+  <script src="__ROOT__/lay/modules/jquery.js"></script>
+
+
+<!-- 上传图片按钮样式 -->
+<style>
+.upflie {
+width: 80px;
+height: 28px;
+text-align: center;
+vertical-align: middle;
+border-radius: 2px;
+-webkit-border-radius: 2px;
+-moz-border-radius: 2px;
+color: #fff;
+cursor: pointer;
+background: #009688;
+border: 1px solid #009688;
+outline: none;
+position: relative;
+display: inline-block;
+overflow: hidden;
+text-decoration: none;
+line-height: 28px;
+}
+.upflie input {
+position: absolute;
+font-size: 10px;
+width: 200px;
+border: none;
+cursor: pointer;
+right: 0;
+top: 0;
+opacity: 0;
+}
+a:hover {
+display: inline-block;
+color: #fff;
+text-decoration: none;
+cursor: pointer!important;
+opacity: 0.8;
+}
+.upflie :hover {
+display: inline-block;
+overflow: hidden;
+color: #fff!important;
+cursor: pointer;
+text-decoration: none;
+}
+</style>
+<!-- end -->
+
+
+</head>
+<body>
+    <form  class="layui-form" action="{:url('article/add')}"  style="padding: 30px"  method="post"  enctype="multipart/form-data" >
+
+        <div class="layui-form-item">
+            <div class="layui-inline">
+                <label class="layui-form-label">栏目名称</label>
+                <div class="layui-input-inline" style="width:400px;">
+                    <select name="column_id" >
+                        {volist name="column" id="vo"}
+                        <option value="{$vo.id}">{$vo.catename}</option>
+                        {/volist}
+                    </select>
+
+                </div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">文章标题</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <input type="text" name="title" id="uname" placeholder="请输入标题"   autocomplete="off" class="layui-input">
+                </div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">关键词</label>
+                <div class="layui-input-inline" style="width:400px;">
+                    <input type="text" name="keywords" id="uname" placeholder="请输入关键词,多个用英文逗号进行分隔"   autocomplete="off" class="layui-input">
+                </div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">文章作者</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <input type="text" name="author" id="author"  placeholder="请输入作者"  autocomplete="off" class="layui-input">
+                </div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">图片</label>
+                <div class="layui-input-inline" style="width:400px;">
+                    <a class="upflie">添加图片
+                        <input type="file" name="pic" id="pic" autocomplete="off" onchange="imgChange()" lay-verify="pics" >
+                    </a>
+
+                    <a class="upflie">取消
+                     <input type="button" value="取消" onclick="call()" />
+                    </a>
+
+                    <img id="imghead"  width="260" height="180" src="/static/admin/images/noimage.png" />
+                </div>
+            </div>
+
+
+            <div class="layui-form-item layui-form-text">
+              <label class="layui-form-label" style="width:80px">内容</label>
+              <div class="layui-input-block">
+                <textarea placeholder="请输入内容" class="layui-textarea" name="content" id="content" style="border:0;padding:0"></textarea>
+              </div>
+            </div>
+
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">是否推荐</label>
+                <div class="layui-input-block">
+                  <input type="radio" name="state" value="0" title="推荐" >
+                  <input type="radio" name="state" value="1" title="不推荐" >
+                </div>
+            </div>
+
+            <div class="layui-form-item">
+                <div class="layui-input-block">
+                  <button type="submit" class="layui-btn" lay-submit  lay-filter="sub">立即添加</button>
+                  <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                </div>
+            </div>
+    </form>
+
+
+<!-- 百度编辑器配置文件引入 -->
+<script type="text/javascript" src="/static/extr/ueditor/ueditor.config.js"></script>
+<script type="text/javascript" src="/static/extr/ueditor/ueditor.all.js"></script>
+
+<!-- 实例化编辑器 在需要使用百度编辑的的文本域中加入 id='content'
+(例如:<textarea type='text' id="content" name="content" placeholder="请输入邮件内容" class="layui-textarea">)和下面UE中的对应,可以改成自己定义的只要一致就行-->
+<script type="text/javascript">
+    UE.getEditor('content',{initialFrameWidth:1100,initialFrameHeight:500,
+      toolbars: [  
+        [  
+        'bold', //加粗  
+        'indent', //首行缩进  
+        'snapscreen', //截图  
+        'italic', //斜体  
+        'underline', //下划线  
+        'strikethrough', //删除线  
+        'formatmatch', //格式刷  
+        'horizontal', //分隔线  
+        'time', //时间  
+        'date', //日期  
+               'simpleupload', //单图上传
+               'insertimage', //多图上传
+        'fontfamily', //字体  
+        'fontsize', //字号  
+        'paragraph', //段落格式  
+        'link', //超链接  
+        'emotion', //表情  
+        'spechars', //特殊字符  
+        'searchreplace', //查询替换 
+        'forecolor', //字体颜色  
+        'backcolor', //背景色  
+        'edittip ', //编辑提示  
+        'touppercase', //字母大写  
+        'tolowercase', //字母小写  
+      ]]
+    });
+</script>
+
+
+<script>
+
+layui.use(['form', 'layedit', 'jquery','upload','element'], function(){
+        var form = layui.form
+            ,element = layui.element
+            ,layer = layui.layer
+            ,$ = layui.jquery
+            ,upload = layui.upload
+            ;
+
+
+
+    //表单图片格式验证
+          form.verify({
+                pics: [//验证图片格式   ^$:判断为空
+                   /(?:^$|jpg|gif|png|jpeg)$/, '图片上传格式错误'
+                ],
+          });  
+
+
+
+});
+</script>
+
+
+<script>
+  // 图片显示(添加图片的时候显示当前图片)
+      function imgChange() {
+      //在图片 <input type="file" name="pic" id="pic" autocomplete="off" onchange="imgChange()">/*添加一个事件进行操作*/
+      //<img id="imghead"  width="260" height="180" /> <!--图片显示位置-->
+          //获取点击的文本框
+          var file =document.getElementById("pic");
+          var imgUrl =window.URL.createObjectURL(file.files[0]);
+          var img =document.getElementById('imghead');
+          img.setAttribute('src',imgUrl); // 修改img标签src属性值
+      };
+
+      //实现取消图片上传功能
+      function call() {
+        //将img的src属性赋值为空串
+        document.getElementById("imghead").src = "/static/admin/images/noimage.png";
+        //选择文件框的value属性赋值为空串
+        document.getElementById("pic").value = "";
+      }
+</script>
+
+</body>
+</html>

+ 267 - 0
application/admin/view/article/edit.html

@@ -0,0 +1,267 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+  <title>站群后台管理系统</title>
+  <link rel="stylesheet" href="__ROOT__/css/layui.css" media="all">
+  <script src="__ROOT__/layui.js"></script>
+  <script src="__ROOT__/lay/modules/jquery.js"></script>
+
+  <style>
+.upflie {
+
+width: 80px;
+
+height: 28px;
+
+text-align: center;
+
+vertical-align: middle;
+
+border-radius: 1px;
+
+-webkit-border-radius: 2px;
+
+-moz-border-radius: 2px;
+
+color: #fff;
+
+cursor: pointer;
+
+background: #009688;
+
+border: 1px 20px solid #FFFFFF;
+
+outline: none;
+
+position: relative;
+
+display: inline-block;
+
+overflow: hidden;
+
+text-decoration: none;
+
+line-height: 28px;
+
+}
+
+ 
+
+.upflie input {
+
+position: absolute;
+
+font-size: 10px;
+
+width: 200px;
+
+border: none;
+
+cursor: pointer;
+
+right: 0;
+
+top: 0;
+
+opacity: 0;
+
+}
+
+ 
+
+a:hover {
+
+display: inline-block;
+
+color: #fff;
+
+text-decoration: none;
+
+cursor: pointer!important;
+
+opacity: 0.8;
+
+}
+
+ 
+
+.upflie :hover {
+
+display: inline-block;
+
+overflow: hidden;
+
+color: #fff!important;
+
+cursor: pointer;
+
+text-decoration: none;
+
+}
+
+</style>
+</head>
+<body>
+    <form class="layui-form layui-form-pane" action="{:url('Article/edit')}"  style="padding: 30px" method="post" enctype="multipart/form-data">
+        <input type="hidden" name="id" value="{$db.id}" placeholder="隐藏域id">
+        <div class="layui-form-item">
+            <div class="layui-inline">
+                <label class="layui-form-label">导航栏名称</label>
+                <div class="layui-input-inline" style="width:400px;">
+                    <select name="column_id" >
+                        {volist name="column" id="vo"}
+                        <option value='{$vo.id}' {if condition="$db['column_id'] eq $vo['id']"} selected="selected"{/if}>{$vo.catename}</option>
+                        {/volist}
+                    </select>
+                </div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">文章标题</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <input type="text" name="title" id="uname" value="{$db.title}"   autocomplete="off" class="layui-input">
+                </div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">关键词</label>
+                <div class="layui-input-inline" style="width:400px;">
+                    <input type="text" name="keywords" id="uname" value="{$db.keywords}"   autocomplete="off" class="layui-input">
+                </div>
+                <div class="layui-form-mid layui-word-aux">*多个关键词请用英文逗号分隔</div>
+            </div>
+
+         
+            <div class="layui-form-item">
+                <label class="layui-form-label">文章作者</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <input type="text" name="author" id="upass"  value="{$db.author}"  autocomplete="off" class="layui-input">
+                </div>
+            </div>
+           
+
+             <div class="layui-form-item">
+                <div class="layui-input-inline" style="width:300px;">
+                  <a class="upflie">修改图片
+                        <input type="file" name="pic" id="pic" autocomplete="off" onchange="imgChange()"  lay-verify="pics">
+                  </a>
+                  <a class="upflie" style="background-color: white"></a><!-- 为了让修改图片按钮和图片成上下显示,可以忽略 -->
+
+                  {if condition="$db['pic'] eq '' "}
+                  <img id="imghead" src="/static/admin/images/noimage.png">
+                  {else /} 
+                  <img id="imghead" src="__UPLOAD__/{$db.pic}" width="260" height="180">
+                  {/if}
+                </div>
+            </div>
+
+
+            <div class="layui-form-item layui-form-text">
+              <label class="layui-form-label" style="width:1101px">内容</label>
+              <div class="layui-input-block">
+                <textarea placeholder="请输入内容" class="layui-textarea" name="content" id="content" style="border:0;padding:0">
+                  {$db.content}
+                </textarea>
+              </div>
+            </div>
+
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">是否推荐</label>
+                <div class="layui-input-block">
+                  <input type="radio" name="state" value="0" title="推荐" {if condition="$db['state'] eq 0"} checked {/if}>
+                  <input type="radio" name="state" value="1" title="不推荐" {if condition="$db['state'] eq 1"} checked {/if}>
+                </div>
+            </div>
+
+            
+            <div class="layui-form-item">
+                <div class="layui-input-block">
+                  <button type="submit" class="layui-btn" lay-submit  lay-filter="sub">立即修改</button>
+                  <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                </div>
+            </div>
+    </form>
+
+<!-- 百度编辑器配置文件引入 -->
+<script type="text/javascript" src="/static/extr/ueditor/ueditor.config.js"></script>
+<script type="text/javascript" src="/static/extr/ueditor/ueditor.all.js"></script>
+
+<!-- 实例化编辑器 在需要使用百度编辑的的文本域中加入 id='content'
+(例如:<textarea type='text' id="content" name="content" placeholder="请输入邮件内容" class="layui-textarea">)和下面UE中的对应,可以改成自己定义的只要一致就行-->
+<script type="text/javascript">
+    UE.getEditor('content',{initialFrameWidth:1100,initialFrameHeight:500,
+      toolbars: [  
+        [  
+        'bold', //加粗  
+        'indent', //首行缩进  
+        'snapscreen', //截图  
+        'italic', //斜体  
+        'underline', //下划线  
+        'strikethrough', //删除线  
+        'formatmatch', //格式刷  
+        'horizontal', //分隔线  
+        'time', //时间  
+        'date', //日期
+        'simpleupload', //单图上传  
+        'insertimage', //多图上传  
+        'fontfamily', //字体  
+        'fontsize', //字号  
+        'paragraph', //段落格式  
+        'link', //超链接  
+        'emotion', //表情  
+        'spechars', //特殊字符  
+        'searchreplace', //查询替换 
+        'forecolor', //字体颜色  
+        'backcolor', //背景色  
+        'edittip ', //编辑提示  
+        'touppercase', //字母大写  
+        'tolowercase', //字母小写  
+      ]]
+    });
+</script>
+
+
+<script>
+
+layui.use(['form', 'layedit', 'jquery'], function(){
+        var form = layui.form
+            ,layer = layui.layer
+            ,$ = layui.jquery
+            ;
+
+
+    //表单图片格式验证
+          form.verify({
+                pics: [//验证图片格式   ^$:判断为空
+                   /(?:^$|jpg|gif|png|jpeg)$/, '图片上传格式错误'
+                ],
+          });  
+
+
+         
+
+
+});
+</script>
+
+
+<script>
+  // 图片显示(添加图片的时候显示当前图片)
+      function imgChange() {
+      //在图片 <input type="file" name="pic" id="pic" autocomplete="off" onchange="imgChange()">/*添加一个事件进行操作*/
+      //<img id="imghead"  width="260" height="180" /> <!--图片显示位置-->
+          //获取点击的文本框
+          var file =document.getElementById("pic");
+          var imgUrl =window.URL.createObjectURL(file.files[0]);
+          var img =document.getElementById('imghead');
+          img.setAttribute('src',imgUrl); // 修改img标签src属性值
+      }
+
+
+</script>
+
+</body>
+</html>

+ 277 - 0
application/admin/view/article/lst.html

@@ -0,0 +1,277 @@
+<!--加载公共头部文件-->
+    {include file='Base/top'}
+<!--加载公共左侧文件-->
+    {include file='Base/left'}
+<!--加载公共底部文件-->
+    {include file='Base/fotter'}
+
+
+<!-- 内容显示部分 -->
+<div class="layui-body">
+    <!--面包屑导航-->
+        <blockquote class="layui-elem-quote">
+            <span class="layui-breadcrumb" style="visibility: visible;">
+                <a >文章管理</a>
+                <span lay-separator="">/</span>
+                <a href="{:url('Article/lst')}">
+                  <cite>文章列表</cite>
+                </a>
+              </span>
+        </blockquote>
+        <!--面包屑导航 结束-->
+
+	<div class="layui-row  layui-col-space10" style="margin:0 10px;">
+             <div class="search" style="margin:10px 0px 5px -5px;"><!-- 搜索 -->
+                <div class="layui-inline">
+                    <input  type="text" class="layui-input" name="title" id="refund"  autocomplete="off" placeholder="请输入文章标题">
+                </div>
+                <button class="layui-btn layui-btn-primary" data-type="reload">
+                    <i class="layui-icon"></i>搜索
+                </button>
+            </div>
+        <table class="layui-hide"  id="list" lay-filter="list"></table><!-- 表格数据 -->
+
+    </div>
+</div>
+
+<script type="text/html" id="state">
+    {{#  if(d.state == 0){ }}
+    <div class="layui-badge layui-bg-green">推荐</div>
+    {{#  } else if(d.state == 1){ }}
+    <div class="layui-badge layui-bg-read">不推荐</div>
+    {{#  } }}
+</script>
+
+
+
+
+ 
+<!-- 表格操作栏模块 -->
+<script type="text/html" id="barDemo"><!-- 表格自定义操作按钮 -->
+
+  	<a class="layui-btn layui-btn-xs" lay-event="edit">
+        <i class="layui-icon">&#xe642;</i>编辑
+    </a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">
+        <i class="layui-icon">&#xe640;</i>删除
+    </a>
+
+</script>
+ 
+
+
+<!-- 头部工具栏模块 -->
+<script type="text/html" id="toolbarDemo"><!-- 表格自定义操作按钮 -->
+    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">
+        <i class="layui-icon">&#xe654;</i>添加
+    </a>
+
+    <div class="layui-btn-group demoTable">
+         <button class="layui-btn layui-btn-danger layui-btn-xs" data-type="pdel">
+             <i class="layui-icon">&#xe640;</i>批量删除
+         </button>
+    </div>
+
+</script>
+
+<!-- 图片显示 -->
+<script type="text/html" id="pics">
+    {{#  if(d.pic == null){ }}
+        暂无图片~~~
+    {{# }else{ }}
+        <img src="__UPLOAD__/{{d.pic}}" width="50" height="100%">
+    
+    {{#  } }}
+</script>
+
+
+
+<script>
+layui.use(['table','layer','laypage','jquery'], function(){
+        var table = layui.table,
+            layer = layui.layer,
+            laypage = layui.laypage,
+            $ = layui.jquery;
+
+
+        //数据表格
+        table.render({
+            elem: '#list'
+            ,id:'idSystem'
+            ,url:'{:url("lst_data")}'//数据接口(专门处理数据)
+            ,height:'full'
+            // ,toolbar: 'default' //开启工具栏,此处显示默认图标,可以自定义模板,详见文档
+             ,toolbar: '#toolbarDemo'
+
+             //分页
+            ,page: { //支持传入 laypage 组件的所有参数(某些参数除外,如:jump/elem) - 详见文档
+                layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
+                ,curr: 1 //设定初始在第 5 页
+                ,limit:10 //一页显示多少条
+                ,limits:[10,15,25]//每页条数的选择项
+                ,groups: 3 //只显示 2 个连续页码
+                ,first: "首页" //不显示首页
+                ,last: "尾页" //不显示尾页
+
+            }
+
+            ,cols: [[
+             	 {type: 'checkbox', fixed: 'left'}
+                ,{field: 'id', title: '文章ID',sort:true, align:'center',width: 100}
+                ,{field: 'title', title: '文章标题',align:'left', width: 400}
+                ,{field: 'author', title: '文章作者',align:'center', width: 140}
+                ,{field: 'catename', title: '所属栏目',align:'center', width: 140 }
+                ,{field: 'state', title: '是否推荐',align:'center', width: 90,templet: '#state'}
+                ,{field: 'pic', title: '文章图片',align:'center', width: 200,templet: '#pics'}
+                ,{field: 'time', title: '发布时间',align:'center', width: 180}
+                ,{field:'actions',title: '操作',toolbar: '#barDemo',align:'left',width:300 ,fixed:'right'}
+
+            ]]
+        });
+
+
+         // 执行搜索,表格重载
+        $('.search .layui-btn-primary').on('click',function () {
+            // 搜索条件
+                var title = $('#refund').val();
+                if(title==''){
+                    layer.msg('搜索条件不能为空');
+                    return false;
+                }
+                table.reload('idSystem', {
+                    page: {
+                        curr: 1
+                    }
+                    ,where: {
+                        title: title
+                    }
+                    
+                });
+        });
+
+
+
+
+
+        //监听头工具栏事件
+        table.on('toolbar(list)', function(obj){
+            var checkStatus = table.checkStatus(obj.config.id)
+            ,data = checkStatus.data; //获取选中的数据
+            switch(obj.event){
+              case 'add'://添加
+                var index =  layer.open({
+                    type:2,
+                    title:"添加文章列表",
+                    maxmin:true,
+                    width:'auto',
+                    offset : '100px',
+                    area :['1300px','700px'],
+                    content:"{:url('Article/add')}"
+                });
+              
+
+              break;
+
+              
+            }; 
+
+
+        });
+
+        
+          
+          
+        //监听行工具事件
+        table.on('tool(list)', function(obj){ //注:tool是工具条事件名,test是table原始容器的属性 lay-filter="对应的值"
+            var data = obj.data; //获得当前行数据
+            var layEvent = obj.event; //获得 lay-event 对应的值
+            var tr = obj.tr; //获得当前行 tr 的DOM对象
+
+            switch(layEvent){
+		      case 'edit'://编辑
+		        var index =  layer.open({
+                    type:2,
+                    title:"编辑信息",
+                    maxmin:true,
+                    width:'auto',
+                    offset : '100px',
+                    area :['1300px','700px'],
+                    content:"{:url('Article/edit')}?id="+data.id
+                });
+		      break;
+
+              case 'del'://删除
+                 layer.confirm('确定要删除吗?',{icon: 5},function(index){
+                    $.post("{:url('Article/del')}?id="+data.id,function(res){
+                        if(res == 1){        
+                            obj.del();
+                            layer.msg('删除成功!');
+                        }else{
+                            layer.msg('删除失败!');
+                        }
+                       
+                    })
+                });
+              break;
+
+
+		    };
+
+            
+
+        });
+
+
+
+        //批量删除————————————————————————————————————————
+        var $ = layui.$, active = {
+            pdel: function(){ //获取选中数据
+                var checkStatus = table.checkStatus('idSystem')
+                ,data = checkStatus.data;
+                if(data==""){
+                    layer.msg('请选择需要删除的数据',{icon:2});
+                    return;
+                }
+                var ids = [];
+                if(data.length>0){
+                    for(var i=0;i<data.length;i++){
+                        ids+=data[i].id+",";
+                    }
+                }
+                layer.confirm('确定要删除id为'+ids+'的用户信息吗?',function(index){
+                    $.ajax({
+                        type:'POST',
+                        url:'{:url("Article/pdel")}',
+                        data:{"ids":ids},
+                        success:function(data){
+                            if(data==1){
+                                // layer.msg('删除成功',{icon:1});
+                                layer.msg('批量删除成功',{icon:1},function () {
+                                    var index = parent.layer.getFrameIndex(window.name);// 获得frame索引
+                                    parent.layer.close(index);//关闭当前frame
+                                    parent.layui.table.reload('idSystem');//成功刷新父窗口的 table
+                                });    
+                            }else{
+                                layer.msg('批量删除失败!',{icon:2});
+                            }
+                        }
+                    })
+                })
+            }
+        }
+         $('.demoTable .layui-btn-xs').on('click', function(){
+            var type = $(this).data('type');
+            active[type] ? active[type].call(this) : '';
+        });
+        //批量删除结束————————————————————————————————————————————————————
+             
+
+
+       
+
+
+});
+
+
+
+</script>

+ 74 - 0
application/admin/view/column/add.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+  <title>爱奇君后台管理系统</title>
+  <link rel="stylesheet" href="__ROOT__/css/layui.css" media="all">
+  <script src="__ROOT__/layui.js"></script>
+  <script src="__ROOT__/lay/modules/jquery.js"></script>
+
+
+</head>
+<body>
+    <form  class="layui-form"   style="padding: 30px"  method="post"  >
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">栏目名称</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <input type="text" name="catename" id="uname" placeholder="请输入栏目名称"   autocomplete="off" class="layui-input">
+                </div>
+            </div>        
+
+            <div class="layui-form-item">
+                <div class="layui-input-block">
+                  <button type="submit" class="layui-btn" lay-submit  lay-filter="sub">立即添加</button>
+                  <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                </div>
+            </div>
+    </form>
+
+
+<script>
+
+layui.use(['form', 'layedit', 'jquery','upload','element'], function(){
+        var form = layui.form
+            ,element = layui.element
+            ,layer = layui.layer
+            ,$ = layui.jquery
+            ,upload = layui.upload
+            ;
+
+
+        // 表单监听提交,调用后台接口进行处理
+        form.on("submit(sub)", function (data) {
+               var user = data.field;  //将表单提交数据赋值给变量
+                $.post('{:url("Column/add")}', user, function (data) {   //利用ajax把表单数据传递过去  验证账户 密码
+                    if (data==1) { //用户 密码经过后台验证 通过 后登录 跳转
+                        layer.alert("添加栏目成功!", {icon: 6},function () {
+                            var index = parent.layer.getFrameIndex(window.name);// 获得frame索引
+                            parent.layer.close(index);//关闭当前frame
+                            parent.layui.table.reload('idSystem');//成功刷新父窗口的 table
+                        });
+                    }else{
+                        layer.alert('栏目名称不能重复',{icon:5});
+                    }
+                });
+
+            return false;
+        });
+
+
+
+
+
+
+
+});
+</script>
+
+
+
+
+</body>
+</html>

+ 74 - 0
application/admin/view/column/edit.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+  <title>爱奇君后台管理系统</title>
+  <link rel="stylesheet" href="__ROOT__/css/layui.css" media="all">
+  <script src="__ROOT__/layui.js"></script>
+  <script src="__ROOT__/lay/modules/jquery.js"></script>
+
+
+</head>
+<body>
+    <form  class="layui-form"   style="padding: 30px"  method="post"  >
+        <input type="hidden" name="id" value="{$list.id}"> 
+            <div class="layui-form-item">
+                <label class="layui-form-label">栏目名称</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <input type="text" name="catename" id="uname" value="{$list.catename}"   autocomplete="off" class="layui-input">
+                </div>
+            </div>        
+
+            <div class="layui-form-item">
+                <div class="layui-input-block">
+                  <button type="submit" class="layui-btn" lay-submit  lay-filter="sub">立即修改</button>
+                  <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                </div>
+            </div>
+    </form>
+
+
+<script>
+
+layui.use(['form', 'layedit', 'jquery','upload','element'], function(){
+        var form = layui.form
+            ,element = layui.element
+            ,layer = layui.layer
+            ,$ = layui.jquery
+            ,upload = layui.upload
+            ;
+
+
+        // 表单监听提交,调用后台接口进行处理
+        form.on("submit(sub)", function (data) {
+               var user = data.field;  //将表单提交数据赋值给变量
+                $.post('{:url("Column/edit")}', user, function (data) {   //利用ajax把表单数据传递过去  验证账户 密码
+                    if (data==1) { //用户 密码经过后台验证 通过 后登录 跳转
+                        layer.alert("修改栏目成功!", {icon: 6},function () {
+                            var index = parent.layer.getFrameIndex(window.name);// 获得frame索引
+                            parent.layer.close(index);//关闭当前frame
+                            parent.layui.table.reload('idSystem');//成功刷新父窗口的 table
+                        });
+                    }else{
+                        layer.alert('栏目名称不能重复',{icon:5});
+                    }
+                });
+
+            return false;
+        });
+
+
+
+
+
+
+
+});
+</script>
+
+
+
+
+</body>
+</html>

+ 178 - 0
application/admin/view/column/lst.html

@@ -0,0 +1,178 @@
+
+<!--加载公共头部文件-->
+    {include file='Base/top'}
+<!--加载公共左侧文件-->
+    {include file='Base/left'}
+<!--加载公共底部文件-->
+    {include file='Base/fotter'}
+
+
+
+
+<!-- 内容主体区域 -->
+<div class="layui-body">
+
+       <!--面包屑导航-->
+        <blockquote class="layui-elem-quote">
+            <span class="layui-breadcrumb" style="visibility: visible;">
+                <a >栏目管理</a>
+                <span lay-separator="">/</span>
+                <a href="{:url('Column/lst')}">
+                  <cite>栏目列表</cite>
+                </a>
+              </span>
+        </blockquote>
+        <!--面包屑导航 结束-->
+
+        <div >       
+            <button class="layui-btn layui-btn-normal layui-btn-xs" id="add">
+                 <i class="layui-icon">&#xe654;</i>添加
+            </button>
+
+            <button class="layui-btn layui-btn-normal layui-btn-xs" id="up">
+                <i class="layui-icon">&#xe62f;</i> 更新排序
+            </button>       
+        </div>
+
+        <form class="layui-form" action="{:url('Column/sort')}" method="post" id="vo_form">
+            <table class="layui-table" id="deleteds">
+                <thead>
+                <tr width="100">
+                    <th width="6%" style="text-align: center;">栏目ID</th>
+                    <th width="10%" style="text-align: center;">栏目名称</th>
+                    <th width="10%" style="text-align: center;">权重</th>
+                    <th width="30">操作</th>
+                </tr>
+                </thead>
+                <tbody>
+ 
+                {volist name='list' id='vo'}
+                <tr>
+                    <td align="center">{$vo.id}</td>
+
+                    <td align="center">{$vo.catename}</td>
+
+                    <td>
+                        <input type="text" class="layui-input x-sort" name="sort[{$vo['id']}]" value="{$vo.sort}">
+                    </td>
+
+                    <td>
+                        <div class="layui-btn-group">
+                              <a class="layui-btn layui-btn-xs" onclick="edit({$vo['id']})" >
+                                  <i class="layui-icon">&#xe642;</i>编辑
+                              </a>
+
+                              <a href="javascript:;" class="layui-btn layui-btn-danger layui-btn-xs delete" id="{$vo.id}" style="margin-right: 0;font-size:12px;">
+                                  <i class="layui-icon">&#xe640;</i>删除
+                              </a>
+                         </div>
+                    </td>
+
+                </tr>
+                {/volist}
+                </tbody>     
+            </table>
+
+            <!-- 分页 -->
+            <div class="pages" style="text-align:center;">
+              <div class="plist" >{$list->render()}</div>
+            </div>
+
+        </form>
+
+</div>
+<!-- 内容主体区域 结束-->
+
+
+
+<script>
+layui.use(['table','layer','laypage','jquery'], function(){
+        var table = layui.table,
+            layer = layui.layer,
+            laypage = layui.laypage,
+            $ = layui.jquery;
+
+        //点击添加 
+        $("#add").click(function () {
+            layer.open({
+                type: 2,    //open类型
+                title: false, //新开窗口标题 无
+                offset: 'auto', //上下左右居中
+                area: ['800px','700px'], //新开add页面窗口大小
+                content: '{:url("column/add")}', //这里content是一个URL,如果你不想让iframe出现滚动条,你还可以content: ['http://sentsin.com', 'no']
+                end: function () {
+                    location.reload();
+                }
+            });
+
+        });
+
+
+        //更新排序
+        $("#up").click(function () {
+            $.ajax({
+                type:'post',
+                url:'{:url("sort")}',
+                data: $('#vo_form').serialize(), //获取表单提交的所有数据
+                success: function(data) {
+                    layer.msg('规则排序成功!',{time:1000,icon: 1},function () {
+                        location.reload(true);//刷新当前页面
+                    });
+                },
+                error: function(err) {
+                    layer.msg(err, {time:1000,icon: 2},function () {
+                        location.reload(true);//刷新当前页面
+                    });
+                }
+            });
+        })
+
+
+        //删除
+        $('.delete').click(function(){
+              var id = $(this).attr('id');
+              layer.confirm('确定要删除?',{icon: 5}, function(index) {
+                $.ajax({
+                  url:"{:url('admin/Column/del')}?id="+id,
+                  data:{id:id},
+                  success:function(res) {
+                    layer.msg(res.msg);
+                    if(res.data == 200) {
+                      setTimeout(function(){
+                         window.location.reload();
+                      },1000)
+                    }
+                  }
+                })
+              })
+        })
+
+});
+
+
+
+</script>
+<script type="text/javascript">
+        //点击编辑
+        function edit($id) {
+            layer.open({
+                type: 2,    //open类型
+                title: false, //新开窗口标题 无
+                offset: 'auto', //上下左右居中
+                area: ['800px','700px'], //新开add页面窗口大小
+                content: '{:url("edit")}?id='+$id, //这里content是一个URL,传递要编辑的参数
+                end: function () {
+                    location.reload();
+                }
+            });
+
+        };
+
+
+        
+
+</script>
+
+
+
+

+ 82 - 0
application/admin/view/index/add.html

@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+  <title>站群后台管理系统</title>
+  <link rel="stylesheet" href="__ROOT__/css/layui.css" media="all">
+  <script src="__ROOT__/layui.js"></script>
+  <script src="__ROOT__/lay/modules/jquery.js"></script>
+</head>
+<body>
+    <form class="layui-form layui-form-pane" action=""  style="padding: 30px" method="post">
+
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">账号</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <input type="text" name="uname" id="uname" lay-verify="required"  placeholder="请输入账号" autocomplete="off" class="layui-input">
+                </div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">密码</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <input type="upass" name="upass" required lay-verify="required"  autocomplete="off" class="layui-input">
+                </div>
+            </div>
+
+
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">状态</label>
+                <div class="layui-input-block">
+                  <input type="radio" name="status" value="0" title="正常" >
+                  <input type="radio" name="status" value="1" title="禁止" >
+                </div>
+            </div>
+
+
+            <div class="layui-form-item">
+                <div class="layui-input-block">
+                  <button type="submit" class="layui-btn" lay-submit  lay-filter="sub">立即添加</button>
+                  <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                </div>
+            </div>
+    </form>
+
+
+<script>
+layui.use(['form', 'layedit', 'jquery','upload'], function(){
+        var form = layui.form
+            ,layer = layui.layer
+            ,$ = layui.jquery
+            ,upload = layui.upload
+            ;
+
+
+    
+    // 表单监听登录,调用后台接口进行处理
+        form.on("submit(sub)", function (data) {
+               var user = data.field;  //将表单提交数据赋值给变量
+                $.post('{:url("Index/add")}', user, function (data) {   //利用ajax把表单数据传递过去  验证账户 密码
+                    if (data==1) { //用户 密码经过后台验证 通过 后登录 跳转
+                        layer.alert("添加管理员成功!", {icon: 6},function () {
+                            var index = parent.layer.getFrameIndex(window.name);// 获得frame索引
+                            parent.layer.close(index);//关闭当前frame
+                            parent.layui.table.reload('idSystem');//成功刷新父窗口的 table
+                        });
+                    } else {
+                        layer.alert('添加失败,账号已存在!',{icon:5});
+                    }
+                });
+
+            return false;
+        });
+
+
+});
+</script>
+
+</body>
+</html>

+ 90 - 0
application/admin/view/index/edit.html

@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+  <title>站群后台管理系统</title>
+  <link rel="stylesheet" href="__ROOT__/css/layui.css" media="all">
+  <script src="__ROOT__/layui.js"></script>
+  <script src="__ROOT__/lay/modules/jquery.js"></script>
+ 
+</head>
+
+<body>
+    <form class="layui-form layui-form-pane" action=""  style="padding: 30px" method="post">
+        <input type="hidden" name="id" value="{$db.id}" placeholder="隐藏域id">
+
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">账号</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <input type="text" name="uname" id="uname" lay-verify="required" value="{$db['uname']}" placeholder="请输入账号" autocomplete="off" class="layui-input">
+                </div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">密码</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <!-- <input type="text" name="upass" id="upass"  value="{$db['upass']}"  autocomplete="off" class="layui-input"> -->
+                <input type="upass" name="upass"   autocomplete="off" placeholder="留空不修改" class="layui-input">
+
+                </div>
+            </div>
+
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">状态</label>
+                <div class="layui-input-block">
+                  <input type="radio" name="status" value="0" title="正常" {if condition="$db['status'] eq 0"} checked {/if} disabled>
+                  <input type="radio" name="status" value="1" title="禁止" {if condition="$db['status'] eq 1"} checked {/if} disabled>
+                </div>
+            </div>
+
+
+            <div class="layui-form-item">
+                <div class="layui-input-block">
+                  <button type="submit" class="layui-btn" lay-submit  lay-filter="sub">立即提交</button>
+                  <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                </div>
+            </div>
+    </form>
+
+
+<script>
+layui.use(['form', 'layedit', 'jquery'], function(){
+        var form = layui.form
+            ,layer = layui.layer
+            ,$ = layui.jquery
+            ;
+
+
+
+
+
+
+    
+    // 表单监听登录,调用后台接口进行处理
+        form.on("submit(sub)", function (data) {
+               var user = data.field;  //将表单提交数据赋值给变量
+                $.post('{:url("Index/edit")}', user, function (data) {   //利用ajax把表单数据传递过去  验证账户 密码
+                    if(data==1) { //用户 密码经过后台验证 通过 后登录 跳转
+                        layer.msg("修改成功",function () {
+                            var index = parent.layer.getFrameIndex(window.name);// 获得frame索引
+                            parent.layer.close(index);//关闭当前frame
+                            parent.layui.table.reload('idSystem');//成功刷新父窗口的 table
+                        });
+                    }else{
+                         layer.msg('修改信息不能重复');
+                    }
+                });
+
+            return false;
+        });
+      
+
+
+});
+</script>
+
+</body>
+</html>

+ 115 - 0
application/admin/view/index/log.html

@@ -0,0 +1,115 @@
+<!--加载公共头部文件-->
+    {include file='Base/top'}
+<!--加载公共左侧文件-->
+    {include file='Base/left'}
+<!--加载公共底部文件-->
+    {include file='Base/fotter'}
+
+<!-- 内容显示部分 -->
+<div class="layui-body">
+     <!--面包屑导航-->
+        <blockquote class="layui-elem-quote">
+            <span class="layui-breadcrumb" style="visibility: visible;">
+                <a >管理员管理</a>
+                <span lay-separator="">/</span>
+                <a href="{:url('index/log')}">
+                  <cite>管理员日志</cite>
+                </a>
+              </span>
+        </blockquote>
+        <!--面包屑导航 结束-->
+
+
+	<div class="layui-row  layui-col-space10" style="margin:0 10px;">
+
+		<table class="layui-hide"  id="list" lay-filter="list"></table><!-- 表格数据 -->
+
+	</div>
+</div>
+
+
+
+
+<!-- 头部工具栏模块 -->
+<script type="text/html" id="toolbarDemo"><!-- 表格自定义操作按钮 -->
+    <a class="layui-btn layui-btn-xs  layui-btn-danger" lay-event="del"><i class="layui-icon">&#xe640;</i>一键清空</a>
+</script>
+
+
+
+<script>
+layui.use(['table','layer','laypage','jquery'], function(){
+        var table = layui.table,
+            layer = layui.layer,
+            laypage = layui.laypage,
+            $ = layui.jquery;
+
+
+        //数据表格
+        table.render({
+            elem: '#list'
+            ,id:'idSystem'
+            ,url:'{:url("log_data")}'//数据接口(专门处理数据)
+            ,height:'full'
+            ,toolbar: '#toolbarDemo'
+            //分页
+            ,page: { //支持传入 laypage 组件的所有参数(某些参数除外,如:jump/elem) - 详见文档
+                layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
+                ,curr: 1 //设定初始在第 5 页
+                ,limit:15 //一页显示多少条
+                ,limits:[15,35,55]//每页条数的选择项
+                ,groups: 3 //只显示 2 个连续页码
+                ,first: "首页" //不显示首页
+                ,last: "尾页" //不显示尾页
+
+            }
+
+            ,cols: [[  	 
+                {field: 'id', title: '管理员ID', align:'center',width: 90}        
+                ,{field: 'uname', title: '管理员',align:'center', width: 120}
+                ,{field: 'ip', title: 'IP地址', align:'center',width: 130}        
+                ,{field: 'url', title: '请求链接',align:'center', width: 250}
+                ,{field: 'method', title: '请求类型',align:'center', width: 90}
+                ,{field: 'type', title: '资源类型', align:'center',width: 90}        
+                ,{field: 'remark', title: '操作行为',align:'center', width: 200}
+                ,{field: 'create_time', title: '操作时间',align:'center', width: 200}           
+
+            ]]
+        });
+
+
+
+        //监听头工具栏事件
+        table.on('toolbar(list)', function(obj){
+            var checkStatus = table.checkStatus(obj.config.id)
+            ,data = checkStatus.data; //获取选中的数据
+            switch(obj.event){
+
+            	case 'del'://删除
+	                layer.confirm('确定要清空吗?',{icon: 5},function(index){
+	                    $.post("{:url('index/truncate')}",function(res){
+	                        if(res == 1){        
+	                            layer.msg('删除成功!');
+	                        }
+	                        else{
+	                             layer.msg('没有删除权限',{icon:5});
+	                        }
+	                        
+	                    })
+	                });
+              	break;
+			};
+
+        });
+
+        
+         
+
+       
+
+
+});
+
+
+
+</script>

+ 265 - 0
application/admin/view/index/lst.html

@@ -0,0 +1,265 @@
+<!--加载公共头部文件-->
+    {include file='Base/top'}
+<!--加载公共左侧文件-->
+    {include file='Base/left'}
+<!--加载公共底部文件-->
+    {include file='Base/fotter'}
+
+<!-- 内容显示部分 -->
+<div class="layui-body">
+     <!--面包屑导航-->
+        <blockquote class="layui-elem-quote">
+            <span class="layui-breadcrumb" style="visibility: visible;">
+                <a >管理员管理</a>
+                <span lay-separator="">/</span>
+                <a href="{:url('index/lst')}">
+                  <cite>管理员信息</cite>
+                </a>
+              </span>
+        </blockquote>
+        <!--面包屑导航 结束-->
+
+
+	<div class="layui-row  layui-col-space10" style="margin:0 10px;">
+            <div class="search" style="margin:10px 0px 5px -5px;"><!-- 搜索 -->
+                <div class="layui-inline">
+                    <input  type="text" class="layui-input" name="uname" id="users"  autocomplete="off" placeholder="请输入账号">
+                </div>
+                <button class="layui-btn layui-btn-primary" data-type="reload">
+                    <i class="layui-icon"></i>搜索
+                </button>
+            </div>
+
+
+		<table class="layui-hide"  id="list" lay-filter="list"></table><!-- 表格数据 -->
+
+	</div>
+</div>
+
+
+
+
+<!-- 表格操作栏模块 -->
+<script type="text/html" id="barDemo"><!-- 表格自定义操作按钮 -->
+    {{#  if(d.id == 1){ }}
+  	<a class="layui-btn layui-btn-xs" lay-event="edit">
+        <i class="layui-icon">&#xe642;</i>编辑
+    </a>
+
+  	<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="#">
+        <i class="layui-icon">&#xe640;</i>禁止删除
+    </a>
+    {{#  } else{ }}
+    <a class="layui-btn layui-btn-xs" lay-event="edit">
+        <i class="layui-icon">&#xe642;</i>编辑
+    </a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">
+        <i class="layui-icon">&#xe640;</i>删除
+    </a>
+    {{#  } }}
+</script>
+
+
+<!-- 头部工具栏模块 -->
+<script type="text/html" id="toolbarDemo"><!-- 表格自定义操作按钮 -->
+    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">
+        <i class="layui-icon">&#xe654;</i>添加
+    </a>
+
+    <div class="layui-btn-group demoTable">
+         <button class="layui-btn layui-btn-danger layui-btn-xs" data-type="getCheckData">
+             <i class="layui-icon">&#xe640;</i>批量删除
+         </button>
+    </div>
+
+</script>
+
+
+
+<script>
+layui.use(['table','layer','laypage','jquery'], function(){
+        var table = layui.table,
+            layer = layui.layer,
+            laypage = layui.laypage,
+            $ = layui.jquery;
+
+
+        //数据表格
+        table.render({
+            elem: '#list'
+            ,id:'idSystem'
+            ,url:'{:url("lst_data")}'//数据接口(专门处理数据)
+            ,height:'full'
+            // ,toolbar: 'default' //开启工具栏,此处显示默认图标,可以自定义模板,详见文档
+             ,toolbar: '#toolbarDemo'
+
+             //分页
+            ,page: { //支持传入 laypage 组件的所有参数(某些参数除外,如:jump/elem) - 详见文档
+                layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
+                ,curr: 1 //设定初始在第 5 页
+                ,limit:5 //一页显示多少条
+                ,limits:[5,15,25]//每页条数的选择项
+                ,groups: 3 //只显示 2 个连续页码
+                ,first: "首页" //不显示首页
+                ,last: "尾页" //不显示尾页
+
+            }
+
+            ,cols: [[
+             	 {type: 'checkbox', fixed: 'left'}
+                ,{field: 'id', title: 'ID', align:'center',width: 80}        
+                ,{field: 'uname', title: '账号',align:'center', width: 120}
+                ,{field: 'last_login_time', title: '最后登录时间',align:'center', width: 190}
+                ,{field:'actions',title: '操作',toolbar: '#barDemo',align:'left',width:300,fixed:'right'}
+
+            ]]
+        });
+
+
+         // 执行搜索,表格重载
+        $('.search .layui-btn-primary').on('click',function () {
+            // 搜索条件
+                var id = $('#users').val();
+                if(id==''){
+                    layer.msg('搜索条件不能为空');
+                    return false;
+                }
+                table.reload('idSystem', {
+                    page: {
+                        curr: 1
+                    }
+                    ,where: {
+                        uname: id
+                    }
+                    
+                });
+        });
+
+
+
+
+
+        //监听头工具栏事件
+        table.on('toolbar(list)', function(obj){
+            var checkStatus = table.checkStatus(obj.config.id)
+            ,data = checkStatus.data; //获取选中的数据
+            switch(obj.event){
+              case 'add'://添加
+                var index =  layer.open({
+                    type:2,
+                    title:"添加管理员",
+                    maxmin:true,
+                    width:'auto',
+                    offset : '100px',
+                    area :['1000px','600px'],
+                    content:"{:url('index/add')}"
+                });
+              break;
+
+              
+            }; 
+
+
+        });
+
+        
+          
+          
+        //监听行工具事件
+        table.on('tool(list)', function(obj){ //注:tool是工具条事件名,test是table原始容器的属性 lay-filter="对应的值"
+            var data = obj.data; //获得当前行数据
+            var layEvent = obj.event; //获得 lay-event 对应的值
+            var tr = obj.tr; //获得当前行 tr 的DOM对象
+
+            switch(layEvent){
+		      case 'edit'://编辑
+		        var index =  layer.open({
+                    type:2,
+                    title:"编辑信息",
+                    maxmin:true,
+                    width:'auto',
+                    offset : '100px',
+                     area :['1000px','600px'],
+                    content:"{:url('index/edit')}?id="+data.id
+                });
+		      break;
+
+              case 'del'://删除
+                 layer.confirm('确定要删除吗?',{icon: 5},function(index){
+                    $.post("{:url('index/del')}?id="+data.id,function(res){
+                        if(res == 1){        
+                            obj.del();
+                            layer.msg('删除成功!');
+                        }else if(res==3){
+                            layer.msg('超级管理员不允许删除!');
+                        }else{
+                             layer.msg('没有删除权限',{icon:5});
+                        }
+                        
+                    })
+                });
+              break;
+
+
+		    };
+            // if(layEvent=='del'){
+            //     location.href = "{:url('index/del')}?id="+data.id; 
+            // }
+            
+
+        });
+
+
+
+        //批量删除————————————————————————————————————————
+        var $ = layui.$, active = {
+            getCheckData: function(){ //获取选中数据
+                var checkStatus = table.checkStatus('idSystem')
+                ,data = checkStatus.data;
+                if(data==""){
+                    layer.msg('请选择需要删除的数据',{icon:2});
+                    return;
+                }
+                var ids = [];
+                if(data.length>0){
+                    for(var i=0;i<data.length;i++){
+                        ids+=data[i].id+",";
+                    }
+                }
+                layer.confirm('确定要删除id为'+ids+'的用户信息吗?',function(index){
+                    $.ajax({
+                        type:'POST',
+                        url:'{:url("index/pdel")}',
+                        data:{"ids":ids},
+                        success:function(data){
+                            if(data==1){
+                                // layer.msg('删除成功',{icon:1});
+                                layer.msg('删除成功',{icon:1},function () {
+                                    var index = parent.layer.getFrameIndex(window.name);// 获得frame索引
+                                    parent.layer.close(index);//关闭当前frame
+                                    parent.layui.table.reload('idSystem');//成功刷新父窗口的 table
+                                });    
+                            }else{
+                                layer.msg('没有批量删除权限',{icon:5});
+                            }
+                        }
+                    })
+                })
+            }
+        }
+         $('.demoTable .layui-btn-xs').on('click', function(){
+            var type = $(this).data('type');
+            active[type] ? active[type].call(this) : '';
+        });
+        //批量删除结束————————————————————————————————————————————————————
+             
+
+
+       
+
+
+});
+
+
+
+</script>

+ 168 - 0
application/admin/view/index/server.html

@@ -0,0 +1,168 @@
+<!--加载公共头部文件-->
+    {include file='Base/top'}
+
+<!--加载公共左侧文件-->
+    {include file='Base/left'}
+<!--加载公共底部文件-->
+    {include file='Base/fotter'}
+
+<!-- 内容主体区域 -->
+<div class="layui-body">  
+
+	 <!--面包屑导航-->
+        <blockquote class="layui-elem-quote">
+            <span class="layui-breadcrumb" style="visibility: visible;">
+                <a >控制台</a>
+                <span lay-separator="">/</span>
+                <a href="{:url('index/server')}">
+                  <cite>主页信息</cite>
+                </a>
+              </span>
+        </blockquote>
+        <!--面包屑导航 结束-->
+
+    <div class="mainfrm">
+		    <div class="layui-row  layui-col-space10" style="margin:0 5px;">
+
+
+		        	<div class="layui-col-xs6">
+			            <div class="layui-card-header">管理员登录</div>
+	            		<div class="layui-card-body" id="main" style="height: 450px;"></div>
+		        	</div>
+
+
+	           		<div class="layui-col-xs6">
+	           			<!-- <table class="layui-table">
+			                <colgroup>
+			                    <col width="160" height="1000">
+			                    <col>
+			                </colgroup>
+			                <thead>
+			                	系统信息
+			                </thead>
+			                <tbody>
+			                {volist name="info" id="v" key="k"}
+			                <tr>
+			                    <td class="text">{$key}:</td>
+			                    <td class="input">{$v}</td>
+			                </tr>
+			                {/volist}
+			                </tbody>
+			            </table> -->
+			            <div class="layui-card">
+					        <div class="layui-card-header">系统信息</div>
+					        <div class="layui-card-body layui-text" >
+					          <table class="layui-table">
+					            <colgroup>
+					              <col width="110">
+					              <col>
+					            </colgroup>
+					            <tbody>
+					            {volist name="info" id="v" key="k"}
+					              <tr>
+					                	<td class="text" width="16%">{$key}:</td>
+			                    		<td class="input">{$v}</td>
+					              </tr>
+					            {/volist}
+					            </tbody>
+					          </table>
+					        </div>
+					    </div>
+			       </div>
+		      
+
+		        
+
+		    </div>
+
+	</div>
+	
+</div>
+ 
+<script type="text/javascript">
+var a = "{$web.date_string}";
+var date = a.split(",");
+
+var b = "{$web.login_sum}";
+var login_sum = b.split(",");
+
+
+var myChart = echarts.init(document.getElementById('main'));
+
+option = {
+    tooltip: {
+        trigger: 'axis',
+        position: function (pt) {
+            return [pt[0], '10%'];
+        }
+    },
+    grid: {
+        top: 50,
+        bottom: 70,
+        left:40,
+        right:50
+    },
+    toolbox: {
+        feature: {
+            dataZoom: {
+                yAxisIndex: 'none'
+            },
+            restore: {},
+            saveAsImage: {}
+        }
+    },
+    xAxis: {
+        type: 'category',
+        boundaryGap: false,
+        data: date
+    },
+    yAxis: {
+        type: 'value',
+        boundaryGap: [0, '100%']
+    },
+    dataZoom: [{
+        type: 'inside',
+        start: 0,
+        end: 100
+    }, {
+        start: 0,
+        end: 100,
+        handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
+        handleSize: '100%',
+        handleStyle: {
+            color: '#fff',
+            shadowBlur: 3,
+            shadowColor: '#009688',
+            shadowOffsetX: 2,
+            shadowOffsetY: 2
+        }
+    }],
+    series: [
+        {
+            name:'用户登录次数',
+            type:'line',
+            smooth:true,
+            symbol: 'none',
+            sampling: 'average',
+            itemStyle: {
+                normal: {
+                    color: '#009688'
+                }
+            },
+            areaStyle: {
+                normal: {
+                    color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+                        offset: 0,
+                        color: '#009688'
+                    }, {
+                        offset: 1,
+                        color: '#009688'
+                    }])
+                }
+            },
+            data: login_sum
+        }
+    ]
+};
+myChart.setOption(option);
+</script>

+ 552 - 0
application/admin/view/login/lst.html

@@ -0,0 +1,552 @@
+<!DOCTYPE html>
+{__NOLAYOUT__}
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <title>站群后台管理系统</title>
+    <link rel="stylesheet" href=" __ROOT__/css/layui.css">
+    <script src="__ROOT__/layui.js"></script>
+
+
+    <style type="text/css">
+            h1 {text-align:center;color:#1d598e;font-size:30px;}
+            
+            .layui-input{
+                width: 106%;
+            }
+           .layui-btn{
+                width: 100%;
+            }
+
+            /*特效css*/
+            .tb960x90 {
+            display:none!important;
+            display:none
+            }
+            body {
+                background-color:#232323;
+            }
+    </style>
+
+
+
+    
+
+</head>
+<body>
+     
+<div id="container"></div>
+
+        <div class="mainfrm" style="position:relative;margin:0 auto;top:80%;margin-top:-650px;border:10px solid #efefef;width:370px;height:300px;padding:30px 0 0 20px;">
+            <div class="layui-row  layui-col-space10" style="margin:0 10px;">
+                <div class="layui-col-xs12" style="width:320px;">
+
+                    <form class="layui-form layui-form-pane" lay-filter="form" action="" method="post">
+                        <div class="layui-form-item">
+                            <h1>站群后台管理系统</h1>
+                        </div>
+     
+                        <div class="layui-form-item" style="text-align: center;" >
+                            <label class="layui-form-label">用户名</label>
+                            <div class="layui-input-inline" >
+                                <input type="text" name="uname" id="uname" value="" autocomplete="off" placeholder="不能为空"  class="layui-input">
+                            </div>
+                        </div>
+
+                        <div class="layui-form-item" style="text-align: center">
+                            <label class="layui-form-label">密码</label>
+                            <div class="layui-input-inline">
+                                <input type="password" name="upass" id="upass" value=""  autocomplete="off" placeholder=""  class="layui-input">
+                            </div>
+                        </div>
+
+                        <div class="layui-form-item" style="text-align: center">
+                              <div id="slider"></div><!-- 滑块验证 -->
+                        </div>
+
+                        <div class="layui-form-item" id="login" style="text-align: center;">     
+                            <button class="layui-btn" lay-submit lay-filter="login" >登录</button>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </div>
+    <!-- </div> -->
+ 
+
+
+<script>
+layui.config({
+    base: '__ROOT__/module/'
+}).
+use(['form', 'layedit', 'jquery',"sliderVerify"], function(){
+        var form = layui.form
+            ,layer = layui.layer
+            ,$ = layui.jquery
+            ,sliderVerify = layui.sliderVerify
+            ;
+
+         var slider = sliderVerify.render({
+                    elem: '#slider',
+                })
+
+    
+    // 表单监听登录,调用后台接口进行处理
+        form.on("submit(login)", function (data) {
+           var uname =$.trim($("#uname").val());
+            var upass =$.trim($("#upass").val());
+
+            if (uname == '') { //如果验证码输入为空
+                layer.msg('用户名不能为空!');
+            } else if (upass == '') {
+                layer.msg('密码不能为空!')
+            } else {
+                if(slider.isOk())
+                {
+                   var user = data.field;  //将表单提交数据赋值给变量
+                    //console.log(user);
+                    //弹出loading
+                    //{:url("/lst")}:为后台登录地址,设置路由进行替换的(在route.php中查看)
+                    $.post('{:url("/lst")}', user, function (data) {   //利用ajax把表单数据传递过去  验证账户 密码
+                        if (data==1) { //用户 密码经过后台验证 通过 后登录 跳转
+                            layer.msg('登录中····');
+                            setTimeout(function () {
+                                window.location.href = "{:url('index/server')}";
+                            }, 2000);
+                        }else{
+                            layer.msg('账户或者密码不对!');
+                        }
+                    });
+                }else{
+                    layer.msg("请先通过滑块验证");
+                }
+            }
+
+            return false;
+        });
+
+
+        
+
+
+});
+</script>
+
+<!-- 特效js -->
+<script>
+    var Sketch = function() {
+    function e(e) {
+        e = n(e || {}, l);
+        var t = "sketch-" + r++,
+            o = e.hasOwnProperty("canvas"),
+            u = o ? e.canvas : document.createElement("canvas");
+        switch (e.type) {
+            case m:
+                try {
+                    s = u.getContext("webgl", e)
+                } catch (d) {}
+                try {
+                    s = s || u.getContext("experimental-webgl", e)
+                } catch (d) {}
+                if (!s) throw "WebGL not supported";
+                break;
+            case c:
+                try {
+                    s = u.getContext("2d", e)
+                } catch (d) {}
+                if (!s) throw "Canvas not supported";
+                break;
+            default:
+                u = s = document.createElement("div")
+        }
+        return s.canvas = u, u.className = "sketch", o ? e.autoresize = !1 : (e.container.appendChild(u), e.hasOwnProperty("autoresize") || (e.autoresize = l.autoresize), u.id = t), n(self, g), n(s, e), n(s, p), a(), e.autoresize && i(), w.push(s), s.autostart && setTimeout(s.start, 0), s
+    }
+
+    function n(e, n) {
+        for (var t in n) e.hasOwnProperty(t) || (e[t] = n[t]);
+        return e
+    }
+
+    function t(e) {
+        function n(e, n) {
+            return function() {
+                e.call(n, arguments)
+            }
+        }
+        var t = {};
+        for (var o in e) t[o] = "function" == typeof e[o] ? n(e[o], e) : e[o];
+        return t
+    }
+
+    function o(e, n) {
+        e.length = 0;
+        for (var t = 0, o = n.length; o > t; t++) e[t] = n[t];
+        return e
+    }
+
+    function a() {
+        function e(e) {
+            return M[e] || String.fromCharCode(e)
+        }
+
+        function n(e) {
+            s.mouse.ox = s.mouse.x, s.mouse.oy = s.mouse.y, s.mouse.x = e.x, s.mouse.y = e.y, s.mouse.dx = s.mouse.x - s.mouse.ox, s.mouse.dy = s.mouse.y - s.mouse.oy
+        }
+
+        function a(e) {
+            var n, o = t(e);
+            o.original = e;
+            for (var a = s.canvas, u = 0, i = 0; a; a = a.offsetParent) u += a.offsetLeft, i += a.offsetTop;
+            if (o.touches && o.touches.length)
+                for (var r, c = o.touches.length - 1; c >= 0; c--) r = o.touches[c], r.x = r.pageX - u, r.y = r.pageY - i, n = A[c] || r, r.dx = r.x - n.x, r.dy = r.y - n.x, r.ox = n.x, r.oy = n.y, A[c] = t(r);
+            else o.x = o.pageX - u, o.y = o.pageY - i, n = A.mouse || o, o.dx = o.x - n.x, o.dy = o.y - n.y, o.ox = n.x, o.oy = n.y, A.mouse = o;
+            return o
+        }
+
+        function u(e) {
+            e.preventDefault(), e = a(e), o(s.touches, e.touches), n(s.touches[0]), s.touchstart && s.touchstart(e), s.mousedown && s.mousedown(e)
+        }
+
+        function r(e) {
+            e = a(e), o(s.touches, e.touches), n(s.touches[0]), s.touchmove && s.touchmove(e), s.mousemove && s.mousemove(e)
+        }
+
+        function c(e) {
+            if (e = a(e), e.touches.length)
+                for (var n in A) e.touches[n] || A[n];
+            else A = {};
+            s.touchend && s.touchend(e), s.mouseup && s.mouseup(e)
+        }
+
+        function m(e) {
+            e = a(e), s.mouseover && s.mouseover(e)
+        }
+
+        function d(e) {
+            e = a(e), s.dragging || (x(s.canvas, "mousemove", h), x(s.canvas, "mouseup", v), y(document, "mousemove", h), y(document, "mouseup", v), s.dragging = !0), o(s.touches, [e]), s.touchstart && s.touchstart(e), s.mousedown && s.mousedown(e)
+        }
+
+        function h(e) {
+            e = a(e), n(e), o(s.touches, [e]), s.touchmove && s.touchmove(e), s.mousemove && s.mousemove(e)
+        }
+
+        function f(e) {
+            e = a(e), s.mouseout && s.mouseout(e)
+        }
+
+        function v(e) {
+            e = a(e), s.dragging && (x(document, "mousemove", h), x(document, "mouseup", v), y(s.canvas, "mousemove", h), y(s.canvas, "mouseup", v), s.dragging = !1), A.mouse, s.touchend && s.touchend(e), s.mouseup && s.mouseup(e)
+        }
+
+        function w(e) {
+            e = a(e), s.click && s.click(e)
+        }
+
+        function l(n) {
+            s.keys[e(n.keyCode)] = !0, s.keys[n.keyCode] = !0, s.keydown && s.keydown(n)
+        }
+
+        function g(n) {
+            s.keys[e(n.keyCode)] = !1, s.keys[n.keyCode] = !1, s.keyup && s.keyup(n)
+        }
+        var M = {
+            8: "BACKSPACE",
+            9: "TAB",
+            13: "ENTER",
+            16: "SHIFT",
+            27: "ESCAPE",
+            32: "SPACE",
+            37: "LEFT",
+            38: "UP",
+            39: "RIGHT",
+            40: "DOWN"
+        };
+        for (var k in M) p.keys[M[k]] = !1;
+        var A = {};
+        y(s.canvas, "touchstart", u), y(s.canvas, "touchmove", r), y(s.canvas, "touchend", c), y(s.canvas, "mouseover", m), y(s.canvas, "mousedown", d), y(s.canvas, "mousemove", h), y(s.canvas, "mouseout", f), y(s.canvas, "mouseup", v), y(s.canvas, "click", w), y(document, "keydown", l), y(document, "keyup", g), y(window, "resize", i)
+    }
+
+    function u() {
+        if (!h) {
+            var e = Date.now();
+            s.dt = e - s.now, s.millis += s.dt, s.now = e, s.update && s.update(s.dt), s.autoclear && s.clear(), s.draw && s.draw(s)
+        }
+        h = ++h % s.interval, f = requestAnimationFrame(u)
+    }
+
+    function i() {
+        if (s.autoresize) {
+            var e = s.type === d ? s.style : s.canvas;
+            s.fullscreen ? (s.height = e.height = window.innerHeight, s.width = e.width = window.innerWidth) : (e.height = s.height, e.width = s.width), s.resize && s.resize()
+        }
+    }
+    var s, r = 0,
+        c = "canvas",
+        m = "web-gl",
+        d = "dom",
+        h = 0,
+        f = -1,
+        v = {},
+        w = [],
+        l = {
+            fullscreen: !0,
+            autostart: !0,
+            autoclear: !0,
+            autopause: !0,
+            autoresize: !0,
+            container: document.body,
+            interval: 1,
+            type: c
+        },
+        g = {
+            PI: Math.PI,
+            TWO_PI: 2 * Math.PI,
+            HALF_PI: Math.PI / 2,
+            QUARTER_PI: Math.PI / 4,
+            abs: Math.abs,
+            acos: Math.acos,
+            asin: Math.asin,
+            atan2: Math.atan2,
+            atan: Math.atan,
+            ceil: Math.ceil,
+            cos: Math.cos,
+            exp: Math.exp,
+            floor: Math.floor,
+            log: Math.log,
+            max: Math.max,
+            min: Math.min,
+            pow: Math.pow,
+            round: Math.round,
+            sin: Math.sin,
+            sqrt: Math.sqrt,
+            tan: Math.tan,
+            random: function(e, n) {
+                return e && "number" == typeof e.length && e.length ? e[Math.floor(Math.random() * e.length)] : ("number" != typeof n && (n = e || 1, e = 0), e + Math.random() * (n - e))
+            }
+        },
+        p = {
+            millis: 0,
+            now: 0 / 0,
+            dt: 0 / 0,
+            keys: {},
+            mouse: {
+                x: 0,
+                y: 0,
+                ox: 0,
+                oy: 0,
+                dx: 0,
+                dy: 0
+            },
+            touches: [],
+            initialized: !1,
+            dragging: !1,
+            running: !1,
+            start: function() {
+                s.running || (s.setup && !s.initialized && (s.autopause && (y(window, "focus", s.start), y(window, "blur", s.stop)), s.setup()), s.initialized = !0, s.running = !0, s.now = Date.now(), u())
+            },
+            stop: function() {
+                cancelAnimationFrame(f), s.running = !1
+            },
+            toggle: function() {
+                (s.running ? s.stop : s.start)()
+            },
+            clear: function() {
+                s.canvas && (s.canvas.width = s.canvas.width)
+            },
+            destroy: function() {
+                var e, n, t, o, a, u;
+                w.splice(w.indexOf(s), 1), s.stop();
+                for (n in v) {
+                    for (t = v[n], a = 0, u = t.length; u > a; a++) e = t[a], x(e.el, n, e.fn);
+                    v[n]
+                }
+                s.container.removeChild(s.canvas);
+                for (o in s) s.hasOwnProperty(o) && s[o]
+            }
+        },
+        y = function() {
+            function e(e, n, t) {
+                v[n] || (v[n] = []), v[n].push({
+                    el: e,
+                    fn: t
+                })
+            }
+            return window.addEventListener ? function(n, t, o) {
+                n.addEventListener(t, o, !1), e(n, t, o)
+            } : window.attachEvent ? function(n, t, o) {
+                n.attachEvent("on" + t, o), e(n, t, o)
+            } : function(n, t, o) {
+                n["on" + t] = o, e(n, t, o)
+            }
+        }(),
+        x = function() {
+            function e(e, n, t) {
+                if (v[n])
+                    for (var o, a = v[n].length - 1; a >= 0; a--) o = v[n][a], o.el === e && o.fn === t && v[n].splice(a, 1)
+            }
+            return window.removeEventListener ? function(n, t, o) {
+                n.removeEventListener(t, o, !1), e(n, t, o)
+            } : window.detachEvent ? function(n, t, o) {
+                n.detachEvent("on" + t, o), e(n, t, o)
+            } : (el["on" + ev] = null, e(el, ev, fn), void 0)
+        }();
+    return {
+        CANVAS: c,
+        WEB_GL: m,
+        DOM: d,
+        instances: w,
+        create: e
+    }
+}();
+Date.now || (Date.now = function() {
+        return +new Date
+    }),
+    function() {
+        for (var e = 0, n = ["ms", "moz", "webkit", "o"], t = 0; n.length > t && !window.requestAnimationFrame; ++t) window.requestAnimationFrame = window[n[t] + "RequestAnimationFrame"], window.cancelAnimationFrame = window[n[t] + "CancelAnimationFrame"] || window[n[t] + "CancelRequestAnimationFrame"];
+        window.requestAnimationFrame || (window.requestAnimationFrame = function(n) {
+            var t = Date.now(),
+                o = Math.max(0, 16 - (t - e)),
+                a = window.setTimeout(function() {
+                    n(t + o)
+                }, o);
+            return e = t + o, a
+        }), window.cancelAnimationFrame || (window.cancelAnimationFrame = function(e) {
+            clearTimeout(e)
+        })
+    }();
+
+function Particle(x, y, radius) {
+    this.init(x, y, radius);
+}
+
+Particle.prototype = {
+
+    init: function(x, y, radius) {
+
+        this.alive = true;
+
+        this.radius = radius || 10;
+        this.wander = 0.15;
+        this.theta = random(TWO_PI);
+        this.drag = 0.92;
+        this.color = '#fff';
+
+        this.x = x || 0.0;
+        this.y = y || 0.0;
+
+        this.vx = 0.0;
+        this.vy = 0.0;
+    },
+
+    move: function() {
+
+        this.x += this.vx;
+        this.y += this.vy;
+
+        this.vx *= this.drag;
+        this.vy *= this.drag;
+
+        this.theta += random(-0.5, 0.5) * this.wander;
+        this.vx += sin(this.theta) * 0.1;
+        this.vy += cos(this.theta) * 0.1;
+
+        this.radius *= 0.96;
+        this.alive = this.radius > 0.5;
+    },
+
+    draw: function(ctx) {
+
+        ctx.beginPath();
+        ctx.arc(this.x, this.y, this.radius, 0, TWO_PI);
+        ctx.fillStyle = this.color;
+        ctx.fill();
+    }
+};
+
+// ----------------------------------------
+// Example
+// ----------------------------------------
+
+var MAX_PARTICLES = 280;
+var COLOURS = ['#69D2E7', '#A7DBD8', '#E0E4CC', '#F38630', '#FA6900', '#FF4E50', '#F9D423'];
+
+var particles = [];
+var pool = [];
+
+var demo = Sketch.create({
+    container: document.getElementById('container')
+});
+
+demo.setup = function() {
+
+    // Set off some initial particles.
+    var i, x, y;
+
+    for (i = 0; i < 20; i++) {
+        x = (demo.width * 0.5) + random(-100, 100);
+        y = (demo.height * 0.5) + random(-100, 100);
+        demo.spawn(x, y);
+    }
+};
+
+demo.spawn = function(x, y) {
+
+    if (particles.length >= MAX_PARTICLES)
+        pool.push(particles.shift());
+
+    particle = pool.length ? pool.pop() : new Particle();
+    particle.init(x, y, random(5, 40));
+
+    particle.wander = random(0.5, 2.0);
+    particle.color = random(COLOURS);
+    particle.drag = random(0.9, 0.99);
+
+    theta = random(TWO_PI);
+    force = random(2, 8);
+
+    particle.vx = sin(theta) * force;
+    particle.vy = cos(theta) * force;
+
+    particles.push(particle);
+}
+
+demo.update = function() {
+
+    var i, particle;
+
+    for (i = particles.length - 1; i >= 0; i--) {
+
+        particle = particles[i];
+
+        if (particle.alive) particle.move();
+        else pool.push(particles.splice(i, 1)[0]);
+    }
+};
+
+demo.draw = function() {
+
+    demo.globalCompositeOperation = 'lighter';
+
+    for (var i = particles.length - 1; i >= 0; i--) {
+        particles[i].draw(demo);
+    }
+};
+
+demo.mousemove = function() {
+
+    var particle, theta, force, touch, max, i, j, n;
+
+    for (i = 0, n = demo.touches.length; i < n; i++) {
+
+        touch = demo.touches[i], max = random(1, 4);
+        for (j = 0; j < max; j++) demo.spawn(touch.x, touch.y);
+    }
+};
+</script>
+
+
+
+</body>
+</html>
+

+ 74 - 0
application/admin/view/tags/add.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+  <title>爱奇君后台管理系统</title>
+  <link rel="stylesheet" href="__ROOT__/css/layui.css" media="all">
+  <script src="__ROOT__/layui.js"></script>
+  <script src="__ROOT__/lay/modules/jquery.js"></script>
+
+
+</head>
+<body>
+    <form  class="layui-form"   style="padding: 30px"  method="post"  >
+
+            <div class="layui-form-item">
+                <label class="layui-form-label">标签名称</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <input type="text" name="tagname" id="uname" placeholder="请输入标签名称"   autocomplete="off" class="layui-input">
+                </div>
+            </div>        
+
+            <div class="layui-form-item">
+                <div class="layui-input-block">
+                  <button type="submit" class="layui-btn" lay-submit  lay-filter="sub">立即添加</button>
+                  <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                </div>
+            </div>
+    </form>
+
+
+<script>
+
+layui.use(['form', 'layedit', 'jquery','upload','element'], function(){
+        var form = layui.form
+            ,element = layui.element
+            ,layer = layui.layer
+            ,$ = layui.jquery
+            ,upload = layui.upload
+            ;
+
+
+        // 表单监听提交,调用后台接口进行处理
+        form.on("submit(sub)", function (data) {
+               var user = data.field;  //将表单提交数据赋值给变量
+                $.post('{:url("Tags/add")}', user, function (data) {   
+                    if (data==1) {
+                        layer.alert("添加标签成功!", {icon: 6},function () {
+                            var index = parent.layer.getFrameIndex(window.name);// 获得frame索引
+                            parent.layer.close(index);//关闭当前frame
+                            parent.layui.table.reload('idSystem');//成功刷新父窗口的 table
+                        });
+                    }else{
+                        layer.alert('标签名称不能重复',{icon:5});
+                    }
+                });
+
+            return false;
+        });
+
+
+
+
+
+
+
+});
+</script>
+
+
+
+
+</body>
+</html>

+ 73 - 0
application/admin/view/tags/edit.html

@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+  <title>爱奇君后台管理系统</title>
+  <link rel="stylesheet" href="__ROOT__/css/layui.css" media="all">
+  <script src="__ROOT__/layui.js"></script>
+  <script src="__ROOT__/lay/modules/jquery.js"></script>
+
+
+</head>
+<body>
+    <form  class="layui-form"   style="padding: 30px"  method="post"  >
+        <input type="hidden" name="id" value="{$list.id}"> 
+            <div class="layui-form-item">
+                <label class="layui-form-label">标签名称</label>
+                <div class="layui-input-inline" style="width:400px;">
+                <input type="text" name="tagname" id="uname" value="{$list.tagname}"   autocomplete="off" class="layui-input">
+                </div>
+            </div>        
+
+            <div class="layui-form-item">
+                <div class="layui-input-block">
+                  <button type="submit" class="layui-btn" lay-submit  lay-filter="sub">立即修改</button>
+                  <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                </div>
+            </div>
+    </form>
+
+
+<script>
+
+layui.use(['form', 'layedit', 'jquery','element'], function(){
+        var form = layui.form
+            ,element = layui.element
+            ,layer = layui.layer
+            ,$ = layui.jquery
+            ;
+
+
+        // 表单监听提交,调用后台接口进行处理
+        form.on("submit(sub)", function (data) {
+               var user = data.field;  //将表单提交数据赋值给变量
+                $.post('{:url("Tags/edit")}', user, function (data) {   //利用ajax把表单数据传递过去  验证账户 密码
+                    if (data==1) { //用户 密码经过后台验证 通过 后登录 跳转
+                        layer.alert("修改标签成功!", {icon: 6},function () {
+                            var index = parent.layer.getFrameIndex(window.name);// 获得frame索引
+                            parent.layer.close(index);//关闭当前frame
+                            parent.layui.table.reload('idSystem');//成功刷新父窗口的 table
+                        });
+                    }else{
+                        layer.alert('标签名称不能重复',{icon:5});
+                    }
+                });
+
+            return false;
+        });
+
+
+
+
+
+
+
+});
+</script>
+
+
+
+
+</body>
+</html>

+ 261 - 0
application/admin/view/tags/lst.html

@@ -0,0 +1,261 @@
+<!--加载公共头部文件-->
+    {include file='Base/top'}
+<!--加载公共左侧文件-->
+    {include file='Base/left'}
+<!--加载公共底部文件-->
+    {include file='Base/fotter'}
+
+
+<!-- 内容显示部分 -->
+<div class="layui-body">
+    <!--面包屑导航-->
+        <blockquote class="layui-elem-quote">
+            <span class="layui-breadcrumb" style="visibility: visible;">
+                <a >标签管理</a>
+                <span lay-separator="">/</span>
+                <a href="{:url('Tags/lst')}">
+                  <cite>标签列表</cite>
+                </a>
+              </span>
+        </blockquote>
+        <!--面包屑导航 结束-->
+
+	<div class="layui-row  layui-col-space10" style="margin:0 10px;">
+    		 <div class="search" style="margin:10px 0px 5px -5px;"><!-- 搜索 -->
+                <div class="layui-inline">
+                    <input  type="text" class="layui-input" name="id" id="refund"  autocomplete="off" placeholder="请输入id">
+                </div>
+                <button class="layui-btn layui-btn-primary" data-type="reload">
+                    <i class="layui-icon"></i>搜索
+                </button>
+            </div>
+		<table class="layui-hide"  id="list" lay-filter="list"></table><!-- 表格数据 -->
+
+	</div>
+</div>
+
+<!-- <script type="text/html" id="status">
+    {{#  if(d.show_status == 0){ }}
+    <div class="layui-badge layui-bg-green">隐藏</div>
+    {{#  } else if(d.show_status == 1){ }}
+    <div class="layui-badge layui-bg-read">显示</div>
+    {{#  } }}
+</script> -->
+
+
+
+
+ 
+<!-- 表格操作栏模块 -->
+<script type="text/html" id="barDemo"><!-- 表格自定义操作按钮 -->
+  	<a class="layui-btn layui-btn-xs" lay-event="edit">
+        <i class="layui-icon">&#xe642;</i>编辑
+    </a>
+  	<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">
+        <i class="layui-icon">&#xe640;</i>删除
+    </a>
+</script>
+
+
+
+<!-- 头部工具栏模块 -->
+<script type="text/html" id="toolbarDemo"><!-- 表格自定义操作按钮 -->
+    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">
+        <i class="layui-icon">&#xe654;</i>添加
+    </a>
+
+    <div class="layui-btn-group demoTable">
+         <button class="layui-btn layui-btn-danger layui-btn-xs" data-type="pdel">
+             <i class="layui-icon">&#xe640;</i>批量删除
+         </button>
+    </div>
+
+</script>
+
+
+
+
+<script>
+layui.use(['table','layer','laypage','jquery'], function(){
+        var table = layui.table,
+            layer = layui.layer,
+            laypage = layui.laypage,
+            $ = layui.jquery;
+
+
+        //数据表格
+        table.render({
+            elem: '#list'
+            ,id:'idSystem'
+            ,url:'{:url("lst_data")}'//数据接口(专门处理数据)
+            ,height:'full'
+            // ,toolbar: 'default' //开启工具栏,此处显示默认图标,可以自定义模板,详见文档
+             ,toolbar: '#toolbarDemo'
+
+             //分页
+            ,page: { //支持传入 laypage 组件的所有参数(某些参数除外,如:jump/elem) - 详见文档
+                layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局
+                ,curr: 1 //设定初始在第 5 页
+                ,limit:10 //一页显示多少条
+                ,limits:[10,20,30]//每页条数的选择项
+                ,groups: 3 //只显示 2 个连续页码
+                ,first: "首页" //不显示首页
+                ,last: "尾页" //不显示尾页
+
+            }
+
+            ,cols: [[
+             	 {type: 'checkbox', fixed: 'left'}
+                ,{field: 'id', title: '标签ID',sort:true, align:'center',width: 100}
+                ,{field: 'tagname', title: '标签名称',align:'center', width: 150}
+                ,{field:'actions',title: '操作',toolbar: '#barDemo',align:'left',width:300 ,fixed:'right'}
+
+            ]]
+        });
+
+
+         // 执行搜索,表格重载
+        $('.search .layui-btn-primary').on('click',function () {
+            // 搜索条件
+                var id = $('#refund').val();
+                if(id==''){
+                    layer.msg('搜索条件不能为空');
+                    return false;
+                }
+                table.reload('idSystem', {
+                    page: {
+                        curr: 1
+                    }
+                    ,where: {
+                        id: id
+                    }
+                    
+                });
+        });
+
+
+
+
+
+        //监听头工具栏事件
+        table.on('toolbar(list)', function(obj){
+            var checkStatus = table.checkStatus(obj.config.id)
+            ,data = checkStatus.data; //获取选中的数据
+            switch(obj.event){
+              case 'add'://添加
+                var index =  layer.open({
+                    type:2,
+                    title:"添加标签",
+                    maxmin:true,
+                    width:'auto',
+                    offset : '100px',
+                    area :['1000px','600px'],
+                    content:"{:url('Tags/add')}"
+                });
+              
+
+              break;
+
+              
+            }; 
+
+
+        });
+
+        
+          
+          
+        //监听行工具事件
+        table.on('tool(list)', function(obj){ //注:tool是工具条事件名,test是table原始容器的属性 lay-filter="对应的值"
+            var data = obj.data; //获得当前行数据
+            var layEvent = obj.event; //获得 lay-event 对应的值
+            var tr = obj.tr; //获得当前行 tr 的DOM对象
+
+            switch(layEvent){
+		      case 'edit'://编辑
+		        var index =  layer.open({
+                    type:2,
+                    title:"编辑信息",
+                    maxmin:true,
+                    width:'auto',
+                    offset : '100px',
+                     area :['1000px','600px'],
+                    content:"{:url('Tags/edit')}?id="+data.id
+                });
+		      break;
+
+              case 'del'://删除
+                 layer.confirm('确定要删除吗?',{icon: 5},function(index){
+                    $.post("{:url('Tags/del')}?id="+data.id,function(res){
+                        if(res == 1){        
+                            obj.del();
+                            layer.msg('删除成功!');
+                        }else{
+                            layer.msg('删除失败!');
+                        }
+                       
+                    })
+                });
+              break;
+
+
+		    };
+
+            
+
+        });
+
+
+
+        //批量删除————————————————————————————————————————
+        var $ = layui.$, active = {
+            pdel: function(){ //获取选中数据
+                var checkStatus = table.checkStatus('idSystem')
+                ,data = checkStatus.data;
+                if(data==""){
+                    layer.msg('请选择需要删除的数据',{icon:2});
+                    return;
+                }
+                var ids = [];
+                if(data.length>0){
+                    for(var i=0;i<data.length;i++){
+                        ids+=data[i].id+",";
+                    }
+                }
+                layer.confirm('确定要删除id为'+ids+'的用户信息吗?',function(index){
+                    $.ajax({
+                        type:'POST',
+                        url:'{:url("Tags/pdel")}',
+                        data:{"ids":ids},
+                        success:function(data){
+                            if(data==1){
+                                // layer.msg('删除成功',{icon:1});
+                                layer.msg('批量删除成功',{icon:1},function () {
+                                    var index = parent.layer.getFrameIndex(window.name);// 获得frame索引
+                                    parent.layer.close(index);//关闭当前frame
+                                    parent.layui.table.reload('idSystem');//成功刷新父窗口的 table
+                                });    
+                            }else{
+                                layer.msg('没有批量删除权限!',{icon:2});
+                            }
+                        }
+                    })
+                })
+            }
+        }
+         $('.demoTable .layui-btn-xs').on('click', function(){
+            var type = $(this).data('type');
+            active[type] ? active[type].call(this) : '';
+        });
+        //批量删除结束————————————————————————————————————————————————————
+             
+
+
+       
+
+
+});
+
+
+
+</script>

+ 12 - 0
application/command.php

@@ -0,0 +1,12 @@
+<?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: yunwuxin <448901948@qq.com>
+// +----------------------------------------------------------------------
+
+return [];

+ 147 - 0
application/common.php

@@ -0,0 +1,147 @@
+<?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@gmail.com>
+// +----------------------------------------------------------------------
+
+// 应用公共文件
+
+header('Content-Type:text/html;Charset=utf-8');
+
+
+
+/**
+ * 保存后台用户行为
+ * @param string $remark 日志备注
+ */
+function insert_admin_log($remark)
+{
+
+        db('user_log')->insert([
+            'user_id' => session('admin_auth.id'),
+            'uname' => session('admin_auth.uname'),
+            'useragent' => request()->server('HTTP_USER_AGENT'),
+            'ip' => request()->ip(),
+            'url' => request()->url(true),
+            'method' => request()->method(),
+            'type' => request()->type(),
+            'param' => json_encode(request()->param()),
+            'remark' => $remark,
+            'create_time' => time(),
+        ]);
+
+}
+
+/**
+ * @param $str
+ * @return string
+ * 驼峰命名法转下划线风格
+ */
+function to_under_score($str)
+{
+    $array = array();
+    for ($i = 0; $i < strlen($str); $i++) {
+        if ($str[$i] == strtolower($str[$i])) {
+            $array[] = $str[$i];
+        } else {
+            if ($i > 0) {
+                $array[] = '-';//想转什么就可以自己设置
+            }
+            $array[] = strtolower($str[$i]);
+        }
+    }
+    $result = implode('', $array);
+    return $result;
+}
+
+/**
+ * 获取用户真实 IP
+ */
+function getIP()
+{
+    static $realip;
+    if (isset($_SERVER)){
+        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
+            $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
+        } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
+            $realip = $_SERVER["HTTP_CLIENT_IP"];
+        } else {
+            $realip = $_SERVER["REMOTE_ADDR"];
+        }
+    } else {
+        if (getenv("HTTP_X_FORWARDED_FOR")){
+            $realip = getenv("HTTP_X_FORWARDED_FOR");
+        } else if (getenv("HTTP_CLIENT_IP")) {
+            $realip = getenv("HTTP_CLIENT_IP");
+        } else {
+            $realip = getenv("REMOTE_ADDR");
+        }
+    }
+    return $realip;
+}
+
+
+
+
+//获取城市所在天气情况
+function tianqi($chengshi)
+{
+    $url = 'http://wthrcdn.etouch.cn/weather_mini?city='.urlencode($chengshi);
+    $html = file_get_contents($url);
+    $jsondata = gzdecode($html);
+    $data=json_decode($jsondata,true);
+    $arr=array();
+    $arr['chengshi']=$data['data']['city'];
+    $dangtian=$data['data']['forecast'][0];
+    $arr['gaowen']= str_replace("高温 ",null,$dangtian['high']);
+    $arr['diwen']= str_replace("低温 ",null,$dangtian['low']);
+    $arr['tianqi']=$dangtian['type'];
+    $arr['fengxiang'] = $dangtian['fengxiang'];
+    $arr['time'] =date("Y-m-d H:i:s");
+    return $arr;
+
+
+}
+
+
+/**
+ * 检测管理员是否登录(防止用户重复登录)
+ * @return integer 0/管理员ID
+ */
+function is_admin_login()
+{
+    $admin = session('admin_auth');
+    if (empty($admin)) {
+        return 0;
+    } else {
+        return session('admin_auth_sign') == data_auth_sign($admin) ? $admin['id'] : 0;
+    }
+}
+
+
+/**
+ * 数据签名认证
+ * @param  array $data 被认证的数据
+ * @return string       签名
+ */
+function data_auth_sign($data)
+{
+    // 数据类型检测
+    if (!is_array($data)) {
+        $data = (array)$data;
+    }
+    ksort($data); // 排序
+    $code = http_build_query($data); // url编码并生成query字符串
+    $sign = sha1($code); // 生成签名
+    return $sign;
+}
+
+
+
+
+

+ 251 - 0
application/config.php

@@ -0,0 +1,251 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+return [
+    // +----------------------------------------------------------------------
+    // | 应用设置
+    // +----------------------------------------------------------------------
+
+    // 应用调试模式
+    'app_debug'              => true,
+    // 应用Trace
+    'app_trace'              => false,
+    // 应用模式状态
+    'app_status'             => '',
+    // 是否支持多模块
+    'app_multi_module'       => true,
+    // 入口自动绑定模块
+    'auto_bind_module'       => false,
+    // 注册的根命名空间
+    'root_namespace'         => [],
+    // 扩展函数文件
+    'extra_file_list'        => [THINK_PATH . 'helper' . EXT],
+    // 默认输出类型
+    'default_return_type'    => 'html',
+    // 默认AJAX 数据返回格式,可选json xml ...
+    'default_ajax_return'    => 'json',
+    // 默认JSONP格式返回的处理方法
+    'default_jsonp_handler'  => 'jsonpReturn',
+    // 默认JSONP处理方法
+    'var_jsonp_handler'      => 'callback',
+    // 默认时区
+    'default_timezone'       => 'PRC',
+    // 是否开启多语言
+    'lang_switch_on'         => false,
+    // 默认全局过滤方法 用逗号分隔多个
+    'default_filter'         => '',
+    // 默认语言
+    'default_lang'           => 'zh-cn',
+    // 应用类库后缀
+    'class_suffix'           => false,
+    // 控制器类后缀
+    'controller_suffix'      => false,
+
+    // +----------------------------------------------------------------------
+    // | 模块设置
+    // +----------------------------------------------------------------------
+
+    // 默认模块名
+    'default_module'         => 'index',
+    // 禁止访问模块
+    'deny_module_list'       => ['common'],
+    // 默认控制器名
+    'default_controller'     => 'Index',
+    // 默认操作名
+    'default_action'         => 'index',
+    // 默认验证器
+    'default_validate'       => '',
+    // 默认的空控制器名
+    'empty_controller'       => 'Error',
+    // 操作方法后缀
+    'action_suffix'          => '',
+    // 自动搜索控制器
+    'controller_auto_search' => false,
+
+    // +----------------------------------------------------------------------
+    // | URL设置
+    // +----------------------------------------------------------------------
+
+    // PATHINFO变量名 用于兼容模式
+    'var_pathinfo'           => 's',
+    // 兼容PATH_INFO获取
+    'pathinfo_fetch'         => ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL'],
+    // pathinfo分隔符
+    'pathinfo_depr'          => '/',
+    // URL伪静态后缀
+    'url_html_suffix'        => 'html',
+    // URL普通方式参数 用于自动生成
+    'url_common_param'       => false,
+    // URL参数方式 0 按名称成对解析 1 按顺序解析
+    'url_param_type'         => 0,
+    // 是否开启路由
+    'url_route_on'           => true,
+    // 路由使用完整匹配
+    'route_complete_match'   => false,
+    // 路由配置文件(支持配置多个)
+    'route_config_file'      => ['route'],
+    // 是否开启路由解析缓存
+    'route_check_cache'      => false,
+    // 是否强制使用路由
+    'url_route_must'         => false,
+    // 域名部署
+    'url_domain_deploy'      => false,
+    // 域名根,如thinkphp.cn
+    'url_domain_root'        => '',
+    // 是否自动转换URL中的控制器和操作名
+    'url_convert'            => true,
+    // 默认的访问控制器层
+    'url_controller_layer'   => 'controller',
+    // 表单请求类型伪装变量
+    'var_method'             => '_method',
+    // 表单ajax伪装变量
+    'var_ajax'               => '_ajax',
+    // 表单pjax伪装变量
+    'var_pjax'               => '_pjax',
+    // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
+    'request_cache'          => false,
+    // 请求缓存有效期
+    'request_cache_expire'   => null,
+    // 全局请求缓存排除规则
+    'request_cache_except'   => [],
+
+    // +----------------------------------------------------------------------
+    // | 模板设置
+    // +----------------------------------------------------------------------
+
+    'template'               => [
+        // 模板引擎类型 支持 php think 支持扩展
+        'type'         => 'Think',
+        // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写
+        'auto_rule'    => 1,
+        // 模板路径
+        'view_path'    => '',
+        // 模板后缀
+        'view_suffix'  => 'html',
+        // 模板文件名分隔符
+        'view_depr'    => DS,
+        // 模板引擎普通标签开始标记
+        'tpl_begin'    => '{',
+        // 模板引擎普通标签结束标记
+        'tpl_end'      => '}',
+        // 标签库标签开始标记
+        'taglib_begin' => '{',
+        // 标签库标签结束标记
+        'taglib_end'   => '}',
+    ],
+
+    // 视图输出字符串内容替换
+    'view_replace_str'       => [],
+    // 默认跳转页面对应的模板文件
+    'dispatch_success_tmpl'  => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl',
+    'dispatch_error_tmpl'    => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl',
+
+    // +----------------------------------------------------------------------
+    // | 异常及错误设置
+    // +----------------------------------------------------------------------
+
+    // 异常页面的模板文件
+    'exception_tmpl'         => THINK_PATH . 'tpl' . DS . 'think_exception.tpl',
+
+    // 错误显示信息,非调试模式有效
+    'error_message'          => '页面错误!请稍后再试~',
+    // 显示错误信息
+    'show_error_msg'         => false,
+    // 异常处理handle类 留空使用 \think\exception\Handle
+    'exception_handle'       => '',
+
+    // +----------------------------------------------------------------------
+    // | 日志设置
+    // +----------------------------------------------------------------------
+
+    'log'                    => [
+        // 日志记录方式,内置 file socket 支持扩展
+        'type'  => 'File',
+        // 日志保存目录
+        'path'  => LOG_PATH,
+        // 日志记录级别
+        'level' => [],
+    ],
+
+    // +----------------------------------------------------------------------
+    // | Trace设置 开启 app_trace 后 有效
+    // +----------------------------------------------------------------------
+    'trace'                  => [
+        // 内置Html Console 支持扩展
+        'type' => 'Html',
+    ],
+
+    // +----------------------------------------------------------------------
+    // | 缓存设置
+    // +----------------------------------------------------------------------
+
+    'cache'                  => [
+        // 驱动方式
+        'type'   => 'File',
+        // 缓存保存目录
+        'path'   => CACHE_PATH,
+        // 缓存前缀
+        'prefix' => '',
+        // 缓存有效期 0表示永久缓存
+        'expire' => 0,
+    ],
+
+    // +----------------------------------------------------------------------
+    // | 会话设置
+    // +----------------------------------------------------------------------
+
+    'session'                => [
+        'id'             => '',
+        // SESSION_ID的提交变量,解决flash上传跨域
+        'var_session_id' => '',
+        // SESSION 前缀
+        'prefix'         => 'think',
+        // 驱动方式 支持redis memcache memcached
+        'type'           => '',
+        // 是否自动开启 SESSION
+        'auto_start'     => true,
+    ],
+
+    // +----------------------------------------------------------------------
+    // | Cookie设置
+    // +----------------------------------------------------------------------
+    'cookie'                 => [
+        // cookie 名称前缀
+        'prefix'    => '',
+        // cookie 保存时间
+        'expire'    => 0,
+        // cookie 保存路径
+        'path'      => '/',
+        // cookie 有效域名
+        'domain'    => '',
+        //  cookie 启用安全传输
+        'secure'    => false,
+        // httponly设置
+        'httponly'  => '',
+        // 是否使用 setcookie
+        'setcookie' => true,
+    ],
+
+    //分页配置
+    // 'paginate'               => [
+    //     'type'      => 'bootstrap',
+    //     'var_page'  => 'page',
+    //     'list_rows' => 15,
+    // ],
+
+     //分页配置
+    'paginate'               => [
+        'type'      => 'page\Page',//自己修改的系统自带分页(在extend/page/Page.php)
+        'var_page'  => 'page',
+        'list_rows' => 15,
+    ],
+
+];

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 159 - 0
application/data/site.sql


+ 55 - 0
application/database.php

@@ -0,0 +1,55 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+return [
+    // 数据库类型
+    'type'            => 'mysql',
+    // 服务器地址
+    'hostname'        => '127.0.0.1',
+    // 数据库名
+    'database'        => 'site',
+    // 用户名
+    'username'        => 'root',
+    // 密码
+    'password'        => 'rootroot',
+    // 端口
+    'hostport'        => '',
+    // 连接dsn
+    'dsn'             => '',
+    // 数据库连接参数
+    'params'          => [],
+    // 数据库编码默认采用utf8
+    'charset'         => 'utf8',
+    // 数据库表前缀
+    'prefix'          => 'bp_',
+    // 数据库调试模式
+    'debug'           => true,
+    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
+    'deploy'          => 0,
+    // 数据库读写是否分离 主从式有效
+    'rw_separate'     => false,
+    // 读写分离后 主服务器数量
+    'master_num'      => 1,
+    // 指定从服务器序号
+    'slave_no'        => '',
+    // 自动读取主库数据
+    'read_master'     => false,
+    // 是否严格检查字段是否存在
+    'fields_strict'   => true,
+    // 数据集返回类型
+    'resultset_type'  => 'array',
+    // 自动写入时间戳字段
+    'auto_timestamp'  => false,
+    // 时间字段取出后的默认时间格式
+    'datetime_format' => 'Y-m-d H:i:s',
+    // 是否需要进行SQL性能分析
+    'sql_explain'     => false,
+];

+ 14 - 0
application/extra/queue.php

@@ -0,0 +1,14 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: yunwuxin <448901948@qq.com>
+// +----------------------------------------------------------------------
+
+return [
+    'connector' => 'Sync'
+];

+ 12 - 0
application/index/config.php

@@ -0,0 +1,12 @@
+<?php
+ 
+return [
+
+    // 视图输出字符串内容替换
+    'view_replace_str'       => [
+
+    ],
+
+
+
+];

+ 93 - 0
application/index/controller/Base.php

@@ -0,0 +1,93 @@
+<?php
+namespace app\index\controller;
+use think\Controller;
+
+use think\Request;
+
+class Base extends Controller//公共控制器
+{ 
+
+
+    protected function _initialize()
+    {
+        $column = $this->tops();//栏目信息
+        $ta = $this->tags();//标签信息
+
+        $this->assign([
+            'column'=>$column,//栏目信息
+            'ta'=>$ta,//标签信息
+        ]);
+
+        
+
+    }
+
+    protected function tops(){//头部栏目数据
+        $co = db('column')->order('id asc')->select();
+        return $co;
+    }
+
+    protected function tags(){//热门标签
+
+        $tag = db('article')->field('id,keywords')->where('keywords','not null')->select();
+
+        //***解决重复关键词(keywords)只显示其中的一个
+        $qc=[];
+        foreach ($tag as $ka){
+            $key = explode(",",$ka['keywords']);
+            foreach ($key as $k){
+                $qc[]=$k;
+            }
+        }
+        $tags = array_unique($qc);
+        //_______________________________________________end
+        return $tags;
+    }
+
+
+    public function search(){//热门标签搜索
+        $keywords=input('keywords');
+        if($keywords){
+            $map['title']=['like','%'.$keywords.'%'];
+            $ke['keywords']=['like','%'.$keywords.'%'];
+            $searchres=db('article')->where($map)->whereOr($ke)->select();
+            $this->assign(array(
+                'searchres'=>$searchres,
+                'keywords'=>$keywords,
+            ));
+        }else{
+            echo  "<script>alert('非法请求!');location.href='".url('index/index')."'</script>";
+        }
+        return view();
+
+    }
+
+    public function searchtop(){//头部关键词搜索
+        if(request()->isPost()) {
+            $keywords = input('keywords');
+            if($keywords){
+                $map['title']=['like','%'.$keywords.'%'];
+                $ke['keywords']=['like','%'.$keywords.'%'];
+                $search=db('article')->where($map)->whereOr($ke)->select();
+                if($search){
+                    $this->assign(array(
+                        'search'=>$search,
+                        'keywords'=>$keywords,
+                    ));
+                }else{
+                    $this->assign(array(
+                        'search'=>null,
+                        'keywords'=>'没有搜索到关键词!',
+                    ));
+                }
+            }
+        }else{
+            echo  "<script>alert('非法请求');location.href='".url('index/index')."'</script>";
+        }
+        return view();
+
+    }
+    
+
+   
+}

+ 77 - 0
application/index/controller/Index.php

@@ -0,0 +1,77 @@
+<?php
+namespace app\index\controller;
+
+
+class Index extends Base
+{
+
+    public function index()//主页
+    {
+        $articles =db('article')
+                ->alias('a')
+                ->field('a.*,b.catename')
+                ->join('column b','a.column_id=b.id')
+                ->paginate(20);//文章表
+        $this->assign([
+            'articles'=>$articles,
+        ]);
+
+        return view();
+
+    }
+
+    public function articlelb()//列表页
+    {
+        //接收当前栏目id
+        $columnid = input('column_id');
+        //查询当前栏目名称
+        $cates=db('column')->find($columnid);
+        //查询当前栏目下的文章
+        $articleres=db('article')
+            ->alias('a')
+            ->field('a.*,b.catename')
+            ->join('column b','a.column_id=b.id')
+            ->where('column_id',$columnid)
+            ->paginate(20);
+        $this->assign([
+            'articleres'=>$articleres,
+            'cates'=>$cates,
+        ]);
+
+        return view();
+
+    }
+
+
+    public function articlexq()//文章详情页
+    {
+        $arid=input('arid');
+        $articles=db('article')
+            ->alias('a')
+            ->field('a.*,b.catename')
+            ->join('column b','a.column_id=b.id')
+            ->find($arid);
+
+        db('article')->where('id','=',$arid)->setInc('click');
+        $cates=db('column')->find($articles['column_id']);
+        $recres=db('article')->where(array('column_id'=>$cates['id'],'state'=>0))->limit(8)->select();
+
+        $this->assign(array(
+            'articles'=>$articles,
+            'cates'=>$cates,
+            'recres'=>$recres,
+        ));
+        return view();
+    }
+
+
+
+
+
+
+
+
+    
+        
+        
+}

+ 20 - 0
application/index/view/base/fotter.html

@@ -0,0 +1,20 @@
+<div id="footer" class="two-s-footer clearfix">
+    <div class="footer-box">
+        <div class="container">
+
+            <div class="nav-footer">
+                <a href="/">首页</a>
+                {volist name="column" id="vo"}
+                    <a href="{:url('index/articlelb',['column_id'=>$vo.id])}">{$vo.catename}</a>
+                {/volist}
+            </div>
+
+            <div class="copyright-footer">
+                <p>Copyright © 2019 Powered by Mosheng  &nbsp; <b><a href="https://www.dashgame.com/">DashGame</a> &nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.miitbeian.gov.cn/"  target="_blank"  rel="nofollow">渝ICP备14004903号</a></b></p>
+            </div>
+            <div class="links-footer"><!--站长统计-->
+                <script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1260588650'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s95.cnzz.com/z_stat.php%3Fid%3D1260588650%26online%3D1%26show%3Dline' type='text/javascript'%3E%3C/script%3E"));</script>
+            </div>
+        </div>
+    </div>
+</div>

+ 74 - 0
application/index/view/base/right.html

@@ -0,0 +1,74 @@
+<div class="sidebar col-xs-12 col-sm-4 col-md-4">
+    <div class="widget widget_suxingme_postlist">
+        <h3><span>随便看看</span></h3>
+        <ul class="recent-posts-widget">
+            <!--<li class="others">-->
+                <!--<div class="image"><a  title="持续更新中!"> <img src="/static/index/images/timg.jpg" alt="持续更新中!" class="thumbnail"/> </a></div>-->
+                <!--<div class="title">-->
+                   <!---->
+                    <!--<span>2020-05-05</span> </div>-->
+            <!--</li>-->
+            <h4><a href="/" title="持续更新中">持续更新中!</a></h4>
+
+        </ul>
+    </div>
+    <div class="widget widget_suxingme_hotpost">
+        <h3><span>热评文章</span></h3>
+        <ul class="widget_suxingme_post">
+            <li>
+                <a href="/" title="生活">
+                    <div class="overlay"></div>
+                    <img class="thumbnail" src="/static/index/images/wz.jpg" alt="生活" />
+                    <div class="title">
+                        <!--<div class="entry-meta">-->
+                            <!--<span>2020-05-06</span>-->
+                            <!--<span><i class="icon-comment-3"></i>3</span>-->
+                        <!--</div>-->
+                        <h4>持续更新中!</h4>
+                    </div>
+
+                </a>
+            </li>
+
+        </ul>
+
+    </div>
+    <div class="widget suxingme_tag">
+        <h3><span>热门标签</span></h3>
+        <div class="widge_tags">
+            <div class="tag-items">
+                {volist name="ta" id="vo"}
+                    <a href="{:url('base/search',['keywords'=>$vo])}">{$vo}</a>
+                {/volist}
+            </div>
+        </div>
+    </div>
+    <div class="widget suxingme_tag">
+        <h3><span>友情链接</span></h3>
+        <div class="widge_tags">
+            <div class="tag-items">
+                <a href='https://www.zbboke.com/' target='_blank'>张兵个人博客</a>
+            </div>
+        </div>
+    </div>
+
+
+    <!--<div class="widget suxingme_social">-->
+        <!--<h3><span>关注我 么么哒!</span></h3>-->
+        <!--<div class="attentionus">-->
+            <!--<ul class="items clearfix">-->
+        <!--<span class="social-widget-link social-link-weibo">-->
+		<!--<span class="social-widget-link-count"><i class="icon-weibo"></i>你是天恩也是坎儿</span>-->
+		<!--<span class="social-widget-link-title">新浪微博</span> <a href="http://www.sina.com" target="_blank" rel="nofollow" ></a></span>-->
+                <!--<span class="social-widget-link social-link-tencent-weibo"> <span class="social-widget-link-count"><i class="icon-tencent-weibo"></i>你是天恩也是坎儿</span>-->
+		<!--<span class="social-widget-link-title">腾讯微博</span> <a href="http://t.qq.com" target="_blank" rel="nofollow" ></a> </span>-->
+                <!--<span class="social-widget-link social-link-qq"> <span class="social-widget-link-count"><i class="icon-qq"></i>517999587</span>-->
+		<!--<span class="social-widget-link-title">QQ号</span> <a href="http://wpa.qq.com/msgrd?v=3&uin=517999587&site=qq&menu=yes" rel="nofollow" ></a> </span>-->
+                <!--<span class="social-widget-link social-link-email"> <span class="social-widget-link-count"><i class="icon-mail"></i>517999587@qq.com</span>-->
+		<!--<span class="social-widget-link-title">邮箱</span> <a href="http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=517999587@qq.com" target="_blank" rel="nofollow" ></a> </span>-->
+                <!--<span class="social-widget-link social-link-wechat"> <span class="social-widget-link-count"><i class="icon-wechat"></i>QQ517999587</span>-->
+		<!--<span class="social-widget-link-title">微信</span> <a id="tooltip-s-weixin" href="javascript:void(0);"></a> </span>-->
+            <!--</ul>-->
+        <!--</div>-->
+    <!--</div>-->
+</div>

+ 75 - 0
application/index/view/base/search.html

@@ -0,0 +1,75 @@
+
+{include file='base/top'}<!--头部-->
+<div id="page-content">
+    <div class="container">
+        <div class="row">
+            <div class="article col-xs-12 col-sm-8 col-md-8">
+                <div class="breadcrumbs" ><span itemprop="itemListElement"><i class="icon-location-2"></i><a href='/'>主页</a> > <a>TAG标签</a> ><b style="color: #ff5e5c">{$keywords}</b></div>
+                <div class="ajax-load-box posts-con">
+
+                    {volist name="searchres" id="vo"}
+                    <div class="ajax-load-con content  ">
+
+                        <div class="content-box posts-image-box">
+                            <div class="posts-default-title">
+                                <div class="post-entry-categories">
+                                    {if condition="$vo['keywords'] neq null"}
+                                        <?php
+                                       $key = explode(",",$vo['keywords']);
+                                    ?>
+                                        {volist name="key" id="ke"}
+                                            <a>{$ke}</a>
+                                        {/volist}
+                                    {else/}
+
+                                    {/if}
+                                </div>
+
+                                <h2><a href="{:url('index/articlexq',['arid'=>$vo.id])}" >{$vo.title}</a></h2>
+                            </div>
+
+                            <div class="posts-default-content">
+
+                                    <?php
+                                    $w ='/(src)="(.*?(jpg|jpeg|gif|png))/i';
+                                    preg_match($w,$vo['content'],$match);
+                                  ?>
+                                    <div class="posts-text">
+                                        <img src="{$match[2]}"/>
+                                    </div>
+
+                                <div class="posts-default-info">
+                                    <ul>
+                                        <li class="post-author">
+                                            <div class="avatar"><img alt='爱奇君头像' srcset='/static/index/images/touxiang.jpg' class='avatar avatar-96 photo' height='96' width='96' /></div>
+                                            <a>{$vo.author}</a>
+                                        </li>
+                                        <li class="ico-cat"><i class="icon-list-2"></i>TAG标签</li>
+                                        <li class="ico-time"><i class="icon-clock-1"></i>{$vo.time}</li>
+                                        <li class="ico-like"><i class="icon-eye"></i>{$vo.click}</li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    {/volist}
+
+                </div>
+
+            </div>
+
+
+            {include file="base/right"}<!--右侧-->
+
+
+        </div>
+    </div>
+</div>
+</div>
+
+<div class="clearfix"></div>
+
+
+{include file="base/fotter"}<!--底部-->
+
+

+ 75 - 0
application/index/view/base/searchtop.html

@@ -0,0 +1,75 @@
+
+{include file='base/top'}<!--头部-->
+<div id="page-content">
+    <div class="container">
+        <div class="row">
+            <div class="article col-xs-12 col-sm-8 col-md-8">
+
+                <h2 class="htitle">搜索条件:<span style="color:#ff5e5c; font-weight:bold;">{$keywords}</span></h2>
+                <div class="ajax-load-box posts-con">
+
+                    {volist name="search" id="vo"}
+                    <div class="ajax-load-con content  ">
+                        <div class="content-box posts-image-box">
+                            <div class="posts-default-title">
+                                <div class="post-entry-categories">
+                                    {if condition="$vo['keywords'] neq null"}
+                                    <?php
+                                       $key = explode(",",$vo['keywords']);
+                                    ?>
+                                    {volist name="key" id="ke"}
+                                    <a>{$ke}</a>
+                                    {/volist}
+                                    {else/}
+
+                                    {/if}
+                                </div>
+
+                                <h2><a href="{:url('index/articlexq',['arid'=>$vo.id])}" >{$vo.title}</a></h2>
+                            </div>
+
+                            <div class="posts-default-content">
+                                <?php
+                                $w ='/(src)="(.*?(jpg|jpeg|gif|png))/i';
+                                preg_match($w,$vo['content'],$match);
+                              ?>
+                                <div class="posts-text">
+                                    <img src="{$match[2]}"/>
+                                </div>
+
+                                <div class="posts-default-info">
+                                    <ul>
+                                        <li class="post-author">
+                                            <div class="avatar"><img alt='爱奇君头像' srcset='/static/index/images/touxiang.jpg' class='avatar avatar-96 photo' height='96' width='96' /></div>
+                                            <a>{$vo.author}</a>
+                                        </li>
+                                        <li class="ico-cat"><i class="icon-list-2"></i>TAG标签</li>
+                                        <li class="ico-time"><i class="icon-clock-1"></i>{$vo.time}</li>
+                                        <li class="ico-like"><i class="icon-eye"></i>{$vo.click}</li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    {/volist}
+
+                </div>
+
+            </div>
+
+
+            {include file="base/right"}<!--右侧-->
+
+
+        </div>
+    </div>
+</div>
+</div>
+
+<div class="clearfix"></div>
+
+
+{include file="base/fotter"}<!--底部-->
+
+

+ 137 - 0
application/index/view/base/top.html

@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html >
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>爱生活博客 - 一个简约的博客网站</title>
+    <meta name="keywords" content="一个简约的博客网站,爱生活博客" />
+    <meta name="description" content="爱生活博客是一个分享生活,旅游,趣图的一个博客网站!" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, minimal-ui">
+    <meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE;chrome=1">
+    <meta name="generator" content="Dedecms" />
+    <link rel="icon" href="/static/admin/images/favicon.png" type="image/x-icon">
+    <link rel='stylesheet' id='carousel-css'  href='/static/index/css/owl.carousel.css' type='text/css' media='all' />
+    <link rel='stylesheet' id='mcustomscrollbar-css'  href='/static/index/css/jquery.mcustomscrollbar.min.css' type='text/css' media='all' />
+    <link rel='stylesheet' id='animate-css'  href='/static/index/css/animate.css' type='text/css' media='all' />
+    <link rel='stylesheet' id='fontello-css'  href='/static/index/css/fontello.css' type='text/css' media='all' />
+    <link rel='stylesheet' id='bootstrap-css'  href='/static/index/css/bootstrap.min.css' type='text/css' media='all' />
+    <link rel='stylesheet' id='Grace-style-css'  href='/static/index/css/style.css' type='text/css' media='all' />
+    <!--Prefetch是DNS预获取。设置DNS预获取(dns-prefetch)有两个作用:1、减少DNS的请求次数,2、进行DNS预先获取。-->
+
+
+    <script src="/static/index/js/jquery.js"></script>
+
+    <!--[if lt IE 9]>
+    <script type='text/javascript' src='/static/index/js/html5shiv.js'></script>
+    <![endif]-->
+    <!--[if lt IE 9]>
+    <script type='text/javascript' src='/static/index/js/respond.min.js'></script>
+    <![endif]-->
+
+    <style>
+        #page-content{
+            background-image: url("/static/index/images/timg.jpg");/*背景图片*/
+        }
+        #header{
+            background-color:#f9fcff;
+        }
+    </style>
+
+</head>
+<body class="home blog off-canvas-nav-left">
+
+<div id="header" class=" navbar-fixed-top">
+    <div class="container">
+        <h1 class="logo" style="font-size: 30px; padding-top: 23px;">爱生活博客</h1>
+        <div role="navigation" class="site-nav primary-menu">
+            <div class="menu-fix-box" >
+                <ul id="menu-navigation" class="menu">
+                    <li class="menu-item-has-children"><a href="/" title='爱生活博客' alt='爱生活博客'>首页</a></li>
+
+                    {volist name="column" id="vo"}
+                    <li class="menu-item-has-children">
+                        <a href="{:url('index/articlelb',['column_id'=>$vo.id])}">{$vo.catename}</a>
+                    </li>
+                    {/volist}
+
+                </ul>
+            </div>
+        </div>
+        <div class="right-nav" >
+            <div class="js-toggle-message">
+                <button id="sitemessage" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <i class="icon-megaphone" title="最新公告"></i> </button>
+                <div class="dropdown-menu" role="menu" aria-labelledby="sitemessage" >
+                    <ul>
+                        <li><span class="time">05-06</span><a target="_blank" href="/">暂时没有!</a></li>
+                        <!--<li><span class="time">05-06</span><a target="_blank" href="/">还没更新好!</a></li>-->
+                        <!--<li><span class="time">05-05</span><a target="_blank" href="/">还没更新好!</a></li>-->
+                        <!--<li><span class="time">05-05</span><a target="_blank" href="/">还没更新好!</a></li>-->
+                        <!--<li><span class="time">05-05</span><a target="_blank" href="/">还没更新好!</a></li>-->
+                    </ul>
+                    <div class="more-messages"><a target="_blank" href="{:url('index/index')}">更多</a></div>
+                </div>
+
+            </div>
+            <button class="js-toggle-search"><i class=" icon-search" title="搜索关键词"></i></button>
+        </div>
+    </div>
+</div>
+
+<div class="search-form"><!--搜索-->
+    <form  name="formsearch" action="{:url('base/searchtop')}" method="post">
+        <div class="search-form-inner">
+            <div class="search-form-box">
+                <input class="form-search" type="text" name="keywords" id='q' placeholder="请输入关键词">
+                <button type="submit" id="btn-search"><i class="icon-search" ></i> </button>
+            </div>
+        </div>
+    </form>
+    <div class="close-search"> <span class="close-top"></span> <span class="close-bottom"></span> </div>
+</div>
+<style>
+    .search-commend a{
+        text-transform: uppercase;
+        -webkit-transition: all .3s ease;
+        -o-transition: all .3s ease;
+        transition: all .3s ease;
+        display: inline-block;
+        vertical-align: top;
+        font-size: 13px;
+        line-height: 20px;
+        padding: 4px 15px;
+        margin: 0 8px 8px 0;
+        border: 1px solid #e0e0e0;
+        border-radius: 2px;
+        color: rgba(0,0,0,.44);
+        background-color: rgba(255,255,255,.97);
+    }
+</style>
+<script type='text/javascript' src='/static/index/js/jquery.sticky-kit.min.js'></script>
+<script type='text/javascript' src='/static/index/js/bootstrap.min.js'></script>
+<script type='text/javascript' src='/static/index/js/jquery.mcustomscrollbar.concat.min.js'></script>
+<script type='text/javascript'>
+    /* <![CDATA[ */
+    var suxingme_url = {"roll":"1","headfixed":"1","slidestyle":"index_slide_sytle_4","wow":"1"};
+    /* ]]> */
+
+</script>
+<script type='text/javascript' src='/static/index/js/suxingme.js'></script>
+<script type='text/javascript' src='/static/index/js/jquery.bootstrap-autohidingnavbar.min.js'></script>
+<script type='text/javascript' src='/static/index/js/owl.carousel.min.js'></script>
+<script type='text/javascript' src='/static/index/js/wow.min.js'></script>
+<script>
+    (function(){
+        var bp = document.createElement('script');
+        var curProtocol = window.location.protocol.split(':')[0];
+        if (curProtocol === 'https') {
+            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
+        }
+        else {
+            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
+        }
+        var s = document.getElementsByTagName("script")[0];
+        s.parentNode.insertBefore(bp, s);
+    })();
+</script>
+
+</body>
+</html>

+ 81 - 0
application/index/view/index/articlelb.html

@@ -0,0 +1,81 @@
+
+{include file='base/top'}<!--头部-->
+<div id="page-content">
+  <div class="container">
+    <div class="row">
+      <div class="article col-xs-12 col-sm-8 col-md-8">
+        <div class="breadcrumbs" ><span itemprop="itemListElement"><i class="icon-location-2"></i><a href='/'>主页</a> > <a href="{:url('index/articlelb',array('column_id'=>$cates['id']))}">{$cates.catename}</a> > </div>
+        <div class="ajax-load-box posts-con">
+
+        {volist name="articleres" id="vo"}
+         <div class="ajax-load-con content  ">
+
+           <div class="content-box posts-image-box">
+             <div class="posts-default-title">
+               <div class="post-entry-categories">
+                 {if condition="$vo['keywords'] neq null"}
+                 <?php
+                           $key = explode(",",$vo['keywords']);
+                        ?>
+                 {volist name="key" id="ke"}
+                      <a>{$ke}</a>
+                 {/volist}
+                 {else/}
+
+                 {/if}
+               </div>
+
+               <h2><a href="{:url('index/articlexq',['arid'=>$vo.id])}" >{$vo.title}</a></h2>
+             </div>
+
+                <div class="posts-default-content">
+                    <?php
+                            $w ='/(src)="(.*?(jpg|jpeg|gif|png))/i';
+                            preg_match($w,$vo['content'],$match);
+                          ?>
+                    <div class="posts-text">
+                      <img src="{$match[2]}"/>
+                    </div>
+
+                  <div class="posts-default-info">
+                    <ul>
+                      <li class="post-author">
+                        <div class="avatar"><img alt='爱奇君头像' srcset='/static/index/images/touxiang.jpg' class='avatar avatar-96 photo' height='96' width='96' /></div>
+                        <a>{$vo.author}</a>
+                      </li>
+                      <li class="ico-cat"><i class="icon-list-2"></i>{$vo.catename}</li>
+                      <li class="ico-time"><i class="icon-clock-1"></i>{$vo.time}</li>
+                      <li class="ico-like"><i class="icon-eye"></i>{$vo.click}</li>
+                    </ul>
+                  </div>
+                </div>
+              </div>
+          </div>
+        {/volist}
+
+          <!-- 分页 -->
+          <div class="pages">
+            <div class="plist" >{$articleres->render()}</div>
+          </div>
+        </div>
+
+
+
+
+        </div>
+        
+    
+{include file="base/right"}<!--右侧-->
+    
+
+      </div>
+    </div>
+  </div>
+</div>
+
+<div class="clearfix"></div>
+
+
+{include file="base/fotter"}<!--底部-->
+
+

+ 72 - 0
application/index/view/index/articlexq.html

@@ -0,0 +1,72 @@
+{include file="base/top"}<!--头部-->
+
+
+<div id="page-content">
+  <div class="container">
+    <div class="row">
+      <div class="article col-xs-12 col-sm-8 col-md-8">
+        <div class="post">
+          <div class="post-title">
+            <div class="post-entry-categories">
+                {if condition="$articles['keywords'] neq null"}
+                <?php
+                           $key = explode(",",$articles['keywords']);
+                        ?>
+                {volist name="key" id="ke"}
+                    <a>{$ke}</a>
+                {/volist}
+                {else/}
+
+                {/if}
+			
+			</div>
+            <h1 class="title" id='tit'>{$articles.title}</h1>
+            <div class="post_icon">
+                <span class="postauthor">
+                   作者: <a>{$articles.author}</a>
+                </span>
+
+                <span  class="postcat"><i class="icon-list-2"></i>
+                     <a href="">{$articles.catename}</a>
+                 </span>
+                 <span class="postclock">
+                     <i class="icon-clock-1">{$articles.time}</i>
+                 </span>
+                 <span class="postlike">
+                     <i class="icon-eye">{$articles.click}</i>
+                 </span>
+			 </div>
+          </div>
+          <div class="post-content">
+ 	            {$articles.content}
+          </div>
+
+
+
+        </div>
+        <div class="related-post">
+          <h3><span>猜你喜欢</span></h3>
+          <ul>
+ 
+          </ul>
+        </div>
+
+
+
+
+
+          <div class="clear"></div>
+        
+      </div>
+     
+	   {include file="base/right"}
+
+
+    </div>
+  </div>
+</div>
+<div class="clearfix"></div>
+
+{include file="base/fotter"}<!--底部-->
+
+

+ 140 - 0
application/index/view/index/index.html

@@ -0,0 +1,140 @@
+
+{include file='base/top'}<!--头部-->
+
+<div id="page-content" >
+  <div class="top-content">
+    <div class="container">
+      <div class="row">
+      	
+        <div class="owl-carousel top-slide-two">
+        	    <div class="item" style="background: url(/static/index/images/lifeone.jpg); background-repeat: no-repeat;background-size: cover;background-position: center top;object-fit: cover;">
+		            <div class="slider-content">
+		              <div class="slider-content-item">
+		                <!--<div class="slider-cat clearfix">成长</div>-->
+		                <!--<h2>一个北漂五年的人告诉你,为什么二十多岁的你要努力。</h2>-->
+		              </div>
+		            </div>
+		            <a class="read-slider" href="/" title="生活"></a>
+		        </div>
+
+                <div class="item" style="background: url(/static/index/images/lifetwo.jpg); background-repeat: no-repeat;background-size: cover;background-position: center top;object-fit: cover;">
+		            <div class="slider-content">
+		              <div class="slider-content-item">
+		                <!--<div class="slider-cat clearfix">成长</div>-->
+		                <!--<h2>今年我二十七八岁</h2>-->
+		              </div>
+		            </div>
+		            <a class="read-slider" href="/cz/709.html" title="生活"></a>
+		        </div>
+
+                <div class="item" style="background: url(/static/index/images/lifethree.jpg); background-repeat: no-repeat;background-size: cover;background-position: center top;object-fit: cover;">
+		            <div class="slider-content">
+		              <div class="slider-content-item">
+		                <!--<div class="slider-cat clearfix">娱乐</div>-->
+		                <!--<h2>33张赤果果的人性图,别抱怨鞋子不好看,世上还有没有脚的人。</h2>-->
+		              </div>
+		            </div>
+		            <a class="read-slider" href="/" title="生活"></a>
+		        </div>
+
+        </div>
+        
+        <div class="hot-articles">
+          <div class="hots-content">
+            <div class="hots-headline">头条</div>
+
+                <div class="hots-item">
+                    <a href="/" target="_blank">
+                          <div class="hots-image" style="background-image:url(/static/index/images/tt.jpg)"></div>
+                    </a>
+                </div>
+
+                <div class="hots-title">
+                    <i class="icon-record-outline"></i><a href="/" target="_blank">持续更新中!</a>
+                </div>
+
+          </div>
+
+        </div>
+        
+
+       
+      </div>
+    </div>
+  </div>
+
+
+  <div class="main-content">
+    <div class="container">
+      <div class="row">
+        <div class="article col-xs-12 col-sm-8 col-md-8">
+          <div class="ajax-load-box posts-con">
+
+
+              {volist name="articles" id="vo"}
+		 <div class="ajax-load-con content  ">
+              <div class="content-box posts-image-box">
+                <div class="posts-default-title">
+                  <div class="post-entry-categories">
+                      {if condition="$vo['keywords'] neq null"}
+                           <?php
+                           $key = explode(",",$vo['keywords']);
+                        ?>
+                            {volist name="key" id="ke"}
+					            <a>{$ke}</a>
+                            {/volist}
+                      {else/}
+
+                      {/if}
+				  </div>
+                  <h2><a href="{:url('index/articlexq',['arid'=>$vo.id])}" >{$vo.title}</a></h2>
+                </div>
+
+                <div class="posts-default-content">
+                            <?php
+                            $w ='/(src)="(.*?(jpg|jpeg|gif|png))/i';
+                            preg_match($w,$vo['content'],$match);
+                          ?>
+                        <div class="posts-text">
+                            <img src="{$match[2]}"/>
+                        </div>
+
+                  <div class="posts-default-info">
+                    <ul>
+                        <li class="post-author">
+                            <div class="avatar"><img alt='爱奇君头像' srcset='/static/index/images/touxiang.jpg' class='avatar avatar-96 photo' height='96' width='96' /></div>
+                            <a>{$vo.author}</a>
+                        </li>
+                      <li class="ico-cat"><i class="icon-list-2"></i>{$vo.catename}</li>
+                      <li class="ico-time"><i class="icon-clock-1"></i>{$vo.time}</li>
+                      <li class="ico-like"><i class="icon-eye"></i>{$vo.click}</li>
+                    </ul>
+                  </div>
+                </div>
+              </div>
+            </div>
+        {/volist}
+              <!-- 分页 -->
+              <div class="pages">
+                  <div class="plist" >{$articles->render()}</div>
+              </div>
+
+  </div>
+
+          <div class="clearfix"></div>
+        </div>
+        
+
+
+{include file="base/right"}<!--右侧-->
+		
+
+      </div>
+    </div>
+  </div>
+</div>
+<div class="clearfix"></div>
+
+{include file="base/fotter"}<!--底部-->
+
+

+ 23 - 0
application/route.php

@@ -0,0 +1,23 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+// return [
+//     '__pattern__' => [
+//         'name' => '\w+',
+//     ],
+//     '[hello]'     => [
+//         ':id'   => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
+//         ':name' => ['index/hello', ['method' => 'post']],
+//     ],
+
+// ];
+think\Route::rule('/lst','admin/login/lst'); //后台登录地址替换为/lst(访问(本地)登录页面就直接 localhost/lst 访问)
+//think\Route::rule('','index/index/homepage');//直接访问前台首页

+ 28 - 0
application/tags.php

@@ -0,0 +1,28 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+// 应用行为扩展定义文件
+return [
+    // 应用初始化
+    'app_init'     => [],
+    // 应用开始
+    'app_begin'    => [],
+    // 模块初始化
+    'module_init'  => [],
+    // 操作开始执行
+    'action_begin' => [],
+    // 视图内容过滤
+    'view_filter'  => [],
+    // 日志写入
+    'log_write'    => [],
+    // 应用结束
+    'app_end'      => [],
+];

+ 25 - 0
build.php

@@ -0,0 +1,25 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+return [
+    // 生成应用公共文件
+    '__file__' => ['common.php', 'config.php', 'database.php'],
+
+    // 定义demo模块的自动生成 (按照实际定义的文件名生成)
+    'demo'     => [
+        '__file__'   => ['common.php'],
+        '__dir__'    => ['behavior', 'controller', 'model', 'view'],
+        'controller' => ['Index', 'Test', 'UserType'],
+        'model'      => ['User', 'UserType'],
+        'view'       => ['index/index'],
+    ],
+    // 其他更多的模块定义
+];

+ 34 - 0
composer.json

@@ -0,0 +1,34 @@
+{
+    "name": "topthink/think",
+    "description": "the new thinkphp framework",
+    "type": "project",
+    "keywords": [
+        "framework",
+        "thinkphp",
+        "ORM"
+    ],
+    "homepage": "http://thinkphp.cn/",
+    "license": "Apache-2.0",
+    "authors": [
+        {
+            "name": "liu21st",
+            "email": "liu21st@gmail.com"
+        }
+    ],
+    "require": {
+        "php": ">=5.4.0",
+        "topthink/framework": "5.0.*",
+        "stichoza/google-translate-php": "^4.1"
+    },
+    "autoload": {
+        "psr-4": {
+            "app\\": "application"
+        }
+    },
+    "extra": {
+        "think-path": "thinkphp"
+    },
+    "config": {
+        "preferred-install": "dist"
+    }
+}

+ 6 - 0
desktop.ini

@@ -0,0 +1,6 @@
+[.ShellClassInfo]
+IconResource=C:\WINDOWS\System32\shell32.dll,41
+[ViewState]
+Mode=
+Vid=
+FolderType=Generic

+ 97 - 0
extend/catetree/Catetree.php

@@ -0,0 +1,97 @@
+<?php
+namespace catetree;
+
+class Catetree{
+
+	//无限级分类
+	
+     public function getMenu($menu){
+       return $this->sort($menu);   //返回排序成功后的数据
+     }
+
+     //对栏目进行排序
+     public function sort($menu,$pid=0,$level=0){
+        static $arr=array();  //静态数组
+        foreach ($menu as $k => $v) {  //遍历数据
+          if($v['pid']==$pid){     //第一次 pid=0 的顶级数组全部循环出来
+          	$v['level']=$level;
+            $arr[]=$v;
+            $this->sort($menu,$v['id'],$level+1);  //递归找下级子栏目
+          }
+        }
+
+        return $arr;
+     }
+
+
+
+  //获取子栏目id
+
+   public function childrenids($cateid,$obj){
+        $data=$obj->field('id,pid')->select();
+        return $this->_childrenids($data,$cateid);
+   }
+
+   private function _childrenids($data,$cateid){
+        static $arr=array();
+        foreach ($data as $k => $v) {
+            if($v['pid']==$cateid){
+                $arr[]=$v['id'];
+                $this->_childrenids($data,$v['id']);
+            }
+        }
+
+        return $arr;
+   }
+
+
+   //处理栏目排序
+   public function cateSort($data,$obj){
+    foreach ($data as $k => $v) {
+        $obj->update(['id'=>$k,'sort'=>$v]);
+    }
+   }
+
+
+
+   //处理批量删除
+
+   public function pdel($cateids){
+            foreach ($cateids as $k => $v) {
+                $childrenidsarr[]=$this->childrenids($v);
+                $childrenidsarr[]=(int)$v;
+            }  
+            $_childrenidsarr=array();
+            foreach ($childrenidsarr as $k => $v) {
+                if(is_array($v)){
+                    foreach ($v as $k1 => $v1) {
+                       $_childrenidsarr[]=$v1;
+                    }
+                }else{
+                    $_childrenidsarr[]=$v;
+                }
+            }
+            $_childrenidsarr=array_unique($_childrenidsarr);
+            $this::destroy($_childrenidsarr);
+    
+   }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 283 - 0
extend/page/Page.php

@@ -0,0 +1,283 @@
+<?php
+namespace page;
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: longxing <792532971@qq.com>
+// +----------------------------------------------------------------------
+ 
+use think\Paginator;
+ 
+class Page extends Paginator
+{
+ 
+    //首页
+    protected function home() {
+        if ($this->currentPage() > 1) {
+            return "<a href='" . $this->url(1) . "' title='首页'>首页</a>";
+        } else {
+            return "<p>首页</p>";
+        }
+    }
+ 
+    //上一页
+    protected function prev() {
+        if ($this->currentPage() > 1) {
+            return "<a href='" . $this->url($this->currentPage - 1) . "' title='上一页'>上一页</a>";
+        } else {
+            return "<p>上一页</p>";
+        }
+    }
+ 
+    //下一页
+    protected function next() {
+        if ($this->hasMore) {
+            return "<a href='" . $this->url($this->currentPage + 1) . "' title='下一页'>下一页</a>";
+        } else {
+            return"<p>下一页</p>";
+        }
+    }
+ 
+    //尾页
+    protected function last() {
+        if ($this->hasMore) {
+            return "<a href='" . $this->url($this->lastPage) . "' title='尾页'>尾页</a>";
+        } else {
+            return "<p>尾页</p>";
+        }
+    }
+ 
+    //统计信息
+    protected function info(){
+        return "<p class='pageRemark'>共<b>" . $this->lastPage .
+            "</b>页<b>" . $this->total . "</b>条数据</p>";
+    }
+ 
+    /**
+     * 页码按钮
+     * @return string
+     */
+    protected function getLinks()
+    {
+ 
+        $block = [
+            'first'  => null,
+            'slider' => null,
+            'last'   => null
+        ];
+ 
+        $side   = 3;
+        $window = $side * 2;
+ 
+        if ($this->lastPage < $window + 6) {
+            $block['first'] = $this->getUrlRange(1, $this->lastPage);
+        } elseif ($this->currentPage <= $window) {
+            $block['first'] = $this->getUrlRange(1, $window + 2);
+            $block['last']  = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
+        } elseif ($this->currentPage > ($this->lastPage - $window)) {
+            $block['first'] = $this->getUrlRange(1, 2);
+            $block['last']  = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage);
+        } else {
+            $block['first']  = $this->getUrlRange(1, 2);
+            $block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);
+            $block['last']   = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
+        }
+ 
+        $html = '';
+ 
+        if (is_array($block['first'])) {
+            $html .= $this->getUrlLinks($block['first']);
+        }
+ 
+        if (is_array($block['slider'])) {
+            $html .= $this->getDots();
+            $html .= $this->getUrlLinks($block['slider']);
+        }
+ 
+        if (is_array($block['last'])) {
+            $html .= $this->getDots();
+            $html .= $this->getUrlLinks($block['last']);
+        }
+ 
+        return $html;
+    }
+ 
+    /**
+     * 渲染分页html
+     * @return mixed
+     */
+    public function render()
+    {
+        if ($this->hasPages()) {
+            if ($this->simple) {
+                return sprintf(
+                    '%s<div class="pagination">%s %s %s</div>',
+                    $this->css(),
+                    $this->prev(),
+                    $this->getLinks(),
+                    $this->next()
+                );
+            } else {
+                return sprintf(
+                    '%s<div class="pagination">%s %s %s %s %s %s</div>',
+                    $this->css(),
+                    $this->home(),
+                    $this->prev(),
+                    $this->getLinks(),
+                    $this->next(),
+                    $this->last(),
+                    $this->info()
+                );
+            }
+        }
+    }
+ 
+    /**
+     * 生成一个可点击的按钮
+     *
+     * @param  string $url
+     * @param  int    $page
+     * @return string
+     */
+    protected function getAvailablePageWrapper($url, $page)
+    {
+        return '<a href="' . htmlentities($url) . '" title="第"'. $page .'"页" >' . $page . '</a>';
+    }
+ 
+    /**
+     * 生成一个禁用的按钮
+     *
+     * @param  string $text
+     * @return string
+     */
+    protected function getDisabledTextWrapper($text)
+    {
+        return '<p class="pageEllipsis">' . $text . '</p>';
+    }
+ 
+    /**
+     * 生成一个激活的按钮
+     *
+     * @param  string $text
+     * @return string
+     */
+    protected function getActivePageWrapper($text)
+    {
+        return '<a href="" class="cur">' . $text . '</a>';
+    }
+ 
+    /**
+     * 生成省略号按钮
+     *
+     * @return string
+     */
+    protected function getDots()
+    {
+        return $this->getDisabledTextWrapper('...');
+    }
+ 
+    /**
+     * 批量生成页码按钮.
+     *
+     * @param  array $urls
+     * @return string
+     */
+    protected function getUrlLinks(array $urls)
+    {
+        $html = '';
+ 
+        foreach ($urls as $page => $url) {
+            $html .= $this->getPageLinkWrapper($url, $page);
+        }
+ 
+        return $html;
+    }
+ 
+    /**
+     * 生成普通页码按钮
+     *
+     * @param  string $url
+     * @param  int    $page
+     * @return string
+     */
+    protected function getPageLinkWrapper($url, $page)
+    {
+        if ($page == $this->currentPage()) {
+            return $this->getActivePageWrapper($page);
+        }
+ 
+        return $this->getAvailablePageWrapper($url, $page);
+    }
+ 
+    /**
+     * 分页样式
+     */
+    protected function css(){
+        return '  <style type="text/css">
+            .pagination p{
+                margin:0;
+                cursor:pointer
+            }
+            .pagination{
+                height:40px;
+                padding:20px 0px;
+            }
+            .pagination a{
+                display:block;
+                float:left;
+                margin-right:10px;
+                padding:2px 12px;
+                height:24px;
+                border:1px #cccccc solid;
+                background:#fff;
+                text-decoration:none;
+                color:#808080;
+                font-size:12px;
+                line-height:24px;
+            }
+            .pagination a:hover{
+                color:#077ee3;
+                background: white;
+                border:1px #077ee3 solid;
+            }
+            .pagination a.cur{
+                border:none;
+                background:#077ee3;
+                color:#fff;
+            }
+            .pagination p{
+                float:left;
+                padding:2px 12px;
+                font-size:12px;
+                height:24px;
+                line-height:24px;
+                color:#bbb;
+                border:1px #ccc solid;
+                background:#fcfcfc;
+                margin-right:8px;
+            }
+            .pagination p.pageRemark{
+                border-style:none;
+                background:none;
+                margin-right:0px;
+                padding:4px 0px;
+                color:#666;
+            }
+            .pagination p.pageRemark b{
+                color:red;
+            }
+            .pagination p.pageEllipsis{
+                border-style:none;
+                background:none;
+                padding:4px 0px;
+                color:#808080;
+            }
+            .dates li {font-size: 14px;margin:20px 0}
+            .dates li span{float:right}
+        </style>';
+    }
+}

+ 8 - 0
public/.htaccess

@@ -0,0 +1,8 @@
+<IfModule mod_rewrite.c>
+  Options +FollowSymlinks -Multiviews
+  RewriteEngine On
+
+  RewriteCond %{REQUEST_FILENAME} !-d
+  RewriteCond %{REQUEST_FILENAME} !-f
+  RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
+</IfModule>

BIN
public/favicon.ico


+ 19 - 0
public/index.php

@@ -0,0 +1,19 @@
+<?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>
+// +----------------------------------------------------------------------
+
+// [ 应用入口文件 ]
+
+// 定义应用目录
+define('APP_PATH', __DIR__ . '/../application/');
+//后台删除图片用的相对路径
+define('ADMINIMG', __DIR__ . '/../public/static/uploads/');
+// 加载框架引导文件
+require __DIR__ . '/../thinkphp/start.php';

+ 2 - 0
public/robots.txt

@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:

+ 20 - 0
public/router.php

@@ -0,0 +1,20 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+// $Id$
+
+if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) {
+    return false;
+} else {
+    if (!isset($_SERVER['PATH_INFO'])) {
+        $_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
+    }
+    require __DIR__ . "/index.php";
+}

BIN
public/static/admin/images/admin.png


BIN
public/static/admin/images/favicon.png


BIN
public/static/admin/images/fire.png


BIN
public/static/admin/images/jt.png


BIN
public/static/admin/images/noimage.png


BIN
public/static/admin/images/pdf.png


BIN
public/static/admin/images/yl1.jpg


BIN
public/static/admin/images/zan.png


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
public/static/admin/layui2.5.6/css/layui.css


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
public/static/admin/layui2.5.6/css/layui.mobile.css


+ 2 - 0
public/static/admin/layui2.5.6/css/modules/code.css

@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
public/static/admin/layui2.5.6/css/modules/laydate/default/laydate.css


BIN
public/static/admin/layui2.5.6/css/modules/layer/default/icon-ext.png


BIN
public/static/admin/layui2.5.6/css/modules/layer/default/icon.png


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
public/static/admin/layui2.5.6/css/modules/layer/default/layer.css


BIN
public/static/admin/layui2.5.6/css/modules/layer/default/loading-0.gif


BIN
public/static/admin/layui2.5.6/css/modules/layer/default/loading-1.gif


BIN
public/static/admin/layui2.5.6/css/modules/layer/default/loading-2.gif


BIN
public/static/admin/layui2.5.6/font/iconfont.eot


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 25 - 0
public/static/admin/layui2.5.6/font/iconfont.svg


BIN
public/static/admin/layui2.5.6/font/iconfont.ttf


BIN
public/static/admin/layui2.5.6/font/iconfont.woff


BIN
public/static/admin/layui2.5.6/font/iconfont.woff2


BIN
public/static/admin/layui2.5.6/images/face/0.gif


BIN
public/static/admin/layui2.5.6/images/face/1.gif


BIN
public/static/admin/layui2.5.6/images/face/10.gif


BIN
public/static/admin/layui2.5.6/images/face/11.gif


BIN
public/static/admin/layui2.5.6/images/face/12.gif


BIN
public/static/admin/layui2.5.6/images/face/13.gif


BIN
public/static/admin/layui2.5.6/images/face/14.gif


BIN
public/static/admin/layui2.5.6/images/face/15.gif


BIN
public/static/admin/layui2.5.6/images/face/16.gif


BIN
public/static/admin/layui2.5.6/images/face/17.gif


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott