composer require phpoffice/phpspreadsheet
PhpSpreadsheet中文简介
phpexcel由于版本陈旧性能低下官方放弃维护,转而开发PhpSpreadsheet用了最新得psr标准因而对php版本不向下兼容需要注意!
PhpSpreadsheet是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式
PhpSpreadsheet提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到
使用PhpSpreadsheet开发的PHP要求7.1或更高版本,并且支持链式操作
PhpSpreadsheet 支持的文件格式
文件路径extend/Excel.php
<?php
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use think\exception\ValidateException;
class Excel
{
/**
* 导入excel表格
* @param array $file 文件路径
* @return array|string
*/
protected function importExcel($file)
{
try {
// 截取后缀
$fileExtendName = substr(strrchr($file, '.'), 1);
// 有Xls和Xlsx格式两种
if ($fileExtendName == 'xlsx') {
$objReader = IOFactory::createReader('Xlsx');
} else {
$objReader = IOFactory::createReader('Xls');
}
// 设置文件为只读
$objReader->setReadDataOnly(TRUE);
// 读取文件,tp6默认上传的文件,在runtime的相应目录下,可根据实际情况自己更改
$objPHPExcel = $objReader->load($_SERVER['DOCUMENT_ROOT'] . $file);
//excel中的第一张sheet
$sheet = $objPHPExcel->getSheet(0);
// 取得总行数
$highestRow = $sheet->getHighestRow();
// 取得总列数
$highestColumn = $sheet->getHighestColumn();
Coordinate::columnIndexFromString($highestColumn);
$lines = $highestRow - 1;
if ($lines <= 0) {
return '数据不能为空';
}
// 直接取出excle中的数据
$data = $objPHPExcel->getActiveSheet()->toArray();
// 删除第一个元素(表头)
array_shift($data);
// 返回结果
return $data;
} catch (ValidateException $e) {
return $e->getMessage();
}
}
/**
* 导出excel表格
* @param array $header 设置表头数据
* @param array $data 生成的表格数据
* @param bool $type 文件类型,true为Xlsx,false为Xls,默认为true
* @param string $fileName 文件名,默认为数据
*/
protected function export($header = [], $data = [], $type = true, $fileName = "数据")
{
// 实例化类
$preadsheet = new Spreadsheet();
// 创建sheet
$sheet = $preadsheet->getActiveSheet();
// 生成表头字母
$letter = [];
$n = 0;
for ($i = 'A'; $i <= 'Z'; $i++) {
if ($n<count($header)){
$letter[] = $i;
}else{
break;
}
$n++;
}
// 循环设置表头数据
foreach ($header as $k => $v) {
// 解决长数字自动转科学计数法
if(is_numeric($v) && strlen($v) > 11){
$sheet->setCellValueExplicit($letter[$k].'1',$v,'s');
}
$sheet->setCellValue($letter[$k].'1', $v);
}
// 生成数据
$sheet->fromArray($data, null, "A2");
// 样式设置
$sheet->getDefaultColumnDimension()->setWidth(12);
// 设置下载与后缀
if ($type) {
header("Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
$type = "Xlsx";
$suffix = "xlsx";
} else {
header("Content-Type:application/vnd.ms-excel");
$type = "Xls";
$suffix = "xls";
}
// 激活浏览器窗口
header("Content-Disposition:attachment;filename=$fileName.$suffix");
//缓存控制
header("Cache-Control:max-age=0");
// 调用方法执行下载
$writer = IOFactory::createWriter($preadsheet, $type);
// 数据流
$writer->save("php://output");
}
}
调用
$excel = new Excel();
// 导出
$header = ['姓名','性别'];
$data = [['小王','男'],['小李','男']];
$excel->export($header,$data);
// 导入
$data = $excel->importExcel('/storage/picture/20221222/77d80064c35db092c8124a13a7f6fcd5.xlsx');
if(is_array($data)){
print_r($data);
}else{
echo $data;
}
]]>Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。Document 对象是 Window 对象的一部分。
我们项目中需要使用第三方支付,第三方支付文件使用了DOMDocument,如果直接使用DOMDocument的话会报错
解决方法
只需要在DOMDocument加上一个反斜杠就可以了
$dom = new \DOMDocument();
$dom->loadXML($data);
]]>composer require alibabacloud/sdk
新建一个控制器文件或者放到共用文件
<?php
namespace app\api\controller;
use app\BaseController;
use AlibabaCloud\Client\AlibabaCloud;
class Sms extends BaseController
{
public function index()
{
$phone = input('phone');
if(!$phone){
echo '请传入手机号';
}else if(!$this->validatePhone($phone)){
echo '手机号格式错误';
}else{
$res = $this->sendCode($phone);
if($res === true){
echo '发送验证码成功';
}else{
// echo $res;
echo '发送验证码失败';
}
}
}
/**
* 发送短信验证码
*/
protected function sendCode($phone)
{
return $this->sendSms('AccessKeyId','Secret',['phone' => '手机号','sign' => '至尊网络','code' => 'SMS_...','param' => json_encode(['code' => mt_rand(10000,99999)])]);
}
/**
* 阿里云短信服务
* @param $AccessKeyId
* @param $Secret
* @param $params
* @return bool
* @throws ClientException
*/
protected function sendSms($AccessKeyId, $Secret, $params){
if (empty($params['phone'])) {
return false;
}
// 创建客户端
AlibabaCloud::accessKeyClient($AccessKeyId, $Secret)
->regionId('cn-hangzhou')
->asDefaultClient();
try {
$query = [
'RigionId' => 'cn_hangzhou',
'PhoneNumbers' => $params['phone'],// 输入的手机号
'SignName' => $params['sign'],// 签名信息
'TemplateCode' => $params['code']// 短信模板id
];
if(!empty($param['param'])){
$query['TemplateParam'] = $params['param'];// 可选,模板变量值,json格式
}
$result = AlibabaCloud::rpc()
->product('Dysmsapi')
->version('2017-05-25')
->action('SendSms')
->host('dysmsapi.aliyuncs.com')
->options([
// 这里的参数可以在openAPI Explorer里面查看
'query' => $query
])
->request();
$arr = $result->toArray();
// print_r($arr);
if($arr['Code'] == 'OK'){
return true;
}else{
return $arr['Message'];
}
} catch (ClientException $e) {
return $e->getErrorMessage();
} catch (ServerException $e) {
return $e->getErrorMessage();
}
}
/**
* 校验手机号码
* @param $phone
* @return bool
*/
protected function validatePhone($phone){
if(!preg_match("/^(?:(?:\+|00)86)?1[3-9]\d{9}$/", $phone)){
return false;
}
return true;
}
}
短信验证码防刷机制
1、时间限制:60秒后才能再次发送
2、手机号限制:同一个手机号,24小时之内不能够超过5条
3、短信验证码限制:30分钟之内发送同一个验证码
4、前后端校验:提交Token参数校验
5、唯一性限制:微信产品,限制同一个微信ID用户的请求数量
6、产品流程限制:分步骤进行
7、图形验证码限制:图形验证通过后再请求接口图形验证码前后台交互流程比较简单
8、IP及Cookie限制:限制相同的IP/Cookie信息最大数量
9、短信预警机制,做好出问题之后的防护
1. extend 目录的直接子内容
假设在 extend 目录下创建一个 Upload.php 文件,如果是 extend 目录的直接子内容则不需要添加命名空间
<?php
class Upload
{
}
此时可以在控制器中直接使用 \Upload 类,特别注意命名空间
2. 带层级的类
假设在 extend/file 目录下创建一个 Upload.php 文件,此时需要添加命名空间
<?php
namespace file;
class Upload
{
}
此时可以在控制器中直接使用 \file\Upload 类
// 测试
dump(new \Upload());
dump(new \file\Upload());
]]>//distinct方法去重
$data = (new classifyModel())->distinct(true)->field('name')->select()->toArray();
//group方法去重
$data = (new classifyModel())->group('name')->select()->toArray();
对于两种去重方式:
distinct去重、简单易用,但只能对于单一字段去重,并且最终的结果也仅为去重的字段,实际应用价值不是特别大。
group去重,最终的显示结果为所有字段,且对单一字段进行了去重操作,效果不错。
]]>源商城系统是源分享全新推出的一款轻量级、高性能的开源商城系统。系统基于ThinkPhp5.0+mysql+Vue开发,完善的后台权限管理、会员管理、订单管理、产品管理、数据统计、系统配置、组合数据管理、日志管理、数据库管理,支持队列、PHP快速生成表单、图表统计、表格导出等功能。能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、吸引流量、网络营销、品牌推广的一款产品,且更适合大家二次开发;我们专注于原创研发和创意设计,探索并实现传统教育行业转型发展的难题,通过互联网工具,为合作伙伴长远发展贡献全力。在更深远的认知中,将不断修正服务导向,以开放共享的理念服务中小企业,心之所向,素履以往,以敬畏之心拥抱互联网,勇做推动行业发展的中坚力量,创造价值,为推进互联网转型发展做出贡献。
安装方式:
1.上传程序安装包到宝塔内已创建平台的根目录下,然后解压即可,删除安装包(安装包可删除可不删除,具体看个人意志)
2.上传解压完安装包之后我们回到宝塔的网站管理界面,点击右侧的设置=>伪静态【设置为ThinkPHP】
location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; break; } }
3.配置好伪静态随后点击网站目录, 设置运行目录为Public即可
4.在浏览器打开你已添加好的域名或则IP进行访问进入安装页面,安装提示内容进行配置即可
5.如果打开提示No input file specified. 点击网站目录把防跨站攻击(open_basedir)取消勾选
QQ互联回调地址
域名/third/callback/qq
域名/wap/#/pages/User/QQlogin
源授权是一款全新架构的授权系统.采用ThinkPHP 5.0开发,内置各种强大的功能,邮件管理,腾讯云短信、阿里云短信等.后台强大简洁,使用方便快捷,支付模块集成易支付功能,前台支持自助购买和操作管理授权!
搭建一个网站的标配包括了服务器和域名 (源授权不支持虚拟主机)强烈建议使用:[服务器](标准版、系统选Centos、其他配置默认即可后续可升级配置),刚入门选择最低配置或者活动机器均可。 服务器环境要求的配置:PHP 7.2+ 和 Mysql 5.6(推荐使用linux版本宝塔进行管理搭建,完美)
支付接口集成了易支付 前台可使用卡密授权激活 支持多程序在线自助授权 短信集成腾讯/阿里云短信 支持前台在线充值支付购买 快捷登录方式集成了QQ/微信/微博 可自行对管理权限进行补差价升级 安全 稳定 简约 新UI · 告别繁琐操作 多端授权 · 一站多控 · 授权统一管理方便快捷
]]>源导航是一款集网址、资源、资讯于一体的导航系统,采用ThinkPHP 5.0开发!
普及知识:搭建一个网站的标配包括了服务器和域名 (源授权不支持虚拟主机)强烈建议使用:[服务器](标准版、系统选Centos、其他配置默认即可后续可升级配置),刚入门选择最低配置或者活动机器均可。 服务器环境要求的配置:PHP 7.2 和 Mysql 5.6(推荐使用linux版本宝塔进行管理搭建,完美)
基本功能:后台自定义配置广告位展示 后台配置导航栏目和收录站点 随心所欲切换想用的首页模板
使用说明:
上传直接访问使用,无需安装
配置要求:
PHP7.2+
nginx,apache,iis均可
.htaccess为apache伪静态
nginx.htaccess为nginx伪静态
web.config为iis伪静态
若是使用宝塔面板可以直接设置成thinkphp伪静态就行了
PHP版本:php7.3
运行目录:根目录/(不需要设置/public)
后台地址:访问你的域名/admin
用户名:mvso
密码:123456
全站采集360影视官方接口!
源码内附详细搭建教程以及相关伪静态代码!
自动适应模板有后台简单方便快捷 虚拟空间也可以完美搭建
]]>Thinkphp内核邮件群发管理系统源码 用于群发邮件使用,支持自定义设置个性化挂机参数,支持多发件箱,多模板可视化管理,支持记录挂机日志。
程序功能介绍:
【发信日志】记录每次执行的状态日志。
【多发件箱】支持自定义多个发信账号发信。
【发信模板】支持自定义多个邮件模板随机调用。
【延时执行】控制发信频率,最低设置1秒。
【状态开关】挂机时发信错误,自动关闭发信账号状态,状态为off时,则不会执行挂机发信任务。 邮件模板,收件箱均支持。
百度网盘链接:https://pan.baidu.com/s/1XNzYdO5QekF3WqHvYheZTg 密码:gvn9
]]>