<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script>
// 原理:
// 1. J_endtime 获取到期时间的时间戳
// 2. 将 J_endtime 转化为 datetime-local 格式,并赋值给 J_newtime 显示
// 3. 检测 J_newtime 值是否有改动
// 4. J_newtime 值有改动,则将其 value 转化为时间戳,并赋值给 J_endtime
// 说明:
// newtime.val(getDateTime(endtime));
// newtime.val() 是给 newtime 进行赋值
// 值为 getDateTime(endtime);endtime 是获取的数据库的值;getDateTime 是格式化时间戳为 datatime-local
//这个 getzf 作用是给 1一位数的时间加个前导0,2022-1-26 改成 2022-01-26
var times = $('.J_time');
if (times.length) {
$('.J_endtime').each(function() {
var endtime = $(this).val();
var newtime = $(this).parent().find('.J_newtime');
newtime.val(getDateTime(endtime));
});
}
$('.J_newtime').on('input propertychange', function() {
var newtime = $(this).val().replace('T', ' ').replace(/-/g, '/');
$('.J_endtime').val(Date.parse(newtime) / 1000);
});
// 将时间戳转化为 datetime-local 格式---------getzf(date.getSeconds()秒;
function getDateTime(str) {
var date = new Date(parseInt(str + '000'));
return date.getFullYear() + '-' + getzf(date.getMonth() + 1) + '-' + getzf(date.getDate()) + 'T' + getzf(date.getHours()) + ':' + getzf(date.getMinutes());
}
// 两位数的前导零
function getzf(num) {
if (parseInt(num) < 10) {
num = '0' + num;
}
return num;
}
</script>
think-captcha
thinkphp5 验证码类库
安装
composer require topthink/think-captcha
使用
模板里输出验证码
<div>{:captcha_img()}</div>
或者
<div><img src="{:captcha_src()}" alt="captcha" /></div>
上面两种的最终效果是一样的
控制器里验证
使用TP5的内置验证功能即可
$this->validate($data,[
'captcha|验证码'=>'require|captcha'
]);
或者手动验证
if(!captcha_check($captcha)){
//验证失败
};
简介:
<?php
/**
* 支付宝支付
*/
return [
//应用ID,您的APPID。
'app_id' => "",
//商户私钥, 请把生成的私钥文件中字符串拷贝在此
'merchant_private_key' => "",
//异步通知地址
'notify_url' => "",
//同步跳转
'return_url' => "",
//编码格式
'charset' => "UTF-8",
//签名方式
'sign_type'=>"RSA2",
//支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => "",
];
ThinkPHP5 支付宝支付扩展库, 包括手机网站支付、电脑网站支付、支付查询、退款、退款查询、对账单等。
用法
电脑网站支付 Pagepay.php
调用 \alipay\Pagepay::pay($params) 即可
手机网站支付 Wappay.php
调用 \alipay\Wappay::pay($params) 即可
交易查询接口 Query.php
调用 \alipay\Query::exec($query_no) 即可
交易退款接口 Refund.php
调用 \alipay\Refund::exec($params) 即可
退款统一订单查询 RefundQuery.php
调用 \alipay\RefundQuery::exec($params) 即可
交易关闭接口 Close.php
调用 \alipay\Close::exec($query_no) 即可
查询账单下载地址接口 Datadownload.php
调用 \alipay\Datadownload::exec($bill_type, $bill_date) 即可
验签 Notify.php
调用 \alipay\Notify::checkSign($params) 即可
查询1条数据
Db::table('think_user')->where('id',1)->find();
查询数据集
Db::table('think_user')->where('status',1)->select();
如果设置了数据表前缀参数的话,可以使用
Db::name('user')->where('id',1)->find();
Db::name('user')->where('status',1)->select();
一般这个这样的写法 比较 常见!
删除数据
// 根据主键删除
Db::table('think_user')->delete(1);
Db::table('think_user')->delete([1,2,3]);
// 条件删除
Db::table('think_user')->where('id',1)->delete();
Db::table('think_user')->where('id','<',10)->delete();
最终生成的SQL语句可能是:
DELETE FROM think_user
WHERE id
= 1
DELETE FROM think_user
WHERE id
IN (1,2,3)
DELETE FROM think_user
WHERE id
= 1
DELETE FROM think_user
WHERE id
< 10
通过上面可以看出,无论TP的删除语法是什么样的,都是 通过PHP原生语句转化来的;
使用 Db 类的 insert 方法向数据库提交数据
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);
从上面可以看出,直接使用Db的方法,讲$data 进行数据的写入!
添加数据后如果需要返回新增数据的自增主键,可以使用getLastInsID方法:
Db::name('user')->insert($data);
$userId = Db::name('user')->getLastInsID();
或者直接使用insertGetId方法新增数据并返回主键值:
Db::name('user')->insertGetId($data);
添加多条数据直接向 Db 类的 insertAll 方法传入需要添加的数据即可
$data = [
['foo' => 'bar', 'bar' => 'foo'],
['foo' => 'bar1', 'bar' => 'foo1'],
['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll ($data);
相对于5.0来说,5.1版本目录结构的主要变化是配置目录和路由定义目录独立出来,不再放入应用类库目录(并且不可更改)!
www WEB部署目录(或者子目录)
├─application 应用目录
│ ├─common 公共模块目录(可以更改)
│ ├─module_name 模块目录
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ ├─config 配置目录
│ │ └─ ... 更多类库目录
│ │
│ ├─command.php 命令行定义文件
│ ├─common.php 公共函数文件
│ └─tags.php 应用行为扩展定义文件
│
├─config 应用配置目录
│ ├─module_name 模块配置目录
│ │ ├─database.php 数据库配置
│ │ ├─cache 缓存配置
│ │ └─ ...
│ │
│ ├─app.php 应用配置
│ ├─cache.php 缓存配置
│ ├─cookie.php Cookie配置
│ ├─database.php 数据库配置
│ ├─log.php 日志配置
│ ├─session.php Session配置
│ ├─template.php 模板引擎配置
│ └─trace.php Trace配置
│
├─route 路由定义目录
│ ├─route.php 路由定义
│ └─... 更多
│
├─public WEB目录(对外访问目录)
│ ├─index.php 入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写
│
├─thinkphp 框架系统目录
│ ├─lang 语言文件目录
│ ├─library 框架类库目录
│ │ ├─think Think类库包目录
│ │ └─traits 系统Trait目录
│ │
│ ├─tpl 系统模板目录
│ ├─base.php 基础定义文件
│ ├─convention.php 框架惯例配置文件
│ ├─helper.php 助手函数文件
│ └─logo.png 框架LOGO文件
│
├─extend 扩展类库目录
├─runtime 应用的运行时目录(可写,可定制)
├─vendor 第三方类库目录(Composer依赖库)
├─build.php 自动生成定义文件(参考)
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行入口文件
下面是一个最典型的用法,不带任何参数:
// 不带任何参数 自动定位当前操作的模板文件
return $this->fetch();
表示系统会按照默认规则自动定位模板文件,其规则是:
当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html
如果没有按照模板定义规则来定义模板文件(或者需要调用其他控制器下面的某个模板),可以使用:
// 指定模板输出
return $this->fetch('edit');
表示调用当前控制器下面的edit模板
return $this->fetch('member/read');
表示调用Member控制器下面的read模板。
视图部分
<form action="__URL__/Udenglu" method="post" enctype="multipart/form-data">
<input name="action" value="login" type="hidden">
<input name="useremails" placeholder="登录邮箱" required="" type="text">
<hr class="hr15">
<input name="userpaswords" placeholder="密码" required="" type="password">
<hr class="hr15">
<input value="登录" style="width:100%;" type="submit">
<hr class="hr20">
帮助 <a onClick="alert('请联系管理员')">忘记密码</a>
</form>
php部分
public function Udenglu()//登录执行
{
$usersif = Db::name('users')->where(['useremails'=>input('post.useremails'),'userpaswords'=>input('post.userpaswords')] )->find();
if(count($usersif) < 1 ){
$this->error('抱歉,您的登录邮箱不存在或者错误,请重新登录!');
exit;
}else{
Session::set('uid',$usersif['Id']);
Session::set('usernames',$usersif['usernames']);
Session::set('useremails',$usersif['useremails']);
或者
session('user',$usersif)
$this->success('登录成功', '__ROOT__/member/Index/');
}
}
需要注意的是: Session 会话,得放进去
加上这个。直接访问控制器的时候是先执行这个函数里面的代码,然后再去执行别的函数的代码
construct()是php内置的构造函数,initialize()是php框架中定义的(如thinkphp),用法基本一致。
在tp中若父类和子类都有_initialize,则只调用子类的_initialize,并不会自动调用父类_initialize
而子类的construct方法如果要调用父类的construct方法,必须在子类构造函数显示调用parent::__construct();
_initialize()是ThinkPHP定义的控制器初始化函数。功能类似于php原生的construct。
网上很多人说用_initialize就可以不用写parent::__construct了,这种说话是不对的。
只有当你的控制器继承了think\Controller时,你可以直接在控制器中使用_initialize(),此时会执行父类的construct和当前类的_initialize。
当你的控制器是作为think\Controller的子类的子类时,只会执行think\Controller的__construct和当前类的_initialize,并不会执行父类的_initialize,所以此时还是需要加parent::_initialize这句才行。
其实think\Controller只是在__construct中加了一句:$this->_initialize()而已。