first commit
							
								
								
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,6 @@ | |||||||
|  | /.idea | ||||||
|  | /.vscode | ||||||
|  | 
 | ||||||
|  | *.log | ||||||
|  | 
 | ||||||
|  | .env | ||||||
							
								
								
									
										42
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,42 @@ | |||||||
|  | sudo: false | ||||||
|  | 
 | ||||||
|  | language: php | ||||||
|  | 
 | ||||||
|  | branches: | ||||||
|  |   only: | ||||||
|  |     - stable | ||||||
|  | 
 | ||||||
|  | cache: | ||||||
|  |   directories: | ||||||
|  |     - $HOME/.composer/cache | ||||||
|  | 
 | ||||||
|  | before_install: | ||||||
|  |   - composer self-update | ||||||
|  | 
 | ||||||
|  | install: | ||||||
|  |   - composer install --no-dev --no-interaction --ignore-platform-reqs | ||||||
|  |   - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip . | ||||||
|  |   - composer require --update-no-dev --no-interaction "topthink/think-image:^1.0" | ||||||
|  |   - composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0" | ||||||
|  |   - composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0" | ||||||
|  |   - composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0" | ||||||
|  |   - composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0" | ||||||
|  |   - composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0" | ||||||
|  |   - composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0" | ||||||
|  |   - composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0" | ||||||
|  |   - composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0" | ||||||
|  |   - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip . | ||||||
|  | 
 | ||||||
|  | script: | ||||||
|  |   - php think unit | ||||||
|  | 
 | ||||||
|  | deploy: | ||||||
|  |   provider: releases | ||||||
|  |   api_key: | ||||||
|  |     secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw= | ||||||
|  |   file: | ||||||
|  |     - ThinkPHP_Core.zip | ||||||
|  |     - ThinkPHP_Full.zip | ||||||
|  |   skip_cleanup: true | ||||||
|  |   on: | ||||||
|  |     tags: true | ||||||
| @ -0,0 +1 @@ | |||||||
|  | cwqBZcZwyBKeAsUuItwL0D5iMVB3HlsnsMNeLJ03e48.AYcoB9mjvyHsMDRQrxEJvsZaIEtDHEkl0Hqed5s-LUI | ||||||
							
								
								
									
										9
									
								
								404.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,9 @@ | |||||||
|  | 
 | ||||||
|  | <html> | ||||||
|  | <head><title>404 Not Found</title></head> | ||||||
|  | <body> | ||||||
|  | <center><h1>404 Not Found</h1></center> | ||||||
|  | <hr><center>nginx</center> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
|  |          | ||||||
							
								
								
									
										220
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,220 @@ | |||||||
|  | 
 | ||||||
|  | V免签  —— 个人开发者收款解决方案 | ||||||
|  | =============== | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | V免签(PHP) 是基于Thinkphp5.1 + mysql 实现的一套免签支付程序,主要包含以下特色: | ||||||
|  | 
 | ||||||
|  |  + 收款即时到账,无需进入第三方账户,收款更安全 | ||||||
|  |  + 提供示例代码简单接入 | ||||||
|  |  + 超简单Api使用,提供统一Api实现收款回调 | ||||||
|  |  + 免费、开源,无后门风险 | ||||||
|  |  + 支持监听店员收款信息,可使用支付宝微信小号/模拟器挂机,方便IOS用户 | ||||||
|  |  + 免root,免xp框架,不修改支付宝/微信客户端,防封更安全 | ||||||
|  |   | ||||||
|  | > 如果您不熟悉PHP环境的配置,您可以使用Java版本的服务端( https://github.com/szvone/Vmq ) | ||||||
|  | 
 | ||||||
|  | > 监控端的开源地址位于: https://github.com/szvone/VmqApk | ||||||
|  | 
 | ||||||
|  | > V免签的运行环境为PHP版本>=5.6。 | ||||||
|  | 
 | ||||||
|  | > V免签仅供个人开发者调试测试使用,请勿用于非法用途,商用请您申请官方商户接口 | ||||||
|  | 
 | ||||||
|  | > v免签开发交流群:992029073 (群已被封,作者QQ:7876632【问功能怎样的别加我,不回答,免费开源系统,自行搭建测试,不提供技术支持】) | ||||||
|  | 
 | ||||||
|  | > bug反馈请建立issues | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## 前言 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | V免签为完全开源项目,开源项目意味着作者没有任何收入来源,仅凭个人空闲时间开发,如果您有经济条件,您可以赞助本项目的开发(下方收款码),如果您不想赞助,也请您点击上面的Star给一个星星,也是对我莫大的认同,感谢各位的支持。 | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | 
 | ||||||
|  | ## 原理 | ||||||
|  | + 用户扫码付款 -> 收到款项后手机通知栏会有提醒 -> V免签监控端监听到提醒,推送至服务端->服务端根据金额判断是哪笔订单 | ||||||
|  | 
 | ||||||
|  | ## 安装 | ||||||
|  |  + 推荐使用宝塔面板安装,以下教程为宝塔面板安装教程,其他环境请参考自行配置 | ||||||
|  | 
 | ||||||
|  |     1、下载源代码,Clone or download->Download ZIP | ||||||
|  |      | ||||||
|  |     2、宝塔面板中新建网站,设置: | ||||||
|  |          | ||||||
|  |         + 网站目录->运行目录 设置为public并保存 | ||||||
|  |         + 伪静态 设置为thinkphp并保存 | ||||||
|  |         + 默认文档 设置将index.html放在第一行并保存 | ||||||
|  |      | ||||||
|  |     3、打开网站目录 config/database.php ,设置好您的mysql账号密码。 | ||||||
|  |      | ||||||
|  |     4、导入数据库文件(位于根目录)vmq.sql到您的数据库。 | ||||||
|  |      | ||||||
|  |     5、至此网站搭建完毕,请访问后自行修改配置信息!默认后台账号和密码均为admin | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |  > 升级说明:请您直接下载新版本覆盖旧版本即可! | ||||||
|  |   | ||||||
|  |   | ||||||
|  | ## 调用 | ||||||
|  | 
 | ||||||
|  |  + 请部署完成后访问后台,有详细的Api说明 | ||||||
|  |   | ||||||
|  |   | ||||||
|  | ## 注意 | ||||||
|  | 
 | ||||||
|  |   + 本系统原理为监控收款后手机的通知栏推送消息,所以请保持微信/支付宝/V免签监控端后台正常运行,且添加到内存清理白名单! | ||||||
|  | 
 | ||||||
|  |   + v免签面向用户是个人开发者,如果您不懂如何开发网站,那么v免签不适合您的使用! | ||||||
|  |    | ||||||
|  |   + v免签的原理是监控手机收到收款后的通知栏推送信息,所以不适合于商用多用户的情况,如果您想用于商用,请二次开发! | ||||||
|  |    | ||||||
|  |   + v免签是免费开源产品,所有程序均开放源代码,所以不会有收费计划,因此作者不可能教会每个人部署安装,请参考文档多百度谷歌,v免签使用具有一定的技术门槛,请见谅! | ||||||
|  |    | ||||||
|  |   + v免签的监控端并不适配所有手机,遇到手机无法正常使用的时候,请您更换手机或使用模拟器挂机! | ||||||
|  |    | ||||||
|  |   + v免签拥有双语言服务端,当您使用php版本服务端遇到问题的时候,请您尝试使用java版本服务端,php版本服务端配置略复杂,需要配置伪静态规则,请知悉! | ||||||
|  | 
 | ||||||
|  |   + 正常的安装步骤简略如下 | ||||||
|  |     + 下载服务端部署(GitHub中下载的为最新版) | ||||||
|  |     + 登录网站后台更改系统设置 | ||||||
|  |     + 打开网站后台监控端设置 | ||||||
|  |     + 下载监控端 | ||||||
|  |     + 安装监控端后使用手动配置或扫码配置 | ||||||
|  |     + 监控端中点击开启服务跳转到辅助功能中开启服务 | ||||||
|  |     + 开启服务后返回v免签点击检测监听权限 | ||||||
|  |     + 如果显示监听权限正常,至此安装完毕,如果只收到通知栏推送的测试通知,则系统不兼容无法正常监听 | ||||||
|  |     + 如果显示监听权限正常,还是无法正常运行,那么请确定微信是否关注 “微信支付” 和 “微信收款助手” 这两个公众号 | ||||||
|  |    | ||||||
|  |   + 手机设置步骤(教程为MIUI系统,非MIUI系统请参考教程进行设置) | ||||||
|  |     + 关闭系统神隐模式 | ||||||
|  |         | ||||||
|  |         (旧版MIUI系统)在系统【设置】 - 【其他高级设置】 - 【电量与性能】 - 【神隐模式】 - 【V免签监控端】设置为关闭 | ||||||
|  |          | ||||||
|  |         (新版MIUI系统)在系统【设置】 - 【其他高级设置】 - 【电量与性能】 - 【省电优化】 - 【应用智能省电】,将V免签监控端、微信、支付宝的3个APP全都改为无限制 | ||||||
|  |      | ||||||
|  |     + 添加内存清理白名单 | ||||||
|  |      | ||||||
|  |     + 关闭WIFI优化 | ||||||
|  |      | ||||||
|  |         (旧版MIUI系统)在系统【设置】 - 【WLAN】 -【高级设置】 -【WLAN优化】,关闭它。 | ||||||
|  |      | ||||||
|  |         (新版MIUI系统)在系统【设置】 - 【WLAN】 -【高级设置】 - 【在休眠状态下保持WLAN网络连接】改为“始终” | ||||||
|  |     | ||||||
|  |     + 开启推送通知 | ||||||
|  |      | ||||||
|  |         系统【设置】 - 【通知和状态栏】 - 【通知管理】中,找到这3个App,把里面的开关全部打开 | ||||||
|  |          | ||||||
|  |     + 在微信的【设置】 - 【勿扰模式】中,关闭勿扰模式 | ||||||
|  |      | ||||||
|  |     + 在微信的公众号,关注 【微信收款助手】 这个公众号 | ||||||
|  |      | ||||||
|  |     + 在支付宝的主页,上方搜索框 搜索 【支付助手】 ,进入支付助手,右上角小齿轮,打开【接收付款消息提醒】 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |      | ||||||
|  |   + v免签支持的通知有: | ||||||
|  |     + 支付宝个人收款的推送通知 | ||||||
|  |     + 支付宝商家二维码的收款推送通知 | ||||||
|  |     + 支付宝店员通绑定的店员账号收款的推送通知 | ||||||
|  |     + 微信二维码收款推送通知 | ||||||
|  |     + 微信店员收款推送通知 | ||||||
|  |             | ||||||
|  | ## 更新记录 | ||||||
|  |  + v1.12(2020.01.30) | ||||||
|  |     + 增加一些提示信息    | ||||||
|  |     | ||||||
|  |  + v1.11(2019.10.28) | ||||||
|  |     + 修复上传二维码一直卡在处理中 | ||||||
|  |     + 如二维码无法正常识别,请给/public/qr-code/test.php设置777权限 | ||||||
|  |          | ||||||
|  |  + v1.10.1(2019.09.16) | ||||||
|  |     + 增加版本更新提示 | ||||||
|  |      | ||||||
|  |  + v1.10(2019.09.15) | ||||||
|  |     + 调整二维码识别方案,提升二维码识别率 | ||||||
|  |     + 增加第一次安装时,系统自动生成通讯密钥的功能 | ||||||
|  |     | ||||||
|  |  + v1.9.1(2019.09.15) | ||||||
|  |     + 二维码识别出错增加解决方法:在其他网站(草料二维码识别)识别二维码内容后,将内容重新生成成二维码图片上传。 | ||||||
|  |      | ||||||
|  |  + v1.9(2019.09.11) | ||||||
|  |     + 修复一些已知的BUG | ||||||
|  |     + 因为很多人的服务器时间不准确,因此删除时间校验,不会出现客户端时间错误了 | ||||||
|  |     + 增加主页服务器基本配置的显示列表 | ||||||
|  |      | ||||||
|  |  + v1.8.1(2019.05.22) | ||||||
|  |     + 增加详细的手机端设置教程 | ||||||
|  |     + 同步最新版监控端App | ||||||
|  |      | ||||||
|  |  + v1.8(2019.05.16) | ||||||
|  |     + 更新监控端APP到1.6版本,理论支持更多手机 | ||||||
|  |     + 尝试修复偶然情况下锁定金额无法被释放的问题 | ||||||
|  |      | ||||||
|  |  + v1.7.2(2019.05.12) | ||||||
|  |     + 修复当通知地址带有GET参数的时候,无法正常通知的问题 | ||||||
|  |      | ||||||
|  |  + v1.7.1(2019.05.07) | ||||||
|  |     + 修复上个版本更新后订单金额异常的问题 | ||||||
|  | 
 | ||||||
|  |  + v1.7(2019.05.06) | ||||||
|  |     + 修复部分情况下无法自动释放被锁定金额的情况(本版本数据库有变动,旧版升级请覆盖文件后,将tmp_price表中增加一列,字段名为oid,类型varchar(255),如果您不会增加,请删除原有数据库并重新导入vmq.sql) | ||||||
|  | 
 | ||||||
|  |  + v1.6.2(2019.04.30) | ||||||
|  |     + 修复部分情况下出现订单已过期,但是页面还在倒计时的问题 | ||||||
|  | 
 | ||||||
|  |  + v1.6.1(2019.04.26) | ||||||
|  |     + 再次优化二维码识别,使用js解析二维码,如果失败,则使用PHP解析 | ||||||
|  |      | ||||||
|  |  + v1.6(2019.04.25) | ||||||
|  |     + 优化二维码识别,使用js解析二维码,解决部分二维码识别返回false问题  | ||||||
|  |      | ||||||
|  |  + v1.5(2019.04.24) | ||||||
|  |     + 同步最新版APP | ||||||
|  |     + 添加注意事项说明,完善README.md文档 | ||||||
|  | 
 | ||||||
|  |  + v1.4.1(2019.04.22) | ||||||
|  |     + 修复删除未支付状态的订单时不自动释放锁定金额的问题 | ||||||
|  |     + 修复创建订单时返回的二维码与支付方式不符合的问题 | ||||||
|  | 
 | ||||||
|  |  + v1.4(2019.04.21) | ||||||
|  |     + 修复订单过期不自动释放锁定金额的问题 | ||||||
|  |     + 修复订单超出负荷问题 | ||||||
|  |        | ||||||
|  |  + v1.3(2019.04.20) | ||||||
|  |     + 删除数据库文件中的默认系统设置,防止误导用户 | ||||||
|  |     + 更新监控App到v1.3版本,趋于稳定,可以正常使用 | ||||||
|  |        | ||||||
|  |  + v1.2(2019.04.19) | ||||||
|  |     + 整理代码,重新优化APP兼容性 | ||||||
|  |     + 添加店员到账支持,添加后可以实现安卓备用机/模拟器 挂小号取收款通知,方便IOS用户, | ||||||
|  |        + 微信绑定店员方式=>微信->收付款->二维码收款->收款小账本->添加店员接收通知 | ||||||
|  |        + 支付宝绑定店员方式=>我的->商家服务->店员通->立即添加 | ||||||
|  |     + 服务端修复一堆BUG,建议更新到此版本 | ||||||
|  |     | ||||||
|  |  + v1.1.1(2019.04.19)  | ||||||
|  |    + 修复后台点击补单,补单成功订单未设置成成功状态 | ||||||
|  |    + 修复后台首页金额统计保留两位小数 | ||||||
|  |    + 修复修改系统设置引发的监控端状态重置问题 | ||||||
|  |    + 新增创建订单API接口增加notifyUrl和returnUrl参数,可以在创建订单的时候设置回调接口 | ||||||
|  |     | ||||||
|  |  + v1.1(2019.04.18)  | ||||||
|  |    + 打包thinkphp框架上传 | ||||||
|  |     | ||||||
|  |  + v1.0(2019.04.18)  | ||||||
|  |    + PHP初版发布 | ||||||
|  | 
 | ||||||
|  | ## 版本预告 | ||||||
|  | 
 | ||||||
|  | + 待v免签测试稳定后,将会着手开发对接v免签的发卡平台,也是开源免费,敬请期待! | ||||||
|  | 
 | ||||||
|  | ## 版权信息 | ||||||
|  | 
 | ||||||
|  | V免签遵循 MIT License 开源协议发布,并提供免费使用,请勿用于非法用途。 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 版权所有Copyright © 2019 by vone (http://szvone.cn) | ||||||
|  | 
 | ||||||
|  | All rights reserved。 | ||||||
|  | 
 | ||||||
							
								
								
									
										1
									
								
								application/.htaccess
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1 @@ | |||||||
|  | deny from all | ||||||
							
								
								
									
										406
									
								
								application/admin/controller/Index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,406 @@ | |||||||
|  | <?php | ||||||
|  | namespace app\admin\controller; | ||||||
|  | 
 | ||||||
|  | use think\App; | ||||||
|  | use think\Db; | ||||||
|  | use think\facade\Session; | ||||||
|  | use app\service\QrcodeServer; | ||||||
|  | use Zxing\QrReader; | ||||||
|  | 
 | ||||||
|  | class Index | ||||||
|  | { | ||||||
|  |     public function index() | ||||||
|  |     { | ||||||
|  |         return 'by:vone'; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function getReturn($code = 1,$msg = "成功",$data = null){ | ||||||
|  |         return array("code"=>$code,"msg"=>$msg,"data"=>$data); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function getMain(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  |         $today = strtotime(date("Y-m-d"),time()); | ||||||
|  | 
 | ||||||
|  |         $todayOrder = Db::name("pay_order") | ||||||
|  |             ->where("create_date >=".$today) | ||||||
|  |             ->where("create_date <=".($today+86400)) | ||||||
|  |             ->count(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $todaySuccessOrder = Db::name("pay_order") | ||||||
|  |             ->where("state >=1") | ||||||
|  |             ->where("create_date >=".$today) | ||||||
|  |             ->where("create_date <=".($today+86400)) | ||||||
|  |             ->count(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $todayCloseOrder = Db::name("pay_order") | ||||||
|  |             ->where("state",-1) | ||||||
|  |             ->where("create_date >=".$today) | ||||||
|  |             ->where("create_date <=".($today+86400)) | ||||||
|  |             ->count(); | ||||||
|  | 
 | ||||||
|  |         $todayMoney = Db::name("pay_order") | ||||||
|  |             ->where("state >=1") | ||||||
|  |             ->where("create_date >=".$today) | ||||||
|  |             ->where("create_date <=".($today+86400)) | ||||||
|  |             ->sum("price"); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $countOrder = Db::name("pay_order") | ||||||
|  |             ->count(); | ||||||
|  |         $countMoney = Db::name("pay_order") | ||||||
|  |             ->where("state >=1") | ||||||
|  |             ->sum("price"); | ||||||
|  | 
 | ||||||
|  |         $v = Db::query("SELECT VERSION();"); | ||||||
|  |         $v=$v[0]['VERSION()']; | ||||||
|  | 
 | ||||||
|  |         if(function_exists("gd_info")) { | ||||||
|  |             $gd_info = @gd_info(); | ||||||
|  |             $gd = $gd_info["GD Version"]; | ||||||
|  |         }else{ | ||||||
|  |             $gd = '<font color="red">GD库未开启!</font>'; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return json($this->getReturn(1,"成功",array( | ||||||
|  |             "todayOrder"=>$todayOrder, | ||||||
|  |             "todaySuccessOrder"=>$todaySuccessOrder, | ||||||
|  |             "todayCloseOrder"=>$todayCloseOrder, | ||||||
|  |             "todayMoney"=>round($todayMoney,2), | ||||||
|  |             "countOrder"=>$countOrder, | ||||||
|  |             "countMoney"=>round($countMoney), | ||||||
|  | 
 | ||||||
|  |             "PHP_VERSION"=>PHP_VERSION, | ||||||
|  |             "PHP_OS"=>PHP_OS, | ||||||
|  |             "SERVER"=>$_SERVER ['SERVER_SOFTWARE'], | ||||||
|  |             "MySql"=>$v, | ||||||
|  |             "Thinkphp"=>"v".App::VERSION, | ||||||
|  |             "RunTime"=>$this->sys_uptime(), | ||||||
|  |             "ver"=>"v".config("ver"), | ||||||
|  |             "gd"=>$gd, | ||||||
|  |         ))); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     private function sys_uptime() { | ||||||
|  |         $output=''; | ||||||
|  |         if (false === ($str = @file("/proc/uptime"))) return false; | ||||||
|  |         $str = explode(" ", implode("", $str)); | ||||||
|  |         $str = trim($str[0]); | ||||||
|  |         $min = $str / 60; | ||||||
|  |         $hours = $min / 60; | ||||||
|  |         $days = floor($hours / 24); | ||||||
|  |         $hours = floor($hours - ($days * 24)); | ||||||
|  |         $min = floor($min - ($days * 60 * 24) - ($hours * 60)); | ||||||
|  |         if ($days !== 0) $output .= $days."天"; | ||||||
|  |         if ($hours !== 0) $output .= $hours."小时"; | ||||||
|  |         if ($min !== 0) $output .= $min."分钟"; | ||||||
|  |         return $output; | ||||||
|  |     } | ||||||
|  |     public function checkUpdate(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  |         $ver = $this->getCurl("https://raw.githubusercontent.com/szvone/vmqphp/master/ver"); | ||||||
|  |         $ver = explode("|",$ver); | ||||||
|  | 
 | ||||||
|  |         if (sizeof($ver)==2 && $ver[0]!=config("ver")){ | ||||||
|  |             return json($this->getReturn(1,"[v".$ver[0]."已于".$ver[1]."发布]","https://github.com/szvone/vmqphp")); | ||||||
|  |         }else{ | ||||||
|  |             return json($this->getReturn(0,"程序是最新版")); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function getSettings(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  |         $user = Db::name("setting")->where("vkey","user")->find(); | ||||||
|  |         $pass = Db::name("setting")->where("vkey","pass")->find(); | ||||||
|  |         $notifyUrl = Db::name("setting")->where("vkey","notifyUrl")->find(); | ||||||
|  |         $returnUrl = Db::name("setting")->where("vkey","returnUrl")->find(); | ||||||
|  |         $key = Db::name("setting")->where("vkey","key")->find(); | ||||||
|  |         $lastheart = Db::name("setting")->where("vkey","lastheart")->find(); | ||||||
|  |         $lastpay = Db::name("setting")->where("vkey","lastpay")->find(); | ||||||
|  |         $jkstate = Db::name("setting")->where("vkey","jkstate")->find(); | ||||||
|  |         $close = Db::name("setting")->where("vkey","close")->find(); | ||||||
|  |         $payQf = Db::name("setting")->where("vkey","payQf")->find(); | ||||||
|  |         $wxpay = Db::name("setting")->where("vkey","wxpay")->find(); | ||||||
|  |         $zfbpay = Db::name("setting")->where("vkey","zfbpay")->find(); | ||||||
|  |         if ($key['vvalue']==""){ | ||||||
|  |             $key['vvalue'] = md5(time()); | ||||||
|  |             Db::name("setting")->where("vkey","key")->update(array( | ||||||
|  |                 "vvalue"=>$key['vvalue'] | ||||||
|  |             )); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return json($this->getReturn(1,"成功",array( | ||||||
|  |             "user"=>$user['vvalue'], | ||||||
|  |             "pass"=>$pass['vvalue'], | ||||||
|  |             "notifyUrl"=>$notifyUrl['vvalue'], | ||||||
|  |             "returnUrl"=>$returnUrl['vvalue'], | ||||||
|  |             "key"=>$key['vvalue'], | ||||||
|  |             "lastheart"=>$lastheart['vvalue'], | ||||||
|  |             "lastpay"=>$lastpay['vvalue'], | ||||||
|  |             "jkstate"=>$jkstate['vvalue'], | ||||||
|  |             "close"=>$close['vvalue'], | ||||||
|  |             "payQf"=>$payQf['vvalue'], | ||||||
|  |             "wxpay"=>$wxpay['vvalue'], | ||||||
|  |             "zfbpay"=>$zfbpay['vvalue'], | ||||||
|  | 
 | ||||||
|  |         ))); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     public function saveSetting(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  |         Db::name("setting")->where("vkey","user")->update(array("vvalue"=>input("user"))); | ||||||
|  |         Db::name("setting")->where("vkey","pass")->update(array("vvalue"=>input("pass"))); | ||||||
|  |         Db::name("setting")->where("vkey","notifyUrl")->update(array("vvalue"=>input("notifyUrl"))); | ||||||
|  |         Db::name("setting")->where("vkey","returnUrl")->update(array("vvalue"=>input("returnUrl"))); | ||||||
|  |         Db::name("setting")->where("vkey","key")->update(array("vvalue"=>input("key"))); | ||||||
|  |         Db::name("setting")->where("vkey","close")->update(array("vvalue"=>input("close"))); | ||||||
|  |         Db::name("setting")->where("vkey","payQf")->update(array("vvalue"=>input("payQf"))); | ||||||
|  |         Db::name("setting")->where("vkey","wxpay")->update(array("vvalue"=>input("wxpay"))); | ||||||
|  |         Db::name("setting")->where("vkey","zfbpay")->update(array("vvalue"=>input("zfbpay"))); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         return json($this->getReturn()); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function addPayQrcode(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  |         $db = Db::name("pay_qrcode")->insert(array( | ||||||
|  |             "type"=>input("type"), | ||||||
|  |             "pay_url"=>input("pay_url"), | ||||||
|  |             "price"=>input("price"), | ||||||
|  |         )); | ||||||
|  |         return json($this->getReturn()); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function getPayQrcodes(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  |         $page = input("page"); | ||||||
|  |         $size = input("limit"); | ||||||
|  | 
 | ||||||
|  |         $obj = Db::table('pay_qrcode')->page($page,$size); | ||||||
|  | 
 | ||||||
|  |         $obj = $obj->where("type",input("type")); | ||||||
|  | 
 | ||||||
|  |         $array = $obj->order("id","desc")->select(); | ||||||
|  | 
 | ||||||
|  |         //echo $obj->getLastSql();
 | ||||||
|  |         return json(array( | ||||||
|  |             "code"=>0, | ||||||
|  |             "msg"=>"获取成功", | ||||||
|  |             "data"=>$array, | ||||||
|  |             "count"=> $obj->count() | ||||||
|  |         )); | ||||||
|  |     } | ||||||
|  |     public function delPayQrcode(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  |         Db::name("pay_qrcode")->where("id",input("id"))->delete(); | ||||||
|  |         return json($this->getReturn()); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function getOrders(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  |         $page = input("page"); | ||||||
|  |         $size = input("limit"); | ||||||
|  | 
 | ||||||
|  |         $obj = Db::table('pay_order')->page($page,$size); | ||||||
|  |         if (input("type")){ | ||||||
|  |             $obj = $obj->where("type",input("type")); | ||||||
|  |         } | ||||||
|  |         if (input("state")){ | ||||||
|  |             $obj = $obj->where("state",input("state")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $array = $obj->order("id","desc")->select(); | ||||||
|  | 
 | ||||||
|  |         //echo $obj->getLastSql();
 | ||||||
|  |         return json(array( | ||||||
|  |             "code"=>0, | ||||||
|  |             "msg"=>"获取成功", | ||||||
|  |             "data"=>$array, | ||||||
|  |             "count"=> $obj->count() | ||||||
|  |         )); | ||||||
|  |     } | ||||||
|  |     public function delOrder(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  |         $res = Db::name("pay_order")->where("id",input("id"))->find(); | ||||||
|  | 
 | ||||||
|  |         Db::name("pay_order")->where("id",input("id"))->delete(); | ||||||
|  |         if ($res['state']==0){ | ||||||
|  |             Db::name("tmp_price") | ||||||
|  |                 ->where("oid",$res['order_id']) | ||||||
|  |                 ->delete(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return json($this->getReturn()); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function setBd(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $res = Db::name("pay_order")->where("id",input("id"))->find(); | ||||||
|  | 
 | ||||||
|  |         if ($res){ | ||||||
|  | 
 | ||||||
|  |             $url = $res['notify_url']; | ||||||
|  | 
 | ||||||
|  |             $res2 = Db::name("setting")->where("vkey","key")->find(); | ||||||
|  |             $key = $res2['vvalue']; | ||||||
|  | 
 | ||||||
|  |             $p = "payId=".$res['pay_id']."¶m=".$res['param']."&type=".$res['type']."&price=".$res['price']."&reallyPrice=".$res['really_price']; | ||||||
|  | 
 | ||||||
|  |             $sign = $res['pay_id'].$res['param'].$res['type'].$res['price'].$res['really_price'].$key; | ||||||
|  |             $p = $p . "&sign=".md5($sign); | ||||||
|  |             if (strpos($url,"?")===false){ | ||||||
|  |                 $url = $url."?".$p; | ||||||
|  |             }else{ | ||||||
|  |                 $url = $url."&".$p; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $re = $this->getCurl($url); | ||||||
|  | 
 | ||||||
|  |             if ($re=="success"){ | ||||||
|  |                 if ($res['state']==0){ | ||||||
|  |                     Db::name("tmp_price") | ||||||
|  |                         ->where("oid",$res['order_id']) | ||||||
|  |                         ->delete(); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 Db::name("pay_order")->where("id",$res['id'])->update(array("state"=>1)); | ||||||
|  | 
 | ||||||
|  |                 return json($this->getReturn()); | ||||||
|  |             }else{ | ||||||
|  |                 return json($this->getReturn(-2,"补单失败",$re)); | ||||||
|  |             } | ||||||
|  |         }else{ | ||||||
|  |             return json($this->getReturn(-1,"订单不存在")); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function delGqOrder(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  |         Db::name("pay_order")->where("state","-1")->delete(); | ||||||
|  |         return json($this->getReturn()); | ||||||
|  |     } | ||||||
|  |     public function delLastOrder(){ | ||||||
|  |         if (!Session::has("admin")){ | ||||||
|  |             return json($this->getReturn(-1,"没有登录")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         Db::name("pay_order")->where("create_date <".(time()-604800))->delete(); | ||||||
|  |         return json($this->getReturn()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public function enQrcode($url){ | ||||||
|  | 
 | ||||||
|  |         $qr_code = new QrcodeServer(['generate'=>"display","size",200]); | ||||||
|  |         $content = $qr_code->createServer($url); | ||||||
|  | 
 | ||||||
|  |         return response($content,200,['Content-Length'=>strlen($content)])->contentType('image/png'); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //获取客户IP
 | ||||||
|  |     public function ip() { | ||||||
|  | 
 | ||||||
|  |         return $_SERVER['REMOTE_ADDR']; | ||||||
|  |     } | ||||||
|  |     //发送Http请求
 | ||||||
|  |     function getCurl($url, $post = 0, $cookie = 0, $header = 0, $nobaody = 0) | ||||||
|  |     { | ||||||
|  |         $ch = curl_init(); | ||||||
|  |         curl_setopt($ch, CURLOPT_URL, $url); | ||||||
|  |         curl_setopt($ch, CURLOPT_TIMEOUT, 15); | ||||||
|  |         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | ||||||
|  |         $klsf[] = 'Accept:*/*'; | ||||||
|  |         $klsf[] = 'Accept-Language:zh-cn'; | ||||||
|  |         //$klsf[] = 'Content-Type:application/json';
 | ||||||
|  |         $klsf[] = 'User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Mobile/15C153 MicroMessenger/6.6.1 NetType/WIFI Language/zh_CN'; | ||||||
|  |         $klsf[] = 'Referer:'.$url; | ||||||
|  |         curl_setopt($ch, CURLOPT_HTTPHEADER, $klsf); | ||||||
|  |         if ($post) { | ||||||
|  |             curl_setopt($ch, CURLOPT_POST, 1); | ||||||
|  |             curl_setopt($ch, CURLOPT_POSTFIELDS, $post); | ||||||
|  |         } | ||||||
|  |         if ($header) { | ||||||
|  |             curl_setopt($ch, CURLOPT_HEADER, true); | ||||||
|  |         } | ||||||
|  |         if ($cookie) { | ||||||
|  |             curl_setopt($ch, CURLOPT_COOKIE, $cookie); | ||||||
|  |         } | ||||||
|  |         if ($nobaody) { | ||||||
|  |             curl_setopt($ch, CURLOPT_NOBODY, 1); | ||||||
|  |         } | ||||||
|  |         curl_setopt($ch, CURLOPT_TIMEOUT,60); | ||||||
|  |         curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); | ||||||
|  |         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | ||||||
|  |         $ret = curl_exec($ch); | ||||||
|  |         curl_close($ch); | ||||||
|  |         return $ret; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								application/command.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -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 []; | ||||||
							
								
								
									
										12
									
								
								application/common.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -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: 流年 <liu21st@gmail.com>
 | ||||||
|  | // +----------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | // 应用公共文件
 | ||||||
							
								
								
									
										615
									
								
								application/index/controller/Index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,615 @@ | |||||||
|  | <?php | ||||||
|  | namespace app\index\controller; | ||||||
|  | 
 | ||||||
|  | use think\Db; | ||||||
|  | use think\facade\Session; | ||||||
|  | 
 | ||||||
|  | class Index | ||||||
|  | { | ||||||
|  |     public function index() | ||||||
|  |     { | ||||||
|  |         $url = "http://www.5cctv.net/wp-content/plugins/erphpdown/payment/vmq/notify.php?payId=190717101020112222981¶m=order[7876632]&type=1&price=1&reallyPrice=1&sign=2398a2492db0616381a85c1fedc51a11"; | ||||||
|  |         return $this->getCurl($url); | ||||||
|  | 
 | ||||||
|  |         //return 'by:vone';
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function getReturn($code = 1, $msg = "成功", $data = null) | ||||||
|  |     { | ||||||
|  |         return array("code" => $code, "msg" => $msg, "data" => $data); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //后台用户登录
 | ||||||
|  |     public function login() | ||||||
|  |     { | ||||||
|  |         $user = input("user"); | ||||||
|  |         $pass = input("pass"); | ||||||
|  | 
 | ||||||
|  |         $_user = Db::name("setting")->where("vkey", "user")->find(); | ||||||
|  |         if ($user != $_user["vvalue"]) { | ||||||
|  |             return json($this->getReturn(-1, "账号或密码错误")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $_pass = Db::name("setting")->where("vkey", "pass")->find(); | ||||||
|  |         if ($pass != $_pass["vvalue"]) { | ||||||
|  |             return json($this->getReturn(-1, "账号或密码错误")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         Session::set("admin", 1); | ||||||
|  | 
 | ||||||
|  |         return json($this->getReturn()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //后台菜单
 | ||||||
|  |     public function getMenu() | ||||||
|  |     { | ||||||
|  |         if (!Session::has("admin")) { | ||||||
|  |             return json($this->getReturn(-1, "没有登录")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $menu = array( | ||||||
|  |             array( | ||||||
|  |                 "name" => "系统设置", | ||||||
|  |                 "type" => "url", | ||||||
|  |                 "url" => "admin/setting.html?t=" . time(), | ||||||
|  |             ), | ||||||
|  |             array( | ||||||
|  |                 "name" => "监控端设置", | ||||||
|  |                 "type" => "url", | ||||||
|  |                 "url" => "admin/jk.html?t=" . time(), | ||||||
|  |             ), | ||||||
|  |             array( | ||||||
|  |                 "name" => "微信二维码", | ||||||
|  |                 "type" => "menu", | ||||||
|  |                 "node" => array( | ||||||
|  |                     array( | ||||||
|  |                         "name" => "添加", | ||||||
|  |                         "type" => "url", | ||||||
|  |                         "url" => "admin/addwxqrcode.html?t=" . time(), | ||||||
|  |                     ), | ||||||
|  |                     array( | ||||||
|  |                         "name" => "管理", | ||||||
|  |                         "type" => "url", | ||||||
|  |                         "url" => "admin/wxqrcodelist.html?t=" . time(), | ||||||
|  |                     ) | ||||||
|  |                 ), | ||||||
|  |             ), array( | ||||||
|  |                 "name" => "支付宝二维码", | ||||||
|  |                 "type" => "menu", | ||||||
|  |                 "node" => array( | ||||||
|  |                     array( | ||||||
|  |                         "name" => "添加", | ||||||
|  |                         "type" => "url", | ||||||
|  |                         "url" => "admin/addzfbqrcode.html?t=" . time(), | ||||||
|  |                     ), | ||||||
|  |                     array( | ||||||
|  |                         "name" => "管理", | ||||||
|  |                         "type" => "url", | ||||||
|  |                         "url" => "admin/zfbqrcodelist.html?t=" . time(), | ||||||
|  |                     ) | ||||||
|  |                 ), | ||||||
|  |             ), array( | ||||||
|  |                 "name" => "订单列表", | ||||||
|  |                 "type" => "url", | ||||||
|  |                 "url" => "admin/orderlist.html?t=" . time(), | ||||||
|  |             ), array( | ||||||
|  |                 "name" => "Api说明", | ||||||
|  |                 "type" => "url", | ||||||
|  |                 "url" => "api.html?t=" . time(), | ||||||
|  |             ) | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         return json($menu); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //创建订单
 | ||||||
|  |     public function createOrder() | ||||||
|  |     { | ||||||
|  |         $this->closeEndOrder(); | ||||||
|  | 
 | ||||||
|  |         $payId = input("payId"); | ||||||
|  |         if (!$payId || $payId == "") { | ||||||
|  |             return json($this->getReturn(-1, "请传入商户订单号")); | ||||||
|  |         } | ||||||
|  |         $type = input("type"); | ||||||
|  |         if (!$type || $type == "") { | ||||||
|  |             return json($this->getReturn(-1, "请传入支付方式=>1|微信 2|支付宝")); | ||||||
|  |         } | ||||||
|  |         if ($type != 1 && $type != 2) { | ||||||
|  |             return json($this->getReturn(-1, "支付方式错误=>1|微信 2|支付宝")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $price = input("price"); | ||||||
|  |         if (!$price || $price == "") { | ||||||
|  |             return json($this->getReturn(-1, "请传入订单金额")); | ||||||
|  |         } | ||||||
|  |         if ($price <= 0) { | ||||||
|  |             return json($this->getReturn(-1, "订单金额必须大于0")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $sign = input("sign"); | ||||||
|  |         if (!$sign || $sign == "") { | ||||||
|  |             return json($this->getReturn(-1, "请传入签名")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $isHtml = input("isHtml"); | ||||||
|  |         if (!$isHtml || $isHtml == "") { | ||||||
|  |             $isHtml = 0; | ||||||
|  |         } | ||||||
|  |         $param = input("param"); | ||||||
|  |         if (!$param) { | ||||||
|  |             $param = ""; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $res = Db::name("setting")->where("vkey", "key")->find(); | ||||||
|  |         $key = $res['vvalue']; | ||||||
|  | 
 | ||||||
|  |         if (input("notifyUrl")) { | ||||||
|  |             $notify_url = input("notifyUrl"); | ||||||
|  |         } else { | ||||||
|  |             $res = Db::name("setting")->where("vkey", "notifyUrl")->find(); | ||||||
|  |             $notify_url = $res['vvalue']; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (input("returnUrl")) { | ||||||
|  |             $return_url = input("returnUrl"); | ||||||
|  |         } else { | ||||||
|  |             $res = Db::name("setting")->where("vkey", "returnUrl")->find(); | ||||||
|  |             $return_url = $res['vvalue']; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $_sign = md5($payId . $param . $type . $price . $key); | ||||||
|  |         if ($sign != $_sign) { | ||||||
|  |             return json($this->getReturn(-1, "签名错误")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $jkstate = Db::name("setting")->where("vkey", "jkstate")->find(); | ||||||
|  |         $jkstate = $jkstate['vvalue']; | ||||||
|  |         if ($jkstate!="1"){ | ||||||
|  |             return json($this->getReturn(-1, "监控端状态异常,请检查")); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $reallyPrice = bcmul($price ,100); | ||||||
|  | 
 | ||||||
|  |         $payQf = Db::name("setting")->where("vkey", "payQf")->find(); | ||||||
|  |         $payQf = $payQf['vvalue']; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $orderId = date("YmdHms") . rand(1, 9) . rand(1, 9) . rand(1, 9) . rand(1, 9); | ||||||
|  | 
 | ||||||
|  |         $ok = false; | ||||||
|  |         for ($i = 0; $i < 10; $i++) { | ||||||
|  |             $tmpPrice = $reallyPrice . "-" . $type; | ||||||
|  | 
 | ||||||
|  |             $row = Db::execute("INSERT IGNORE INTO tmp_price (price,oid) VALUES ('" . $tmpPrice . "','".$orderId."')"); | ||||||
|  |             if ($row) { | ||||||
|  |                 $ok = true; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             if ($payQf == 1) { | ||||||
|  |                 $reallyPrice++; | ||||||
|  |             } else if ($payQf == 2) { | ||||||
|  |                 $reallyPrice--; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!$ok) { | ||||||
|  |             return json($this->getReturn(-1, "订单超出负荷,请稍后重试")); | ||||||
|  |         } | ||||||
|  |         //echo $reallyPrice;
 | ||||||
|  | 
 | ||||||
|  |         $reallyPrice = bcdiv($reallyPrice, 100,2); | ||||||
|  | 
 | ||||||
|  |         if ($type == 1) { | ||||||
|  |             $payUrl = Db::name("setting")->where("vkey", "wxpay")->find(); | ||||||
|  |             $payUrl = $payUrl['vvalue']; | ||||||
|  | 
 | ||||||
|  |         } else if ($type == 2) { | ||||||
|  |             $payUrl = Db::name("setting")->where("vkey", "zfbpay")->find(); | ||||||
|  |             $payUrl = $payUrl['vvalue']; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if ($payUrl == "") { | ||||||
|  |             return json($this->getReturn(-1, "请您先进入后台配置程序")); | ||||||
|  |         } | ||||||
|  |         $isAuto = 1; | ||||||
|  |         $_payUrl = Db::name("pay_qrcode") | ||||||
|  |             ->where("price", $reallyPrice) | ||||||
|  |             ->where("type", $type) | ||||||
|  |             ->find(); | ||||||
|  |         if ($_payUrl) { | ||||||
|  |             $payUrl = $_payUrl['pay_url']; | ||||||
|  |             $isAuto = 0; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $res = Db::name("pay_order")->where("pay_id", $payId)->find(); | ||||||
|  |         if ($res) { | ||||||
|  |             return json($this->getReturn(-1, "商户订单号已存在")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $createDate = time(); | ||||||
|  |         $data = array( | ||||||
|  |             "close_date" => 0, | ||||||
|  |             "create_date" => $createDate, | ||||||
|  |             "is_auto" => $isAuto, | ||||||
|  |             "notify_url" => $notify_url, | ||||||
|  |             "order_id" => $orderId, | ||||||
|  |             "param" => $param, | ||||||
|  |             "pay_date" => 0, | ||||||
|  |             "pay_id" => $payId, | ||||||
|  |             "pay_url" => $payUrl, | ||||||
|  |             "price" => $price, | ||||||
|  |             "really_price" => $reallyPrice, | ||||||
|  |             "return_url" => $return_url, | ||||||
|  |             "state" => 0, | ||||||
|  |             "type" => $type | ||||||
|  | 
 | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         Db::name("pay_order")->insert($data); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         //return "<script>window.location.href = '/payPage/pay.html?orderId=" + c.getOrderId() + "'</script>";
 | ||||||
|  | 
 | ||||||
|  |         if ($isHtml == 1) { | ||||||
|  | 
 | ||||||
|  |             echo "<script>window.location.href = 'payPage/pay.html?orderId=" . $orderId . "'</script>"; | ||||||
|  | 
 | ||||||
|  |         } else { | ||||||
|  |             $time = Db::name("setting")->where("vkey", "close")->find(); | ||||||
|  |             $data = array( | ||||||
|  |                 "payId" => $payId, | ||||||
|  |                 "orderId" => $orderId, | ||||||
|  |                 "payType" => $type, | ||||||
|  |                 "price" => $price, | ||||||
|  |                 "reallyPrice" => $reallyPrice, | ||||||
|  |                 "payUrl" => $payUrl, | ||||||
|  |                 "isAuto" => $isAuto, | ||||||
|  |                 "state" => 0, | ||||||
|  |                 "timeOut" => $time['vvalue'], | ||||||
|  |                 "date" => $createDate | ||||||
|  |             ); | ||||||
|  |             return json($this->getReturn(1, "成功", $data)); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     //获取订单信息
 | ||||||
|  |     public function getOrder() | ||||||
|  |     { | ||||||
|  | 
 | ||||||
|  |         $res = Db::name("pay_order")->where("order_id", input("orderId"))->find(); | ||||||
|  |         if ($res){ | ||||||
|  |             $time = Db::name("setting")->where("vkey", "close")->find(); | ||||||
|  | 
 | ||||||
|  |             $data = array( | ||||||
|  |                 "payId" => $res['pay_id'], | ||||||
|  |                 "orderId" => $res['order_id'], | ||||||
|  |                 "payType" => $res['type'], | ||||||
|  |                 "price" => $res['price'], | ||||||
|  |                 "reallyPrice" => $res['really_price'], | ||||||
|  |                 "payUrl" => $res['pay_url'], | ||||||
|  |                 "isAuto" => $res['is_auto'], | ||||||
|  |                 "state" => $res['state'], | ||||||
|  |                 "timeOut" => $time['vvalue'], | ||||||
|  |                 "date" => $res['create_date'] | ||||||
|  |             ); | ||||||
|  |             return json($this->getReturn(1, "成功", $data)); | ||||||
|  |         }else{ | ||||||
|  |             return json($this->getReturn(-1, "云端订单编号不存在")); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     //查询订单状态
 | ||||||
|  |     public function checkOrder() | ||||||
|  |     { | ||||||
|  |         $res = Db::name("pay_order")->where("order_id", input("orderId"))->find(); | ||||||
|  |         if ($res){ | ||||||
|  |             if ($res['state']==0){ | ||||||
|  |                 return json($this->getReturn(-1, "订单未支付")); | ||||||
|  |             } | ||||||
|  |             if ($res['state']==-1){ | ||||||
|  |                 return json($this->getReturn(-1, "订单已过期")); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $res2 = Db::name("setting")->where("vkey","key")->find(); | ||||||
|  |             $key = $res2['vvalue']; | ||||||
|  | 
 | ||||||
|  |             $res['price'] = number_format($res['price'],2,".",""); | ||||||
|  |             $res['really_price'] = number_format($res['really_price'],2,".",""); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             $p = "payId=".$res['pay_id']."¶m=".$res['param']."&type=".$res['type']."&price=".$res['price']."&reallyPrice=".$res['really_price']; | ||||||
|  | 
 | ||||||
|  |             $sign = $res['pay_id'].$res['param'].$res['type'].$res['price'].$res['really_price'].$key; | ||||||
|  |             $p = $p . "&sign=".md5($sign); | ||||||
|  | 
 | ||||||
|  |             $url = $res['return_url']; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             if (strpos($url,"?")===false){ | ||||||
|  |                 $url = $url."?".$p; | ||||||
|  |             }else{ | ||||||
|  |                 $url = $url."&".$p; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return json($this->getReturn(1, "成功", $url)); | ||||||
|  |         }else{ | ||||||
|  |             return json($this->getReturn(-1, "云端订单编号不存在")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     //关闭订单
 | ||||||
|  |     public function closeOrder(){ | ||||||
|  |         $res2 = Db::name("setting")->where("vkey","key")->find(); | ||||||
|  |         $key = $res2['vvalue']; | ||||||
|  |         $orderId = input("orderId"); | ||||||
|  | 
 | ||||||
|  |         $_sign = $orderId.$key; | ||||||
|  | 
 | ||||||
|  |         if (md5($_sign)!=input("sign")){ | ||||||
|  |             return json($this->getReturn(-1, "签名校验不通过")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $res = Db::name("pay_order")->where("order_id",$orderId)->find(); | ||||||
|  | 
 | ||||||
|  |         if ($res){ | ||||||
|  |             if ($res['state']!=0){ | ||||||
|  |                 return json($this->getReturn(-1, "订单状态不允许关闭")); | ||||||
|  |             } | ||||||
|  |             Db::name("pay_order")->where("order_id",$orderId)->update(array("state"=>-1,"close_date"=>time())); | ||||||
|  |             Db::name("tmp_price") | ||||||
|  |                 ->where("oid",$res['order_id']) | ||||||
|  |                 ->delete(); | ||||||
|  |             return json($this->getReturn(1, "成功")); | ||||||
|  |         }else{ | ||||||
|  |             return json($this->getReturn(-1, "云端订单编号不存在")); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     //获取监控端状态
 | ||||||
|  |     public function getState(){ | ||||||
|  |         $res2 = Db::name("setting")->where("vkey","key")->find(); | ||||||
|  |         $key = $res2['vvalue']; | ||||||
|  |         $t = input("t"); | ||||||
|  | 
 | ||||||
|  |         $_sign = $t.$key; | ||||||
|  | 
 | ||||||
|  |         if (md5($_sign)!=input("sign")){ | ||||||
|  |             return json($this->getReturn(-1, "签名校验不通过")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $res = Db::name("setting")->where("vkey","lastheart")->find(); | ||||||
|  |         $lastheart = $res['vvalue']; | ||||||
|  |         $res = Db::name("setting")->where("vkey","lastpay")->find(); | ||||||
|  |         $lastpay = $res['vvalue']; | ||||||
|  |         $res = Db::name("setting")->where("vkey","jkstate")->find(); | ||||||
|  |         $jkstate = $res['vvalue']; | ||||||
|  | 
 | ||||||
|  |         return json($this->getReturn(1, "成功",array("lastheart"=>$lastheart,"lastpay"=>$lastpay,"jkstate"=>$jkstate))); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //App心跳接口
 | ||||||
|  |     public function appHeart(){ | ||||||
|  |         $this->closeEndOrder(); | ||||||
|  | 
 | ||||||
|  |         $res2 = Db::name("setting")->where("vkey","key")->find(); | ||||||
|  |         $key = $res2['vvalue']; | ||||||
|  |         $t = input("t"); | ||||||
|  | 
 | ||||||
|  |         $_sign = $t.$key; | ||||||
|  | 
 | ||||||
|  |         if (md5($_sign)!=input("sign")){ | ||||||
|  |             return json($this->getReturn(-1, "签名校验不通过")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | //        $jg = time()*1000 - $t;
 | ||||||
|  | //        if ($jg>50000 || $jg<-50000){
 | ||||||
|  | //            return json($this->getReturn(-1, "客户端时间错误"));
 | ||||||
|  | //        }
 | ||||||
|  | 
 | ||||||
|  |         Db::name("setting")->where("vkey","lastheart")->update(array("vvalue"=>time())); | ||||||
|  |         Db::name("setting")->where("vkey","jkstate")->update(array("vvalue"=>1)); | ||||||
|  |         return json($this->getReturn()); | ||||||
|  |     } | ||||||
|  |     //App推送付款数据接口
 | ||||||
|  |     public function appPush(){ | ||||||
|  |         $this->closeEndOrder(); | ||||||
|  | 
 | ||||||
|  |         $res2 = Db::name("setting")->where("vkey","key")->find(); | ||||||
|  |         $key = $res2['vvalue']; | ||||||
|  |         $t = input("t"); | ||||||
|  |         $type = input("type"); | ||||||
|  |         $price = input("price"); | ||||||
|  | 
 | ||||||
|  |         $_sign = $type.$price.$t.$key; | ||||||
|  | 
 | ||||||
|  |         if (md5($_sign)!=input("sign")){ | ||||||
|  |             return json($this->getReturn(-1, "签名校验不通过")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | //        $jg = time()*1000 - $t;
 | ||||||
|  | //        if ($jg>50000 || $jg<-50000){
 | ||||||
|  | //            return json($this->getReturn(-1, "客户端时间错误"));
 | ||||||
|  | //        }
 | ||||||
|  | 
 | ||||||
|  |         Db::name("setting") | ||||||
|  |             ->where("vkey","lastpay") | ||||||
|  |             ->update( | ||||||
|  |                 array( | ||||||
|  |                     "vvalue"=>time() | ||||||
|  |                 ) | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |         $res = Db::name("pay_order") | ||||||
|  |             ->where("really_price",$price) | ||||||
|  |             ->where("state",0) | ||||||
|  |             ->where("type",$type) | ||||||
|  |             ->find(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         if ($res){ | ||||||
|  | 
 | ||||||
|  |             Db::name("tmp_price") | ||||||
|  |                 ->where("oid",$res['order_id']) | ||||||
|  |                 ->delete(); | ||||||
|  | 
 | ||||||
|  |             Db::name("pay_order")->where("id",$res['id'])->update(array("state"=>1,"pay_date"=>time(),"close_date"=>time())); | ||||||
|  | 
 | ||||||
|  |             $url = $res['notify_url']; | ||||||
|  | 
 | ||||||
|  |             $res2 = Db::name("setting")->where("vkey","key")->find(); | ||||||
|  |             $key = $res2['vvalue']; | ||||||
|  | 
 | ||||||
|  |             $p = "payId=".$res['pay_id']."¶m=".$res['param']."&type=".$res['type']."&price=".$res['price']."&reallyPrice=".$res['really_price']; | ||||||
|  | 
 | ||||||
|  |             $sign = $res['pay_id'].$res['param'].$res['type'].$res['price'].$res['really_price'].$key; | ||||||
|  |             $p = $p . "&sign=".md5($sign); | ||||||
|  | 
 | ||||||
|  |             if (strpos($url,"?")===false){ | ||||||
|  |                 $url = $url."?".$p; | ||||||
|  |             }else{ | ||||||
|  |                 $url = $url."&".$p; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             $re = $this->getCurl($url); | ||||||
|  |             if ($re=="success"){ | ||||||
|  |                 return json($this->getReturn()); | ||||||
|  |             }else{ | ||||||
|  |                 Db::name("pay_order")->where("id",$res['id'])->update(array("state"=>2)); | ||||||
|  | 
 | ||||||
|  |                 return json($this->getReturn(-1,"异步通知失败")); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         }else{ | ||||||
|  |             $data = array( | ||||||
|  |                 "close_date" => 0, | ||||||
|  |                 "create_date" => time(), | ||||||
|  |                 "is_auto" => 0, | ||||||
|  |                 "notify_url" => "", | ||||||
|  |                 "order_id" => "无订单转账", | ||||||
|  |                 "param" => "无订单转账", | ||||||
|  |                 "pay_date" => 0, | ||||||
|  |                 "pay_id" => "无订单转账", | ||||||
|  |                 "pay_url" => "", | ||||||
|  |                 "price" => $price, | ||||||
|  |                 "really_price" => $price, | ||||||
|  |                 "return_url" => "", | ||||||
|  |                 "state" => 1, | ||||||
|  |                 "type" => $type | ||||||
|  | 
 | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             Db::name("pay_order")->insert($data); | ||||||
|  |             return json($this->getReturn()); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //关闭过期订单接口(请用定时器至少1分钟调用一次)
 | ||||||
|  |     public function closeEndOrder(){ | ||||||
|  |         $res = Db::name("setting")->where("vkey","lastheart")->find(); | ||||||
|  |         $lastheart = $res['vvalue']; | ||||||
|  |         if ((time()-$lastheart)>60){ | ||||||
|  |             Db::name("setting")->where("vkey","jkstate")->update(array("vvalue"=>0)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         $time = Db::name("setting")->where("vkey", "close")->find(); | ||||||
|  | 
 | ||||||
|  |         $closeTime = time()-60*$time['vvalue']; | ||||||
|  |         $close_date = time(); | ||||||
|  | 
 | ||||||
|  |         $res = Db::name("pay_order") | ||||||
|  |             ->where("create_date <=".$closeTime) | ||||||
|  |             ->where("state",0) | ||||||
|  |             ->update(array("state"=>-1,"close_date"=>$close_date)); | ||||||
|  | 
 | ||||||
|  |         if ($res){ | ||||||
|  |             $rows = Db::name("pay_order")->where("close_date",$close_date)->select(); | ||||||
|  |             foreach ($rows as $row){ | ||||||
|  |                 Db::name("tmp_price") | ||||||
|  |                     ->where("oid",$row['order_id']) | ||||||
|  |                     ->delete(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $rows = Db::name("tmp_price")->select(); | ||||||
|  |             foreach ($rows as $row){ | ||||||
|  |                 $re = Db::name("pay_order")->where("order_id",$row['oid'])->find(); | ||||||
|  |                 if ($re){ | ||||||
|  | 
 | ||||||
|  |                 }else{ | ||||||
|  |                     Db::name("tmp_price") | ||||||
|  |                         ->where("oid",$row['oid']) | ||||||
|  |                         ->delete(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             return json($this->getReturn(1,"成功清理".$res."条订单")); | ||||||
|  |         }else{ | ||||||
|  |             return json($this->getReturn(1,"没有等待清理的订单")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //发送Http请求
 | ||||||
|  |     private function getCurl($url, $post = 0, $cookie = 0, $header = 0, $nobaody = 0) | ||||||
|  |     { | ||||||
|  |         $ch = curl_init(); | ||||||
|  |         curl_setopt($ch, CURLOPT_URL, $url); | ||||||
|  |         curl_setopt($ch, CURLOPT_TIMEOUT, 15); | ||||||
|  |         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | ||||||
|  |         $klsf[] = 'Accept:*/*'; | ||||||
|  |         $klsf[] = 'Accept-Language:zh-cn'; | ||||||
|  |         //$klsf[] = 'Content-Type:application/json';
 | ||||||
|  |         $klsf[] = 'User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Mobile/15C153 MicroMessenger/6.6.1 NetType/WIFI Language/zh_CN'; | ||||||
|  |         $klsf[] = 'Referer:'.$url; | ||||||
|  |         curl_setopt($ch, CURLOPT_HTTPHEADER, $klsf); | ||||||
|  |         if ($post) { | ||||||
|  |             curl_setopt($ch, CURLOPT_POST, 1); | ||||||
|  |             curl_setopt($ch, CURLOPT_POSTFIELDS, $post); | ||||||
|  |         } | ||||||
|  |         if ($header) { | ||||||
|  |             curl_setopt($ch, CURLOPT_HEADER, true); | ||||||
|  |         } | ||||||
|  |         if ($cookie) { | ||||||
|  |             curl_setopt($ch, CURLOPT_COOKIE, $cookie); | ||||||
|  |         } | ||||||
|  |         if ($nobaody) { | ||||||
|  |             curl_setopt($ch, CURLOPT_NOBODY, 1); | ||||||
|  |         } | ||||||
|  |         curl_setopt($ch, CURLOPT_TIMEOUT,60); | ||||||
|  |         curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); | ||||||
|  |         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | ||||||
|  |         $ret = curl_exec($ch); | ||||||
|  |         curl_close($ch); | ||||||
|  |         return $ret; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								application/provider.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,14 @@ | |||||||
|  | <?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 [ | ||||||
|  | ]; | ||||||
							
								
								
									
										109
									
								
								application/service/QrcodeServer.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,109 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Created by PhpStorm. | ||||||
|  |  * User: vone | ||||||
|  |  * Date: 2019/4/16 | ||||||
|  |  * Time: 22:13 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | namespace app\service; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | use Endroid\QrCode\ErrorCorrectionLevel; | ||||||
|  | use Endroid\QrCode\LabelAlignment; | ||||||
|  | use Endroid\QrCode\QrCode; | ||||||
|  | 
 | ||||||
|  | class QrcodeServer | ||||||
|  | { | ||||||
|  |     protected $_qr; | ||||||
|  |     protected $_encoding        = 'UTF-8';              // 编码类型
 | ||||||
|  |     protected $_size            = 180;                  // 二维码大小
 | ||||||
|  |     protected $_logo            = false;                // 是否需要带logo的二维码
 | ||||||
|  |     protected $_logo_url        = '';                   // logo图片路径
 | ||||||
|  |     protected $_logo_size       = 80;                   // logo大小
 | ||||||
|  |     protected $_title           = false;                // 是否需要二维码title
 | ||||||
|  |     protected $_title_content   = '';                   // title内容
 | ||||||
|  |     protected $_generate        = 'display';            // display-直接显示  writefile-写入文件
 | ||||||
|  |     protected $_file_name       = './static/qrcode';    // 写入文件路径
 | ||||||
|  |     const MARGIN           = 10;                        // 二维码内容相对于整张图片的外边距
 | ||||||
|  |     const WRITE_NAME       = 'png';                     // 写入文件的后缀名
 | ||||||
|  |     const FOREGROUND_COLOR = ['r' => 0, 'g' => 0, 'b' => 0, 'a' => 0];          // 前景色
 | ||||||
|  |     const BACKGROUND_COLOR = ['r' => 255, 'g' => 255, 'b' => 255, 'a' => 0];    // 背景色
 | ||||||
|  | 
 | ||||||
|  |     public function __construct($config) { | ||||||
|  |         isset($config['generate'])      &&  $this->_generate        = $config['generate']; | ||||||
|  |         isset($config['encoding'])      &&  $this->_encoding        = $config['encoding']; | ||||||
|  |         isset($config['size'])          &&  $this->_size            = $config['size']; | ||||||
|  |         isset($config['logo'])          &&  $this->_logo            = $config['logo']; | ||||||
|  |         isset($config['logo_url'])      &&  $this->_logo_url        = $config['logo_url']; | ||||||
|  |         isset($config['logo_size'])     &&  $this->_logo_size       = $config['logo_size']; | ||||||
|  |         isset($config['title'])         &&  $this->_title           = $config['title']; | ||||||
|  |         isset($config['title_content']) &&  $this->_title_content   = $config['title_content']; | ||||||
|  |         isset($config['file_name'])     &&  $this->_file_name       = $config['file_name']; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 生成二维码 | ||||||
|  |      * @param $content //需要写入的内容
 | ||||||
|  |      * @return array | page input | ||||||
|  |      */ | ||||||
|  |     public function createServer($content) { | ||||||
|  |         $this->_qr = new QrCode($content); | ||||||
|  |         $this->_qr->setSize($this->_size); | ||||||
|  |         $this->_qr->setWriterByName(self::WRITE_NAME); | ||||||
|  |         $this->_qr->setMargin(self::MARGIN); | ||||||
|  |         $this->_qr->setEncoding($this->_encoding); | ||||||
|  |         $this->_qr->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH);   // 容错率
 | ||||||
|  |         $this->_qr->setForegroundColor(self::FOREGROUND_COLOR); | ||||||
|  |         $this->_qr->setBackgroundColor(self::BACKGROUND_COLOR); | ||||||
|  |         // 是否需要title
 | ||||||
|  |         if ($this->_title) { | ||||||
|  |             $this->_qr->setLabel($this->_title_content, 16, null, LabelAlignment::CENTER); | ||||||
|  |         } | ||||||
|  |         // 是否需要logo
 | ||||||
|  |         if ($this->_logo) { | ||||||
|  |             $this->_qr->setLogoPath($this->_logo_url); | ||||||
|  |             $this->_qr->setLogoWidth($this->_logo_size); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $this->_qr->setValidateResult(false); | ||||||
|  | 
 | ||||||
|  |         if ($this->_generate == 'display') { | ||||||
|  |             // 展示二维码
 | ||||||
|  |             // 前端调用 例:<img src="http://localhost/qr.php?url=base64_url_string">
 | ||||||
|  |             header('Content-Type: ' . $this->_qr->getContentType()); | ||||||
|  |             return $this->_qr->writeString(); | ||||||
|  |         } else if ($this->_generate == 'writefile') { | ||||||
|  |             // 写入文件
 | ||||||
|  |             $file_name = $this->_file_name; | ||||||
|  |             return $this->generateImg($file_name); | ||||||
|  |         } else { | ||||||
|  |             return ['success' => false, 'message' => 'the generate type not found', 'data' => '']; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 生成文件 | ||||||
|  |      * @param $file_name //目录文件 例: /tmp
 | ||||||
|  |      * @return array | ||||||
|  |      */ | ||||||
|  |     public function generateImg($file_name) { | ||||||
|  |         $file_path = $file_name . DIRECTORY_SEPARATOR . uniqid() . '.' . self::WRITE_NAME; | ||||||
|  | 
 | ||||||
|  |         if (!file_exists($file_name)) { | ||||||
|  |             mkdir($file_name, 0777, true); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             $this->_qr->writeFile($file_path); | ||||||
|  |             $data = [ | ||||||
|  |                 'url' => $file_path, | ||||||
|  |                 'ext' => self::WRITE_NAME, | ||||||
|  |             ]; | ||||||
|  |             return ['success' => true, 'message' => 'write qrimg success', 'data' => $data]; | ||||||
|  |         } catch (\Exception $e) { | ||||||
|  |             return ['success' => false, 'message' => $e->getMessage(), 'data' => '']; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										28
									
								
								application/tags.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -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'      => [], | ||||||
|  | ]; | ||||||
							
								
								
									
										26
									
								
								build.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,26 @@ | |||||||
|  | <?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'], | ||||||
|  | 
 | ||||||
|  |     // 定义demo模块的自动生成 (按照实际定义的文件名生成)
 | ||||||
|  |     'demo'     => [ | ||||||
|  |         '__file__'   => ['common.php'], | ||||||
|  |         '__dir__'    => ['behavior', 'controller', 'model', 'view'], | ||||||
|  |         'controller' => ['Index', 'Test', 'UserType'], | ||||||
|  |         'model'      => ['User', 'UserType'], | ||||||
|  |         'view'       => ['index/index'], | ||||||
|  |     ], | ||||||
|  | 
 | ||||||
|  |     // 其他更多的模块定义
 | ||||||
|  | ]; | ||||||
							
								
								
									
										36
									
								
								composer.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,36 @@ | |||||||
|  | { | ||||||
|  |     "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.6.0", | ||||||
|  |         "topthink/framework": "5.1.*", | ||||||
|  |         "endroid/qrcode": "^2.5", | ||||||
|  |         "endroid/qr-code": "^2.5", | ||||||
|  |         "khanamiryan/qrcode-detector-decoder": "^1.0" | ||||||
|  |     }, | ||||||
|  |     "autoload": { | ||||||
|  |         "psr-4": { | ||||||
|  |             "app\\": "application" | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |     "extra": { | ||||||
|  |         "think-path": "thinkphp" | ||||||
|  |     }, | ||||||
|  |     "config": { | ||||||
|  |         "preferred-install": "dist" | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										625
									
								
								composer.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,625 @@ | |||||||
|  | { | ||||||
|  |     "_readme": [ | ||||||
|  |         "This file locks the dependencies of your project to a known state", | ||||||
|  |         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", | ||||||
|  |         "This file is @generated automatically" | ||||||
|  |     ], | ||||||
|  |     "content-hash": "ec45aa9c45b84ff153bf9509eb28eba3", | ||||||
|  |     "packages": [ | ||||||
|  |         { | ||||||
|  |             "name": "bacon/bacon-qr-code", | ||||||
|  |             "version": "1.0.3", | ||||||
|  |             "source": { | ||||||
|  |                 "type": "git", | ||||||
|  |                 "url": "https://github.com/Bacon/BaconQrCode.git", | ||||||
|  |                 "reference": "5a91b62b9d37cee635bbf8d553f4546057250bee" | ||||||
|  |             }, | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/5a91b62b9d37cee635bbf8d553f4546057250bee", | ||||||
|  |                 "reference": "5a91b62b9d37cee635bbf8d553f4546057250bee", | ||||||
|  |                 "shasum": "", | ||||||
|  |                 "mirrors": [ | ||||||
|  |                     { | ||||||
|  |                         "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", | ||||||
|  |                         "preferred": true | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "ext-iconv": "*", | ||||||
|  |                 "php": "^5.4|^7.0" | ||||||
|  |             }, | ||||||
|  |             "require-dev": { | ||||||
|  |                 "phpunit/phpunit": "^4.8" | ||||||
|  |             }, | ||||||
|  |             "suggest": { | ||||||
|  |                 "ext-gd": "to generate QR code images" | ||||||
|  |             }, | ||||||
|  |             "type": "library", | ||||||
|  |             "autoload": { | ||||||
|  |                 "psr-0": { | ||||||
|  |                     "BaconQrCode": "src/" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "notification-url": "https://packagist.org/downloads/", | ||||||
|  |             "license": [ | ||||||
|  |                 "BSD-2-Clause" | ||||||
|  |             ], | ||||||
|  |             "authors": [ | ||||||
|  |                 { | ||||||
|  |                     "name": "Ben Scholzen 'DASPRiD'", | ||||||
|  |                     "email": "mail@dasprids.de", | ||||||
|  |                     "homepage": "http://www.dasprids.de", | ||||||
|  |                     "role": "Developer" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "description": "BaconQrCode is a QR code generator for PHP.", | ||||||
|  |             "homepage": "https://github.com/Bacon/BaconQrCode", | ||||||
|  |             "time": "2017-10-17T09:59:25+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "endroid/qr-code", | ||||||
|  |             "version": "2.5.1", | ||||||
|  |             "source": { | ||||||
|  |                 "type": "git", | ||||||
|  |                 "url": "https://github.com/endroid/qr-code.git", | ||||||
|  |                 "reference": "6062677d3404e0ded40647b8f62ec55ff9722eb7" | ||||||
|  |             }, | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://api.github.com/repos/endroid/qr-code/zipball/6062677d3404e0ded40647b8f62ec55ff9722eb7", | ||||||
|  |                 "reference": "6062677d3404e0ded40647b8f62ec55ff9722eb7", | ||||||
|  |                 "shasum": "", | ||||||
|  |                 "mirrors": [ | ||||||
|  |                     { | ||||||
|  |                         "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", | ||||||
|  |                         "preferred": true | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "bacon/bacon-qr-code": "^1.0.3", | ||||||
|  |                 "ext-gd": "*", | ||||||
|  |                 "khanamiryan/qrcode-detector-decoder": "1", | ||||||
|  |                 "myclabs/php-enum": "^1.5", | ||||||
|  |                 "php": ">=5.6", | ||||||
|  |                 "symfony/options-resolver": "^2.7", | ||||||
|  |                 "symfony/property-access": "^2.7" | ||||||
|  |             }, | ||||||
|  |             "require-dev": { | ||||||
|  |                 "phpunit/phpunit": "^5.7", | ||||||
|  |                 "symfony/asset": "^2.7", | ||||||
|  |                 "symfony/browser-kit": "^2.7", | ||||||
|  |                 "symfony/finder": "^2.7", | ||||||
|  |                 "symfony/framework-bundle": "^2.7", | ||||||
|  |                 "symfony/http-kernel": "^2.7", | ||||||
|  |                 "symfony/templating": "^2.7", | ||||||
|  |                 "symfony/twig-bundle": "^2.7", | ||||||
|  |                 "symfony/yaml": "^2.7" | ||||||
|  |             }, | ||||||
|  |             "type": "symfony-bundle", | ||||||
|  |             "extra": { | ||||||
|  |                 "branch-alias": { | ||||||
|  |                     "dev-master": "2.x-dev" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "autoload": { | ||||||
|  |                 "psr-4": { | ||||||
|  |                     "Endroid\\QrCode\\": "src/" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "notification-url": "https://packagist.org/downloads/", | ||||||
|  |             "license": [ | ||||||
|  |                 "MIT" | ||||||
|  |             ], | ||||||
|  |             "authors": [ | ||||||
|  |                 { | ||||||
|  |                     "name": "Jeroen van den Enden", | ||||||
|  |                     "email": "info@endroid.nl", | ||||||
|  |                     "homepage": "http://endroid.nl/" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "description": "Endroid QR Code", | ||||||
|  |             "homepage": "https://github.com/endroid/QrCode", | ||||||
|  |             "keywords": [ | ||||||
|  |                 "bundle", | ||||||
|  |                 "code", | ||||||
|  |                 "endroid", | ||||||
|  |                 "flex", | ||||||
|  |                 "qr", | ||||||
|  |                 "qrcode", | ||||||
|  |                 "symfony" | ||||||
|  |             ], | ||||||
|  |             "time": "2018-05-09T20:26:30+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "endroid/qrcode", | ||||||
|  |             "version": "2.5.1", | ||||||
|  |             "source": { | ||||||
|  |                 "type": "git", | ||||||
|  |                 "url": "https://github.com/endroid/qr-code.git", | ||||||
|  |                 "reference": "6062677d3404e0ded40647b8f62ec55ff9722eb7" | ||||||
|  |             }, | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://api.github.com/repos/endroid/qr-code/zipball/6062677d3404e0ded40647b8f62ec55ff9722eb7", | ||||||
|  |                 "reference": "6062677d3404e0ded40647b8f62ec55ff9722eb7", | ||||||
|  |                 "shasum": "", | ||||||
|  |                 "mirrors": [ | ||||||
|  |                     { | ||||||
|  |                         "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", | ||||||
|  |                         "preferred": true | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "bacon/bacon-qr-code": "^1.0.3", | ||||||
|  |                 "ext-gd": "*", | ||||||
|  |                 "khanamiryan/qrcode-detector-decoder": "1", | ||||||
|  |                 "myclabs/php-enum": "^1.5", | ||||||
|  |                 "php": ">=5.6", | ||||||
|  |                 "symfony/options-resolver": "^2.7", | ||||||
|  |                 "symfony/property-access": "^2.7" | ||||||
|  |             }, | ||||||
|  |             "require-dev": { | ||||||
|  |                 "phpunit/phpunit": "^5.7", | ||||||
|  |                 "symfony/asset": "^2.7", | ||||||
|  |                 "symfony/browser-kit": "^2.7", | ||||||
|  |                 "symfony/finder": "^2.7", | ||||||
|  |                 "symfony/framework-bundle": "^2.7", | ||||||
|  |                 "symfony/http-kernel": "^2.7", | ||||||
|  |                 "symfony/templating": "^2.7", | ||||||
|  |                 "symfony/twig-bundle": "^2.7", | ||||||
|  |                 "symfony/yaml": "^2.7" | ||||||
|  |             }, | ||||||
|  |             "type": "symfony-bundle", | ||||||
|  |             "extra": { | ||||||
|  |                 "branch-alias": { | ||||||
|  |                     "dev-master": "2.x-dev" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "autoload": { | ||||||
|  |                 "psr-4": { | ||||||
|  |                     "Endroid\\QrCode\\": "src/" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "notification-url": "https://packagist.org/downloads/", | ||||||
|  |             "license": [ | ||||||
|  |                 "MIT" | ||||||
|  |             ], | ||||||
|  |             "authors": [ | ||||||
|  |                 { | ||||||
|  |                     "name": "Jeroen van den Enden", | ||||||
|  |                     "email": "info@endroid.nl", | ||||||
|  |                     "homepage": "http://endroid.nl/" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "description": "Endroid QR Code", | ||||||
|  |             "homepage": "https://github.com/endroid/QrCode", | ||||||
|  |             "keywords": [ | ||||||
|  |                 "bundle", | ||||||
|  |                 "code", | ||||||
|  |                 "endroid", | ||||||
|  |                 "flex", | ||||||
|  |                 "qr", | ||||||
|  |                 "qrcode", | ||||||
|  |                 "symfony" | ||||||
|  |             ], | ||||||
|  |             "abandoned": "endroid/qr-code", | ||||||
|  |             "time": "2018-05-09T20:26:30+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "khanamiryan/qrcode-detector-decoder", | ||||||
|  |             "version": "1", | ||||||
|  |             "source": { | ||||||
|  |                 "type": "git", | ||||||
|  |                 "url": "https://github.com/khanamiryan/php-qrcode-detector-decoder.git", | ||||||
|  |                 "reference": "96d5f80680b04803c4f1b69d6e01735e876b80c7" | ||||||
|  |             }, | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://api.github.com/repos/khanamiryan/php-qrcode-detector-decoder/zipball/96d5f80680b04803c4f1b69d6e01735e876b80c7", | ||||||
|  |                 "reference": "96d5f80680b04803c4f1b69d6e01735e876b80c7", | ||||||
|  |                 "shasum": "", | ||||||
|  |                 "mirrors": [ | ||||||
|  |                     { | ||||||
|  |                         "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", | ||||||
|  |                         "preferred": true | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "php": "^5.6|^7.0" | ||||||
|  |             }, | ||||||
|  |             "require-dev": { | ||||||
|  |                 "phpunit/phpunit": "^5.7" | ||||||
|  |             }, | ||||||
|  |             "type": "library", | ||||||
|  |             "autoload": { | ||||||
|  |                 "classmap": [ | ||||||
|  |                     "lib/" | ||||||
|  |                 ], | ||||||
|  |                 "files": [ | ||||||
|  |                     "lib/common/customFunctions.php" | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "notification-url": "https://packagist.org/downloads/", | ||||||
|  |             "license": [ | ||||||
|  |                 "MIT" | ||||||
|  |             ], | ||||||
|  |             "authors": [ | ||||||
|  |                 { | ||||||
|  |                     "name": "Ashot Khanamiryan", | ||||||
|  |                     "email": "a.khanamiryan@gmail.com", | ||||||
|  |                     "homepage": "https://github.com/khanamiryan", | ||||||
|  |                     "role": "Developer" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "description": "QR code decoder / reader", | ||||||
|  |             "homepage": "https://github.com/khanamiryan/php-qrcode-detector-decoder", | ||||||
|  |             "keywords": [ | ||||||
|  |                 "barcode", | ||||||
|  |                 "qr", | ||||||
|  |                 "zxing" | ||||||
|  |             ], | ||||||
|  |             "time": "2017-01-13T09:11:46+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "myclabs/php-enum", | ||||||
|  |             "version": "1.6.6", | ||||||
|  |             "source": { | ||||||
|  |                 "type": "git", | ||||||
|  |                 "url": "https://github.com/myclabs/php-enum.git", | ||||||
|  |                 "reference": "32c4202886c51fbe5cc3a7c34ec5c9a4a790345e" | ||||||
|  |             }, | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://api.github.com/repos/myclabs/php-enum/zipball/32c4202886c51fbe5cc3a7c34ec5c9a4a790345e", | ||||||
|  |                 "reference": "32c4202886c51fbe5cc3a7c34ec5c9a4a790345e", | ||||||
|  |                 "shasum": "", | ||||||
|  |                 "mirrors": [ | ||||||
|  |                     { | ||||||
|  |                         "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", | ||||||
|  |                         "preferred": true | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "ext-json": "*", | ||||||
|  |                 "php": ">=5.4" | ||||||
|  |             }, | ||||||
|  |             "require-dev": { | ||||||
|  |                 "phpunit/phpunit": "^4.8.35|^5.7|^6.0", | ||||||
|  |                 "squizlabs/php_codesniffer": "1.*" | ||||||
|  |             }, | ||||||
|  |             "type": "library", | ||||||
|  |             "autoload": { | ||||||
|  |                 "psr-4": { | ||||||
|  |                     "MyCLabs\\Enum\\": "src/" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "notification-url": "https://packagist.org/downloads/", | ||||||
|  |             "license": [ | ||||||
|  |                 "MIT" | ||||||
|  |             ], | ||||||
|  |             "authors": [ | ||||||
|  |                 { | ||||||
|  |                     "name": "PHP Enum contributors", | ||||||
|  |                     "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "description": "PHP Enum implementation", | ||||||
|  |             "homepage": "http://github.com/myclabs/php-enum", | ||||||
|  |             "keywords": [ | ||||||
|  |                 "enum" | ||||||
|  |             ], | ||||||
|  |             "time": "2019-02-04T21:18:49+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "symfony/options-resolver", | ||||||
|  |             "version": "v2.8.49", | ||||||
|  |             "source": { | ||||||
|  |                 "type": "git", | ||||||
|  |                 "url": "https://github.com/symfony/options-resolver.git", | ||||||
|  |                 "reference": "7aaab725bb58f0e18aa12c61bdadd4793ab4c32b" | ||||||
|  |             }, | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7aaab725bb58f0e18aa12c61bdadd4793ab4c32b", | ||||||
|  |                 "reference": "7aaab725bb58f0e18aa12c61bdadd4793ab4c32b", | ||||||
|  |                 "shasum": "", | ||||||
|  |                 "mirrors": [ | ||||||
|  |                     { | ||||||
|  |                         "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", | ||||||
|  |                         "preferred": true | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "php": ">=5.3.9" | ||||||
|  |             }, | ||||||
|  |             "type": "library", | ||||||
|  |             "extra": { | ||||||
|  |                 "branch-alias": { | ||||||
|  |                     "dev-master": "2.8-dev" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "autoload": { | ||||||
|  |                 "psr-4": { | ||||||
|  |                     "Symfony\\Component\\OptionsResolver\\": "" | ||||||
|  |                 }, | ||||||
|  |                 "exclude-from-classmap": [ | ||||||
|  |                     "/Tests/" | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "notification-url": "https://packagist.org/downloads/", | ||||||
|  |             "license": [ | ||||||
|  |                 "MIT" | ||||||
|  |             ], | ||||||
|  |             "authors": [ | ||||||
|  |                 { | ||||||
|  |                     "name": "Fabien Potencier", | ||||||
|  |                     "email": "fabien@symfony.com" | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "Symfony Community", | ||||||
|  |                     "homepage": "https://symfony.com/contributors" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "description": "Symfony OptionsResolver Component", | ||||||
|  |             "homepage": "https://symfony.com", | ||||||
|  |             "keywords": [ | ||||||
|  |                 "config", | ||||||
|  |                 "configuration", | ||||||
|  |                 "options" | ||||||
|  |             ], | ||||||
|  |             "time": "2018-11-11T11:18:13+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "symfony/polyfill-ctype", | ||||||
|  |             "version": "v1.11.0", | ||||||
|  |             "source": { | ||||||
|  |                 "type": "git", | ||||||
|  |                 "url": "https://github.com/symfony/polyfill-ctype.git", | ||||||
|  |                 "reference": "82ebae02209c21113908c229e9883c419720738a" | ||||||
|  |             }, | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", | ||||||
|  |                 "reference": "82ebae02209c21113908c229e9883c419720738a", | ||||||
|  |                 "shasum": "", | ||||||
|  |                 "mirrors": [ | ||||||
|  |                     { | ||||||
|  |                         "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", | ||||||
|  |                         "preferred": true | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "php": ">=5.3.3" | ||||||
|  |             }, | ||||||
|  |             "suggest": { | ||||||
|  |                 "ext-ctype": "For best performance" | ||||||
|  |             }, | ||||||
|  |             "type": "library", | ||||||
|  |             "extra": { | ||||||
|  |                 "branch-alias": { | ||||||
|  |                     "dev-master": "1.11-dev" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "autoload": { | ||||||
|  |                 "psr-4": { | ||||||
|  |                     "Symfony\\Polyfill\\Ctype\\": "" | ||||||
|  |                 }, | ||||||
|  |                 "files": [ | ||||||
|  |                     "bootstrap.php" | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "notification-url": "https://packagist.org/downloads/", | ||||||
|  |             "license": [ | ||||||
|  |                 "MIT" | ||||||
|  |             ], | ||||||
|  |             "authors": [ | ||||||
|  |                 { | ||||||
|  |                     "name": "Symfony Community", | ||||||
|  |                     "homepage": "https://symfony.com/contributors" | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "Gert de Pagter", | ||||||
|  |                     "email": "backendtea@gmail.com" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "description": "Symfony polyfill for ctype functions", | ||||||
|  |             "homepage": "https://symfony.com", | ||||||
|  |             "keywords": [ | ||||||
|  |                 "compatibility", | ||||||
|  |                 "ctype", | ||||||
|  |                 "polyfill", | ||||||
|  |                 "portable" | ||||||
|  |             ], | ||||||
|  |             "time": "2019-02-06T07:57:58+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "symfony/property-access", | ||||||
|  |             "version": "v2.8.49", | ||||||
|  |             "source": { | ||||||
|  |                 "type": "git", | ||||||
|  |                 "url": "https://github.com/symfony/property-access.git", | ||||||
|  |                 "reference": "c8f10191183be9bb0d5a1b8364d3891f1bde07b6" | ||||||
|  |             }, | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://api.github.com/repos/symfony/property-access/zipball/c8f10191183be9bb0d5a1b8364d3891f1bde07b6", | ||||||
|  |                 "reference": "c8f10191183be9bb0d5a1b8364d3891f1bde07b6", | ||||||
|  |                 "shasum": "", | ||||||
|  |                 "mirrors": [ | ||||||
|  |                     { | ||||||
|  |                         "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", | ||||||
|  |                         "preferred": true | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "php": ">=5.3.9", | ||||||
|  |                 "symfony/polyfill-ctype": "~1.8" | ||||||
|  |             }, | ||||||
|  |             "type": "library", | ||||||
|  |             "extra": { | ||||||
|  |                 "branch-alias": { | ||||||
|  |                     "dev-master": "2.8-dev" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "autoload": { | ||||||
|  |                 "psr-4": { | ||||||
|  |                     "Symfony\\Component\\PropertyAccess\\": "" | ||||||
|  |                 }, | ||||||
|  |                 "exclude-from-classmap": [ | ||||||
|  |                     "/Tests/" | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "notification-url": "https://packagist.org/downloads/", | ||||||
|  |             "license": [ | ||||||
|  |                 "MIT" | ||||||
|  |             ], | ||||||
|  |             "authors": [ | ||||||
|  |                 { | ||||||
|  |                     "name": "Fabien Potencier", | ||||||
|  |                     "email": "fabien@symfony.com" | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "Symfony Community", | ||||||
|  |                     "homepage": "https://symfony.com/contributors" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "description": "Symfony PropertyAccess Component", | ||||||
|  |             "homepage": "https://symfony.com", | ||||||
|  |             "keywords": [ | ||||||
|  |                 "access", | ||||||
|  |                 "array", | ||||||
|  |                 "extraction", | ||||||
|  |                 "index", | ||||||
|  |                 "injection", | ||||||
|  |                 "object", | ||||||
|  |                 "property", | ||||||
|  |                 "property path", | ||||||
|  |                 "reflection" | ||||||
|  |             ], | ||||||
|  |             "time": "2018-11-11T11:18:13+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "topthink/framework", | ||||||
|  |             "version": "v5.1.35", | ||||||
|  |             "source": { | ||||||
|  |                 "type": "git", | ||||||
|  |                 "url": "https://github.com/top-think/framework.git", | ||||||
|  |                 "reference": "c53c0c6132022a87e8ee9c4109939eaf9a8a7adb" | ||||||
|  |             }, | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://api.github.com/repos/top-think/framework/zipball/c53c0c6132022a87e8ee9c4109939eaf9a8a7adb", | ||||||
|  |                 "reference": "c53c0c6132022a87e8ee9c4109939eaf9a8a7adb", | ||||||
|  |                 "shasum": "", | ||||||
|  |                 "mirrors": [ | ||||||
|  |                     { | ||||||
|  |                         "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", | ||||||
|  |                         "preferred": true | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "php": ">=5.6.0", | ||||||
|  |                 "topthink/think-installer": "2.*" | ||||||
|  |             }, | ||||||
|  |             "require-dev": { | ||||||
|  |                 "johnkary/phpunit-speedtrap": "^1.0", | ||||||
|  |                 "mikey179/vfsstream": "~1.6", | ||||||
|  |                 "phpdocumentor/reflection-docblock": "^2.0", | ||||||
|  |                 "phploc/phploc": "2.*", | ||||||
|  |                 "phpunit/phpunit": "^5.0|^6.0", | ||||||
|  |                 "sebastian/phpcpd": "2.*", | ||||||
|  |                 "squizlabs/php_codesniffer": "2.*" | ||||||
|  |             }, | ||||||
|  |             "type": "think-framework", | ||||||
|  |             "notification-url": "https://packagist.org/downloads/", | ||||||
|  |             "license": [ | ||||||
|  |                 "Apache-2.0" | ||||||
|  |             ], | ||||||
|  |             "authors": [ | ||||||
|  |                 { | ||||||
|  |                     "name": "liu21st", | ||||||
|  |                     "email": "liu21st@gmail.com" | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "yunwuxin", | ||||||
|  |                     "email": "448901948@qq.com" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "description": "the new thinkphp framework", | ||||||
|  |             "homepage": "http://thinkphp.cn/", | ||||||
|  |             "keywords": [ | ||||||
|  |                 "framework", | ||||||
|  |                 "orm", | ||||||
|  |                 "thinkphp" | ||||||
|  |             ], | ||||||
|  |             "time": "2019-03-03T00:44:44+00:00" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "topthink/think-installer", | ||||||
|  |             "version": "v2.0.0", | ||||||
|  |             "source": { | ||||||
|  |                 "type": "git", | ||||||
|  |                 "url": "https://github.com/top-think/think-installer.git", | ||||||
|  |                 "reference": "f5400a12c60e513911aef41fe443fa6920952675" | ||||||
|  |             }, | ||||||
|  |             "dist": { | ||||||
|  |                 "type": "zip", | ||||||
|  |                 "url": "https://api.github.com/repos/top-think/think-installer/zipball/f5400a12c60e513911aef41fe443fa6920952675", | ||||||
|  |                 "reference": "f5400a12c60e513911aef41fe443fa6920952675", | ||||||
|  |                 "shasum": "", | ||||||
|  |                 "mirrors": [ | ||||||
|  |                     { | ||||||
|  |                         "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", | ||||||
|  |                         "preferred": true | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             "require": { | ||||||
|  |                 "composer-plugin-api": "^1.0" | ||||||
|  |             }, | ||||||
|  |             "require-dev": { | ||||||
|  |                 "composer/composer": "1.0.*@dev" | ||||||
|  |             }, | ||||||
|  |             "type": "composer-plugin", | ||||||
|  |             "extra": { | ||||||
|  |                 "class": "think\\composer\\Plugin" | ||||||
|  |             }, | ||||||
|  |             "autoload": { | ||||||
|  |                 "psr-4": { | ||||||
|  |                     "think\\composer\\": "src" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "notification-url": "https://packagist.org/downloads/", | ||||||
|  |             "license": [ | ||||||
|  |                 "Apache-2.0" | ||||||
|  |             ], | ||||||
|  |             "authors": [ | ||||||
|  |                 { | ||||||
|  |                     "name": "yunwuxin", | ||||||
|  |                     "email": "448901948@qq.com" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "time": "2018-05-11T06:45:42+00:00" | ||||||
|  |         } | ||||||
|  |     ], | ||||||
|  |     "packages-dev": [], | ||||||
|  |     "aliases": [], | ||||||
|  |     "minimum-stability": "stable", | ||||||
|  |     "stability-flags": [], | ||||||
|  |     "prefer-stable": false, | ||||||
|  |     "prefer-lowest": false, | ||||||
|  |     "platform": { | ||||||
|  |         "php": ">=5.6.0" | ||||||
|  |     }, | ||||||
|  |     "platform-dev": [] | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								composer.phar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										146
									
								
								config/app.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,146 @@ | |||||||
|  | <?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_name'               => '', | ||||||
|  |     // 应用地址
 | ||||||
|  |     'app_host'               => '', | ||||||
|  |     // 应用调试模式
 | ||||||
|  |     'app_debug'              => true, | ||||||
|  |     // 应用Trace
 | ||||||
|  |     'app_trace'              => false, | ||||||
|  |     // 是否支持多模块
 | ||||||
|  |     'app_multi_module'       => true, | ||||||
|  |     // 入口自动绑定模块
 | ||||||
|  |     'auto_bind_module'       => false, | ||||||
|  |     // 注册的根命名空间
 | ||||||
|  |     'root_namespace'         => [], | ||||||
|  |     // 默认输出类型
 | ||||||
|  |     'default_return_type'    => 'html', | ||||||
|  |     // 默认AJAX 数据返回格式,可选json xml ...
 | ||||||
|  |     'default_ajax_return'    => 'json', | ||||||
|  |     // 默认JSONP格式返回的处理方法
 | ||||||
|  |     'default_jsonp_handler'  => 'jsonpReturn', | ||||||
|  |     // 默认JSONP处理方法
 | ||||||
|  |     'var_jsonp_handler'      => 'callback', | ||||||
|  |     // 默认时区
 | ||||||
|  |     'default_timezone'       => 'Asia/Shanghai', | ||||||
|  |     // 是否开启多语言
 | ||||||
|  |     '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_module'           => '', | ||||||
|  |     // 默认的空控制器名
 | ||||||
|  |     'empty_controller'       => 'Error', | ||||||
|  |     // 操作方法前缀
 | ||||||
|  |     'use_action_prefix'      => false, | ||||||
|  |     // 操作方法后缀
 | ||||||
|  |     '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'          => '/', | ||||||
|  |     // HTTPS代理标识
 | ||||||
|  |     'https_agent_name'       => '', | ||||||
|  |     // IP代理获取标识
 | ||||||
|  |     'http_agent_ip'          => 'X-REAL-IP', | ||||||
|  |     // URL伪静态后缀
 | ||||||
|  |     'url_html_suffix'        => 'html', | ||||||
|  |     // URL普通方式参数 用于自动生成
 | ||||||
|  |     'url_common_param'       => false, | ||||||
|  |     // URL参数方式 0 按名称成对解析 1 按顺序解析
 | ||||||
|  |     'url_param_type'         => 0, | ||||||
|  |     // 是否开启路由延迟解析
 | ||||||
|  |     'url_lazy_route'         => false, | ||||||
|  |     // 是否强制使用路由
 | ||||||
|  |     'url_route_must'         => false, | ||||||
|  |     // 合并路由规则
 | ||||||
|  |     'route_rule_merge'       => false, | ||||||
|  |     // 路由是否完全匹配
 | ||||||
|  |     'route_complete_match'   => false, | ||||||
|  |     // 使用注解路由
 | ||||||
|  |     'route_annotation'       => 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'   => [], | ||||||
|  |     // 是否开启路由缓存
 | ||||||
|  |     'route_check_cache'      => false, | ||||||
|  |     // 路由缓存的Key自定义设置(闭包),默认为当前URL和请求类型的md5
 | ||||||
|  |     'route_check_cache_key'  => '', | ||||||
|  |     // 路由缓存类型及参数
 | ||||||
|  |     'route_cache_option'     => [], | ||||||
|  | 
 | ||||||
|  |     // 默认跳转页面对应的模板文件
 | ||||||
|  |     'dispatch_success_tmpl'  => Env::get('think_path') . 'tpl/dispatch_jump.tpl', | ||||||
|  |     'dispatch_error_tmpl'    => Env::get('think_path') . 'tpl/dispatch_jump.tpl', | ||||||
|  | 
 | ||||||
|  |     // 异常页面的模板文件
 | ||||||
|  |     'exception_tmpl'         => Env::get('think_path') . 'tpl/think_exception.tpl', | ||||||
|  | 
 | ||||||
|  |     // 错误显示信息,非调试模式有效
 | ||||||
|  |     'error_message'          => '页面错误!请稍后再试~', | ||||||
|  |     // 显示错误信息
 | ||||||
|  |     'show_error_msg'         => false, | ||||||
|  |     // 异常处理handle类 留空使用 \think\exception\Handle
 | ||||||
|  |     'exception_handle'       => '', | ||||||
|  |     'ver'                    => '1.12', | ||||||
|  | ]; | ||||||
							
								
								
									
										25
									
								
								config/cache.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -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 [ | ||||||
|  |     // 驱动方式
 | ||||||
|  |     'type'   => 'File', | ||||||
|  |     // 缓存保存目录
 | ||||||
|  |     'path'   => '', | ||||||
|  |     // 缓存前缀
 | ||||||
|  |     'prefix' => '', | ||||||
|  |     // 缓存有效期 0表示永久缓存
 | ||||||
|  |     'expire' => 0, | ||||||
|  | ]; | ||||||
							
								
								
									
										19
									
								
								config/console.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,19 @@ | |||||||
|  | <?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 [ | ||||||
|  |     'name'    => 'Think Console', | ||||||
|  |     'version' => '0.1', | ||||||
|  |     'user'    => null, | ||||||
|  | ]; | ||||||
							
								
								
									
										30
									
								
								config/cookie.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,30 @@ | |||||||
|  | <?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>
 | ||||||
|  | // +----------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | // +----------------------------------------------------------------------
 | ||||||
|  | // | Cookie设置
 | ||||||
|  | // +----------------------------------------------------------------------
 | ||||||
|  | return [ | ||||||
|  |     // cookie 名称前缀
 | ||||||
|  |     'prefix'    => '', | ||||||
|  |     // cookie 保存时间
 | ||||||
|  |     'expire'    => 0, | ||||||
|  |     // cookie 保存路径
 | ||||||
|  |     'path'      => '/', | ||||||
|  |     // cookie 有效域名
 | ||||||
|  |     'domain'    => '', | ||||||
|  |     //  cookie 启用安全传输
 | ||||||
|  |     'secure'    => false, | ||||||
|  |     // httponly设置
 | ||||||
|  |     'httponly'  => '', | ||||||
|  |     // 是否使用 setcookie
 | ||||||
|  |     'setcookie' => true, | ||||||
|  | ]; | ||||||
							
								
								
									
										63
									
								
								config/database.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,63 @@ | |||||||
|  | <?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'        => 'zf', | ||||||
|  |     // 用户名
 | ||||||
|  |     'username'        => 'zf', | ||||||
|  |     // 密码
 | ||||||
|  |     'password'        => 'tB5PMM7aD8TApNym', | ||||||
|  |     // 端口
 | ||||||
|  |     'hostport'        => '3306', | ||||||
|  |     // 连接dsn
 | ||||||
|  |     'dsn'             => '', | ||||||
|  |     // 数据库连接参数
 | ||||||
|  |     'params'          => [], | ||||||
|  |     // 数据库编码默认采用utf8
 | ||||||
|  |     'charset'         => 'utf8', | ||||||
|  |     // 数据库表前缀
 | ||||||
|  |     'prefix'          => '', | ||||||
|  |     // 数据库调试模式
 | ||||||
|  |     '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, | ||||||
|  |     // Builder类
 | ||||||
|  |     'builder'         => '', | ||||||
|  |     // Query类
 | ||||||
|  |     'query'           => '\\think\\db\\Query', | ||||||
|  |     // 是否需要断线重连
 | ||||||
|  |     'break_reconnect' => false, | ||||||
|  |     // 断线标识字符串
 | ||||||
|  |     'break_match_str' => [], | ||||||
|  | ]; | ||||||
							
								
								
									
										30
									
								
								config/log.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,30 @@ | |||||||
|  | <?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 socket 支持扩展
 | ||||||
|  |     'type'        => 'File', | ||||||
|  |     // 日志保存目录
 | ||||||
|  |     'path'        => '', | ||||||
|  |     // 日志记录级别
 | ||||||
|  |     'level'       => [], | ||||||
|  |     // 单文件日志写入
 | ||||||
|  |     'single'      => false, | ||||||
|  |     // 独立日志级别
 | ||||||
|  |     'apart_level' => [], | ||||||
|  |     // 最大日志文件数量
 | ||||||
|  |     'max_files'   => 0, | ||||||
|  |     // 是否关闭日志写入
 | ||||||
|  |     'close'       => false, | ||||||
|  | ]; | ||||||
							
								
								
									
										18
									
								
								config/middleware.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,18 @@ | |||||||
|  | <?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 [ | ||||||
|  |     // 默认中间件命名空间
 | ||||||
|  |     'default_namespace' => 'app\\http\\middleware\\', | ||||||
|  | ]; | ||||||
							
								
								
									
										26
									
								
								config/session.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,26 @@ | |||||||
|  | <?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 [ | ||||||
|  |     'id'             => '', | ||||||
|  |     // SESSION_ID的提交变量,解决flash上传跨域
 | ||||||
|  |     'var_session_id' => '', | ||||||
|  |     // SESSION 前缀
 | ||||||
|  |     'prefix'         => 'think', | ||||||
|  |     // 驱动方式 支持redis memcache memcached
 | ||||||
|  |     'type'           => '', | ||||||
|  |     // 是否自动开启 SESSION
 | ||||||
|  |     'auto_start'     => true, | ||||||
|  | ]; | ||||||
							
								
								
									
										35
									
								
								config/template.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,35 @@ | |||||||
|  | <?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 [ | ||||||
|  |     // 模板引擎类型 支持 php think 支持扩展
 | ||||||
|  |     'type'         => 'Think', | ||||||
|  |     // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法
 | ||||||
|  |     'auto_rule'    => 1, | ||||||
|  |     // 模板路径
 | ||||||
|  |     'view_path'    => '', | ||||||
|  |     // 模板后缀
 | ||||||
|  |     'view_suffix'  => 'html', | ||||||
|  |     // 模板文件名分隔符
 | ||||||
|  |     'view_depr'    => DIRECTORY_SEPARATOR, | ||||||
|  |     // 模板引擎普通标签开始标记
 | ||||||
|  |     'tpl_begin'    => '{', | ||||||
|  |     // 模板引擎普通标签结束标记
 | ||||||
|  |     'tpl_end'      => '}', | ||||||
|  |     // 标签库标签开始标记
 | ||||||
|  |     'taglib_begin' => '{', | ||||||
|  |     // 标签库标签结束标记
 | ||||||
|  |     'taglib_end'   => '}', | ||||||
|  | ]; | ||||||
							
								
								
									
										18
									
								
								config/trace.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,18 @@ | |||||||
|  | <?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>
 | ||||||
|  | // +----------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | // +----------------------------------------------------------------------
 | ||||||
|  | // | Trace设置 开启 app_trace 后 有效
 | ||||||
|  | // +----------------------------------------------------------------------
 | ||||||
|  | return [ | ||||||
|  |     // 内置Html Console 支持扩展
 | ||||||
|  |     'type' => 'Html', | ||||||
|  | ]; | ||||||
							
								
								
									
										2
									
								
								extend/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,2 @@ | |||||||
|  | * | ||||||
|  | !.gitignore | ||||||
							
								
								
									
										19
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,19 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8"> | ||||||
|  |     <title>存在搭建问题</title> | ||||||
|  |     <meta name="renderer" content="webkit"> | ||||||
|  |     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | ||||||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> | ||||||
|  |     <meta name="apple-mobile-web-app-status-bar-style" content="black"> | ||||||
|  |     <meta name="apple-mobile-web-app-capable" content="yes"> | ||||||
|  |     <meta name="format-detection" content="telephone=no"> | ||||||
|  | </head> | ||||||
|  | <body class="body"> | ||||||
|  | <div style="padding: 15px;color: red;"> | ||||||
|  |     <h1 style="text-align: center">检测到运行目录未设定成public</h1><br><br> | ||||||
|  |     <h1 style="text-align: center">请在宝塔面板-网站-设置-网站目录->修改运行目录为public并保存,同时关闭防跨站攻击</h1><br><br> | ||||||
|  | </div> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										9
									
								
								public/.htaccess
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,9 @@ | |||||||
|  | <IfModule mod_rewrite.c> | ||||||
|  |   Options +FollowSymlinks -Multiviews | ||||||
|  |   RewriteEngine On | ||||||
|  |   | ||||||
|  |   RewriteCond %{REQUEST_FILENAME} !-d | ||||||
|  |   RewriteCond %{REQUEST_FILENAME} !-f | ||||||
|  | #  RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] | ||||||
|  |   RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L] | ||||||
|  | </IfModule> | ||||||
| @ -0,0 +1 @@ | |||||||
|  | 0R0p-0IhSrZMKiookruKlRGMKn8GkDZTPQx4b4UK6Lo.AYcoB9mjvyHsMDRQrxEJvsZaIEtDHEkl0Hqed5s-LUI | ||||||
							
								
								
									
										26
									
								
								public/404.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,26 @@ | |||||||
|  | <!doctype html> | ||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  | <meta charset="utf-8"> | ||||||
|  | <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||||||
|  | <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> | ||||||
|  | <title>404</title> | ||||||
|  | <style> | ||||||
|  | 	body{ | ||||||
|  | 		background-color:#444; | ||||||
|  | 		font-size:14px; | ||||||
|  | 	} | ||||||
|  | 	h3{ | ||||||
|  | 		font-size:60px; | ||||||
|  | 		color:#eee; | ||||||
|  | 		text-align:center; | ||||||
|  | 		padding-top:30px; | ||||||
|  | 		font-weight:normal; | ||||||
|  | 	} | ||||||
|  | </style> | ||||||
|  | </head> | ||||||
|  | 
 | ||||||
|  | <body> | ||||||
|  | <h3>404锛屾偍璇锋眰鐨勬枃浠朵笉瀛樺湪!</h3> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										177
									
								
								public/aaa.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,177 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8"> | ||||||
|  |     <title>后台管理</title> | ||||||
|  |     <meta name="renderer" content="webkit"> | ||||||
|  |     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | ||||||
|  |     <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" /> | ||||||
|  |     <meta name="apple-mobile-web-app-status-bar-style" content="black"> | ||||||
|  |     <meta name="apple-mobile-web-app-capable" content="yes"> | ||||||
|  |     <meta name="format-detection" content="telephone=no"> | ||||||
|  | 
 | ||||||
|  |     <link rel="stylesheet" href="layui/css/layui.css"  media="all"> | ||||||
|  |     <link rel="stylesheet" href="css/global.css?t=1531663423583-6" media="all"> | ||||||
|  |     <style type="text/css">ins.adsbygoogle{display:none!important;display:none}</style></head> | ||||||
|  | <body> | ||||||
|  | <div class="layui-layout layui-layout-admin"> | ||||||
|  |     <div class="layui-header header header-demo" summer> | ||||||
|  |         <div class="layui-main"> | ||||||
|  |             <span style="color: white;font-size: 30px;font-weight:100;line-height: 58px;font-family:Microsoft JhengHei">后台管理</span> | ||||||
|  | 
 | ||||||
|  |             <ul class="layui-nav layui-layout-right"> | ||||||
|  |                 <li class="layui-nav-item"> | ||||||
|  |                     <a href="javascript:;"> | ||||||
|  |                        | ||||||
|  |                         管理员 | ||||||
|  |                     </a> | ||||||
|  |                     <dl class="layui-nav-child"> | ||||||
|  |                         <dd><a href="index.html">退出</a></dd> | ||||||
|  |                     </dl> | ||||||
|  |                 </li> | ||||||
|  |                 <!-- <li class="layui-nav-item"><a href="">退出</a></li> --> | ||||||
|  |             </ul> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <!-- 让IE8/9支持媒体查询,从而兼容栅格 --> | ||||||
|  |     <!--[if lt IE 9]> | ||||||
|  |     <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script> | ||||||
|  |     <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script> | ||||||
|  |     <![endif]--> | ||||||
|  |     <div class="layui-side layui-bg-black"> | ||||||
|  |         <div class="layui-side-scroll"> | ||||||
|  | 
 | ||||||
|  |             <ul class="layui-nav layui-nav-tree site-demo-nav" id="v_menu"> | ||||||
|  | 
 | ||||||
|  |             </ul> | ||||||
|  | 
 | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |         <div class="layui-body layui-tab-content site-demo site-demo-body"> | ||||||
|  |             <div class="layui-tab-item layui-show"> | ||||||
|  |                 <div class="layui-main"> | ||||||
|  |                     <div id="LAY_preview"> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                          | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                     </div> | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="site-tree-mobile layui-hide" style="opacity: 0.4;"> | ||||||
|  |         <i class="layui-icon"></i> | ||||||
|  |     </div> | ||||||
|  |     <div class="site-mobile-shade"></div> | ||||||
|  |     <script src="layui/layui.js?t=1531663423583" charset="utf-8"></script> | ||||||
|  |     <script> | ||||||
|  |         window.global = { | ||||||
|  |             pageType: 'demo' | ||||||
|  |             ,preview: function(){ | ||||||
|  |                 var preview = document.getElementById('LAY_preview'); | ||||||
|  |                 return preview ? preview.innerHTML : ''; | ||||||
|  |             }() | ||||||
|  |         }; | ||||||
|  |         layui.config({ | ||||||
|  |             base: 'js/' | ||||||
|  |             ,version: '1531663423583' | ||||||
|  |         }).use('global'); | ||||||
|  |     </script> | ||||||
|  | </div> | ||||||
|  | <script> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     layui.use(['layer','element'], function(){ | ||||||
|  |         var $ = layui.$ | ||||||
|  |             ,setIframe = function(){ | ||||||
|  |             var height = $(window).height() - 370; | ||||||
|  |             $('#demoAdmin').height(height); | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         setIframe(); | ||||||
|  |         $(window).on('resize', setIframe); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     }); | ||||||
|  | </script> | ||||||
|  | <script src="https://lib.baomitu.com/jquery/3.3.1/jquery.min.js"></script> | ||||||
|  | <script src="js/llqrcode.js" type="text/javascript" charset="utf-8"></script> | ||||||
|  | <script type="text/javascript"> | ||||||
|  |     function getObjectURL(file) { | ||||||
|  |         var url = null; | ||||||
|  |         if (window.createObjectURL != undefined) { | ||||||
|  |             url = window.createObjectURL(file); | ||||||
|  |         } else if (window.URL != undefined) { | ||||||
|  |             url = window.URL.createObjectURL(file); | ||||||
|  |         } else if (window.webkitURL != undefined) { | ||||||
|  |             url = window.webkitURL.createObjectURL(file); | ||||||
|  |         } | ||||||
|  |         return url; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | $("#LAY_preview").load("main.html") | ||||||
|  | 
 | ||||||
|  | $.post("getMenu",function (data) { | ||||||
|  |     if (data == null || data == "" || data.code==-1) { | ||||||
|  |         window.location.href = "index.html"; | ||||||
|  |     } | ||||||
|  |     setTimeout(function () { | ||||||
|  |         $.post("admin/index/checkUpdate",function (data) { | ||||||
|  |             if (data.code==1) { | ||||||
|  | 
 | ||||||
|  |                 layer.confirm(data.msg, { | ||||||
|  |                     btn: ['去看看','算啦'], | ||||||
|  |                     title:"有更新啦" | ||||||
|  |                 }, function(){ | ||||||
|  |                     window.location.href = data.data; | ||||||
|  |                 }); | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     },2000); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     console.log(data); | ||||||
|  |     var out_menu = ""; | ||||||
|  |     for (var i = 0;i<data.length;i++){ | ||||||
|  |         if (data[i].type=="menu"){ | ||||||
|  |             out_menu+='<li class="layui-nav-item layui-nav-itemed">'; | ||||||
|  |             out_menu+='<a class="" href="javascript:;">'+data[i].name+'</a>'; | ||||||
|  |             out_menu+='<dl class="layui-nav-child">'; | ||||||
|  | 
 | ||||||
|  |             for (var ii = 0;ii<data[i].node.length;ii++){ | ||||||
|  |                 out_menu+='<dd><a onclick="$(\'#LAY_preview\').load(\''+data[i].node[ii].url+'\');">'+data[i].node[ii].name+'</a></dd>'; | ||||||
|  |             } | ||||||
|  |             out_menu+='</dl>'; | ||||||
|  |             out_menu+='</li>'; | ||||||
|  |         } else{ | ||||||
|  |             out_menu+='<li class="layui-nav-item"><a onclick="$(\'#LAY_preview\').load(\''+data[i].url+'\');">'+data[i].name+'</a></li>'; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     console.log(out_menu); | ||||||
|  |     $("#v_menu").append(out_menu); | ||||||
|  |     if (layui.element) | ||||||
|  |         layui.element.render(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | }); | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										163
									
								
								public/admin/addwxqrcode.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,163 @@ | |||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  |     .layui-table-cell { | ||||||
|  |         height: auto; | ||||||
|  |     } | ||||||
|  |     .layui-table img { | ||||||
|  |         max-width: 200px; | ||||||
|  |     } | ||||||
|  | </style> | ||||||
|  | 
 | ||||||
|  | <div class="layui-upload"> | ||||||
|  |     <button type="button" class="layui-btn layui-btn-normal" id="testList">选择微信有金额的二维码</button> | ||||||
|  |     <button type="button" class="layui-btn" onclick="saveqr()">保存二维码</button> | ||||||
|  | 
 | ||||||
|  |     <table class="layui-hide" id="test" lay-filter="wxqrlist"></table> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | <script type="text/html" id="barDemo"> | ||||||
|  |     <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a> | ||||||
|  | </script> | ||||||
|  | <script> | ||||||
|  |     var imgs = {},mytable; | ||||||
|  |     var duilie = 0; | ||||||
|  |     layui.use('upload', function() { | ||||||
|  |         var $ = layui.jquery | ||||||
|  |             , upload = layui.upload; | ||||||
|  | 
 | ||||||
|  |         mytable = layui.table.render({ | ||||||
|  |             elem: '#test' | ||||||
|  |             ,data:imgs | ||||||
|  |             ,cols: [[ | ||||||
|  |                 {type:'numbers',title: '序号'} | ||||||
|  | 
 | ||||||
|  |                 ,{field:'', width:230, title: '二维码', templet:function (data) { | ||||||
|  |                         return "<img src='"+data.b64+"'/>" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 ,{field:'url', minWidth:150, title: '内容'} | ||||||
|  |                 ,{field:'money',width:100, title: '金额',edit:"text"} | ||||||
|  |                 ,{title: '操作', minWidth: 80, align:'center', toolbar: '#barDemo'} | ||||||
|  | 
 | ||||||
|  |             ]], | ||||||
|  |             page:true | ||||||
|  |         }); | ||||||
|  |         //监听工具条 | ||||||
|  |         layui.table.on('tool(wxqrlist)', function(obj){ | ||||||
|  |             var data = obj.data; | ||||||
|  |             if(obj.event === 'del'){ | ||||||
|  |                 layer.confirm('真的删除行么', function(index){ | ||||||
|  |                     obj.del(); | ||||||
|  |                     imgs = layui.table.cache.test; | ||||||
|  |                     mytable.reload({ | ||||||
|  |                         data: imgs | ||||||
|  |                     }); | ||||||
|  |                     layer.close(index); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         //多文件列表示例 | ||||||
|  |         var demoListView = $('#demoList') | ||||||
|  |             ,uploadListIns = upload.render({ | ||||||
|  |             elem: '#testList' | ||||||
|  |             ,url: '/upload/' | ||||||
|  |             ,accept: 'file' | ||||||
|  |             ,multiple: true | ||||||
|  |             ,auto: false | ||||||
|  |             ,bindAction: '#testListAction' | ||||||
|  |             ,choose: function(obj){ | ||||||
|  |                 imgs = []; | ||||||
|  |                 var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列 | ||||||
|  |                 layer.msg("等待所有二维码识别完毕后手动输入金额,输入完成后点击保存二维码") | ||||||
|  |                 // layer.msg('处理中', { | ||||||
|  |                 //     icon: 16 | ||||||
|  |                 //     ,shade: 0.01 | ||||||
|  |                 //     ,time:0 | ||||||
|  |                 // }); | ||||||
|  | 
 | ||||||
|  |                 //读取本地文件 | ||||||
|  |                 obj.preview(function(index, file, result){ | ||||||
|  |                     // $.post("qr-code/test.php","base64="+encodeURIComponent(result.split(",")[1]),function (data) { | ||||||
|  |                     //     console.log(data) | ||||||
|  |                     //     if (!data.data) { | ||||||
|  |                     //         data = JSON.parse(data); | ||||||
|  |                     //     } | ||||||
|  |                     //     imgs.push({"index":imgs.length,"money":"","b64":result,"url":data.data}); | ||||||
|  |                     //     mytable.reload({ | ||||||
|  |                     //         data: imgs | ||||||
|  |                     //     }); | ||||||
|  |                     // }); | ||||||
|  |                     //console.log(index) | ||||||
|  | 
 | ||||||
|  |                     qrcode.decode(getObjectURL(file),result); | ||||||
|  |                     qrcode.callback = function(imgMsg,img64) { | ||||||
|  |                         console.log(imgMsg); | ||||||
|  | 
 | ||||||
|  |                         if (imgMsg==""){ | ||||||
|  |                             $.post("qr-code/test.php","base64="+encodeURIComponent(img64.split(",")[1]),function (data) { | ||||||
|  |                                 console.log(data) | ||||||
|  |                                 if (!data.data) { | ||||||
|  |                                     data = JSON.parse(data); | ||||||
|  |                                 } | ||||||
|  | 
 | ||||||
|  |                                 imgs.push({"index":imgs.length,"money":"","b64":img64,"url":data.data}); | ||||||
|  |                                 mytable.reload({ | ||||||
|  |                                     data: imgs | ||||||
|  |                                 }); | ||||||
|  |                             }); | ||||||
|  |                         } else{ | ||||||
|  |                             imgs.push({"index":imgs.length,"money":"","b64":img64,"url":imgMsg}); | ||||||
|  |                             mytable.reload({ | ||||||
|  |                                 data: imgs | ||||||
|  |                             }); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     function saveqr() { | ||||||
|  |         var data = layui.table.cache.test; | ||||||
|  |         for (var i = 0;i<data.length;i++){ | ||||||
|  |             if (data[i].money =="" || checkRate(data[i].money == false)){ | ||||||
|  |                 layer.msg("序号为"+(i+1)+"的二维码金额有误,请检查"); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         up(data,0); | ||||||
|  |     } | ||||||
|  |     function up(obj,index) { | ||||||
|  |         if (obj.length==index){ | ||||||
|  |             layer.msg("操作成功!"); | ||||||
|  |             imgs = [] | ||||||
|  |             mytable.reload({ | ||||||
|  |                 data: imgs | ||||||
|  |             }); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         $.post("admin/index/addPayQrcode","type=1&pay_url="+encodeURIComponent(obj[index].url)+"&price="+obj[index].money,function (data) { | ||||||
|  |             up(obj,index+1) | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function checkRate(input) { | ||||||
|  | 
 | ||||||
|  |         var re = /^[0-9]+.?[0-9]*$/; //判断字符串是否为数字 //判断正整数 /^[1-9]+[0-9]*]*$/ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         if (!re.test(input)) { | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | </script> | ||||||
							
								
								
									
										153
									
								
								public/admin/addzfbqrcode.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,153 @@ | |||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  |     .layui-table-cell { | ||||||
|  |         height: auto; | ||||||
|  |     } | ||||||
|  |     .layui-table img { | ||||||
|  |         max-width: 200px; | ||||||
|  |     } | ||||||
|  | </style> | ||||||
|  | 
 | ||||||
|  | <div class="layui-upload"> | ||||||
|  |     <button type="button" class="layui-btn layui-btn-normal" id="testList">选择支付宝有金额的二维码</button> | ||||||
|  |     <button type="button" class="layui-btn" onclick="saveqr()">保存二维码</button> | ||||||
|  | 
 | ||||||
|  |     <table class="layui-hide" id="test" lay-filter="wxqrlist"></table> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | <script type="text/html" id="barDemo"> | ||||||
|  |     <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a> | ||||||
|  | </script> | ||||||
|  | <script> | ||||||
|  |     var imgs = {},mytable; | ||||||
|  |     layui.use('upload', function() { | ||||||
|  |         var $ = layui.jquery | ||||||
|  |             , upload = layui.upload; | ||||||
|  | 
 | ||||||
|  |         mytable = layui.table.render({ | ||||||
|  |             elem: '#test' | ||||||
|  |             ,data:imgs | ||||||
|  |             ,cols: [[ | ||||||
|  |                 {type:'numbers',title: '序号'} | ||||||
|  | 
 | ||||||
|  |                 ,{field:'', width:230, title: '二维码', templet:function (data) { | ||||||
|  |                         return "<img src='"+data.b64+"'/>" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 ,{field:'url', minWidth:150, title: '内容'} | ||||||
|  |                 ,{field:'money',width:100, title: '金额',edit:"text"} | ||||||
|  |                 ,{title: '操作', minWidth: 80, align:'center', toolbar: '#barDemo'} | ||||||
|  | 
 | ||||||
|  |             ]], | ||||||
|  |             page:true | ||||||
|  |         }); | ||||||
|  |         //监听工具条 | ||||||
|  |         layui.table.on('tool(wxqrlist)', function(obj){ | ||||||
|  |             var data = obj.data; | ||||||
|  |             if(obj.event === 'del'){ | ||||||
|  |                 layer.confirm('真的删除行么', function(index){ | ||||||
|  |                     obj.del(); | ||||||
|  |                     imgs = layui.table.cache.test; | ||||||
|  |                     mytable.reload({ | ||||||
|  |                         data: imgs | ||||||
|  |                     }); | ||||||
|  |                     layer.close(index); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |         //多文件列表示例 | ||||||
|  |         var demoListView = $('#demoList') | ||||||
|  |             ,uploadListIns = upload.render({ | ||||||
|  |             elem: '#testList' | ||||||
|  |             ,url: '/upload/' | ||||||
|  |             ,accept: 'file' | ||||||
|  |             ,multiple: true | ||||||
|  |             ,auto: false | ||||||
|  |             ,bindAction: '#testListAction' | ||||||
|  |             ,choose: function(obj){ | ||||||
|  |                 imgs = []; | ||||||
|  |                 var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列 | ||||||
|  |                 layer.msg("等待所有二维码识别完毕后手动输入金额,输入完成后点击保存二维码") | ||||||
|  |                 //读取本地文件 | ||||||
|  |                 obj.preview(function(index, file, result){ | ||||||
|  |                     /* | ||||||
|  |                     $.post("qr-code/test.php","base64="+encodeURIComponent(result.split(",")[1]),function (data) { | ||||||
|  |                         console.log(data) | ||||||
|  |                         if (!data.data) { | ||||||
|  |                             data = JSON.parse(data); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                         imgs.push({"index":imgs.length,"money":"","b64":result,"url":data.data}); | ||||||
|  |                         mytable.reload({ | ||||||
|  |                             data: imgs | ||||||
|  |                         }); | ||||||
|  |                     }); | ||||||
|  |                     */ | ||||||
|  |                     qrcode.decode(getObjectURL(file),result); | ||||||
|  |                     qrcode.callback = function(imgMsg,img64) { | ||||||
|  |                         if (imgMsg==""){ | ||||||
|  |                             $.post("qr-code/test.php","base64="+encodeURIComponent(img64.split(",")[1]),function (data) { | ||||||
|  |                                 console.log(data) | ||||||
|  |                                 if (!data.data) { | ||||||
|  |                                     data = JSON.parse(data); | ||||||
|  |                                 } | ||||||
|  |                                 imgs.push({"index":imgs.length,"money":"","b64":img64,"url":data.data}); | ||||||
|  |                                 mytable.reload({ | ||||||
|  |                                     data: imgs | ||||||
|  |                                 }); | ||||||
|  |                             }); | ||||||
|  |                         } else{ | ||||||
|  |                             imgs.push({"index":imgs.length,"money":"","b64":img64,"url":imgMsg}); | ||||||
|  |                             mytable.reload({ | ||||||
|  |                                 data: imgs | ||||||
|  |                             }); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     function saveqr() { | ||||||
|  |         var data = layui.table.cache.test; | ||||||
|  |         for (var i = 0;i<data.length;i++){ | ||||||
|  |             if (data[i].money =="" || checkRate(data[i].money == false)){ | ||||||
|  |                 layer.msg("序号为"+(i+1)+"的二维码金额有误,请检查"); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         up(data,0); | ||||||
|  |     } | ||||||
|  |     function up(obj,index) { | ||||||
|  |         if (obj.length==index){ | ||||||
|  |             layer.msg("操作成功!"); | ||||||
|  |             imgs = [] | ||||||
|  |             mytable.reload({ | ||||||
|  |                 data: imgs | ||||||
|  |             }); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         $.post("admin/index/addPayQrcode","type=2&pay_url="+encodeURIComponent(obj[index].url)+"&price="+obj[index].money,function (data) { | ||||||
|  |             up(obj,index+1) | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function checkRate(input) { | ||||||
|  | 
 | ||||||
|  |         var re = /^[0-9]+.?[0-9]*$/; //判断字符串是否为数字 //判断正整数 /^[1-9]+[0-9]*]*$/ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         if (!re.test(input)) { | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | </script> | ||||||
							
								
								
									
										96
									
								
								public/admin/jk.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,96 @@ | |||||||
|  | <div class="layui-form" action=""> | ||||||
|  | 
 | ||||||
|  |     <div class="layui-form-item"> | ||||||
|  |         <label class="layui-form-label">监控端状态</label> | ||||||
|  |         <div class="layui-input-block"> | ||||||
|  |             <input type="text" id="jkstate" value="" lay-verify="required" placeholder="监控端状态" autocomplete="off" readonly class="layui-input"> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="layui-form-item"> | ||||||
|  |         <label class="layui-form-label">最后心跳</label> | ||||||
|  |         <div class="layui-input-block"> | ||||||
|  |             <input type="text" id="lastheart" lay-verify="required" placeholder="最后心跳时间" autocomplete="off" readonly class="layui-input"> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  |     <div class="layui-form-item"> | ||||||
|  |         <label class="layui-form-label">最后收款</label> | ||||||
|  |         <div class="layui-input-block"> | ||||||
|  |             <input type="text" id="lastpay" lay-verify="required" placeholder="最后收款时间" autocomplete="off" readonly class="layui-input"> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="layui-form-item"> | ||||||
|  |         <label class="layui-form-label">配置数据</label> | ||||||
|  |         <div class="layui-input-block"> | ||||||
|  |             <input type="text" id="input" lay-verify="required" placeholder="手动配置数据" autocomplete="off" readonly class="layui-input"> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="layui-form-item"> | ||||||
|  |         <label class="layui-form-label">配置二维码</label> | ||||||
|  |         <div class="layui-input-block"> | ||||||
|  |             <img id="pzqrcode"> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     <div class="layui-form-item" style="text-align: right"> | ||||||
|  |         <button class="layui-btn" onclick="window.open('../v.apk')">下载监控端</button> | ||||||
|  |         <button class="layui-btn" onclick="window.open('https://github.com/szvone/vmqApk/releases')">最新版监控端下载</button> | ||||||
|  | 
 | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     <!--<div class="layui-form-item layui-form-text">--> | ||||||
|  |         <!--<label class="layui-form-label">设置进入网站的提示</label>--> | ||||||
|  |         <!--<div class="layui-input-block">--> | ||||||
|  |             <!--<textarea placeholder="请输入公告内容" id="xz" class="layui-textarea"></textarea>--> | ||||||
|  |         <!--</div>--> | ||||||
|  |     <!--</div>--> | ||||||
|  |     <!--<div class="layui-form-item">--> | ||||||
|  |         <!--<button class="layui-btn" onclick="editxz()">保存</button>--> | ||||||
|  |     <!--</div>--> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  |     function formatDate(now) { | ||||||
|  |         if (now==0) { | ||||||
|  |             return "无"; | ||||||
|  |         } | ||||||
|  |         now = new Date(now*1000); | ||||||
|  |         return now.getFullYear() | ||||||
|  |             + "-" + (now.getMonth()>8?(now.getMonth()+1):"0"+(now.getMonth()+1)) | ||||||
|  |             + "-" + (now.getDate()>9?now.getDate():"0"+now.getDate()) | ||||||
|  |             + " " + (now.getHours()>9?now.getHours():"0"+now.getHours()) | ||||||
|  |             + ":" + (now.getMinutes()>9?now.getMinutes():"0"+now.getMinutes()) | ||||||
|  |             + ":" + (now.getSeconds()>9?now.getSeconds():"0"+now.getSeconds()); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     layui.use(['form','layer'], function(){ | ||||||
|  |         var table = layui.table,form = layui.form; | ||||||
|  | 
 | ||||||
|  |         form.render(); | ||||||
|  | 
 | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     $.post("admin/index/getSettings",function (data) { | ||||||
|  |         console.log(data); | ||||||
|  |         if (data.code==1){ | ||||||
|  |             if (data.data.jkstate == -1){ | ||||||
|  |                 $("#jkstate").val("监控端未绑定,请您扫码绑定"); | ||||||
|  |             }else if (data.data.jkstate == 0){ | ||||||
|  |                 $("#jkstate").val("监控端已掉线,请您检查App是否正常运行"); | ||||||
|  |             }else if (data.data.jkstate == 1){ | ||||||
|  |                 $("#jkstate").val("运行正常"); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $("#lastheart").val(formatDate(data.data.lastheart)); | ||||||
|  |             $("#lastpay").val(formatDate(data.data.lastpay)); | ||||||
|  | 
 | ||||||
|  |             var img = window.location.host+"/"+data.data.key; | ||||||
|  | 
 | ||||||
|  |             $("#input").val(img); | ||||||
|  |             $("#pzqrcode").attr("src","enQrcode?url="+img); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | </script> | ||||||
							
								
								
									
										274
									
								
								public/admin/orderlist.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,274 @@ | |||||||
|  | <div class="layui-form layui-form-pane" action=""> | ||||||
|  | <div class="layui-form-item"> | ||||||
|  | 
 | ||||||
|  |     <div class="layui-inline"> | ||||||
|  |         <label class="layui-form-label">支付方式</label> | ||||||
|  |         <div class="layui-input-inline"> | ||||||
|  |             <select id="type" lay-verify="required" lay-filter="type"> | ||||||
|  |                 <option value="">不限制</option> | ||||||
|  |                 <option value="1">微信</option> | ||||||
|  |                 <option value="2">支付宝</option> | ||||||
|  | 
 | ||||||
|  |             </select> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="layui-inline"> | ||||||
|  |         <label class="layui-form-label">订单状态</label> | ||||||
|  |         <div class="layui-input-inline"> | ||||||
|  |             <select id="state" lay-verify="required" lay-filter="state"> | ||||||
|  |                 <option value="">不限制</option> | ||||||
|  |                 <option value="-1">过期</option> | ||||||
|  |                 <option value="0">待支付</option> | ||||||
|  |                 <option value="1">完成</option> | ||||||
|  |                 <option value="2">通知失败</option> | ||||||
|  | 
 | ||||||
|  |             </select> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | </div> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | <script type="text/html" id="toolbarDemo"> | ||||||
|  |     <div class="layui-btn-container"> | ||||||
|  |         <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="delGq">删除所有过期订单</button> | ||||||
|  |         <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="delLast">删除七天前订单</button> | ||||||
|  | 
 | ||||||
|  |     </div> | ||||||
|  | </script> | ||||||
|  | <table id="demo" lay-filter="test"></table> | ||||||
|  | 
 | ||||||
|  | <script type="text/html" id="barDemo"> | ||||||
|  |     <a class="layui-btn layui-btn-xs" lay-event="bd">补单</a> | ||||||
|  |     <a class="layui-btn layui-btn-xs" lay-event="info">详情</a> | ||||||
|  |     <a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</a> | ||||||
|  | 
 | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  |     function formatDate(now) { | ||||||
|  |         if (now=="0"){ | ||||||
|  |             return "无"; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         now = new Date(now*1000); | ||||||
|  |         return now.getFullYear() | ||||||
|  |             + "-" + (now.getMonth()>8?(now.getMonth()+1):"0"+(now.getMonth()+1)) | ||||||
|  |             + "-" + (now.getDate()>9?now.getDate():"0"+now.getDate()) | ||||||
|  |             + " " + (now.getHours()>9?now.getHours():"0"+now.getHours()) | ||||||
|  |             + ":" + (now.getMinutes()>9?now.getMinutes():"0"+now.getMinutes()) | ||||||
|  |             + ":" + (now.getSeconds()>9?now.getSeconds():"0"+now.getSeconds()); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     var myTable,table,form; | ||||||
|  |     layui.use(['form','table','laydate'], function(){ | ||||||
|  |         table = layui.table; | ||||||
|  |         form = layui.form; | ||||||
|  | 
 | ||||||
|  |         //第一个实例 | ||||||
|  |         myTable = table.render({ | ||||||
|  |             elem: '#demo' | ||||||
|  |             ,height: 'full-160' | ||||||
|  |             ,url: 'admin/index/getOrders' | ||||||
|  |             ,toolbar: '#toolbarDemo' | ||||||
|  |             ,where: { | ||||||
|  |                 state:$("#state").val(), | ||||||
|  |                 type:$("#type").val() | ||||||
|  |             } | ||||||
|  |             ,cols: [[ //表头 | ||||||
|  |                 {field: 'create_date', title: '创建时间',minWidth:160,templet: function(d){ | ||||||
|  |                         return formatDate(d.create_date); | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  |                 {field: 'pay_id', title: '商户编号',minWidth:180}, | ||||||
|  |                 {field: 'order_id', title: '云端订单编号',minWidth:180}, | ||||||
|  |                 {field: 'type', title: '支付方式',minWidth:100,templet: function(d){ | ||||||
|  |                         if (d.type=="1"){ | ||||||
|  |                             return '微信'; | ||||||
|  |                         }else if (d.type=="2"){ | ||||||
|  |                             return '支付宝'; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  |                 {field: 'price', title: '订单金额',minWidth:100, align:'center'}, | ||||||
|  |                 {field: 'really_price', title: '实际金额',minWidth:100, align:'center'}, | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 {field: 'state', title: '状态',minWidth:80,templet: function(d){ | ||||||
|  |                         if (d.state=="2"){ | ||||||
|  |                             return '<span style="color: orange">通知失败</span>'; | ||||||
|  |                         }else if (d.state=="1"){ | ||||||
|  |                             return '<span style="color: green">完成</span>'; | ||||||
|  |                         }else if (d.state=="0"){ | ||||||
|  |                             return '<span style="color: orange">待支付</span>'; | ||||||
|  |                         }else if (d.state=="-1"){ | ||||||
|  |                             return '<span style="color: red">过期</span>'; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  | 
 | ||||||
|  |                 {title: '操作', minWidth: 120, align:'center', toolbar: '#barDemo'} | ||||||
|  | 
 | ||||||
|  |             ]] | ||||||
|  |             ,page:true | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         //监听行工具事件 | ||||||
|  |         table.on('tool(test)', function(obj){ //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值" | ||||||
|  |             var data = obj.data //获得当前行数据 | ||||||
|  |                 ,layEvent = obj.event; //获得 lay-event 对应的值 | ||||||
|  |             if(layEvent === 'info'){ | ||||||
|  |                 var out = "<p>创建时间:"+formatDate(data.create_date)+"</p>"; | ||||||
|  |                 out += "<p>支付时间:"+formatDate(data.pay_date)+"</p>"; | ||||||
|  |                 out += "<p>关闭时间:"+formatDate(data.close_date)+"</p>"; | ||||||
|  |                 out += "<p>自定义参数:"+data.param+"</p>"; | ||||||
|  |                 layer.alert(out); | ||||||
|  | 
 | ||||||
|  |             }else if(layEvent === 'bd'){ | ||||||
|  |                 layer.confirm('确定要补单吗?该操作将会将该订单标记为已支付,并向您的服务器发送订单完成通知', function(index){ | ||||||
|  |                     layer.msg('操作中', { | ||||||
|  |                         icon: 16 | ||||||
|  |                         ,shade: 0.01 | ||||||
|  |                     }); | ||||||
|  | 
 | ||||||
|  |                     $.post("admin/index/setBd","id="+data.id,function (data) { | ||||||
|  |                         if (data.code==1){ | ||||||
|  |                             layer.msg("操作成功!"); | ||||||
|  |                             myTable.reload({ | ||||||
|  |                                 where: { | ||||||
|  |                                     state:$("#state").val(), | ||||||
|  |                                     type:$("#type").val() | ||||||
|  |                                 } | ||||||
|  |                             }); | ||||||
|  |                         }else if(data.code==-2){ | ||||||
|  |                             layer.confirm('补单失败,异步通知返回错误,是否查看通知返回数据?', { | ||||||
|  |                                 btn: ['查看','取消'] //按钮 | ||||||
|  |                             }, function(){ | ||||||
|  |                                 alert(data.data); | ||||||
|  |                             }, function(){ | ||||||
|  | 
 | ||||||
|  |                             }); | ||||||
|  |                         }else{ | ||||||
|  |                             layer.msg(data.msg); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                     }); | ||||||
|  | 
 | ||||||
|  |                     console.log(data.id); | ||||||
|  |                 }); | ||||||
|  |             }else if(layEvent === 'del'){ | ||||||
|  |                 layer.confirm('确定要删除订单吗?', function(index){ | ||||||
|  |                     layer.msg('操作中', { | ||||||
|  |                         icon: 16 | ||||||
|  |                         ,shade: 0.01 | ||||||
|  |                     }); | ||||||
|  | 
 | ||||||
|  |                     $.post("admin/index/delOrder","id="+data.id,function (data) { | ||||||
|  |                         if (data.code==1){ | ||||||
|  |                             layer.msg("操作成功!"); | ||||||
|  |                             myTable.reload({ | ||||||
|  |                                 where: { | ||||||
|  |                                     state:$("#state").val(), | ||||||
|  |                                     type:$("#type").val() | ||||||
|  |                                 } | ||||||
|  |                             }); | ||||||
|  |                         }else{ | ||||||
|  |                             layer.msg(data.msg); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                     }); | ||||||
|  | 
 | ||||||
|  |                     console.log(data.id); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |         form.on('select(state)', function(data){ | ||||||
|  |             myTable.reload({ | ||||||
|  |                 where: { | ||||||
|  |                     state:$("#state").val(), | ||||||
|  |                     type:$("#type").val() | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  | 
 | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         form.on('select(type)', function(data){ | ||||||
|  |             myTable.reload({ | ||||||
|  |                 where: { | ||||||
|  |                     state:$("#state").val(), | ||||||
|  |                     type:$("#type").val() | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  | 
 | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         //头工具栏事件 | ||||||
|  |         table.on('toolbar(test)', function(obj){ | ||||||
|  |             var checkStatus = table.checkStatus(obj.config.id); | ||||||
|  |             switch(obj.event){ | ||||||
|  |                 case 'delGq': | ||||||
|  |                     layer.confirm('确定要删除所有过期订单吗?', function(index){ | ||||||
|  |                         layer.msg('操作中', { | ||||||
|  |                             icon: 16 | ||||||
|  |                             ,shade: 0.01 | ||||||
|  |                         }); | ||||||
|  | 
 | ||||||
|  |                         $.post("admin/index/delGqOrder",function (data) { | ||||||
|  |                             if (data.code==1){ | ||||||
|  |                                 layer.msg("操作成功!"); | ||||||
|  |                                 myTable.reload({ | ||||||
|  |                                     where: { | ||||||
|  |                                         state:$("#state").val(), | ||||||
|  |                                         type:$("#type").val() | ||||||
|  |                                     } | ||||||
|  |                                 }); | ||||||
|  |                             }else{ | ||||||
|  |                                 layer.msg(data.msg); | ||||||
|  |                             } | ||||||
|  | 
 | ||||||
|  |                         }); | ||||||
|  | 
 | ||||||
|  |                     }); | ||||||
|  | 
 | ||||||
|  |                     break; | ||||||
|  |                 case 'delLast': | ||||||
|  |                     layer.confirm('确定要删除七天前的所有订单吗?', function(index){ | ||||||
|  |                         layer.msg('操作中', { | ||||||
|  |                             icon: 16 | ||||||
|  |                             ,shade: 0.01 | ||||||
|  |                         }); | ||||||
|  | 
 | ||||||
|  |                         $.post("admin/index/delLastOrder",function (data) { | ||||||
|  |                             if (data.code==1){ | ||||||
|  |                                 layer.msg("操作成功!"); | ||||||
|  |                                 myTable.reload({ | ||||||
|  |                                     where: { | ||||||
|  |                                         state:$("#state").val(), | ||||||
|  |                                         type:$("#type").val() | ||||||
|  |                                     } | ||||||
|  |                                 }); | ||||||
|  |                             }else{ | ||||||
|  |                                 layer.msg(data.msg); | ||||||
|  |                             } | ||||||
|  | 
 | ||||||
|  |                         }); | ||||||
|  | 
 | ||||||
|  |                     }); | ||||||
|  |                     break; | ||||||
|  |             }; | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         form.render(); | ||||||
|  | 
 | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | </script> | ||||||
							
								
								
									
										351
									
								
								public/admin/setting.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,351 @@ | |||||||
|  | <div class="layui-form" action=""> | ||||||
|  | 
 | ||||||
|  |     <div class="layui-form-item"> | ||||||
|  |         <label class="layui-form-label">后台账号</label> | ||||||
|  |         <div class="layui-input-block"> | ||||||
|  |             <input type="text" id="user" 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-block"> | ||||||
|  |             <input type="text" id="pass" 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-block"> | ||||||
|  |             <input type="number" id="close" 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-block"> | ||||||
|  |             <input type="text" id="notifyUrl" 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-block"> | ||||||
|  |             <input type="text" id="returnUrl" 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-block"> | ||||||
|  |             <input type="text" id="key" 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-block"> | ||||||
|  |             <div class="layui-upload"> | ||||||
|  |                 <select id="payQf"> | ||||||
|  |                     <option value="1">金额递增</option> | ||||||
|  |                     <option value="2">金额递减</option> | ||||||
|  |                 </select> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  |     <div class="layui-form-item"> | ||||||
|  |         <label class="layui-form-label">微信码</label> | ||||||
|  |         <div class="layui-input-block"> | ||||||
|  |             <div class="layui-upload"> | ||||||
|  |                 <button type="button" class="layui-btn" id="wxup">上传收款二维码</button>(此处上传的是无金额的收款二维码) | ||||||
|  |                 <div class="layui-upload-list"> | ||||||
|  |                     <img class="layui-upload-img" id="wximg"> | ||||||
|  |                     <p id="wxcs"></p> | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="layui-form-item"> | ||||||
|  |         <label class="layui-form-label">支付宝码</label> | ||||||
|  |         <div class="layui-input-block"> | ||||||
|  |             <div class="layui-upload"> | ||||||
|  |                 <button type="button" class="layui-btn" id="zfbup">上传收款二维码</button>(此处上传的是无金额的收款二维码) | ||||||
|  |                 <div class="layui-upload-list"> | ||||||
|  |                     <img class="layui-upload-img" id="zfbimg"> | ||||||
|  |                     <p id="zfbcs"></p> | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     <div class="layui-form-item" style="text-align: right;"> | ||||||
|  |         <button class="layui-btn" onclick="save()">保存</button> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     <!--<div class="layui-form-item layui-form-text">--> | ||||||
|  |     <!--<label class="layui-form-label">设置进入网站的提示</label>--> | ||||||
|  |     <!--<div class="layui-input-block">--> | ||||||
|  |     <!--<textarea placeholder="请输入公告内容" id="xz" class="layui-textarea"></textarea>--> | ||||||
|  |     <!--</div>--> | ||||||
|  |     <!--</div>--> | ||||||
|  |     <!--<div class="layui-form-item">--> | ||||||
|  |     <!--<button class="layui-btn" onclick="editxz()">保存</button>--> | ||||||
|  |     <!--</div>--> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  |     function formatDate(now) { | ||||||
|  |         now = new Date(now*1000); | ||||||
|  |         return now.getFullYear() | ||||||
|  |             + "-" + (now.getMonth()>8?(now.getMonth()+1):"0"+(now.getMonth()+1)) | ||||||
|  |             + "-" + (now.getDate()>9?now.getDate():"0"+now.getDate()) | ||||||
|  |             + " " + (now.getHours()>9?now.getHours():"0"+now.getHours()) | ||||||
|  |             + ":" + (now.getMinutes()>9?now.getMinutes():"0"+now.getMinutes()) | ||||||
|  |             + ":" + (now.getSeconds()>9?now.getSeconds():"0"+now.getSeconds()); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     layui.use(['form','layer','upload'], function(){ | ||||||
|  |         var table = layui.table,form = layui.form,upload = layui.upload; | ||||||
|  | 
 | ||||||
|  |         var uploadInst = upload.render({ | ||||||
|  |             elem: '#wxup' | ||||||
|  |             , url: 'qr-code/test.php' | ||||||
|  |             ,auto: false | ||||||
|  |             ,choose: function(obj){ | ||||||
|  |                 console.log(obj) | ||||||
|  |                 obj.preview(function(index, file, result){ | ||||||
|  |                     qrcode.decode(getObjectURL(file)); | ||||||
|  |                     qrcode.callback = function(imgMsg) { | ||||||
|  |                         console.log(imgMsg) | ||||||
|  |                         if(imgMsg!=""){ | ||||||
|  |                             $('#wximg').attr('src', "enQrcode?url="+imgMsg); | ||||||
|  |                         }else{ | ||||||
|  |                             layer.msg('处理中', { | ||||||
|  |                                 icon: 16 | ||||||
|  |                                 ,shade: 0.01 | ||||||
|  |                                 ,time:0 | ||||||
|  |                             }); | ||||||
|  | 
 | ||||||
|  |                             $.post("qr-code/test.php","base64="+encodeURIComponent(result.split(",")[1]),function (data) { | ||||||
|  |                                 console.log(data) | ||||||
|  |                                 if (!data.data) { | ||||||
|  |                                     data = JSON.parse(data); | ||||||
|  |                                 } | ||||||
|  |                                 if (data.code==1){ | ||||||
|  |                                     $('#wximg').attr('src', "enQrcode?url="+data.data); | ||||||
|  |                                     layer.msg('处理成功'); | ||||||
|  |                                 } else{ | ||||||
|  |                                     return layer.alert('处理失败,可以尝试将二维码用草料识别出内容,然后重新将内容生成二维码图片上传!'); | ||||||
|  |                                 } | ||||||
|  | 
 | ||||||
|  |                             }); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 }); | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  |             , before: function (obj) { | ||||||
|  |                 layer.msg('处理中', { | ||||||
|  |                     icon: 16 | ||||||
|  |                     ,shade: 0.01 | ||||||
|  |                     ,time:0 | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |             , done: function (res) { | ||||||
|  |                 //如果上传失败 | ||||||
|  |                 if (res.code == -1) { | ||||||
|  |                     return layer.msg('上传失败'); | ||||||
|  |                 } | ||||||
|  |                 if (res.data==""){ | ||||||
|  |                     return layer.msg('请上传微信无金额收款二维码'); | ||||||
|  |                 } | ||||||
|  |                 layer.msg('处理成功'); | ||||||
|  | 
 | ||||||
|  |                 $('#wximg').attr('src', "enQrcode?url="+res.data); | ||||||
|  |             } | ||||||
|  |             , error: function () { | ||||||
|  |                 layer.msg('上传失败'); | ||||||
|  |                 //演示失败状态,并实现重传 | ||||||
|  |                 var demoText = $('#wxcs'); | ||||||
|  |                 demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs wxcs">重试</a>'); | ||||||
|  |                 demoText.find('.wxcs').on('click', function () { | ||||||
|  |                     uploadInst.upload(); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         var uploadInst2 = upload.render({ | ||||||
|  |             elem: '#zfbup' | ||||||
|  |             , url: 'qr-code/test.php' | ||||||
|  |             ,auto: false | ||||||
|  |             ,choose: function(obj){ | ||||||
|  |                 console.log(obj) | ||||||
|  |                 obj.preview(function(index, file, result){ | ||||||
|  |                     qrcode.decode(getObjectURL(file)); | ||||||
|  |                     qrcode.callback = function(imgMsg) { | ||||||
|  |                         console.log(imgMsg) | ||||||
|  |                         if(imgMsg!=""){ | ||||||
|  |                             $('#zfbimg').attr('src', "enQrcode?url="+imgMsg); | ||||||
|  |                         }else{ | ||||||
|  |                             layer.msg('处理中', { | ||||||
|  |                                 icon: 16 | ||||||
|  |                                 ,shade: 0.01 | ||||||
|  |                                 ,time:0 | ||||||
|  |                             }); | ||||||
|  |                             $.post("qr-code/test.php","base64="+encodeURIComponent(result.split(",")[1]),function (data) { | ||||||
|  |                                 console.log(data) | ||||||
|  |                                 if (!data.data) { | ||||||
|  |                                     data = JSON.parse(data); | ||||||
|  |                                 } | ||||||
|  |                                 if (data.code==1){ | ||||||
|  |                                     $('#zfbimg').attr('src', "enQrcode?url="+data.data); | ||||||
|  |                                     layer.msg('处理成功'); | ||||||
|  |                                 } else{ | ||||||
|  |                                     return layer.alert('处理失败,可以尝试将二维码用草料识别出内容,然后重新将内容生成二维码图片上传!'); | ||||||
|  | 
 | ||||||
|  |                                 } | ||||||
|  | 
 | ||||||
|  |                             }); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 }); | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  |             , before: function (obj) { | ||||||
|  |                 layer.msg('处理中', { | ||||||
|  |                     icon: 16 | ||||||
|  |                     ,shade: 0.01 | ||||||
|  |                     ,time:0 | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |             , done: function (res) { | ||||||
|  |                 //如果上传失败 | ||||||
|  |                 if (res.code == -1) { | ||||||
|  |                     return layer.msg('上传失败'); | ||||||
|  |                 } | ||||||
|  |                 if (res.data=="" ){ | ||||||
|  |                     return layer.msg('请上传支付宝无金额收款二维码'); | ||||||
|  |                 } | ||||||
|  |                 layer.msg('处理成功'); | ||||||
|  | 
 | ||||||
|  |                 $('#zfbimg').attr('src', "enQrcode?url="+res.data); | ||||||
|  |             } | ||||||
|  |             , error: function () { | ||||||
|  |                 layer.msg('上传失败'); | ||||||
|  | 
 | ||||||
|  |                 //演示失败状态,并实现重传 | ||||||
|  |                 var demoText = $('#zfbcs'); | ||||||
|  |                 demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs zfbcs">重试</a>'); | ||||||
|  |                 demoText.find('.zfbcs').on('click', function () { | ||||||
|  |                     uploadInst2.upload(); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |         form.render(); | ||||||
|  | 
 | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     function save() { | ||||||
|  |         var user = $("#user").val(); | ||||||
|  |         var pass = $("#pass").val(); | ||||||
|  |         var notifyUrl = $("#notifyUrl").val(); | ||||||
|  |         var returnUrl = $("#returnUrl").val(); | ||||||
|  |         var key = $("#key").val(); | ||||||
|  |         var close = $("#close").val(); | ||||||
|  |         var payQf = $("#payQf").val(); | ||||||
|  |         if (user == ""){ | ||||||
|  |             layer.msg("请输入管理员账号"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if (pass == ""){ | ||||||
|  |             layer.msg("请输入管理员密码"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if (key == ""){ | ||||||
|  |             layer.msg("请输入通讯密钥"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if (notifyUrl == ""){ | ||||||
|  |             layer.msg("请输入异步回调地址"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if (returnUrl == ""){ | ||||||
|  |             layer.msg("请输入支付完成后跳转地址"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (close == ""){ | ||||||
|  |             layer.msg("请输入创建的订单几分钟后失效"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         var wximg = $("#wximg").attr("src"); | ||||||
|  |         if (wximg=="" || !wximg){ | ||||||
|  |             layer.msg("请上传微信无金额的收款二维码"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         var zfbimg = $("#zfbimg").attr("src"); | ||||||
|  |         if (zfbimg=="" || !zfbimg){ | ||||||
|  |             layer.msg("请上传支付宝无金额的收款二维码"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         wximg = wximg.replace(/enQrcode\?url=/g,""); | ||||||
|  |         zfbimg = zfbimg.replace(/enQrcode\?url=/g,""); | ||||||
|  |         $.post("admin/index/saveSetting","user="+user+"&pass="+pass+"¬ifyUrl="+notifyUrl+"&returnUrl="+returnUrl+"&key="+key+"&wxpay="+wximg+"&zfbpay="+zfbimg+"&close="+close+"&payQf="+payQf,function (data) { | ||||||
|  |             if (data.code==1){ | ||||||
|  |                 $.post("admin/index/getSettings",function (data) { | ||||||
|  |                     console.log(data); | ||||||
|  |                     if (data.code==1){ | ||||||
|  |                         $("#user").val(data.data.user); | ||||||
|  |                         $("#pass").val(data.data.pass); | ||||||
|  |                         $("#notifyUrl").val(data.data.notifyUrl); | ||||||
|  |                         $("#returnUrl").val(data.data.returnUrl); | ||||||
|  |                         $("#key").val(data.data.key); | ||||||
|  |                         $("#close").val(data.data.close); | ||||||
|  | 
 | ||||||
|  |                         if (data.data.wxpay!=""){ | ||||||
|  |                             $('#wximg').attr('src', "enQrcode?url="+data.data.wxpay); | ||||||
|  |                         } | ||||||
|  |                         if (data.data.zfbpay!=""){ | ||||||
|  |                             $('#zfbimg').attr('src', "enQrcode?url="+data.data.zfbpay); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |             layer.msg(data.msg); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     function getstate(){ | ||||||
|  |         $.post("admin/index/getSettings",function (data) { | ||||||
|  |             console.log(data); | ||||||
|  |             if (data.code==1){ | ||||||
|  |                 $("#user").val(data.data.user); | ||||||
|  |                 $("#pass").val(data.data.pass); | ||||||
|  |                 $("#notifyUrl").val(data.data.notifyUrl); | ||||||
|  |                 $("#returnUrl").val(data.data.returnUrl); | ||||||
|  |                 $("#key").val(data.data.key); | ||||||
|  |                 $("#close").val(data.data.close); | ||||||
|  |                 $("#payQf").val(data.data.payQf); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 if (data.data.wxpay!=""){ | ||||||
|  |                     $('#wximg').attr('src', "enQrcode?url="+data.data.wxpay); | ||||||
|  |                 } | ||||||
|  |                 if (data.data.zfbpay!=""){ | ||||||
|  |                     $('#zfbimg').attr('src', "enQrcode?url="+data.data.zfbpay); | ||||||
|  |                 } | ||||||
|  |                 layui.form.render(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     getstate(); | ||||||
|  | </script> | ||||||
							
								
								
									
										83
									
								
								public/admin/wxqrcodelist.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,83 @@ | |||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  |     .layui-table-cell { | ||||||
|  |         height: auto; | ||||||
|  |     } | ||||||
|  |     .layui-table img { | ||||||
|  |         max-width: 200px; | ||||||
|  |     } | ||||||
|  | </style> | ||||||
|  | <table id="demo" lay-filter="test"></table> | ||||||
|  | 
 | ||||||
|  | <script type="text/html" id="barDemo"> | ||||||
|  |     <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a> | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  |     function formatDate(now) { | ||||||
|  |         now = new Date(now*1000); | ||||||
|  |         return now.getFullYear() | ||||||
|  |             + "-" + (now.getMonth()>8?(now.getMonth()+1):"0"+(now.getMonth()+1)) | ||||||
|  |             + "-" + (now.getDate()>9?now.getDate():"0"+now.getDate()) | ||||||
|  |             + " " + (now.getHours()>9?now.getHours():"0"+now.getHours()) | ||||||
|  |             + ":" + (now.getMinutes()>9?now.getMinutes():"0"+now.getMinutes()) | ||||||
|  |             + ":" + (now.getSeconds()>9?now.getSeconds():"0"+now.getSeconds()); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     var myTable,table,form; | ||||||
|  |     layui.use(['form','table','laydate'], function(){ | ||||||
|  |         table = layui.table; | ||||||
|  |         form = layui.form; | ||||||
|  | 
 | ||||||
|  |         //第一个实例 | ||||||
|  |         myTable = table.render({ | ||||||
|  |             elem: '#demo' | ||||||
|  |             ,height: 'full-130' | ||||||
|  |             ,url: 'admin/index/getPayQrcodes' | ||||||
|  |             ,where: { | ||||||
|  |                 type:1, | ||||||
|  |             } | ||||||
|  |             ,cols: [[ //表头 | ||||||
|  |                 {field: 'state', title: '二维码',templet: function(d){ | ||||||
|  |                         return '<img src="enQrcode?url='+d.pay_url+'"/>'; | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  |                 {field: 'price', title: '金额'}, | ||||||
|  |                 {title:"操作", width: 70, align:'center', toolbar: '#barDemo'} | ||||||
|  | 
 | ||||||
|  |             ]] | ||||||
|  |             ,page:true | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         //监听行工具事件 | ||||||
|  |         table.on('tool(test)', function(obj){ //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值" | ||||||
|  |             var data = obj.data //获得当前行数据 | ||||||
|  |                 ,layEvent = obj.event; //获得 lay-event 对应的值 | ||||||
|  |             if(layEvent === 'del'){ | ||||||
|  |                 layer.confirm('要删除该二维码么?', function(index){ | ||||||
|  | 
 | ||||||
|  |                     layer.close(index); | ||||||
|  |                     //向服务端发送删除指令 | ||||||
|  |                     $.post("admin/index/delPayQrcode","id="+data.id,function (data) { | ||||||
|  |                         if (data.code==1){ | ||||||
|  |                             obj.del(); //删除对应行(tr)的DOM结构 | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                         layer.msg(data.msg); | ||||||
|  |                     }); | ||||||
|  | 
 | ||||||
|  |                     console.log(data.id); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         form.render(); | ||||||
|  | 
 | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | </script> | ||||||
							
								
								
									
										83
									
								
								public/admin/zfbqrcodelist.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,83 @@ | |||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  |     .layui-table-cell { | ||||||
|  |         height: auto; | ||||||
|  |     } | ||||||
|  |     .layui-table img { | ||||||
|  |         max-width: 200px; | ||||||
|  |     } | ||||||
|  | </style> | ||||||
|  | <table id="demo" lay-filter="test"></table> | ||||||
|  | 
 | ||||||
|  | <script type="text/html" id="barDemo"> | ||||||
|  |     <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a> | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  |     function formatDate(now) { | ||||||
|  |         now = new Date(now*1000); | ||||||
|  |         return now.getFullYear() | ||||||
|  |             + "-" + (now.getMonth()>8?(now.getMonth()+1):"0"+(now.getMonth()+1)) | ||||||
|  |             + "-" + (now.getDate()>9?now.getDate():"0"+now.getDate()) | ||||||
|  |             + " " + (now.getHours()>9?now.getHours():"0"+now.getHours()) | ||||||
|  |             + ":" + (now.getMinutes()>9?now.getMinutes():"0"+now.getMinutes()) | ||||||
|  |             + ":" + (now.getSeconds()>9?now.getSeconds():"0"+now.getSeconds()); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     var myTable,table,form; | ||||||
|  |     layui.use(['form','table','laydate'], function(){ | ||||||
|  |         table = layui.table; | ||||||
|  |         form = layui.form; | ||||||
|  | 
 | ||||||
|  |         //第一个实例 | ||||||
|  |         myTable = table.render({ | ||||||
|  |             elem: '#demo' | ||||||
|  |             ,height: 'full-130' | ||||||
|  |             ,url: 'admin/index/getPayQrcodes' | ||||||
|  |             ,where: { | ||||||
|  |                 type:2, | ||||||
|  |             } | ||||||
|  |             ,cols: [[ //表头 | ||||||
|  |                 {field: 'state', title: '二维码',templet: function(d){ | ||||||
|  |                         return '<img src="enQrcode?url='+d.pay_url+'"/>'; | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  |                 {field: 'price', title: '金额'}, | ||||||
|  |                 {title:"操作", width: 70, align:'center', toolbar: '#barDemo'} | ||||||
|  | 
 | ||||||
|  |             ]] | ||||||
|  |             ,page:true | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         //监听行工具事件 | ||||||
|  |         table.on('tool(test)', function(obj){ //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值" | ||||||
|  |             var data = obj.data //获得当前行数据 | ||||||
|  |                 ,layEvent = obj.event; //获得 lay-event 对应的值 | ||||||
|  |             if(layEvent === 'del'){ | ||||||
|  |                 layer.confirm('要删除该二维码么?', function(index){ | ||||||
|  | 
 | ||||||
|  |                     layer.close(index); | ||||||
|  |                     //向服务端发送删除指令 | ||||||
|  |                     $.post("admin/index/delPayQrcode","id="+data.id,function (data) { | ||||||
|  |                         if (data.code==1){ | ||||||
|  |                             obj.del(); //删除对应行(tr)的DOM结构 | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                         layer.msg(data.msg); | ||||||
|  |                     }); | ||||||
|  | 
 | ||||||
|  |                     console.log(data.id); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         form.render(); | ||||||
|  | 
 | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | </script> | ||||||
							
								
								
									
										853
									
								
								public/api.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,853 @@ | |||||||
|  | <!-- | ||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8"> | ||||||
|  |     <title>API调用说明</title> | ||||||
|  |     <meta name="renderer" content="webkit"> | ||||||
|  |     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | ||||||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> | ||||||
|  |     <meta name="apple-mobile-web-app-status-bar-style" content="black"> | ||||||
|  |     <meta name="apple-mobile-web-app-capable" content="yes"> | ||||||
|  |     <meta name="format-detection" content="telephone=no"> | ||||||
|  |     <link rel="stylesheet" href="layui/css/layui.css" media="all" /> | ||||||
|  | </head> | ||||||
|  | <body class="body" style="padding: 15px;"> | ||||||
|  | 
 | ||||||
|  | <h1 style="text-align: center">Api调用说明</h1><br><br> | ||||||
|  | --> | ||||||
|  | 
 | ||||||
|  | <blockquote class="layui-elem-quote news_search"> | ||||||
|  |     <div class="layui-inline"> | ||||||
|  |         <p>测试支付页面:<a href="example" target="_blank">http://服务器域名/example/</a></p> | ||||||
|  |         <p>如果需要使用测试代码,请设置main.php,notify.php,return.php里面的$key为你的通讯密钥</p> | ||||||
|  |         <p>设置后台的同步回调地址为:http://服务器域名/example/return.php</p> | ||||||
|  |         <p>设置后台的异步回调地址为:http://服务器域名/example/notify.php</p> | ||||||
|  | 
 | ||||||
|  |     </div> | ||||||
|  | </blockquote> | ||||||
|  | 
 | ||||||
|  | <div class="layui-collapse" lay-filter="test"> | ||||||
|  |     <div class="layui-colla-item"> | ||||||
|  |         <h2 class="layui-colla-title">创建订单</h2> | ||||||
|  |         <div class="layui-colla-content"> | ||||||
|  | 
 | ||||||
|  |             <div> | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         请求地址:http://服务器域名/createOrder | ||||||
|  |                     </div> | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         请求方式:POST/GET | ||||||
|  |                     </div> | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  | 
 | ||||||
|  |                     <p>通讯密钥(示例):a7cc8678193ee9c70ae3d75fd04ae6a9</p> | ||||||
|  |                     <p>校验签名(示例):md5(1547129707139vone66620.1a7cc8678193ee9c70ae3d75fd04ae6a9) = 2b8b5d58c51203162f14939bdbc46a54</p> | ||||||
|  |                     <p>参数示例(示例):payId=1547129707139&type=2&price=0.1&sign=2b8b5d58c51203162f14939bdbc46a54&param=vone666&isHtml=0</p> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         <p>参数说明:</p> | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <table class="layui-table"> | ||||||
|  |                         <colgroup> | ||||||
|  |                             <col> | ||||||
|  |                             <col> | ||||||
|  |                         </colgroup> | ||||||
|  |                         <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>参数</th> | ||||||
|  |                             <th>参数类型</th> | ||||||
|  |                             <th>参数说明</th> | ||||||
|  |                         </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>payId</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>【必传】商户订单号,可以是时间戳,不可重复</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>type</td> | ||||||
|  |                             <td>整数</td> | ||||||
|  |                             <td>【必传】微信支付传入1 支付宝支付传入2</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>price</td> | ||||||
|  |                             <td>小数</td> | ||||||
|  |                             <td>【必传】订单金额</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>sign</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>【必传】签名,计算方式为 md5(payId+param+type+price+通讯密钥)</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>param</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>【可选】传输参数,将会原样返回到异步和同步通知接口</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>isHtml</td> | ||||||
|  |                             <td>整数</td> | ||||||
|  |                             <td>【可选】传入1则自动跳转到支付页面,否则返回创建结果的json数据</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>notifyUrl</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>【可选】传入则设置该订单的异步通知接口为该参数,不传或传空则使用后台设置的接口</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>returnUrl</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>【可选】传入则设置该订单的同步跳转接口为该参数,不传或传空则使用后台设置的接口</td> | ||||||
|  |                         </tr> | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <p>返回数据(示例):{"code":1,"msg":"成功","data":{"payId":"1547129707139","orderId":"201901102220147500","payType":2,"price":0.1,"reallyPrice":0.1,"payUrl":"HTTPS://QR.ALIPAY.COM/FKX03500Z2ZYWA0ELYUB5D","isAuto":1,"state":0,"timeOut":5,"date":1547130014}}</p> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         返回数据说明: | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <table class="layui-table"> | ||||||
|  |                         <colgroup> | ||||||
|  |                             <col> | ||||||
|  |                             <col> | ||||||
|  |                         </colgroup> | ||||||
|  |                         <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>返回参数</th> | ||||||
|  |                             <th>参数类型</th> | ||||||
|  |                             <th>参数说明</th> | ||||||
|  |                         </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>code</td> | ||||||
|  |                             <td>整数</td> | ||||||
|  |                             <td>返回代码(1:成功,-1:调用失败)</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>msg</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>api调用结果说明</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>data</td> | ||||||
|  |                             <td>数组</td> | ||||||
|  |                             <td>api调用结果(如果code为-1,则data为null) | ||||||
|  | 
 | ||||||
|  |                                 <table class="layui-table"> | ||||||
|  |                                     <colgroup> | ||||||
|  |                                         <col> | ||||||
|  |                                         <col> | ||||||
|  |                                     </colgroup> | ||||||
|  |                                     <thead> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <th>返回参数</th> | ||||||
|  |                                         <th>参数类型</th> | ||||||
|  |                                         <th>参数说明</th> | ||||||
|  |                                     </tr> | ||||||
|  |                                     </thead> | ||||||
|  |                                     <tbody> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>payId</td> | ||||||
|  |                                         <td>字符串</td> | ||||||
|  |                                         <td>商户订单号</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>orderId</td> | ||||||
|  |                                         <td>字符串</td> | ||||||
|  |                                         <td>云端订单号,可用于查询订单是否支付成功</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>payType</td> | ||||||
|  |                                         <td>整数</td> | ||||||
|  |                                         <td>微信支付为1 支付宝支付为2</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>price</td> | ||||||
|  |                                         <td>小数</td> | ||||||
|  |                                         <td>订单金额</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>reallyPrice</td> | ||||||
|  |                                         <td>小数</td> | ||||||
|  |                                         <td>实际需付金额</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>payUrl</td> | ||||||
|  |                                         <td>字符串</td> | ||||||
|  |                                         <td>支付二维码内容</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>isAuto</td> | ||||||
|  |                                         <td>整数</td> | ||||||
|  |                                         <td>1需要手动输入金额 0扫码后自动输入金额</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>state</td> | ||||||
|  |                                         <td>整数</td> | ||||||
|  |                                         <td>订单状态:-1|订单过期 0|等待支付 1|完成 2|支付完成但通知失败</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>timeOut</td> | ||||||
|  |                                         <td>整数</td> | ||||||
|  |                                         <td>订单有效时间(分钟)</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>date</td> | ||||||
|  |                                         <td>长整数</td> | ||||||
|  |                                         <td>订单创建时间时间戳(10位)</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     </tbody> | ||||||
|  |                                 </table> | ||||||
|  | 
 | ||||||
|  |                             </td> | ||||||
|  |                         </tr> | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  | 
 | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="layui-colla-item"> | ||||||
|  |         <h2 class="layui-colla-title">查询订单信息</h2> | ||||||
|  |         <div class="layui-colla-content"> | ||||||
|  |             <div> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         请求地址:http://服务器域名/getOrder | ||||||
|  |                     </div> | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         请求方式:POST/GET | ||||||
|  |                     </div> | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  | 
 | ||||||
|  |                     <p>参数示例(示例):orderId=201901102225513177</p> | ||||||
|  | 
 | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         <p>参数说明:</p> | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <table class="layui-table"> | ||||||
|  |                         <colgroup> | ||||||
|  |                             <col> | ||||||
|  |                             <col> | ||||||
|  |                         </colgroup> | ||||||
|  |                         <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>参数</th> | ||||||
|  |                             <th>参数类型</th> | ||||||
|  |                             <th>参数说明</th> | ||||||
|  |                         </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>orderId</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>【必传】云端订单号,创建订单返回的</td> | ||||||
|  |                         </tr> | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <p>返回数据(示例):{"code":1,"msg":"成功","data":{"payId":"1547129707139","orderId":"201901102220147500","payType":2,"price":0.1,"reallyPrice":0.1,"payUrl":"HTTPS://QR.ALIPAY.COM/FKX03500Z2ZYWA0ELYUB5D","isAuto":1,"state":0,"timeOut":5,"date":1547130014}}</p> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         返回数据说明: | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <table class="layui-table"> | ||||||
|  |                         <colgroup> | ||||||
|  |                             <col> | ||||||
|  |                             <col> | ||||||
|  |                         </colgroup> | ||||||
|  |                         <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>返回参数</th> | ||||||
|  |                             <th>参数类型</th> | ||||||
|  |                             <th>参数说明</th> | ||||||
|  |                         </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>code</td> | ||||||
|  |                             <td>整数</td> | ||||||
|  |                             <td>返回代码(1:成功,-1:调用失败)</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>msg</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>api调用结果说明</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>data</td> | ||||||
|  |                             <td>数组</td> | ||||||
|  |                             <td>api调用结果(如果code为-1,则data为null) | ||||||
|  | 
 | ||||||
|  |                                 <table class="layui-table"> | ||||||
|  |                                     <colgroup> | ||||||
|  |                                         <col> | ||||||
|  |                                         <col> | ||||||
|  |                                     </colgroup> | ||||||
|  |                                     <thead> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <th>返回参数</th> | ||||||
|  |                                         <th>参数类型</th> | ||||||
|  |                                         <th>参数说明</th> | ||||||
|  |                                     </tr> | ||||||
|  |                                     </thead> | ||||||
|  |                                     <tbody> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>payId</td> | ||||||
|  |                                         <td>字符串</td> | ||||||
|  |                                         <td>商户订单号</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>orderId</td> | ||||||
|  |                                         <td>字符串</td> | ||||||
|  |                                         <td>云端订单号,可用于查询订单是否支付成功</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>payType</td> | ||||||
|  |                                         <td>整数</td> | ||||||
|  |                                         <td>微信支付为1 支付宝支付为2</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>price</td> | ||||||
|  |                                         <td>小数</td> | ||||||
|  |                                         <td>订单金额</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>reallyPrice</td> | ||||||
|  |                                         <td>小数</td> | ||||||
|  |                                         <td>实际需付金额</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>payUrl</td> | ||||||
|  |                                         <td>字符串</td> | ||||||
|  |                                         <td>支付二维码内容</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>isAuto</td> | ||||||
|  |                                         <td>整数</td> | ||||||
|  |                                         <td>1需要手动输入金额 0扫码后自动输入金额</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>state</td> | ||||||
|  |                                         <td>整数</td> | ||||||
|  |                                         <td>订单状态:-1|订单过期 0|等待支付 1|完成 2|支付完成但通知失败</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>timeOut</td> | ||||||
|  |                                         <td>整数</td> | ||||||
|  |                                         <td>订单有效时间(分钟)</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>date</td> | ||||||
|  |                                         <td>长整数</td> | ||||||
|  |                                         <td>订单创建时间时间戳(10位)</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     </tbody> | ||||||
|  |                                 </table> | ||||||
|  | 
 | ||||||
|  |                             </td> | ||||||
|  |                         </tr> | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  | 
 | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |             </div> | ||||||
|  | 
 | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="layui-colla-item"> | ||||||
|  |         <h2 class="layui-colla-title">查询订单状态</h2> | ||||||
|  |         <div class="layui-colla-content"> | ||||||
|  |             <div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         请求地址:http://服务器域名/checkOrder | ||||||
|  |                     </div> | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         请求方式:POST/GET | ||||||
|  |                     </div> | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  | 
 | ||||||
|  |                     <p>参数示例(示例):orderId=201901102225513177</p> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         <p>参数说明:</p> | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <table class="layui-table"> | ||||||
|  |                         <colgroup> | ||||||
|  |                             <col> | ||||||
|  |                             <col> | ||||||
|  |                         </colgroup> | ||||||
|  |                         <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>参数</th> | ||||||
|  |                             <th>参数类型</th> | ||||||
|  |                             <th>参数说明</th> | ||||||
|  |                         </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>orderId</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>【必传】云端订单号,创建订单返回的</td> | ||||||
|  |                         </tr> | ||||||
|  | 
 | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <p>返回数据(示例):{"code":1,"msg":"成功","data":"https://bbs.125.la/?payId=1547130880571&param=vone666&type=2&price=0.1&reallyPrice=0.1&sign=c79f041bd5bc47d73bc19dc8406c9843"}</p> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         返回数据说明: | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <table class="layui-table"> | ||||||
|  |                         <colgroup> | ||||||
|  |                             <col> | ||||||
|  |                             <col> | ||||||
|  |                         </colgroup> | ||||||
|  |                         <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>返回参数</th> | ||||||
|  |                             <th>参数类型</th> | ||||||
|  |                             <th>参数说明</th> | ||||||
|  |                         </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>code</td> | ||||||
|  |                             <td>整数</td> | ||||||
|  |                             <td>返回代码(1:订单已被支付,-1:支付失败或还未支付,具体查看msg字段)</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>msg</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>调用结果说明</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>data</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td> | ||||||
|  |                                 如果code为-1,则data为null,否则为该订单支付完成后的跳转地址(带回调参数) | ||||||
|  |                             </td> | ||||||
|  |                         </tr> | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  | 
 | ||||||
|  |                 </blockquote> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  |     <div class="layui-colla-item"> | ||||||
|  |         <h2 class="layui-colla-title">关闭订单</h2> | ||||||
|  |         <div class="layui-colla-content"> | ||||||
|  |             <div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         请求地址:http://服务器域名/closeOrder | ||||||
|  |                     </div> | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         请求方式:POST/GET | ||||||
|  |                     </div> | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  | 
 | ||||||
|  |                     <p>参数示例(示例):orderId=201901102225513177&sign=7db2d26323dd8ccbb5d130dd61d210a0</p> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         <p>参数说明:</p> | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <table class="layui-table"> | ||||||
|  |                         <colgroup> | ||||||
|  |                             <col> | ||||||
|  |                             <col> | ||||||
|  |                         </colgroup> | ||||||
|  |                         <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>参数</th> | ||||||
|  |                             <th>参数类型</th> | ||||||
|  |                             <th>参数说明</th> | ||||||
|  |                         </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>orderId</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>【必传】云端订单号,创建订单返回的</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>sign</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>【必传】md5(云端订单号+通讯密钥)</td> | ||||||
|  |                         </tr> | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <p>返回数据(示例):{"code":1,"msg":"成功","data":null}</p> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         返回数据说明: | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <table class="layui-table"> | ||||||
|  |                         <colgroup> | ||||||
|  |                             <col> | ||||||
|  |                             <col> | ||||||
|  |                         </colgroup> | ||||||
|  |                         <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>返回参数</th> | ||||||
|  |                             <th>参数类型</th> | ||||||
|  |                             <th>参数说明</th> | ||||||
|  |                         </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>code</td> | ||||||
|  |                             <td>整数</td> | ||||||
|  |                             <td>返回代码(1:订单关闭成功,-1:订单关闭失败,具体原因查看msg字段)</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>msg</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>调用结果说明</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>data</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td> | ||||||
|  |                                 无用字段,请忽略 | ||||||
|  |                             </td> | ||||||
|  |                         </tr> | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  | 
 | ||||||
|  |                 </blockquote> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     <div class="layui-colla-item"> | ||||||
|  |         <h2 class="layui-colla-title">查询服务端状态</h2> | ||||||
|  |         <div class="layui-colla-content"> | ||||||
|  |             <div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         请求地址:http://服务器域名/getState | ||||||
|  |                     </div> | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         请求方式:POST/GET | ||||||
|  |                     </div> | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  | 
 | ||||||
|  |                     <p>参数示例(示例):t=1547613643&sign=7db2d26323dd8ccbb5d130dd61d210a0</p> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         <p>参数说明:</p> | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <table class="layui-table"> | ||||||
|  |                         <colgroup> | ||||||
|  |                             <col> | ||||||
|  |                             <col> | ||||||
|  |                         </colgroup> | ||||||
|  |                         <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>参数</th> | ||||||
|  |                             <th>参数类型</th> | ||||||
|  |                             <th>参数说明</th> | ||||||
|  |                         </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>t</td> | ||||||
|  |                             <td>长整数</td> | ||||||
|  |                             <td>【必传】现行时间戳</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>sign</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>【必传】md5(现行时间戳+通讯密钥)</td> | ||||||
|  |                         </tr> | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <p>返回数据(示例):{"code":1,"msg":"成功","data":{"lastpay":"1547394640","lastheart":"1547613873","state":"1"}}</p> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         返回数据说明: | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <table class="layui-table"> | ||||||
|  |                         <colgroup> | ||||||
|  |                             <col> | ||||||
|  |                             <col> | ||||||
|  |                         </colgroup> | ||||||
|  |                         <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>返回参数</th> | ||||||
|  |                             <th>参数类型</th> | ||||||
|  |                             <th>参数说明</th> | ||||||
|  |                         </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>code</td> | ||||||
|  |                             <td>整数</td> | ||||||
|  |                             <td>返回代码(1:成功,-1:失败,具体原因查看msg字段)</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>msg</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>调用结果说明</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>data</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>api调用结果(如果code为-1,则data为null) | ||||||
|  | 
 | ||||||
|  |                                 <table class="layui-table"> | ||||||
|  |                                     <colgroup> | ||||||
|  |                                         <col> | ||||||
|  |                                         <col> | ||||||
|  |                                     </colgroup> | ||||||
|  |                                     <thead> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <th>返回参数</th> | ||||||
|  |                                         <th>参数类型</th> | ||||||
|  |                                         <th>参数说明</th> | ||||||
|  |                                     </tr> | ||||||
|  |                                     </thead> | ||||||
|  |                                     <tbody> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>lastpay</td> | ||||||
|  |                                         <td>长整数</td> | ||||||
|  |                                         <td>最后一次监控到支付的时间戳(10位)</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>lastheart</td> | ||||||
|  |                                         <td>长整数</td> | ||||||
|  |                                         <td>最后一次监控端向服务器发送心跳的时间戳(10位)</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     <tr> | ||||||
|  |                                         <td>state</td> | ||||||
|  |                                         <td>整数</td> | ||||||
|  |                                         <td>监控端状态 1|在线 0|掉线 -1|还未绑定监控端</td> | ||||||
|  |                                     </tr> | ||||||
|  |                                     </tbody> | ||||||
|  |                                 </table> | ||||||
|  | 
 | ||||||
|  |                             </td> | ||||||
|  |                         </tr> | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  | 
 | ||||||
|  |                 </blockquote> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     <div class="layui-colla-item"> | ||||||
|  |         <h2 class="layui-colla-title">回调参数说明</h2> | ||||||
|  |         <div class="layui-colla-content"> | ||||||
|  |             <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                 <div class="layui-inline"> | ||||||
|  |                     当系统收到用户收款后,将会向您后台设定的异步通知地址发送GET请求,通知您的服务端订单完成收款 | ||||||
|  |                 </div> | ||||||
|  | 
 | ||||||
|  |                 <div class="layui-inline"> | ||||||
|  |                 若您使用的是isHtml=1则在支付完成后会携带参数跳转到您的同步通知接口,若使用isHtml=0则只有异步通知 | ||||||
|  |                 </div> | ||||||
|  |             </blockquote> | ||||||
|  |                 <blockquote class="layui-elem-quote news_search"> | ||||||
|  |                     <p>传输参数(示例):payId=1547130349673&param=vone666&type=2&price=0.1&reallyPrice=0.1&sign=28943820b95019b6a63598a13c46f93f</p> | ||||||
|  |                     <div class="layui-inline"> | ||||||
|  |                         传输参数说明: | ||||||
|  |                     </div> | ||||||
|  | 
 | ||||||
|  |                     <table class="layui-table"> | ||||||
|  |                         <colgroup> | ||||||
|  |                             <col> | ||||||
|  |                             <col> | ||||||
|  |                         </colgroup> | ||||||
|  |                         <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>返回参数</th> | ||||||
|  |                             <th>参数类型</th> | ||||||
|  |                             <th>参数说明</th> | ||||||
|  |                         </tr> | ||||||
|  |                         </thead> | ||||||
|  |                         <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>payId</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>商户订单号</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>param</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>创建订单的时候传入的参数</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>type</td> | ||||||
|  |                             <td>整数</td> | ||||||
|  |                             <td>支付方式 :微信支付为1 支付宝支付为2</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>price</td> | ||||||
|  |                             <td>小数</td> | ||||||
|  |                             <td>订单金额</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>reallyPrice</td> | ||||||
|  |                             <td>小数</td> | ||||||
|  |                             <td>实际支付金额</td> | ||||||
|  |                         </tr> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>sign</td> | ||||||
|  |                             <td>字符串</td> | ||||||
|  |                             <td>校验签名,计算方式 = md5(payId + param + type + price + reallyPrice + 通讯密钥)</td> | ||||||
|  |                         </tr> | ||||||
|  | 
 | ||||||
|  |                         </tbody> | ||||||
|  |                     </table> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 </blockquote> | ||||||
|  | 
 | ||||||
|  |             <pre class="layui-code"> | ||||||
|  | 
 | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | ini_set("error_reporting","E_ALL & ~E_NOTICE"); | ||||||
|  | 
 | ||||||
|  | $key = "83d551f0b3609781a22536ca2658473d";//通讯密钥 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | $payId = $_GET['payId'];//商户订单号 | ||||||
|  | $param = $_GET['param'];//创建订单的时候传入的参数 | ||||||
|  | $type = $_GET['type'];//支付方式 :微信支付为1 支付宝支付为2 | ||||||
|  | $price = $_GET['price'];//订单金额 | ||||||
|  | $reallyPrice = $_GET['reallyPrice'];//实际支付金额 | ||||||
|  | $sign = $_GET['sign'];//校验签名,计算方式 = md5(payId + param + type + price + reallyPrice + 通讯密钥) | ||||||
|  | 
 | ||||||
|  | //开始校验签名 | ||||||
|  | $_sign =  md5($payId . $param . $type . $price . $reallyPrice . $key); | ||||||
|  | if ($_sign != $sign) { | ||||||
|  |     echo "error_sign";//sign校验不通过 | ||||||
|  |     exit(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | echo "success"; | ||||||
|  | //继续业务流程 | ||||||
|  | //echo "商户订单号:".$payId ."<br>自定义参数:". $param ."<br>支付方式:". $type ."<br>订单金额:". $price ."<br>实际支付金额:". $reallyPrice; | ||||||
|  | 
 | ||||||
|  | ?> | ||||||
|  |             </pre> | ||||||
|  | 
 | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  |     layui.use(['element','code'], function(){ | ||||||
|  |         var element = layui.element; | ||||||
|  |         layui.element.render(); | ||||||
|  |         layui.code({ | ||||||
|  |             title: 'PHP回调示例代码' | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |     }); | ||||||
|  | </script> | ||||||
|  | <!-- | ||||||
|  | 
 | ||||||
|  | <script type="text/javascript" src="layui/layui.js"></script> | ||||||
|  | <script> | ||||||
|  |     layui.use(['element', 'layer'], function(){ | ||||||
|  |         var element = layui.element; | ||||||
|  |         var layer = layui.layer; | ||||||
|  | 
 | ||||||
|  |     }); | ||||||
|  | </script> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
|  | --> | ||||||
							
								
								
									
										5
									
								
								public/assets/css/font-awesome.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								public/assets/css/layer.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								public/assets/css/main.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								public/assets/css/mikufont.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1 @@ | |||||||
|  | @font-face{font-family:source sans pro;font-style:italic;font-weight:300;src:url(../fonts/source-sans-pro-300italic.eot);src:local('Source Sans Pro'),local('SourceSans Pro-Italic'),url(../fonts/source-sans-pro-300italic.eot?#iefix) format('embedded-opentype'),url(../fonts/source-sans-pro-300italic.woff2) format('woff2'),url(../fonts/source-sans-pro-300italic.woff) format('woff'),url(../fonts/source-sans-pro-300italic.ttf) format('truetype'),url('../fonts/source-sans-pro-300italic.svg#SourceSans Pro') format('svg')}@font-face{font-family:source sans pro;font-style:italic;font-weight:600;src:url(../fonts/source-sans-pro-600italic.eot);src:local('Source Sans Pro'),local('SourceSans Pro-Italic'),url(../fonts/source-sans-pro-600italic.eot?#iefix) format('embedded-opentype'),url(../fonts/source-sans-pro-600italic.woff2) format('woff2'),url(../fonts/source-sans-pro-600italic.woff) format('woff'),url(../fonts/source-sans-pro-600italic.ttf) format('truetype'),url('../fonts/source-sans-pro-600italic.svg#SourceSans Pro') format('svg')}@font-face{font-family:source sans pro;font-style:normal;font-weight:300;src:url(../fonts/source-sans-pro-300.eot);src:local('Source Sans Pro'),local('SourceSans Pro-Normal'),url(../fonts/source-sans-pro-300.eot?#iefix) format('embedded-opentype'),url(../fonts/source-sans-pro-300.woff2) format('woff2'),url(../fonts/source-sans-pro-300.woff) format('woff'),url(../fonts/source-sans-pro-300.ttf) format('truetype'),url('../fonts/source-sans-pro-300.svg#SourceSans Pro') format('svg')}@font-face{font-family:source sans pro;font-style:normal;font-weight:600;src:url(../fonts/source-sans-pro-600.eot);src:local('Source Sans Pro'),local('SourceSans Pro-Normal'),url(../fonts/source-sans-pro-600.eot?#iefix) format('embedded-opentype'),url(../fonts/source-sans-pro-600.woff2) format('woff2'),url(../fonts/source-sans-pro-600.woff) format('woff'),url(../fonts/source-sans-pro-600.ttf) format('truetype'),url('../fonts/source-sans-pro-600.svg#SourceSans Pro') format('svg')} | ||||||
							
								
								
									
										12
									
								
								public/assets/css/noscript.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,12 @@ | |||||||
|  | /* | ||||||
|  | 	Dimension by HTML5 UP | ||||||
|  | 	html5up.net | @ajlkn | ||||||
|  | 	Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /* Main */ | ||||||
|  | 
 | ||||||
|  | 	#main article { | ||||||
|  | 		opacity: 1; | ||||||
|  | 		margin: 4rem 0 0 0; | ||||||
|  | 	} | ||||||
							
								
								
									
										
											BIN
										
									
								
								public/assets/fonts/fontawesome-webfont.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								public/assets/fonts/fontawesome-webfont.woff
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								public/assets/fonts/fontawesome-webfont.woff2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								public/assets/fonts/source-sans-pro-300.woff2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								public/assets/fonts/source-sans-pro-600.woff2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								public/assets/images/bg.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 111 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/assets/images/overlay.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.2 KiB | 
							
								
								
									
										5
									
								
								public/assets/js/jQuery@1.11.3.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2
									
								
								public/assets/js/layer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										17
									
								
								public/assets/js/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,17 @@ | |||||||
|  | (function($){skel.breakpoints({xlarge:'(max-width: 1680px)',large:'(max-width: 1280px)',medium:'(max-width: 980px)',small:'(max-width: 736px)',xsmall:'(max-width: 480px)',xxsmall:'(max-width: 360px)'});$(function(){var $window=$(window),$body=$('body'),$wrapper=$('#wrapper'),$header=$('#header'),$footer=$('#footer'),$main=$('#main'),$main_articles=$main.children('article');$body.addClass('is-loading');$window.on('load',function(){window.setTimeout(function(){$body.removeClass('is-loading');},100);});$('form').placeholder();if(skel.vars.IEVersion<12){var flexboxFixTimeoutId;$window.on('resize.flexbox-fix',function(){clearTimeout(flexboxFixTimeoutId);flexboxFixTimeoutId=setTimeout(function(){if($wrapper.prop('scrollHeight')>$window.height()) | ||||||
|  | $wrapper.css('height','auto');else | ||||||
|  | $wrapper.css('height','100vh');},250);}).triggerHandler('resize.flexbox-fix');} | ||||||
|  | var $nav=$header.children('nav'),$nav_li=$nav.find('li');if($nav_li.length%2==0){$nav.addClass('use-middle');$nav_li.eq(($nav_li.length/2)).addClass('is-middle');} | ||||||
|  | var delay=325,locked=false;$main._show=function(id,initial){var $article=$main_articles.filter('#'+id);if($article.length==0) | ||||||
|  | return;if(locked||(typeof initial!='undefined'&&initial===true)){$body.addClass('is-switching');$body.addClass('is-article-visible');$main_articles.removeClass('active');$header.hide();$footer.hide();$main.show();$article.show();$article.addClass('active');locked=false;setTimeout(function(){$body.removeClass('is-switching');},(initial?1000:0));return;} | ||||||
|  | locked=true;if($body.hasClass('is-article-visible')){var $currentArticle=$main_articles.filter('.active');$currentArticle.removeClass('active');setTimeout(function(){$currentArticle.hide();$article.show();setTimeout(function(){$article.addClass('active');$window.scrollTop(0).triggerHandler('resize.flexbox-fix');setTimeout(function(){locked=false;},delay);},25);},delay);} | ||||||
|  | else{$body.addClass('is-article-visible');setTimeout(function(){$header.hide();$footer.hide();$main.show();$article.show();setTimeout(function(){$article.addClass('active');$window.scrollTop(0).triggerHandler('resize.flexbox-fix');setTimeout(function(){locked=false;},delay);},25);},delay);}};$main._hide=function(addState){var $article=$main_articles.filter('.active');if(!$body.hasClass('is-article-visible')) | ||||||
|  | return;if(typeof addState!='undefined'&&addState===true) | ||||||
|  | history.pushState(null,null,'#');if(locked){$body.addClass('is-switching');$article.removeClass('active');$article.hide();$main.hide();$footer.show();$header.show();$body.removeClass('is-article-visible');locked=false;$body.removeClass('is-switching');$window.scrollTop(0).triggerHandler('resize.flexbox-fix');return;} | ||||||
|  | locked=true;$article.removeClass('active');setTimeout(function(){$article.hide();$main.hide();$footer.show();$header.show();setTimeout(function(){$body.removeClass('is-article-visible');$window.scrollTop(0).triggerHandler('resize.flexbox-fix');setTimeout(function(){locked=false;},delay);},25);},delay);};$main_articles.each(function(){var $this=$(this);$('<div class="close">Close</div>').appendTo($this).on('click',function(){location.hash='';});$this.on('click',function(event){event.stopPropagation();});});$body.on('click',function(event){if($body.hasClass('is-article-visible')) | ||||||
|  | $main._hide(true);});$window.on('keyup',function(event){switch(event.keyCode){case 27:if($body.hasClass('is-article-visible')) | ||||||
|  | $main._hide(true);break;default:break;}});$window.on('hashchange',function(event){if(location.hash==''||location.hash=='#'){event.preventDefault();event.stopPropagation();$main._hide();} | ||||||
|  | else if($main_articles.filter(location.hash).length>0){event.preventDefault();event.stopPropagation();$main._show(location.hash.substr(1));}});if('scrollRestoration'in history) | ||||||
|  | history.scrollRestoration='manual';else{var oldScrollPos=0,scrollPos=0,$htmlbody=$('html,body');$window.on('scroll',function(){oldScrollPos=scrollPos;scrollPos=$htmlbody.scrollTop();}).on('hashchange',function(){$window.scrollTop(oldScrollPos);});} | ||||||
|  | $main.hide();$main_articles.hide();if(location.hash!=''&&location.hash!='#') | ||||||
|  | $window.on('load',function(){$main._show(location.hash.substr(1),true);});});})(jQuery); | ||||||
							
								
								
									
										2
									
								
								public/assets/js/skel.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								public/assets/js/theme/default/icon-ext.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 5.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/assets/js/theme/default/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										1
									
								
								public/assets/js/theme/default/layer.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								public/assets/js/theme/default/loading-0.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 5.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/assets/js/theme/default/loading-1.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 701 B | 
							
								
								
									
										
											BIN
										
									
								
								public/assets/js/theme/default/loading-2.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.7 KiB | 
							
								
								
									
										49
									
								
								public/assets/js/util.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,49 @@ | |||||||
|  | (function($){$.fn.navList=function(){var $this=$(this);$a=$this.find('a'),b=[];$a.each(function(){var $this=$(this),indent=Math.max(0,$this.parents('li').length-1),href=$this.attr('href'),target=$this.attr('target');b.push('<a '+ | ||||||
|  | 'class="link depth-'+indent+'"'+ | ||||||
|  | ((typeof target!=='undefined'&&target!='')?' target="'+target+'"':'')+ | ||||||
|  | ((typeof href!=='undefined'&&href!='')?' href="'+href+'"':'')+ | ||||||
|  | '>'+ | ||||||
|  | '<span class="indent-'+indent+'"></span>'+ | ||||||
|  | $this.text()+ | ||||||
|  | '</a>');});return b.join('');};$.fn.panel=function(userConfig){if(this.length==0) | ||||||
|  | return $this;if(this.length>1){for(var i=0;i<this.length;i++) | ||||||
|  | $(this[i]).panel(userConfig);return $this;} | ||||||
|  | var $this=$(this),$body=$('body'),$window=$(window),id=$this.attr('id'),config;config=$.extend({delay:0,hideOnClick:false,hideOnEscape:false,hideOnSwipe:false,resetScroll:false,resetForms:false,side:null,target:$this,visibleClass:'visible'},userConfig);if(typeof config.target!='jQuery') | ||||||
|  | config.target=$(config.target);$this._hide=function(event){if(!config.target.hasClass(config.visibleClass)) | ||||||
|  | return;if(event){event.preventDefault();event.stopPropagation();} | ||||||
|  | config.target.removeClass(config.visibleClass);window.setTimeout(function(){if(config.resetScroll) | ||||||
|  | $this.scrollTop(0);if(config.resetForms) | ||||||
|  | $this.find('form').each(function(){this.reset();});},config.delay);};$this.css('-ms-overflow-style','-ms-autohiding-scrollbar').css('-webkit-overflow-scrolling','touch');if(config.hideOnClick){$this.find('a').css('-webkit-tap-highlight-color','rgba(0,0,0,0)');$this.on('click','a',function(event){var $a=$(this),href=$a.attr('href'),target=$a.attr('target');if(!href||href=='#'||href==''||href=='#'+id) | ||||||
|  | return;event.preventDefault();event.stopPropagation();$this._hide();window.setTimeout(function(){if(target=='_blank') | ||||||
|  | window.open(href);else | ||||||
|  | window.location.href=href;},config.delay+10);});} | ||||||
|  | $this.on('touchstart',function(event){$this.touchPosX=event.originalEvent.touches[0].pageX;$this.touchPosY=event.originalEvent.touches[0].pageY;}) | ||||||
|  | $this.on('touchmove',function(event){if($this.touchPosX===null||$this.touchPosY===null) | ||||||
|  | return;var diffX=$this.touchPosX-event.originalEvent.touches[0].pageX,diffY=$this.touchPosY-event.originalEvent.touches[0].pageY,th=$this.outerHeight(),ts=($this.get(0).scrollHeight-$this.scrollTop());if(config.hideOnSwipe){var result=false,boundary=20,delta=50;switch(config.side){case 'left':result=(diffY<boundary&&diffY>(-1*boundary))&&(diffX>delta);break;case 'right':result=(diffY<boundary&&diffY>(-1*boundary))&&(diffX<(-1*delta));break;case 'top':result=(diffX<boundary&&diffX>(-1*boundary))&&(diffY>delta);break;case 'bottom':result=(diffX<boundary&&diffX>(-1*boundary))&&(diffY<(-1*delta));break;default:break;} | ||||||
|  | if(result){$this.touchPosX=null;$this.touchPosY=null;$this._hide();return false;}} | ||||||
|  | if(($this.scrollTop()<0&&diffY<0)||(ts>(th-2)&&ts<(th+2)&&diffY>0)){event.preventDefault();event.stopPropagation();}});$this.on('click touchend touchstart touchmove',function(event){event.stopPropagation();});$this.on('click','a[href="#'+id+'"]',function(event){event.preventDefault();event.stopPropagation();config.target.removeClass(config.visibleClass);});$body.on('click touchend',function(event){$this._hide(event);});$body.on('click','a[href="#'+id+'"]',function(event){event.preventDefault();event.stopPropagation();config.target.toggleClass(config.visibleClass);});if(config.hideOnEscape) | ||||||
|  | $window.on('keydown',function(event){if(event.keyCode==27) | ||||||
|  | $this._hide(event);});return $this;};$.fn.placeholder=function(){if(typeof(document.createElement('input')).placeholder!='undefined') | ||||||
|  | return $(this);if(this.length==0) | ||||||
|  | return $this;if(this.length>1){for(var i=0;i<this.length;i++) | ||||||
|  | $(this[i]).placeholder();return $this;} | ||||||
|  | var $this=$(this);$this.find('input[type=text],textarea').each(function(){var i=$(this);if(i.val()==''||i.val()==i.attr('placeholder')) | ||||||
|  | i.addClass('polyfill-placeholder').val(i.attr('placeholder'));}).on('blur',function(){var i=$(this);if(i.attr('name').match(/-polyfill-field$/)) | ||||||
|  | return;if(i.val()=='') | ||||||
|  | i.addClass('polyfill-placeholder').val(i.attr('placeholder'));}).on('focus',function(){var i=$(this);if(i.attr('name').match(/-polyfill-field$/)) | ||||||
|  | return;if(i.val()==i.attr('placeholder')) | ||||||
|  | i.removeClass('polyfill-placeholder').val('');});$this.find('input[type=password]').each(function(){var i=$(this);var x=$($('<div>').append(i.clone()).remove().html().replace(/type="password"/i,'type="text"').replace(/type=password/i,'type=text'));if(i.attr('id')!='') | ||||||
|  | x.attr('id',i.attr('id')+'-polyfill-field');if(i.attr('name')!='') | ||||||
|  | x.attr('name',i.attr('name')+'-polyfill-field');x.addClass('polyfill-placeholder').val(x.attr('placeholder')).insertAfter(i);if(i.val()=='') | ||||||
|  | i.hide();else | ||||||
|  | x.hide();i.on('blur',function(event){event.preventDefault();var x=i.parent().find('input[name='+i.attr('name')+'-polyfill-field]');if(i.val()==''){i.hide();x.show();}});x.on('focus',function(event){event.preventDefault();var i=x.parent().find('input[name='+x.attr('name').replace('-polyfill-field','')+']');x.hide();i.show().focus();}).on('keypress',function(event){event.preventDefault();x.val('');});});$this.on('submit',function(){$this.find('input[type=text],input[type=password],textarea').each(function(event){var i=$(this);if(i.attr('name').match(/-polyfill-field$/)) | ||||||
|  | i.attr('name','');if(i.val()==i.attr('placeholder')){i.removeClass('polyfill-placeholder');i.val('');}});}).on('reset',function(event){event.preventDefault();$this.find('select').val($('option:first').val());$this.find('input,textarea').each(function(){var i=$(this),x;i.removeClass('polyfill-placeholder');switch(this.type){case 'submit':case 'reset':break;case 'password':i.val(i.attr('defaultValue'));x=i.parent().find('input[name='+i.attr('name')+'-polyfill-field]');if(i.val()==''){i.hide();x.show();} | ||||||
|  | else{i.show();x.hide();} | ||||||
|  | break;case 'checkbox':case 'radio':i.attr('checked',i.attr('defaultValue'));break;case 'text':case 'textarea':i.val(i.attr('defaultValue'));if(i.val()==''){i.addClass('polyfill-placeholder');i.val(i.attr('placeholder'));} | ||||||
|  | break;default:i.val(i.attr('defaultValue'));break;}});});return $this;};$.prioritize=function($elements,condition){var key='__prioritize';if(typeof $elements!='jQuery') | ||||||
|  | $elements=$($elements);$elements.each(function(){var $e=$(this),$p,$parent=$e.parent();if($parent.length==0) | ||||||
|  | return;if(!$e.data(key)){if(!condition) | ||||||
|  | return;$p=$e.prev();if($p.length==0) | ||||||
|  | return;$e.prependTo($parent);$e.data(key,$p);} | ||||||
|  | else{if(condition) | ||||||
|  | return;$p=$e.data(key);$e.insertAfter($p);$e.removeData(key);}});};})(jQuery); | ||||||
							
								
								
									
										5
									
								
								public/css/font-awesome.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										445
									
								
								public/css/global.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,445 @@ | |||||||
|  | /** | ||||||
|  | 
 | ||||||
|  |  layui官网 | ||||||
|  |  By 贤心 | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | h1,h2,h3{font-size: 14px;} | ||||||
|  | 
 | ||||||
|  | /* 布局 */ | ||||||
|  | .site-inline{font-size: 0;} | ||||||
|  | .site-tree, .site-content{display: inline-block;  *display:inline; *zoom:1; vertical-align: top; font-size: 14px;} | ||||||
|  | .site-tree{width: 220px; min-height: 900px; padding: 5px 0 20px;} | ||||||
|  | .site-content{width: 899px; min-height: 900px; padding: 20px 0 10px 20px;} | ||||||
|  | 
 | ||||||
|  | /* 头部 */ | ||||||
|  | .header{height: 59px; border-bottom: 1px solid #404553;  background-color: #393D49;} | ||||||
|  | .logo{position: absolute; left: 0; top: 16px;} | ||||||
|  | .logo img{width: 82px; height: 31px;} | ||||||
|  | 
 | ||||||
|  | .header .layui-nav{position: absolute; right: 0; top: 0; padding: 0; background: none;} | ||||||
|  | .header .layui-nav .layui-nav-item{margin: 0 20px; } | ||||||
|  | .header .layui-nav .layui-nav-item[mobile]{display: none;} | ||||||
|  | 
 | ||||||
|  | .header .layui-container .logo{left: 15px;} | ||||||
|  | .header .layui-container .layui-nav{right: 15px;} | ||||||
|  | 
 | ||||||
|  | .menu{position: absolute; right: 0; top: 0; line-height: 65px;} | ||||||
|  | .menu a{display:inline-block; *display:inline; *zoom:1; vertical-align:top;} | ||||||
|  | .menu a{position: relative; padding: 0 20px; margin: 0 20px; color: #c2c2c2; font-size: 14px;} | ||||||
|  | .menu a:hover{color: #fff; transition: all .5s; -webkit-transition: all .5s} | ||||||
|  | .menu a.this{color: #fff} | ||||||
|  | .menu a.this::after{content: ''; position: absolute; left: 0; bottom: -1px; width: 100%; height: 5px; background-color: #5FB878;} | ||||||
|  | 
 | ||||||
|  | .header-index{background-color: #05031A; border: none;} | ||||||
|  | .header-index .site-banner-bg{} | ||||||
|  | .header-index[spring]{background-color: #0D1206} | ||||||
|  | .header-index[summer]{background-color: #0A0E11} | ||||||
|  | .header-index[autumn]{background-color: #100903} | ||||||
|  | .header-index[winter]{background-color: #0E0E0E} | ||||||
|  | 
 | ||||||
|  | .header-demo{height: 60px; border-bottom: none;} | ||||||
|  | .header-demo .logo{left: 40px;} | ||||||
|  | .header-demo .layui-nav{top: 0;} | ||||||
|  | .header-demo .layui-nav .layui-nav-item{margin: 0 10px;} | ||||||
|  | 
 | ||||||
|  | .header-demo .layui-nav .layui-this a{padding: 0 30px;} | ||||||
|  | 
 | ||||||
|  | .component{position: absolute; width: 200px; left: 120px; top: 16px; } | ||||||
|  | .component .layui-input{height: 30px; padding-left: 12px; background-color: #424652; background-color: rgba(255,255,255,.05); border: none 0; color: #fff; font-size: 12px;} | ||||||
|  | .component .layui-form-select .layui-edge{display: none; border-top-color: #999;} | ||||||
|  | .component .layui-form-select dl{top: 36px; background-color: rgba(255,255,255,.9)} | ||||||
|  | .header-demo .component{left: 185px;} | ||||||
|  | 
 | ||||||
|  | /* 子侧边 */ | ||||||
|  | .layui-side-child{width: 160px!important; left: 200px; bottom: 60px!important; border-right: 1px solid #eee; background-color: #fff;} | ||||||
|  | .layui-side-child .layui-side-scroll{width: 170px;} | ||||||
|  | .layui-side-child .layui-nav{padding: 10px 0; width: 160px; border-radius: 0; background: none} | ||||||
|  | .layui-side-child .layui-nav-child{border-radius: 0;} | ||||||
|  | .layui-side-child .layui-nav .layui-nav-title a,  | ||||||
|  | .layui-side-child .layui-nav .layui-nav-title a:hover,  | ||||||
|  | .layui-side-child .layui-nav-itemed>a{color: #666 !important;} | ||||||
|  | .layui-side-child .layui-nav-itemed .layui-nav-child{margin-bottom: 10px; background: none !important;} | ||||||
|  | .layui-side-child .layui-nav .layui-nav-item a{height: 30px; line-height: 30px; color: #666;} | ||||||
|  | .layui-side-child .layui-nav .layui-nav-item a:hover{background: none !important;} | ||||||
|  | .layui-side-child .layui-nav .layui-nav-child a{color: #999 !important;} | ||||||
|  | .layui-side-child .layui-nav .layui-nav-more{display: none;} | ||||||
|  | .layui-side-child .layui-nav-tree .layui-this,  | ||||||
|  | .layui-side-child .layui-nav-tree .layui-this>a,  | ||||||
|  | .layui-side-child .layui-nav-tree .layui-nav-child dd.layui-this,  | ||||||
|  | .layui-side-child .layui-nav-tree .layui-nav-child dd.layui-this a{background: none; color: #5FB878 !important;} | ||||||
|  | .layui-side-child .layui-nav .layui-nav-child a:hover{color: #009688 !important}  | ||||||
|  | .layui-side-child .layui-nav-bar{background-color: #5FB878;} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* 底部 */ | ||||||
|  | .footer{padding: 30px 0; line-height: 30px; text-align: center; color: #666; font-weight: 300;} | ||||||
|  | body .layui-layout-admin .footer-demo{height: 50px; padding: 5px 0;} | ||||||
|  | .footer a{padding: 0 5px;} | ||||||
|  | .site-union{margin-top: 10px; color: #999;} | ||||||
|  | .site-union>*{display: inline-block; vertical-align: middle;} | ||||||
|  | .site-union a[upyun] img{width: 80px;} | ||||||
|  | .site-union span{position: relative; top: 3px;} | ||||||
|  | .site-union span a{padding: 0; display: inline; color: #999;} | ||||||
|  | .site-union span a:hover{text-decoration: underline;} | ||||||
|  | 
 | ||||||
|  | .footer-demo p{display: inline-block; vertical-align: middle; height: 50px; padding-right: 10px;} | ||||||
|  | .footer-demo .site-union{position: relative; top: -9px;} | ||||||
|  | 
 | ||||||
|  | /* 首页banner部分 */ | ||||||
|  | .site-banner{position: relative; height: 600px; text-align: center; overflow: hidden; background-color: #393D49;} | ||||||
|  | .site-banner-bg | ||||||
|  | ,.site-banner-main{position: absolute; left: 0; top: 0; width: 100%; height: 100%;} | ||||||
|  | .site-banner-bg{background-position: center 0;} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .site-zfj{padding-top: 25px; height: 220px;} | ||||||
|  | .site-zfj i{position: absolute; left: 50%; top: 25px; width: 200px; height: 200px; margin-left: -100px; font-size: 200px; color: #c2c2c2;} | ||||||
|  | 
 | ||||||
|  | @-webkit-keyframes site-zfj { | ||||||
|  |   0% {opacity: 1;  -webkit-transform: translate3d(0, 0, 0) rotate(0deg) scale(1);} | ||||||
|  |   10% {opacity: 0.8; -webkit-transform: translate3d(-100px, 0px, 0) rotate(10deg) scale(0.7);} | ||||||
|  |   35% {opacity: 0.6; -webkit-transform: translate3d(100px, 0px, 0) rotate(30deg) scale(0.4);} | ||||||
|  |   50% {opacity: 0.4; -webkit-transform: translate3d(0, 0, 0) rotate(360deg) scale(0);} | ||||||
|  |   80% {opacity: 0.2; -webkit-transform: translate3d(0, 0, 0) rotate(720deg) scale(1);} | ||||||
|  |   90% {opacity: 0.1; -webkit-transform: translate3d(0, 0, 0) rotate(3600deg) scale(6);} | ||||||
|  |   100% {opacity: 1; -webkit-transform: translate3d(0, 0, 0) rotate(3600deg) scale(1);} | ||||||
|  | } | ||||||
|  | @keyframes site-zfj { | ||||||
|  |   0% {opacity: 1;  transform: translate3d(0, 0, 0) rotate(0deg) scale(1);} | ||||||
|  |   10% {opacity: 0.8; transform: translate3d(-100px, 0px, 0) rotate(10deg) scale(0.7);} | ||||||
|  |   35% {opacity: 0.6; transform: translate3d(100px, 0px, 0) rotate(30deg) scale(0.4);} | ||||||
|  |   50% {opacity: 0.4; transform: translate3d(0, 0, 0) rotate(360deg) scale(0);} | ||||||
|  |   80% {opacity: 0.2; transform: translate3d(0, 0, 0) rotate(720deg) scale(1);} | ||||||
|  |   90% {opacity: 0.1; transform: translate3d(0, 0, 0) rotate(3600deg) scale(6);} | ||||||
|  |   100% {opacity: 1; transform: translate3d(0, 0, 0) rotate(3600deg) scale(1);} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @-webkit-keyframes site-desc { | ||||||
|  |   0% { -webkit-transform: scale(1.1);} | ||||||
|  |   100% {opacity: 1; -webkit-transform: scale(1);} | ||||||
|  | } | ||||||
|  | @keyframes site-desc { | ||||||
|  |   0% { transform: scale(1.1);} | ||||||
|  |   100% {transform: scale(1);} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .site-zfj-anim i{-webkit-animation-name: site-zfj; animation-name: site-zfj; -webkit-animation-duration: 5s; animation-duration: 5s;  -webkit-animation-timing-function: linear; animation-timing-function: linear;} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .site-desc{position: relative; height: 70px; margin-top: 25px;  background: url(../images/layui/desc.png) center no-repeat;} | ||||||
|  | .site-desc-anim{-webkit-animation-name: site-desc; animation-name: site-desc;} | ||||||
|  | 
 | ||||||
|  | .site-desc cite{position: absolute; bottom: -40px; left: 0; width: 100%; color: #c2c2c2; font-style: normal;} | ||||||
|  | .site-download{margin-top: 80px; font-size: 0;} | ||||||
|  | .site-download a{position: relative; padding: 0 45px 0 90px; height: 60px; line-height: 60px; border: 1px solid #c2c2c2;  border-color: rgba(255,255,255,.2); font-size: 24px; color: #ccc; transition: all .5s; -webkit-transition: all .5s;} | ||||||
|  | .site-download a:hover{border-color: rgba(255,255,255,.3); color: #fff; background-color: rgba(255,255,255,.05); border-radius: 30px;} | ||||||
|  | .site-download a cite{position: absolute; left: 45px; font-size: 30px;} | ||||||
|  | .site-version{position: relative; margin-top: 15px; color: #ccc; font-size: 12px;} | ||||||
|  | .site-version span{padding: 0 3px;} | ||||||
|  | .site-version *{font-style: normal;} | ||||||
|  | .site-version a{color: #e2e2e2; text-decoration: underline;} | ||||||
|  | 
 | ||||||
|  | .site-banner-other{position: absolute; left: 0; bottom: 30px; width: 100%; text-align: center; font-size: 0;} | ||||||
|  | .site-banner-other iframe{border: none;} | ||||||
|  | .site-banner-other a{display: inline-block; vertical-align: middle; height: 28px; line-height: 28px; margin: 0 5px; padding: 0 8px; border-radius: 2px; color: #c2c2c2; color: rgba(255,255,255,.8); border: 1px solid #c2c2c2; border-color: rgba(255,255,255,.2); font-size: 14px; transition: all .5s; -webkit-transition: all .5s;} | ||||||
|  | .site-banner-other a:hover{color: #fff; background-color: rgba(255,255,255,.1);} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .site-idea{margin: 50px 0; font-size: 0; text-align: center; font-weight: 300;} | ||||||
|  | .site-idea li{display: inline-block; vertical-align: top; *display: inline; *zoom:1; font-size: 14px; } | ||||||
|  | .site-idea li{width: 298px; height: 150px; padding: 30px; line-height: 24px; margin-left: 30px; border: 1px solid #d2d2d2; text-align: left;} | ||||||
|  | .site-idea li:first-child{margin-left: 0} | ||||||
|  | .site-idea .layui-field-title{border-color: #d2d2d2} | ||||||
|  | .site-idea .layui-field-title legend{margin: 0 20px 20px 0; padding: 0 20px; text-align: center;} | ||||||
|  | 
 | ||||||
|  | /* 赞助商 */ | ||||||
|  | .site-sponsor-home{margin-top: 40px; text-align: center;} | ||||||
|  | .site-sponsor-home .layui-btn{position: relative; width: 233px; height: 65px; line-height: 65px; background: none; border-color: #212121; font-size: 26px; border-radius: 6px; /*padding-left: 55px;*/} | ||||||
|  | .site-sponsor-home .layui-btn:hover{background: #4A4855; color: #BAB8C3;} | ||||||
|  | .site-sponsor-home .layui-btn:before{/*position: absolute; left: 15px; top: 15px; content: ''; width: 30px; height: 30px; background: url(http://cdn.layui.com/upload/2018_1/168_1514869467160_26113.png) center; background-repeat: no-repeat; background-size: contain;*/} | ||||||
|  | .site-sponsor-home p{position: relative; padding-top: 15px; font-size: 22px; color: #212121;} | ||||||
|  | .site-sponsor-home p:before{content: ''; position: relative; top: -2px; display: inline-block; vertical-align: middle; width: 30px; height: 30px; margin-right: 10px; background: url(http://cdn.layui.com/upload/2018_1/168_1514869467160_26113.png) center; background-repeat: no-repeat; background-size: contain;} | ||||||
|  | @media screen and (max-width: 750px) { | ||||||
|  |   .site-sponsor-home .layui-btn{width: 180px; height: 45px; line-height: 45px; font-size: 20px;} | ||||||
|  |   .site-sponsor-home p{font-size: 16px;} | ||||||
|  |   .site-sponsor-home p:before{width: 20px; height: 20px;} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* 辅助 */ | ||||||
|  | .site-tips{margin-bottom: 10px; padding: 15px; line-height: 22px; border-left: 5px solid #0078AD; background-color: #f2f2f2;} | ||||||
|  | body .site-tips p{margin: 0;} | ||||||
|  | body .layui-layer-notice .layui-layer-content{padding: 20px; line-height: 26px; background-color: #393D49; color: #fff; font-weight: 300;} | ||||||
|  | .layui-layer-notice .layui-text{color: #f8f8f8;} | ||||||
|  | .layui-layer-notice .layui-text a{color: #009688;} | ||||||
|  | 
 | ||||||
|  | /* 目录 */ | ||||||
|  | .site-dir{display: none;} | ||||||
|  | .site-dir li{line-height: 26px; margin-left: 20px; overflow: visible; list-style-type: disc;} | ||||||
|  | .site-dir li a{display: block;} | ||||||
|  | .site-dir li a:active{color: #01AAED;} | ||||||
|  | .site-dir li a.layui-this{color: #01AAED;} | ||||||
|  | body .layui-layer-dir{box-shadow: none; border: 1px solid #d2d2d2;} | ||||||
|  | body .layui-layer-dir .layui-layer-content{padding: 10px;} | ||||||
|  | .site-dir a em{padding-left: 5px; font-size: 12px; color: #c2c2c2; font-style: normal;} | ||||||
|  | 
 | ||||||
|  | /* 文档 */ | ||||||
|  | .site-tree{border-right: 1px solid #eee; } | ||||||
|  | .site-tree .layui-tree{line-height: 32px;} | ||||||
|  | .site-tree .layui-tree li i{position: relative; font-size: 22px; color: #000} | ||||||
|  | .site-tree .layui-tree li a cite{padding: 0 8px;} | ||||||
|  | .site-tree .layui-tree .site-tree-noicon a cite{padding-left: 15px;} | ||||||
|  | .site-tree .layui-tree li a em{font-size: 12px; color: #bbb; padding-right: 5px; font-style: normal;} | ||||||
|  | .site-tree .layui-tree li h2{line-height: 36px; border-left: 5px solid #009E94; margin: 15px 0 5px; padding: 0 10px; background-color: #f2f2f2;} | ||||||
|  | .site-tree .layui-tree li ul{margin-left: 27px; line-height: 28px;} | ||||||
|  | .site-tree .layui-tree li ul a, | ||||||
|  | .site-tree .layui-tree li ul a i{color: #777;} | ||||||
|  | .site-tree .layui-tree li ul a:hover{color: #333;} | ||||||
|  | .site-tree .layui-tree li ul li{margin-left: 25px; overflow: visible; list-style-type: disc; /*list-style-position: inside;*/} | ||||||
|  | .site-tree .layui-tree li ul li cite, | ||||||
|  | .site-tree .layui-tree .site-tree-noicon ul li cite{padding-left: 0;} | ||||||
|  | 
 | ||||||
|  | .site-tree .layui-tree .layui-this a{color: #01AAED;} | ||||||
|  | .site-tree .layui-tree .layui-this .layui-icon{color: #01AAED;} | ||||||
|  | 
 | ||||||
|  | .site-fix .site-tree{position: fixed; top: 0; bottom: 0; z-index: 666; min-height: 0; overflow: auto;  background-color: #fff;} | ||||||
|  | .site-fix .site-content{margin-left: 220px;} | ||||||
|  | .site-fix-footer .site-tree{/*margin-bottom: 120px;*/} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .site-title{ margin: 30px 0 20px;} | ||||||
|  | .site-title fieldset{border: none; padding: 0; border-top: 1px solid #eee;} | ||||||
|  | .site-title fieldset legend{margin-left: 20px;  padding: 0 10px; font-size: 22px; font-weight: 300;} | ||||||
|  | 
 | ||||||
|  | .site-text a{color: #01AAED;} | ||||||
|  | .site-h1{margin-bottom: 20px; line-height: 60px; padding-bottom: 10px; color: #393D49; border-bottom: 1px solid #eee;  font-size: 28px; font-weight: 300;} | ||||||
|  | .site-h1 .layui-icon{position: relative; top: 5px; font-size: 50px; margin-right: 10px;} | ||||||
|  | .site-text{position:relative;} | ||||||
|  | .site-text p{margin-bottom: 10px;  line-height:22px;} | ||||||
|  | .site-text em{padding: 0 3px; font-weight: 500; font-style: italic; color: #666;} | ||||||
|  | .site-text code{margin:0 5px; padding: 3px 10px; border: 1px solid #e2e2e2; background-color: #fbfbfb; color: #666; border-radius: 2px;} | ||||||
|  | 
 | ||||||
|  | .site-table{width: 100%; margin: 10px 0;} | ||||||
|  | .site-table thead{background-color:#f2f2f2; } | ||||||
|  | .site-table th,  | ||||||
|  | .site-table td{padding: 6px 15px; min-height: 20px; line-height: 20px; border:1px solid #ddd; font-size: 14px; font-weight: 400;} | ||||||
|  | .site-table tr:nth-child(even){background: #fbfbfb;} | ||||||
|  | 
 | ||||||
|  | .site-block{padding: 20px; border: 1px solid #eee;} | ||||||
|  | .site-block .layui-form{margin-right: 200px;} | ||||||
|  | 
 | ||||||
|  | /* 更新日志 */ | ||||||
|  | .site-changelog .layui-timeline-title h2{display: inline-block;} | ||||||
|  | .site-changelog .layui-timeline-title .layui-badge-rim{top: -2px; left: 10px;} | ||||||
|  | 
 | ||||||
|  | /* 颜色 */ | ||||||
|  | .site-doc-color{font-size: 0;} | ||||||
|  | .site-doc-color li{display: inline-block; vertical-align: middle; width: 180px; margin-left: 20px; margin-bottom: 20px; padding: 20px 10px; color: #fff; text-align: center; border-radius: 2px; line-height: 22px; font-size: 14px;} | ||||||
|  | .site-doc-color li p[tips]{opacity: 0.8; font-size: 12px;} | ||||||
|  | 
 | ||||||
|  | .site-doc-necolor li{width: 108px; margin-top: 15px; margin-left: 0; border-radius: 0;} | ||||||
|  | 
 | ||||||
|  | .site-doc-bgcolor li{padding: 10px;} | ||||||
|  | 
 | ||||||
|  | /* 宫格 */ | ||||||
|  | .site-doc-icon{margin-bottom: 50px; font-size: 0;} | ||||||
|  | .site-doc-icon li{display: inline-block; vertical-align: middle; width: 127px; height: 105px; line-height: 25px; padding: 20px 0; margin-right: -1px; margin-bottom: -1px; border: 1px solid #e2e2e2; font-size: 14px; text-align: center; color: #666; transition: all .3s; -webkit-transition: all .3s;} | ||||||
|  | .site-doc-anim li{height: auto;} | ||||||
|  | .site-doc-icon li .layui-icon{display: inline-block; font-size: 36px;} | ||||||
|  | 
 | ||||||
|  | .site-doc-icon li .doc-icon-name, | ||||||
|  | .site-doc-icon li .doc-icon-code{color: #c2c2c2;} | ||||||
|  | .site-doc-icon li .doc-icon-fontclass{height: 40px; line-height: 20px; padding: 0 5px; font-size: 13px; color: #333; } | ||||||
|  | .site-doc-icon li:hover{background-color: #f2f2f2; color: #000;} | ||||||
|  | 
 | ||||||
|  | /* 栅格示例 */ | ||||||
|  | .grid-demo{padding: 10px; line-height: 50px; text-align: center; background-color: #79C48C; color: #fff;} | ||||||
|  | .grid-demo-bg1{background-color: #63BA79;} | ||||||
|  | .grid-demo-bg2{background-color: #49A761;} | ||||||
|  | .grid-demo-bg3{background-color: #38814A;} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* 演示 */ | ||||||
|  | body .layui-layout-admin .site-demo{bottom: 0px;padding: 0;}/*bottom: 60px;*/ | ||||||
|  | body .site-demo-nav .layui-nav-item{line-height: 40px} | ||||||
|  | .layui-nav-item .layui-icon{position: relative; font-size: 20px;} | ||||||
|  | .layui-nav-item a cite{padding: 0 10px;} | ||||||
|  | .site-demo .layui-main{margin: 15px; line-height: 22px;} | ||||||
|  | .site-demo-editor{position: absolute; top: 0; bottom: 0; left: 0; width: 50%; } | ||||||
|  | .site-demo-area{position: absolute; top: 0; bottom: 0; width: 100%;} | ||||||
|  | .site-demo-editor textarea{position: absolute; width: 100%; height: 100%; padding: 10px; border: none; resize: none; background-color: #F7FBFF; background-color: #13151A; color: #999; font-family: Courier New; font-size: 12px; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;} | ||||||
|  | .site-demo-btn{position: absolute; bottom: 15px; right: 20px;} | ||||||
|  | .site-demo-zanzhu{position: absolute; bottom: 0; left: 0; width: 100%; height: 90px; text-align: center; background-color: #e2e2e2; overflow: hidden;} | ||||||
|  | .site-demo-zanzhu>*{position: relative; z-index: 1;} | ||||||
|  | .site-demo-zanzhu:before{content: ""; position: absolute; z-index: 0; top: 50%; left: 50%; width: 120px; margin: -10px 0px 0px -60px; text-align: center; color: rgb(170, 170, 170); font-size: 18px; font-weight: 300; } | ||||||
|  | 
 | ||||||
|  | .site-demo-result{position: absolute; right: 0; top: 0; bottom: 0; width: 50%;} | ||||||
|  | .site-demo-result iframe{position: absolute; width: 100%; height: 100%;} | ||||||
|  | 
 | ||||||
|  | .site-demo-button{margin-bottom: 30px;} | ||||||
|  | .site-demo-button div{margin: 20px 30px 10px;} | ||||||
|  | .site-demo-button .layui-btn+.layui-btn{margin-left: 0;} | ||||||
|  | .site-demo-button .layui-btn{margin: 0 7px 10px 0; } | ||||||
|  | 
 | ||||||
|  | .site-demo-text a{color: #01AAED;} | ||||||
|  | 
 | ||||||
|  | .site-demo-laytpl{text-align: center;} | ||||||
|  | .site-demo-laytpl textarea, | ||||||
|  | .site-demo-laytpl div span{width: 40%;  padding: 15px; margin: 0 15px;} | ||||||
|  | .site-demo-laytpl textarea{height: 300px; border: none; background-color: #3F3F3F; color: #E3CEAB; font-family: Courier New; resize: none;} | ||||||
|  | .site-demo-laytpl div span{display: inline-block; text-align: center; background: #101010; color: #fff;} | ||||||
|  | .site-demo-tplres{margin: 10px 0; text-align: center} | ||||||
|  | .site-demo-tplres .site-demo-tplh2, | ||||||
|  | .site-demo-tplres .site-demo-tplview{display: inline-block; width: 50%;} | ||||||
|  | .site-demo-tplres h2{padding: 15px; background: #e2e2e2;} | ||||||
|  | .site-demo-tplres h3{font-weight: 700;} | ||||||
|  | .site-demo-tplres div{padding: 14px; border: 1px solid #e2e2e2; text-align: left;} | ||||||
|  | 
 | ||||||
|  | .site-demo-upload, | ||||||
|  | .site-demo-upload img{width: 200px; height: 200px; border-radius: 100%;} | ||||||
|  | .site-demo-upload{position: relative; background: #e2e2e2;} | ||||||
|  | .site-demo-upload .site-demo-upbar{position: absolute; top: 50%; left: 50%; margin: -18px 0 0 -56px;} | ||||||
|  | .site-demo-upload .layui-upload-button{background-color: rgba(0,0,0,.2); color: rgba(255,255,255,1);} | ||||||
|  | 
 | ||||||
|  | .site-demo-util{position: relative; width: 300px;} | ||||||
|  | .site-demo-util img{width: 300px; border-radius: 100%;} | ||||||
|  | .site-demo-util span{position: absolute; left: 0; top: 0; width: 100%; height: 100%; background: #333; cursor: pointer;} | ||||||
|  | @-webkit-keyframes demo-fengjie { | ||||||
|  |   0% {-webkit-filter: blur(0); opacity: 1; background: #fff; height: 300px; border-radius: 100%;} | ||||||
|  |   80% {-webkit-filter: blur(50px);  opacity: 0.95;} | ||||||
|  |   100% {-webkit-filter: blur(20px); opacity: 0; background: #fff;} | ||||||
|  | } | ||||||
|  | @keyframes demo-fengjie { | ||||||
|  |   0% {filter: blur(0); opacity: 1; background: #fff; height: 300px; border-radius: 100%;} | ||||||
|  |   80% {filter: blur(50px);  opacity: 0.95;} | ||||||
|  |   100% {filter: blur(20px); opacity: 0; background: #fff;} | ||||||
|  | } | ||||||
|  | .site-demo-fengjie{-webkit-animation-name: demo-fengjie; animation-name: demo-fengjie; -webkit-animation-duration: 5s; animation-duration: 5s;} | ||||||
|  | 
 | ||||||
|  | .layui-layout-admin .site-demo-body{/* top: 106px; */} | ||||||
|  | .site-demo-title{position: fixed; left: 200px; right: 0; top: 65px;} | ||||||
|  | .site-demo-code{position: absolute; left: 0; top: 0; width: 100%; height: 100%; border: none; padding: 10px; resize: none; font-size: 12px; background-color: #F7FBFF; color: #881280; font-family: Courier New;} | ||||||
|  | 
 | ||||||
|  | .site-demo-overflow{overflow: hidden;} | ||||||
|  | 
 | ||||||
|  | /* 其它 */ | ||||||
|  | #trans-tooltip, | ||||||
|  | #tip-arrow-bottom, | ||||||
|  | #tip-arrow-top{display: none !important;} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* 独立组件 与 主页 */ | ||||||
|  | .alone{text-align: center; background-color: #009688; color: #fff; font-weight: 300; transition: all .3s; -webkit-transition: all .3s;} | ||||||
|  | .alone:hover{background-color: #5FB878;} | ||||||
|  | .alone a{display: block; padding: 50px 20px; color: #fff; font-size: 30px;} | ||||||
|  | .alone a cite{display: block; padding-top: 10px; font-size: 14px;} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .alone-banner{height: 190px; text-align: center; font-weight: 300; background-color: #009688; color:#fff;} | ||||||
|  | .alone-banner h1{padding-top: 60px; line-height: 32px; font-size: 30px; font-weight: 300;} | ||||||
|  | .alone-banner p{padding-top: 20px; color: #e2e2e2; color: rgba(255,255,255,.8);} | ||||||
|  | 
 | ||||||
|  | .alone-nav .layui-tab-title li{margin-right: 30px; padding: 0; color: #666;} | ||||||
|  | .alone-nav .layui-tab-title li a{  padding: 0 20px;} | ||||||
|  | 
 | ||||||
|  | .alone-download{margin: 30px 0;} | ||||||
|  | .alone-download .layui-btn{margin-right: 10px;} | ||||||
|  | .alone-download span{display: inline-block; line-height: 44px; padding-right: 20px;} | ||||||
|  | .alone-download span em{color: #999;} | ||||||
|  | 
 | ||||||
|  | .alone-title{margin-top: 20px;} | ||||||
|  | 
 | ||||||
|  | .alone-download-btn{text-align: center; margin-top: 50px; font-size: 0;} | ||||||
|  | .alone-download-btn .layui-btn{position: relative; width: 206px; height: 60px; line-height: 60px; font-size: 26px; font-weight: 300;} | ||||||
|  | .alone-download-btn .layui-btn+.layui-btn{margin: 0;} | ||||||
|  | .alone-download-btn .alone-download-right{margin-left: 20px !important; border-color: #009688; background: none; color: #009688;} | ||||||
|  | .alone-download-btn .layui-btn img{position: relative; top: -3px; width: 118px;} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* 适配多设备 */ | ||||||
|  | @media screen and (max-width: 750px) { | ||||||
|  |   .layui-main{width: auto; margin: 0 10px;} | ||||||
|  |   .logo, | ||||||
|  |   .header-demo .logo{left: 10px;} | ||||||
|  |   .component{display: none} | ||||||
|  | 
 | ||||||
|  |   .header .layui-nav-child{left: auto; right: 0;} | ||||||
|  |   .site-demo-overflow{overflow: auto;} | ||||||
|  | 
 | ||||||
|  |   .site-nav-layim{display: none !important;} | ||||||
|  |   .header .layui-nav .layui-nav-item{margin: 0;} | ||||||
|  |   .header .layui-nav .layui-nav-item a{padding: 0 20px;} | ||||||
|  |   .header .layui-nav .layui-nav-item[pc]{display: none;} | ||||||
|  |   .header .layui-nav .layui-nav-item[mobile]{display: inline-block;} | ||||||
|  |   .site-banner{height: 300px;} | ||||||
|  |   .site-banner-bg{background-size: cover;} | ||||||
|  |   .site-zfj{height: 100px; padding-top: 5px;} | ||||||
|  |   .site-zfj i{top: 10px; width: 100px; height: 100px; margin-left: -50px; font-size: 100px;} | ||||||
|  |   .site-desc{background-size: 70%; margin: 0;} | ||||||
|  |   .site-desc cite{display: none;} | ||||||
|  |   .site-download{margin-top: 0; } | ||||||
|  |   .site-download a{height: 40px; line-height: 40px; padding: 0 25px 0 60px; border-radius: 30px; color: #fff; font-size: 16px;} | ||||||
|  |   .site-download a cite{left: 20px;} | ||||||
|  |   .site-banner-other{bottom: 10px;} | ||||||
|  | 
 | ||||||
|  |   .site-idea{margin: 20px 0;} | ||||||
|  |   .site-idea li{margin: 0 0 20px 0; width: 100%; height: auto; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;} | ||||||
|  |   .site-hengfu img{max-width: 100%} | ||||||
|  | 
 | ||||||
|  |   .site-block .layui-form{margin-right: 0;} | ||||||
|  | 
 | ||||||
|  |   .layui-layer-dir{display: none;} | ||||||
|  |   .site-tree{position: fixed; top: 0; bottom: 0; min-height: 0; overflow: auto; z-index: 1000; left: -260px; background-color: #fff;  transition: all .3s; -webkit-transition: all .3s;} | ||||||
|  |   .site-content{width: 100%; padding: 0; overflow: auto;} | ||||||
|  |   .site-content img{max-width: 100%;} | ||||||
|  |   .site-tree-mobile{display: block!important; position: fixed; z-index: 100000; bottom: 15px; left: 15px; width: 50px; height: 50px; line-height: 50px; border-radius: 2px; text-align: center; background-color: rgba(0,0,0,.7); color: #fff;} | ||||||
|  |   .site-home .site-tree-mobile{display: none!important;} | ||||||
|  |   .site-mobile .site-tree-mobile{display: none !important;} | ||||||
|  |   .site-mobile .site-tree{left: 0;} | ||||||
|  |   .site-mobile .site-mobile-shade{content: ''; position: fixed; top: 0; bottom: 0; left: 0; right: 0; background-color: rgba(0,0,0,.8); z-index: 999;} | ||||||
|  |   .site-tree-mobile i{font-size: 20px;} | ||||||
|  |   .layui-code-view{-webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;} | ||||||
|  | 
 | ||||||
|  |   .layui-layout-admin .layui-side{position: fixed; top: 0; left: -260px; transition: all .3s; -webkit-transition: all .3s; z-index: 10000;} | ||||||
|  |   .layui-body{position: static; bottom: 0; left: 0;} | ||||||
|  |   .site-mobile .layui-side{left: 0;} | ||||||
|  |   .site-mobile .layui-side-child{top: 50%; left: 200px; height: 300px; margin-top: -100px;} | ||||||
|  | 
 | ||||||
|  |   body .layui-layout-admin .footer-demo{position: static; height: auto; line-height: 30px;} | ||||||
|  |   .footer-demo p{height: auto;} | ||||||
|  | 
 | ||||||
|  |   .site-demo-area, | ||||||
|  |   .site-demo-editor, | ||||||
|  |   .site-demo-result, | ||||||
|  |   .site-demo-editor textarea, | ||||||
|  |   .site-demo-result iframe{position: static; width: 100%;} | ||||||
|  |   .site-demo-editor textarea{height: 350px;} | ||||||
|  |   .site-demo-zanzhu{display: none;} | ||||||
|  |   .site-demo-btn{bottom: auto; top: 370px;} | ||||||
|  |   .site-demo-result iframe{height: 500px;} | ||||||
|  | 
 | ||||||
|  |   .site-demo-laytpl textarea, .site-demo-laytpl div span{margin: 0;} | ||||||
|  |   .site-demo-tplres .site-demo-tplh2, .site-demo-tplres .site-demo-tplview{width: 100%; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;} | ||||||
|  | 
 | ||||||
|  |   .site-demo-title{position: static; left: 0;} | ||||||
|  |   body .layui-layout-admin .site-demo{} | ||||||
|  |   .site-demo-code{position: static; height: 350px;} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @-webkit-keyframes site-anim-closeup{ /* 特写 */ | ||||||
|  |   from {-webkit-transform: translate3d(0, 0, 0) scale(1);  opacity: 1;} | ||||||
|  |   to { -webkit-transform: translate3d(0, 400px, 0) scale(2);  opacity: 0.5;} | ||||||
|  | } | ||||||
|  | @keyframes site-anim-closeup{ | ||||||
|  |   from {transform: translate3d(0, 0, 0) scale(1); opacity: 1;} | ||||||
|  |   to {transform: translate3d(0, 400px, 0) scale(2); opacity: 0.5;} | ||||||
|  | } | ||||||
|  | .site-out-up{-webkit-animation-duration: 3s; animation-duration: 3s; -webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-name: site-anim-closeup; animation-name: site-anim-closeup; overflow: hidden;} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
							
								
								
									
										63
									
								
								public/css/icons-extra.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,63 @@ | |||||||
|  | @font-face { | ||||||
|  |     font-family: MuiiconSpread; | ||||||
|  |     font-weight: normal; | ||||||
|  |     font-style: normal; | ||||||
|  |     src:  url('mui-icons-extra.ttf') format('truetype'); /* iOS 4.1- */ | ||||||
|  | } | ||||||
|  | .mui-icon-extra | ||||||
|  | { | ||||||
|  |     font-family: MuiiconSpread; | ||||||
|  |     font-size: 24px; | ||||||
|  |     font-weight: normal; | ||||||
|  |     font-style: normal; | ||||||
|  |     line-height: 1; | ||||||
|  |     display: inline-block; | ||||||
|  |     text-decoration: none; | ||||||
|  |     -webkit-font-smoothing: antialiased; | ||||||
|  | } | ||||||
|  | .mui-icon-extra-cold:before { content: "\e500"; } | ||||||
|  | .mui-icon-extra-share:before { content: "\e200"; } | ||||||
|  | .mui-icon-extra-class:before { content: "\e118"; } | ||||||
|  | .mui-icon-extra-custom:before { content: "\e117"; } | ||||||
|  | .mui-icon-extra-new:before { content: "\e103"; } | ||||||
|  | .mui-icon-extra-card:before { content: "\e104"; } | ||||||
|  | .mui-icon-extra-grech:before { content: "\e105"; } | ||||||
|  | .mui-icon-extra-trend:before { content: "\e106"; } | ||||||
|  | .mui-icon-extra-filter:before { content: "\e207"; } | ||||||
|  | .mui-icon-extra-holiday:before { content: "\e300"; } | ||||||
|  | .mui-icon-extra-cart:before { content: "\e107"; } | ||||||
|  | .mui-icon-extra-heart:before { content: "\e180"; } | ||||||
|  | .mui-icon-extra-computer:before { content: "\e600"; } | ||||||
|  | .mui-icon-extra-express:before { content: "\e108"; } | ||||||
|  | .mui-icon-extra-gift:before { content: "\e109"; } | ||||||
|  | .mui-icon-extra-gold:before { content: "\e102"; } | ||||||
|  | .mui-icon-extra-lamp:before { content: "\e601"; } | ||||||
|  | .mui-icon-extra-rank:before { content: "\e110"; } | ||||||
|  | .mui-icon-extra-notice:before { content: "\e111"; } | ||||||
|  | .mui-icon-extra-sweep:before { content: "\e202"; } | ||||||
|  | .mui-icon-extra-arrowleftcricle:before { content: "\e401"; } | ||||||
|  | .mui-icon-extra-dictionary:before { content: "\e602"; } | ||||||
|  | .mui-icon-extra-heart-filled:before { content: "\e119"; } | ||||||
|  | .mui-icon-extra-xiaoshuo:before { content: "\e607"; } | ||||||
|  | .mui-icon-extra-top:before { content: "\e403"; } | ||||||
|  | .mui-icon-extra-people:before { content: "\e203"; } | ||||||
|  | .mui-icon-extra-topic:before { content: "\e603"; } | ||||||
|  | .mui-icon-extra-hotel:before { content: "\e301"; } | ||||||
|  | .mui-icon-extra-like:before { content: "\e206"; } | ||||||
|  | .mui-icon-extra-regist:before { content: "\e201"; } | ||||||
|  | .mui-icon-extra-order:before { content: "\e113"; } | ||||||
|  | .mui-icon-extra-alipay:before { content: "\e114"; } | ||||||
|  | .mui-icon-extra-find:before { content: "\e400"; } | ||||||
|  | .mui-icon-extra-arrowrightcricle:before { content: "\e402"; } | ||||||
|  | .mui-icon-extra-calendar:before { content: "\e115"; } | ||||||
|  | .mui-icon-extra-prech:before { content: "\e116"; } | ||||||
|  | .mui-icon-extra-cate:before { content: "\e501"; } | ||||||
|  | .mui-icon-extra-comment:before { content: "\e209"; } | ||||||
|  | .mui-icon-extra-at:before { content: "\e208"; } | ||||||
|  | .mui-icon-extra-addpeople:before { content: "\e204"; } | ||||||
|  | .mui-icon-extra-peoples:before { content: "\e205"; } | ||||||
|  | .mui-icon-extra-calc:before { content: "\e101"; } | ||||||
|  | .mui-icon-extra-classroom:before { content: "\e604"; } | ||||||
|  | .mui-icon-extra-phone:before { content: "\e404"; } | ||||||
|  | .mui-icon-extra-university:before { content: "\e605"; } | ||||||
|  | .mui-icon-extra-outline:before { content: "\e606"; } | ||||||
							
								
								
									
										129
									
								
								public/css/login.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,129 @@ | |||||||
|  | html{height: 100%;} | ||||||
|  | 
 | ||||||
|  | #canvas-wrapper { | ||||||
|  |     position: fixed; | ||||||
|  |     top: 0; | ||||||
|  |     left: 0; | ||||||
|  |     right: 0; | ||||||
|  |     bottom: 0; | ||||||
|  |     width: 100%; | ||||||
|  |     height: 100%; | ||||||
|  | } | ||||||
|  | body.signin { | ||||||
|  |     background: #18c8f6; | ||||||
|  |     height: auto; | ||||||
|  |     /*background:url("/images/login-background.jpg") no-repeat center fixed;*/ | ||||||
|  |     background: #2f4050; | ||||||
|  |     -webkit-background-size: cover; | ||||||
|  |     -moz-background-size: cover; | ||||||
|  |     -o-background-size: cover; | ||||||
|  |     background-size: cover; | ||||||
|  |     color: rgba(255,255,255,.95); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .signinpanel { | ||||||
|  |     width: 320px; | ||||||
|  |     margin: 10% auto 0 auto; | ||||||
|  |     background: #2f4050; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .signinpanel .logopanel { | ||||||
|  |     float: none; | ||||||
|  |     width: auto; | ||||||
|  |     padding: 0; | ||||||
|  |     background: none; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .signinpanel .signin-info ul { | ||||||
|  |     list-style: none; | ||||||
|  |     padding: 0; | ||||||
|  |     margin: 20px 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .signinpanel .form-control { | ||||||
|  |     display: block; | ||||||
|  |     margin-top: 15px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .signinpanel .uname { | ||||||
|  |     /*background: #fff url(../img/user.png) no-repeat 95% center;*/ | ||||||
|  | 	color:#333; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .signinpanel .pword { | ||||||
|  |     /*background: #fff url(../img/locked.png) no-repeat 95% center;*/ | ||||||
|  | 	color:#333; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .signinpanel .btn { | ||||||
|  | margin-top: 15px; | ||||||
|  | } | ||||||
|  | .signinpanel .vld-code { | ||||||
|  |     float: right; | ||||||
|  |     clear:right; | ||||||
|  |     position:relative; | ||||||
|  |     margin-top:-30px; | ||||||
|  | } | ||||||
|  | .signinpanel .vld-code img { | ||||||
|  |     cursor: pointer; | ||||||
|  |     width: 80px; | ||||||
|  |     height: 30px; | ||||||
|  |      | ||||||
|  | } | ||||||
|  |     .signinpanel .vld-code .reset-code { | ||||||
|  |         display: block; | ||||||
|  |         cursor: pointer; | ||||||
|  |         font-size:12px; | ||||||
|  |         color:chocolate; | ||||||
|  |     } | ||||||
|  | .signinpanel form { | ||||||
|  |     background: rgba(255, 255, 255, 0.2); | ||||||
|  |     border: 1px solid rgba(255,255,255,.3); | ||||||
|  |     -moz-box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); | ||||||
|  |     -webkit-box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); | ||||||
|  |     box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); | ||||||
|  |     -moz-border-radius: 3px; | ||||||
|  |     -webkit-border-radius: 3px; | ||||||
|  |     border-radius: 3px; | ||||||
|  |     padding: 30px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .signup-footer{border-top: solid 1px rgba(255,255,255,.3);margin:20px 0;padding-top: 15px;} | ||||||
|  | 
 | ||||||
|  | @media screen and (max-width: 768px) { | ||||||
|  |     .signinpanel, | ||||||
|  |     .signuppanel { | ||||||
|  |         margin: 0 auto; | ||||||
|  |         width: 420px!important; | ||||||
|  |         padding: 20px; | ||||||
|  |     } | ||||||
|  |     .signinpanel form { | ||||||
|  |         margin-top: 20px; | ||||||
|  |     } | ||||||
|  |     .signup-footer { | ||||||
|  |         margin-bottom: 10px; | ||||||
|  |     } | ||||||
|  |     .signuppanel .form-control { | ||||||
|  |         margin-bottom: 10px; | ||||||
|  |     } | ||||||
|  |     .signup-footer .pull-left, | ||||||
|  |     .signup-footer .pull-right { | ||||||
|  |         float: none !important; | ||||||
|  |         text-align: center; | ||||||
|  |     } | ||||||
|  |     .signinpanel .signin-info ul { | ||||||
|  |         display: none; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @media screen and (max-width: 320px) { | ||||||
|  |     .signinpanel, | ||||||
|  |     .signuppanel { | ||||||
|  |         margin:0 20px; | ||||||
|  |         width:auto; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .field-validation-error { | ||||||
|  |     color: #f13636; | ||||||
|  |     text-align:left; | ||||||
|  | } | ||||||
							
								
								
									
										8335
									
								
								public/css/style.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										5
									
								
								public/doc.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,5 @@ | |||||||
|  | <html> | ||||||
|  |     <body> | ||||||
|  |         zhelis | ||||||
|  |         </body> | ||||||
|  |     </html> | ||||||
							
								
								
									
										19
									
								
								public/error.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,19 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8"> | ||||||
|  |     <title>存在搭建问题</title> | ||||||
|  |     <meta name="renderer" content="webkit"> | ||||||
|  |     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | ||||||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> | ||||||
|  |     <meta name="apple-mobile-web-app-status-bar-style" content="black"> | ||||||
|  |     <meta name="apple-mobile-web-app-capable" content="yes"> | ||||||
|  |     <meta name="format-detection" content="telephone=no"> | ||||||
|  | </head> | ||||||
|  | <body class="body"> | ||||||
|  | <div style="padding: 15px;color: red;"> | ||||||
|  |     <h1 style="text-align: center">检测到运行目录未设定成public</h1><br><br> | ||||||
|  |     <h1 style="text-align: center">请在宝塔面板-网站-设置-网站目录->修改运行目录为public并保存,同时关闭防跨站攻击</h1><br><br> | ||||||
|  | </div> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										29
									
								
								public/example/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,29 @@ | |||||||
|  | <!doctype html> | ||||||
|  | <html lang="en"> | ||||||
|  | <head> | ||||||
|  |     <meta charset="UTF-8"> | ||||||
|  |     <meta name="viewport" | ||||||
|  |           content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> | ||||||
|  |     <meta http-equiv="X-UA-Compatible" content="ie=edge"> | ||||||
|  |     <title>测试支付</title> | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | 
 | ||||||
|  | <p>商户订单号:<input type="text" id="payId"/></p> | ||||||
|  | <p>商户订单价:<input type="number" id="price" value="0.1"/></p> | ||||||
|  | <p>自定义参数:<input type="text" id="param" value="vone666"/></p> | ||||||
|  | <p>支付方式:<select id="type"><option value="1">微信支付</option><option value="2">支付宝支付</option></select></p> | ||||||
|  | <button onclick="zf()">支付</button> | ||||||
|  | <script  src="https://lib.baomitu.com/jquery/3.4.0/jquery.min.js"></script> | ||||||
|  | <script> | ||||||
|  |     $("#payId").val(new Date().getTime()); | ||||||
|  |     function zf() { | ||||||
|  |         var p = "payId="+$("#payId").val() + "&price="+$("#price").val()+"¶m="+$("#param").val()+"&type="+$("#type").val(); | ||||||
|  |         window.location.href = "main.php?" + p; | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										11
									
								
								public/example/main.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,11 @@ | |||||||
|  | <?php | ||||||
|  | ini_set("error_reporting","E_ALL & ~E_NOTICE"); | ||||||
|  | 
 | ||||||
|  | $key = "7eed756ca37ca057370ea9bb208d25fa";//通讯密钥
 | ||||||
|  | $host = "../createOrder"; | ||||||
|  | 
 | ||||||
|  | $sign = md5($_GET['payId'].$_GET['param'].$_GET['type'].$_GET['price'].$key); | ||||||
|  | $p = "payId=".$_GET['payId'].'¶m='.$_GET['param'].'&type='.$_GET['type']."&price=".$_GET['price'].'&sign='.$sign.'&isHtml=1'; | ||||||
|  | 
 | ||||||
|  | echo "<script>window.location.href = '".$host."?".$p."'</script>"; | ||||||
|  | 
 | ||||||
							
								
								
									
										24
									
								
								public/example/notify.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,24 @@ | |||||||
|  | <?php | ||||||
|  | ini_set("error_reporting","E_ALL & ~E_NOTICE"); | ||||||
|  | $key = "7eed756ca37ca057370ea9bb208d25fa";//通讯密钥
 | ||||||
|  | $payId = $_GET['payId'];//商户订单号
 | ||||||
|  | $param = $_GET['param'];//创建订单的时候传入的参数
 | ||||||
|  | $type = $_GET['type'];//支付方式 :微信支付为1 支付宝支付为2
 | ||||||
|  | $price = $_GET['price'];//订单金额
 | ||||||
|  | $reallyPrice = $_GET['reallyPrice'];//实际支付金额
 | ||||||
|  | $sign = $_GET['sign'];//校验签名,计算方式 = md5(payId + param + type + price + reallyPrice + 通讯密钥)
 | ||||||
|  | //开始校验签名
 | ||||||
|  | $_sign =  md5($payId . $param . $type . $price . $reallyPrice . $key); | ||||||
|  | if ($_sign != $sign) { | ||||||
|  |     echo "error_sign";//sign校验不通过
 | ||||||
|  |     exit(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | echo "success"; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //继续业务流程
 | ||||||
|  | //echo "商户订单号:".$payId ."<br>自定义参数:". $param ."<br>支付方式:". $type ."<br>订单金额:". $price ."<br>实际支付金额:". $reallyPrice;
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ?>
 | ||||||
							
								
								
									
										22
									
								
								public/example/return.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,22 @@ | |||||||
|  | <?php | ||||||
|  | ini_set("error_reporting","E_ALL & ~E_NOTICE"); | ||||||
|  | $key = "7eed756ca37ca057370ea9bb208d25fa";//通讯密钥
 | ||||||
|  | $payId = $_GET['payId'];//商户订单号
 | ||||||
|  | $param = $_GET['param'];//创建订单的时候传入的参数
 | ||||||
|  | $type = $_GET['type'];//支付方式 :微信支付为1 支付宝支付为2
 | ||||||
|  | $price = $_GET['price'];//订单金额
 | ||||||
|  | $reallyPrice = $_GET['reallyPrice'];//实际支付金额
 | ||||||
|  | $sign = $_GET['sign'];//校验签名,计算方式 = md5(payId + param + type + price + reallyPrice + 通讯密钥)
 | ||||||
|  | //开始校验签名
 | ||||||
|  | $_sign =  md5($payId . $param . $type . $price . $reallyPrice . $key); | ||||||
|  | if ($_sign != $sign) { | ||||||
|  |     echo "error_sign";//sign校验不通过
 | ||||||
|  |     exit(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //继续业务流程
 | ||||||
|  | echo "商户订单号:".$payId ."<br>自定义参数:". $param ."<br>支付方式:". $type ."<br>订单金额:". $price ."<br>实际支付金额:". $reallyPrice; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ?>
 | ||||||
							
								
								
									
										
											BIN
										
									
								
								public/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/image/bj.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 255 B | 
							
								
								
									
										
											BIN
										
									
								
								public/image/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.4 KiB | 
							
								
								
									
										106
									
								
								public/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,106 @@ | |||||||
|  | 
 | ||||||
|  | <!DOCTYPE HTML> | ||||||
|  | 
 | ||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  | 	<title>V免签</title> | ||||||
|  | 	<meta name="keywords" content="" /> | ||||||
|  | 	<meta name="description" content="" /> | ||||||
|  | 	<meta charset="utf-8" /> | ||||||
|  | 	<link rel="shortcut icon" href="favicon.ico" /> | ||||||
|  | 	<link rel="bookmark" href="favicon.ico" /> | ||||||
|  | 	<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" /> | ||||||
|  | 	<link rel="stylesheet" href="assets/css/main.css" /> | ||||||
|  | 	<noscript><link rel="stylesheet" href="assets/css/noscript.css" /></noscript> | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | <div id="wrapper"> | ||||||
|  | 
 | ||||||
|  | 	<header id="header"> | ||||||
|  | 		<div class="logo"> | ||||||
|  | 			<span class="icon fa-rmb"></span> | ||||||
|  | 		</div> | ||||||
|  | 		<div class="content"> | ||||||
|  | 			<div class="inner"> | ||||||
|  | 				<h1>V免签</h1> | ||||||
|  | 
 | ||||||
|  | 				<p>个人用户收款解决方案</p> | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  | 		<nav> | ||||||
|  | 			<ul> | ||||||
|  | 				<li><a href="#login">登录</a></li> | ||||||
|  | 				<li><a href="#about">简介</a></li> | ||||||
|  | 			</ul> | ||||||
|  | 		</nav> | ||||||
|  | 	</header> | ||||||
|  | 
 | ||||||
|  | 	<div id="main"> | ||||||
|  | 
 | ||||||
|  | 		<article id="about"> | ||||||
|  | 			<h2 class="major">简介</h2> | ||||||
|  | 			<p>1、V免签为个人用户提供支付宝、微信的免签约收款解决方案。</p> | ||||||
|  | 			<p>2、V免签为开源免费产品,请勿二次出售。</p> | ||||||
|  | 			<p>3、V免签仅供交流学习使用,请勿用于商业用途。</p> | ||||||
|  | 			<p>4、请遵守相关法律法规,请勿用于非法用途。</p> | ||||||
|  | 			<p><input type="submit" value="获取V免签" class="" onclick="window.location.href='https://github.com/szvone/vmqphp'"/></p> | ||||||
|  | 		</article> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		<article id="login"> | ||||||
|  | 			<h2 class="major">登录</h2> | ||||||
|  | 			<form method="post" action="javascript:login();"> | ||||||
|  | 				<div class="field half first"> | ||||||
|  | 					<label for="user">账号</label> | ||||||
|  | 					<input type="text" name="user" id="user" /> | ||||||
|  | 				</div> | ||||||
|  | 				<div class="field half"> | ||||||
|  | 					<label for="pass">密码</label> | ||||||
|  | 					<input type="password" name="pass" id="pass" /> | ||||||
|  | 				</div> | ||||||
|  | 
 | ||||||
|  | 				<ul class="actions"> | ||||||
|  | 					<li><input id="login2" type="submit" value="登录" class="special" /></li> | ||||||
|  | 					<li><input type="reset" value="清空" /></li> | ||||||
|  | 				</ul> | ||||||
|  | 			</form> | ||||||
|  | 			<br> | ||||||
|  | 			<div id="result" role="dialog"> | ||||||
|  | 				<p color class="h5 margin-top-sm text-black-hint" id="msg"></p> | ||||||
|  | 			</div> | ||||||
|  | 		</article> | ||||||
|  | 
 | ||||||
|  | 	</div> | ||||||
|  | 
 | ||||||
|  | 	<footer id="footer"> | ||||||
|  | 		<p class="copyright">©2019 V免签</p> | ||||||
|  | 	</footer> | ||||||
|  | 
 | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | <div id="bg"></div> | ||||||
|  | 
 | ||||||
|  | <script src="./assets/js/jQuery@1.11.3.js"></script> | ||||||
|  | <script src="./assets/js/skel.min.js"></script> | ||||||
|  | <script src="assets/js/util.js"></script> | ||||||
|  | <script src="assets/js/main.js"></script> | ||||||
|  | <script src="assets/js/layer.js"></script> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | 	function login() { | ||||||
|  | 		try { | ||||||
|  | 			$.post("login","user="+$("#user").val()+"&pass="+$("#pass").val(),function (data) { | ||||||
|  | 				layer.msg(data.msg); | ||||||
|  | 				if (data.code==1){ | ||||||
|  | 					window.location.href = "aaa.html"; | ||||||
|  | 				} | ||||||
|  | 			}); | ||||||
|  | 		}catch (e) { | ||||||
|  | 			layer.alert("程序出错,请检查:<br>1、伪静态是否设置成功<br>2、是否设置好数据库账号密码并导入数据库脚本") | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | </script> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										25
									
								
								public/index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -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>
 | ||||||
|  | // +----------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | // [ 应用入口文件 ]
 | ||||||
|  | namespace think; | ||||||
|  | 
 | ||||||
|  | // 加载基础文件
 | ||||||
|  | require __DIR__ . '/../thinkphp/base.php'; | ||||||
|  | 
 | ||||||
|  | // 支持事先使用静态方法设置Request对象和Config对象
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // 执行应用并响应
 | ||||||
|  | Container::get('app')->run()->send(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
							
								
								
									
										237
									
								
								public/js/canvasbg.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										229
									
								
								public/js/global.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,229 @@ | |||||||
|  | /** | ||||||
|  | 
 | ||||||
|  |  layui官网 | ||||||
|  | 
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | layui.define(['code', 'element', 'table', 'util'], function(exports){ | ||||||
|  |   var $ = layui.jquery | ||||||
|  |   ,element = layui.element | ||||||
|  |   ,layer = layui.layer | ||||||
|  |   ,form = layui.form | ||||||
|  |   ,util = layui.util | ||||||
|  |   ,device = layui.device() | ||||||
|  | 
 | ||||||
|  |   ,$win = $(window), $body = $('body'); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   //阻止IE7以下访问
 | ||||||
|  |   if(device.ie && device.ie < 8){ | ||||||
|  |     layer.alert('Layui最低支持ie8,您当前使用的是古老的 IE'+ device.ie + ',你丫的肯定不是程序猿!'); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   var home = $('#LAY_home'); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   //首页banner
 | ||||||
|  |   setTimeout(function(){ | ||||||
|  |     $('.site-zfj').addClass('site-zfj-anim'); | ||||||
|  |     setTimeout(function(){ | ||||||
|  |       $('.site-desc').addClass('site-desc-anim') | ||||||
|  |     }, 5000) | ||||||
|  |   }, 100); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   //数字前置补零
 | ||||||
|  |   var digit = function(num, length, end){ | ||||||
|  |     var str = ''; | ||||||
|  |     num = String(num); | ||||||
|  |     length = length || 2; | ||||||
|  |     for(var i = num.length; i < length; i++){ | ||||||
|  |       str += '0'; | ||||||
|  |     } | ||||||
|  |     return num < Math.pow(10, length) ? str + (num|0) : num; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   for(var i = 0; i < $('.adsbygoogle').length; i++){ | ||||||
|  |     (adsbygoogle = window.adsbygoogle || []).push({}); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   //展示当前版本
 | ||||||
|  |   $('.site-showv').html(layui.v); | ||||||
|  |    | ||||||
|  |   | ||||||
|  |    | ||||||
|  |   //固定Bar
 | ||||||
|  |   if(global.pageType !== 'demo'){ | ||||||
|  |     util.fixbar({ | ||||||
|  |       bar1: true | ||||||
|  |       ,click: function(type){ | ||||||
|  |         if(type === 'bar1'){ | ||||||
|  |           location.href = '//fly.layui.com/'; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |   /* | ||||||
|  |   //窗口scroll
 | ||||||
|  |   ;!function(){ | ||||||
|  |     var main = $('.site-tree').parent(), scroll = function(){ | ||||||
|  |       var stop = $(window).scrollTop(); | ||||||
|  | 
 | ||||||
|  |       if($(window).width() <= 750) return; | ||||||
|  |       var bottom = $('.footer').offset().top - $(window).height(); | ||||||
|  |       if(stop > 61 && stop < bottom){ | ||||||
|  |         if(!main.hasClass('site-fix')){ | ||||||
|  |           main.addClass('site-fix'); | ||||||
|  |         } | ||||||
|  |         if(main.hasClass('site-fix-footer')){ | ||||||
|  |           main.removeClass('site-fix-footer'); | ||||||
|  |         } | ||||||
|  |       } else if(stop >= bottom) { | ||||||
|  |         if(!main.hasClass('site-fix-footer')){ | ||||||
|  |           main.addClass('site-fix site-fix-footer'); | ||||||
|  |         } | ||||||
|  |       } else { | ||||||
|  |         if(main.hasClass('site-fix')){ | ||||||
|  |           main.removeClass('site-fix').removeClass('site-fix-footer'); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       stop = null; | ||||||
|  |     }; | ||||||
|  |     scroll(); | ||||||
|  |     $(window).on('scroll', scroll); | ||||||
|  |   }(); | ||||||
|  | */ | ||||||
|  |   //示例页面滚动
 | ||||||
|  |   $('.site-demo-body').on('scroll', function(){ | ||||||
|  |     var elemDate = $('.layui-laydate') | ||||||
|  |     ,elemTips = $('.layui-table-tips'); | ||||||
|  |     if(elemDate[0]){ | ||||||
|  |       elemDate.each(function(){ | ||||||
|  |         var othis = $(this); | ||||||
|  |         if(!othis.hasClass('layui-laydate-static')){ | ||||||
|  |           othis.remove(); | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |       $('input').blur(); | ||||||
|  |     } | ||||||
|  |     if(elemTips[0]) elemTips.remove(); | ||||||
|  | 
 | ||||||
|  |     if($('.layui-layer')[0]){ | ||||||
|  |       layer.closeAll('tips'); | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  |    | ||||||
|  |   //代码修饰
 | ||||||
|  |   layui.code({ | ||||||
|  |     elem: 'pre' | ||||||
|  |   }); | ||||||
|  |    | ||||||
|  |   //目录
 | ||||||
|  |   var siteDir = $('.site-dir'); | ||||||
|  |   if(siteDir[0] && $(window).width() > 750){ | ||||||
|  |     layer.ready(function(){ | ||||||
|  |       layer.open({ | ||||||
|  |         type: 1 | ||||||
|  |         ,content: siteDir | ||||||
|  |         ,skin: 'layui-layer-dir' | ||||||
|  |         ,area: 'auto' | ||||||
|  |         ,maxHeight: $(window).height() - 300 | ||||||
|  |         ,title: '目录' | ||||||
|  |         //,closeBtn: false
 | ||||||
|  |         ,offset: 'r' | ||||||
|  |         ,shade: false | ||||||
|  |         ,success: function(layero, index){ | ||||||
|  |           layer.style(index, { | ||||||
|  |             marginLeft: -15 | ||||||
|  |           }); | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  |     siteDir.find('li').on('click', function(){ | ||||||
|  |       var othis = $(this); | ||||||
|  |       othis.find('a').addClass('layui-this'); | ||||||
|  |       othis.siblings().find('a').removeClass('layui-this'); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   //在textarea焦点处插入字符
 | ||||||
|  |   var focusInsert = function(str){ | ||||||
|  |     var start = this.selectionStart | ||||||
|  |     ,end = this.selectionEnd | ||||||
|  |     ,offset = start + str.length | ||||||
|  | 
 | ||||||
|  |     this.value = this.value.substring(0, start) + str + this.value.substring(end); | ||||||
|  |     this.setSelectionRange(offset, offset); | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   //演示页面
 | ||||||
|  |   $('body').on('keydown', '#LAY_editor, .site-demo-text', function(e){ | ||||||
|  |     var key = e.keyCode; | ||||||
|  |     if(key === 9 && window.getSelection){ | ||||||
|  |       e.preventDefault(); | ||||||
|  |       focusInsert.call(this, '  '); | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   var editor = $('#LAY_editor') | ||||||
|  |   ,iframeElem = $('#LAY_demo') | ||||||
|  |   ,demoForm = $('#LAY_demoForm')[0] | ||||||
|  |   ,demoCodes = $('#LAY_demoCodes')[0] | ||||||
|  |   ,runCodes = function(){ | ||||||
|  |     if(!iframeElem[0]) return; | ||||||
|  |     var html = editor.val(); | ||||||
|  | 
 | ||||||
|  |     html = html.replace(/=/gi,"layequalsign"); | ||||||
|  |     html = html.replace(/script/gi,"layscrlayipttag"); | ||||||
|  |     demoCodes.value = html.length > 100*1000 ? '<h1>卧槽,你的代码过长</h1>' : html; | ||||||
|  | 
 | ||||||
|  |     demoForm.action = '/api/runHtml/'; | ||||||
|  |     demoForm.submit(); | ||||||
|  | 
 | ||||||
|  |   }; | ||||||
|  |   $('#LAY_demo_run').on('click', runCodes), runCodes(); | ||||||
|  | 
 | ||||||
|  |   //让导航在最佳位置
 | ||||||
|  |   var thisItem = $('.site-demo-nav').find('dd.layui-this'); | ||||||
|  |   if(thisItem[0]){ | ||||||
|  |     var itemTop = thisItem.offset().top | ||||||
|  |     ,winHeight = $(window).height() | ||||||
|  |     ,elemScroll = $('.layui-side-scroll'); | ||||||
|  |     if(itemTop > winHeight - 120){ | ||||||
|  |       elemScroll.animate({'scrollTop': itemTop/2}, 200) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   //点击查看代码选项
 | ||||||
|  |   element.on('tab(demoTitle)', function(obj){ | ||||||
|  |     if(obj.index === 1){ | ||||||
|  |       if(device.ie && device.ie < 9){ | ||||||
|  |         layer.alert('强烈不推荐你通过ie8/9 查看代码!因为,所有的标签都会被格式成大写,且没有换行符,影响阅读'); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   //手机设备的简单适配
 | ||||||
|  |   var treeMobile = $('.site-tree-mobile') | ||||||
|  |   ,shadeMobile = $('.site-mobile-shade') | ||||||
|  | 
 | ||||||
|  |   treeMobile.on('click', function(){ | ||||||
|  |     $('body').addClass('site-mobile'); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   shadeMobile.on('click', function(){ | ||||||
|  |     $('body').removeClass('site-mobile'); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   exports('global', {}); | ||||||
|  | }); | ||||||
							
								
								
									
										2
									
								
								public/js/jquery1.11.3.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										3
									
								
								public/js/layer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2491
									
								
								public/js/llqrcode.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2
									
								
								public/js/skel.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2
									
								
								public/layui/css/layui.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2
									
								
								public/layui/css/layui.mobile.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2
									
								
								public/layui/css/modules/code.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,2 @@ | |||||||
|  | /** layui-v2.4.5 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} | ||||||
							
								
								
									
										2
									
								
								public/layui/css/modules/laydate/default/laydate.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								public/layui/css/modules/layer/default/icon-ext.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 5.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/layui/css/modules/layer/default/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										2
									
								
								public/layui/css/modules/layer/default/layer.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								public/layui/css/modules/layer/default/loading-0.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 5.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/layui/css/modules/layer/default/loading-1.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 701 B | 
							
								
								
									
										
											BIN
										
									
								
								public/layui/css/modules/layer/default/loading-2.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/layui/font/iconfont.eot
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										473
									
								
								public/layui/font/iconfont.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 274 KiB |