first commit

This commit is contained in:
2025-04-27 10:56:38 +08:00
commit 4c3e17d851
796 changed files with 115572 additions and 0 deletions
+9
View 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
View 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
View 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">&#xe602;</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
View 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
View 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
View 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
View 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
View 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+"&notifyUrl="+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
View 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
View 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
View 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&amp;type=2&amp;price=0.1&amp;sign=2b8b5d58c51203162f14939bdbc46a54&amp;param=vone666&amp;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&amp;param=vone666&amp;type=2&amp;price=0.1&amp;reallyPrice=0.1&amp;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&amp;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&amp;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&amp;param=vone666&amp;type=2&amp;price=0.1&amp;reallyPrice=0.1&amp;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">
&lt;?php
ini_set(&quot;error_reporting&quot;,&quot;E_ALL &amp; ~E_NOTICE&quot;);
$key = &quot;83d551f0b3609781a22536ca2658473d&quot;;//通讯密钥
$payId = $_GET[&#x27;payId&#x27;];//商户订单号
$param = $_GET[&#x27;param&#x27;];//创建订单的时候传入的参数
$type = $_GET[&#x27;type&#x27;];//支付方式 :微信支付为1 支付宝支付为2
$price = $_GET[&#x27;price&#x27;];//订单金额
$reallyPrice = $_GET[&#x27;reallyPrice&#x27;];//实际支付金额
$sign = $_GET[&#x27;sign&#x27;];//校验签名,计算方式 = md5(payId + param + type + price + reallyPrice + 通讯密钥)
//开始校验签名
$_sign = md5($payId . $param . $type . $price . $reallyPrice . $key);
if ($_sign != $sign) {
echo &quot;error_sign&quot;;//sign校验不通过
exit();
}
echo &quot;success&quot;;
//继续业务流程
//echo &quot;商户订单号:&quot;.$payId .&quot;&lt;br&gt;自定义参数:&quot;. $param .&quot;&lt;br&gt;支付方式:&quot;. $type .&quot;&lt;br&gt;订单金额:&quot;. $price .&quot;&lt;br&gt;实际支付金额:&quot;. $reallyPrice;
?&gt;
</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>
-->
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
View 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
View 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;
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+17
View 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
View File
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

+49
View 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);
File diff suppressed because one or more lines are too long
+445
View 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
View 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
View 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
View File
File diff suppressed because it is too large Load Diff
+5
View File
@@ -0,0 +1,5 @@
<html>
<body>
zhelis
</body>
</html>
+19
View 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
View 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()+"&param="+$("#param").val()+"&type="+$("#type").val();
window.location.href = "main.php?" + p;
}
</script>
</body>
</html>
+11
View 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'].'&param='.$_GET['param'].'&type='.$_GET['type']."&price=".$_GET['price'].'&sign='.$sign.'&isHtml=1';
echo "<script>window.location.href = '".$host."?".$p."'</script>";
+24
View 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
View 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;
?>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

+106
View 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">&copy;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
View 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();
File diff suppressed because one or more lines are too long
+229
View 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', {});
});
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View 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}
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 274 KiB

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

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

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