首页
关于
归档
朋友
壁纸
留言
API平台
告白墙
更多
休闲游戏
留言板
练字贴
Layui手册
Search
1
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
1,340 阅读
2
【Git】No tracked branch configured for branch master or the branch doesn't exist.
1,039 阅读
3
【Layui】控制页面元素展示隐藏
860 阅读
4
【composer】composer常用命令
787 阅读
5
【PHP】PHP实现JWT生成和验证
769 阅读
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
登录
Search
标签搜索
PHP
函数
方法
类
MySQL
ThinkPHP
OOP
JavaScript
Layui
Web
Linux
Array
设计模式
Git
PHPSpreadsheet
PHPoffice
排序算法
基础
面试题
Windows
小破孩
累计撰写
223
篇文章
累计收到
33
条评论
首页
栏目
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
页面
关于
归档
朋友
壁纸
留言
API平台
告白墙
休闲游戏
留言板
练字贴
Layui手册
搜索到
219
篇与
的结果
2022-06-21
【PHP】PHPMailer发送邮件
/** * @Author:小破孩 * @Time: 2020/7/10 13:13 * @param $title 邮件标题 * @param $content 内容 * @param $toemail 收件人邮箱 * @Description:发送邮件 */ function sendEmail($title, $content, $toemail, $usernumber, $type){ try{ $mail = new \PHPMailer\PHPMailer\PHPMailer(); $mail->isSMTP();// 使用SMTP服务 $mail->CharSet = "utf8";// 编码格式为utf8,不设置编码的话,中文会出现乱码 $mail->Host = "smtp.163.com";// 发送方的SMTP服务器地址 $mail->SMTPAuth = true;// 是否使用身份验证 $mail->Username = Config('app.email_name');// 发送方的163邮箱用户名,就是你申请163的SMTP服务使用的163邮箱 $mail->Password = Config('app.email_allow');// 发送方的邮箱密码,注意用163邮箱这里填写的是“客户端授权密码”而不是邮箱的登录密码! $mail->SMTPSecure = "ssl";// 使用ssl协议方式 $mail->Port = config('app.email_port');// 163邮箱的ssl协议方式端口号是465/994 $mail->setFrom(config('app.email_address'),config('app.email_sendpeopleinfo'));// 设置发件人信息,如邮件格式说明中的发件人,这里会显示为Mailer(xxxx@163.com),Mailer是当做名字显示 $mail->addAddress($toemail,'小破孩回复消息');// 设置收件人信息,如邮件格式说明中的收件人,这里会显示为Liang(yyyy@163.com) $mail->addReplyTo(config('app.email_receive'),'小破孩');// 设置回复人信息,指的是收件人收到邮件后,如果要回复,回复邮件将发送到的邮箱地址 $mail->Subject = $title;// 邮件标题 $mail->Body = $content/*."点击可以查看文章地址:".$desc_url*/;// 邮件正文 if(!$mail->send()){// 发送邮件 returnResponse(100,$mail->ErrorInfo);// 输出错误信息 echo "Mailer Error: ".$mail->ErrorInfo; } //信息入库 $data['e_user_number'] = $usernumber; $data['e_title'] = $title; $data['e_content'] = $content; $data['e_emali_receive'] = $toemail; $data['e_type'] = $type; $res = Db::name('email')->insert($data); if($res){ return $res; } }catch (\Exception $e){ returnResponse(100,$e->getMessage()); } }
2022年06月21日
162 阅读
0 评论
0 点赞
2022-06-21
【MySQL】MySQL触发器应用场景和使用方法
触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。数据库触发器有下面的作用:1.安全性。能够基于数据库的值使用户具有操作数据库的某种权利。# 能够基于时间限制用户的操作,比如不同意下班后和节假日改动数据库数据。# 能够基于数据库中的数据限制用户的操作,比如不同意股票的价格的升幅一次超过10%。2.审计。能够跟踪用户对数据库的操作。 # 审计用户操作数据库的语句。# 把用户对数据库的更新写入审计表。3.实现复杂的数据完整性规则# 实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器能够引用列或数据库对象。比如,触发器可回退不论什么企图吃进超过自己保证金的期货。# 提供可变的缺省值。4.实现复杂的非标准的数据库相关完整性规则。触发器能够对数据库中相关的表进行连环更新。比如,在auths表author_code列上的删除触发器可导致对应删除在其他表中的与之匹配的行。# 在改动或删除时级联改动或删除其他表中的与之匹配的行。# 在改动或删除时把其他表中的与之匹配的行设成NULL值。# 在改动或删除时把其他表中的与之匹配的行级联设成缺省值。# 触发器可以拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这样的触发器会起作用。比如,可以在books.author_code 列上生成一个插入触发器,假设新值与auths.author_code列中的某值不匹配时,插入被回退。5.同步实时地复制表中的数据。6.自己主动计算数据值,假设数据的值达到了一定的要求,则进行特定的处理。比如,假设公司的帐号上的资金低于5万元则马上给財务人员发送警告数据。mysql创建触发器1、老版本mysql语法:CREATE TRIGGER <触发器名称> --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.{ BEFORE | AFTER } --触发器有执行的时间设置:可以设置为事件发生前或后。{ INSERT | UPDATE | DELETE } --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。ON <表名称> --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。FOR EACH ROW --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。<触发器SQL语句> --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。2、新版本mysql语法: CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW [trigger_order] trigger_body trigger_time: { BEFORE | AFTER } trigger_event: { INSERT | UPDATE | DELETE } trigger_order: { FOLLOWS | PRECEDES } other_trigger_name注意:或许你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了。这跟SQL的标准有所不同。mysql5.7新版本语法发生了一些小小的变化,同时也可以自定义用户,语法相对来说简单了很多,原理和老版本还是一样的;准备工作:1、创建表tab1sql命令: DROP TABLE IF EXISTS tab1; CREATE TABLE tab1( tab1_id varchar(11) );2、创建表tab2sql命令: DROP TABLE IF EXISTS tab2; CREATE TABLE tab2( tab2_id varchar(11) );实例1:1、创建触发器:t_afterinsert_on_tab1作用:增加tab1表记录后自动将记录增加到tab2表中老版本sql命令: DROP TRIGGER IF EXISTS t_afterinsert_on_tab1; CREATE TRIGGER t_afterinsert_on_tab1 AFTER INSERT ON tab1 FOR EACH ROW BEGIN insert into tab2(tab2_id) values(new.tab1_id); END;新版本sql命令: DROP TRIGGER IF EXISTS t_afterinsert_on_tab1; CREATE TRIGGER t_afterinsert_on_tab1 AFTER INSERT ON tab1 FOR EACH ROW insert into tab2(tab2_id) values(new.tab1_id);2、向tab1表插入一条数据做测试;sql命令: INSERT INTO tab1(tab1_id) values('0001'); 3、查看tab1表和tab2表的结果;sql命令: SELECT * FROM tab1; SELECT * FROM tab2;实例2:1、创建触发器:t_afterdelete_on_tab1作用:删除tab1表记录后自动将tab2表中对应的记录删去老版本sql命令: DROP TRIGGER IF EXISTS t_afterdelete_on_tab1; CREATE TRIGGER t_afterdelete_on_tab1 AFTER DELETE ON tab1 FOR EACH ROW BEGIN delete from tab2 where tab2_id=old.tab1_id; END;新版本sql命令: DROP TRIGGER IF EXISTS t_afterdelete_on_tab1; CREATE TRIGGER t_afterdelete_on_tab1 AFTER DELETE ON tab1 FOR EACH ROW delete from tab2 where tab2_id=old.tab1_id;2、删除tab1表一条数据sql命令: `DELETE FROM tab1 WHERE tab1_id='0001';` 3、查看tab1表和tab2表的结果sql命令: SELECT * FROM tab1; SELECT * FROM tab2;三、mysql查看触发器和查看数据库(show databases;)查看表格(show tables;)一样,查看触发器的语法如下: `SHOW TRIGGERS [FROM schema_name];` 其中,schema_name 即 Schema 的名称,在 MySQL 中 Schema 和 Database 是一样的,也就是说,可以指定数据库名,这样就不必先“USE database_name;”了。 实例:1、查看tab1表下面所有的触发器:sql命令: `SHOW TRIGGERS` 2、查看test数据库下面的触发器,tabl表属于test数据库:sql命令: `SHOW TRIGGERS FROM test` 四、mysql删除触发器和删除数据库、删除表格一样,删除触发器的语法如下: `DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name` 实例:1、删除触发器‘t_afterdelete_on_tab1’sql命令: `DROP TRIGGER IF EXISTS t_afterdelete_on_tab1` 参考:付杰博客 https://www.fujieace.com/mysql/trigger.html
2022年06月21日
726 阅读
3 评论
1 点赞
2022-06-21
【MySQL】MySQL 事务
MySQL 事务MySQL事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。事务用来管理 insert,update,delete 语句一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。事务控制语句:BEGIN 或 START TRANSACTION 显式地开启一个事务;COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;ROLLBACK TO identifier 把事务回滚到标记点;SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。MYSQL 事务处理主要有两种方法:1、用 BEGIN, ROLLBACK, COMMIT来实现BEGIN 开始一个事务ROLLBACK 事务回滚COMMIT 事务确认2、直接用 SET 来改变 MySQL 的自动提交模式:SET AUTOCOMMIT=0 禁止自动提交SET AUTOCOMMIT=1 开启自动提交事务测试mysql> use RUNOOB; Database changed mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb; # 创建数据表 Query OK, 0 rows affected (0.04 sec) mysql> select * from runoob_transaction_test; Empty set (0.01 sec) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into runoob_transaction_test value(5); Query OK, 1 rows affected (0.01 sec) mysql> insert into runoob_transaction_test value(6); Query OK, 1 rows affected (0.00 sec) mysql> commit; # 提交事务 Query OK, 0 rows affected (0.01 sec) mysql> select * from runoob_transaction_test; +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into runoob_transaction_test values(7); Query OK, 1 rows affected (0.00 sec) mysql> rollback; # 回滚 Query OK, 0 rows affected (0.00 sec) mysql> select * from runoob_transaction_test; # 因为回滚所以数据没有插入 +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql>PHP中使用事务实例MySQL ORDER BY 测试:<?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn, "set names utf8"); mysqli_select_db( $conn, 'RUNOOB' ); mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行 mysqli_begin_transaction($conn); // 开始事务定义 if(!mysqli_query($conn, "insert into runoob_transaction_test (id) values(8)")) { mysqli_query($conn, "ROLLBACK"); // 判断当执行失败时回滚 } if(!mysqli_query($conn, "insert into runoob_transaction_test (id) values(9)")) { mysqli_query($conn, "ROLLBACK"); // 判断执行失败时回滚 } mysqli_commit($conn); //执行事务 mysqli_close($conn); ?>
2022年06月21日
161 阅读
0 评论
0 点赞
2022-06-21
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
**安装** 现在开始,创建项目目录/PHPExcel,进入项目目录。 使用composer安装: composer require phpoffice/phpspreadsheet **使用** 在项目目录下新建/public目录,在public目录下创建示例文件test.php,编辑test.php,用以下代码。 <?php require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', 'Welcome to Helloweba.'); $writer = new Xlsx($spreadsheet); $writer->save('hello.xlsx'); 运行代码,你会发现在目录下生成一个hello.xlsx文件,打开Excel文件,你会看到Excel中的单元格A1中有“Welcome to Helloweba.”内容。当然你可以对单元格样式诸如颜色、背景、宽度、字体等等进行设置,这些会在接下来的几节中讲到。 **PhpSpreadsheet特性** - 支持读取.xls,.xlsx,.html,.csv等格式文件,支持写入导出.xls,.xlsx,.html,.csv,.pdf格式文件。 - 提供丰富的API,提供单元格样式设置、Excel表格属性设置、图表设置等等诸多功能。使用PhpSpreadsheet完全可以生成一个外观结构都满足你的Excel表格文件。 - 卓越的性能,尤其在PHP7上表现优异,比PHPExcel强大很多。 **2. 使用PhpSpreadsheet将Excel导入到MySQL数据库** 导入Excel 思路:使用PhpSpreadsheet读取Excel表格中的有用信息,然后组装成sql语句,最后批量插入到MySQL表中。 require 'vendor/autoload.php'; include('conn.php'); //连接数据库 $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'); $reader->setReadDataOnly(TRUE); $spreadsheet = $reader->load('students.xlsx'); //载入excel表格 $worksheet = $spreadsheet->getActiveSheet(); $highestRow = $worksheet->getHighestRow(); // 总行数 $highestColumn = $worksheet->getHighestColumn(); // 总列数 $highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // e.g. 5 $lines = $highestRow - 2; if ($lines <= 0) { exit('Excel表格中没有数据'); } $sql = "INSERT INTO `t_student` (`name`, `chinese`, `maths`, `english`) VALUES "; for ($row = 3; $row <= $highestRow; ++$row) { $name = $worksheet->getCellByColumnAndRow(1, $row)->getValue(); //姓名 $chinese = $worksheet->getCellByColumnAndRow(2, $row)->getValue(); //语文 $maths = $worksheet->getCellByColumnAndRow(3, $row)->getValue(); //数学 $english = $worksheet->getCellByColumnAndRow(4, $row)->getValue(); //外语 $sql .= "('$name','$chinese','$maths','$english'),"; } $sql = rtrim($sql, ","); //去掉最后一个,号 try { $db->query($sql); echo 'OK'; } catch (Exception $e) { echo $e->getMessage(); } $worksheet->getCellByColumnAndRow(col,row)->getValue();可以获取表格中任意单元格数据内容 col表示单元格所在的列,以数字表示,A列表示第一列,$row表示所在的行。 **3. 使用PhpSpreadsheet将数据导出为Excel文件** **一、设置表头** 首先我们引入自动加载PhpSpreadsheet库,然后实例化,设置工作表标题名称为:学生成绩表,接着设置表头内容。表头分为两行,第一行是表格的名称,第二行数表格列名称。最后我们将第一行单元格进行合并,并设置表头内容样式:字体、对齐方式等。 require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; include('conn.php'); //连接数据库 $spreadsheet = new Spreadsheet(); $worksheet = $spreadsheet->getActiveSheet(); //设置工作表标题名称 $worksheet->setTitle('学生成绩表'); //表头 //设置单元格内容 $worksheet->setCellValueByColumnAndRow(1, 1, '学生成绩表'); $worksheet->setCellValueByColumnAndRow(1, 2, '姓名'); $worksheet->setCellValueByColumnAndRow(2, 2, '语文'); $worksheet->setCellValueByColumnAndRow(3, 2, '数学'); $worksheet->setCellValueByColumnAndRow(4, 2, '外语'); $worksheet->setCellValueByColumnAndRow(5, 2, '总分'); //合并单元格 $worksheet->mergeCells('A1:E1'); $styleArray = [ 'font' => [ 'bold' => true ], 'alignment' => [ 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, ], ]; //设置单元格样式 $worksheet->getStyle('A1')->applyFromArray($styleArray)->getFont()->setSize(28); $worksheet->getStyle('A2:E2')->applyFromArray($styleArray)->getFont()->setSize(14); **二、读取数据** 我们连接数据库后,直接读取学生成绩表t_student,然后for循环,设置每个单元格对应的内容,计算总成绩。注意的是表格中的数据是从第3行开始,因为第1,2行是表头占用了。 然后,我们设置整个表格样式,给表格加上边框,并且居中对齐。 $sql = "SELECT id,name,chinese,maths,english FROM `t_student`"; $stmt = $db->query($sql); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); $len = count($rows); $j = 0; for ($i=0; $i < $len; $i++) { $j = $i + 3; //从表格第3行开始 $worksheet->setCellValueByColumnAndRow(1, $j, $rows[$i]['name']); $worksheet->setCellValueByColumnAndRow(2, $j, $rows[$i]['chinese']); $worksheet->setCellValueByColumnAndRow(3, $j, $rows[$i]['maths']); $worksheet->setCellValueByColumnAndRow(4, $j, $rows[$i]['english']); $worksheet->setCellValueByColumnAndRow(5, $j, $rows[$i]['chinese'] + $rows[$i]['maths'] + $rows[$i]['english']); } $styleArrayBody = [ 'borders' => [ 'allBorders' => [ 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, 'color' => ['argb' => '666666'], ], ], 'alignment' => [ 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, ], ]; $total_rows = $len + 2; //添加所有边框/居中 $worksheet->getStyle('A1:E'.$total_rows)->applyFromArray($styleArrayBody); **三、下载保存** 强制浏览器下载数据并保存为Excel文件 $filename = '成绩表.xlsx'; header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="'.$filename.'"'); header('Cache-Control: max-age=0'); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save('php://output'); 如想要保存为.xls文件格式的话,可以改下header代码: $filename = '成绩表.xlsx'; header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="'.$filename.'"'); header('Cache-Control: max-age=0'); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'xls'); $writer->save('php://output'); **4. 详解PhpSpreadsheet设置单元格** PhpSpreadsheet提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到。 **引入了正确的文件并实例化:** use PhpOffice\PhpSpreadsheet\Spreadsheet; $spreadsheet = new Spreadsheet(); $worksheet = $spreadsheet->getActiveSheet(); **字体** 第1行代码将A7至B7两单元格设置为粗体字,Arial字体,10号字;第2行代码将B1单元格设置为粗体字。 $spreadsheet->getActiveSheet()->getStyle('A7:B7')->getFont()->setBold(true)->setName('Arial') ->setSize(10);; $spreadsheet->getActiveSheet()->getStyle('B1')->getFont()->setBold(true); **颜色** 将文字颜色设置为红色 $spreadsheet->getActiveSheet()->getStyle('A4') ->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED); **图片** 可以将图片加载到Excel中 $drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); $drawing->setName('Logo'); $drawing->setDescription('Logo'); $drawing->setPath('./images/officelogo.jpg'); $drawing->setHeight(36); **列宽** 将A列宽度设置为30(字符): $spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(30); 如果需要自动计算列宽,可以这样: $spreadsheet->getActiveSheet()->getColumnDimension('B')->setAutoSize(true); 设置默认列宽为12: $spreadsheet->getActiveSheet()->getDefaultColumnDimension()->setWidth(12); **行高** 设置第10行行高为100pt: $spreadsheet->getActiveSheet()->getRowDimension('10')->setRowHeight(100); 设置默认行高: $spreadsheet->getActiveSheet()->getDefaultRowDimension()->setRowHeight(15); **对齐** 将A1单元格设置为水平居中对齐: $styleArray = [ 'alignment' => [ 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, ], ]; $worksheet->getStyle('A1')->applyFromArray($styleArray); **合并** 将A18到E22合并为一个单元格: $spreadsheet->getActiveSheet()->mergeCells('A18:E22'); **拆分** 将合并后的单元格拆分: $spreadsheet->getActiveSheet()->unmergeCells('A18:E22'); **边框** 将B2至G8的区域添加红色边框: $styleArray = [ 'borders' => [ 'outline' => [ 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK, 'color' => ['argb' => 'FFFF0000'], ], ], ]; $worksheet->getStyle('B2:G8')->applyFromArray($styleArray); **工作表标题** 设置当前工作表标题: $spreadsheet->getActiveSheet()->setTitle('Hello'); **日期时间** 设置日期格式: $spreadsheet->getActiveSheet() ->setCellValue('D1', '2018-06-15'); $spreadsheet->getActiveSheet()->getStyle('D1') ->getNumberFormat() ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDD2); **换行** 使用\n进行单元格内换行,相当于(ALT+"Enter"): $spreadsheet->getActiveSheet()->getCell('A4')->setValue("hello\nworld"); $spreadsheet->getActiveSheet()->getStyle('A4')->getAlignment()->setWrapText(true); **超链接** 将单元格设置为超链接形式: $spreadsheet->getActiveSheet()->setCellValue('E6', 'www.helloweba.net'); $spreadsheet->getActiveSheet()->getCell('E6')->getHyperlink()->setUrl('https://www.helloweba.net'); **使用函数** 使用SUM计算B5到C5之间单元格的总和。其他函数同理:最大数(MAX),最小数(MIN),平均值(AVERAGE): $spreadsheet->getActiveSheet() ->setCellValue('B7', '=SUM(B5:C5)'); **设置文档属性** 可以设置Excel文档属性: $spreadsheet->getProperties() ->setCreator("Helloweba") //作者 ->setLastModifiedBy("Yuegg") //最后修改者 ->setTitle("Office 2007 XLSX Test Document") //标题 ->setSubject("Office 2007 XLSX Test Document") //副标题 ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") //描述 ->setKeywords("office 2007 openxml php") //关键字 ->setCategory("Test result file"); //分类 此外,除了提供丰富的Excel文件处理接口外,PhpSpreadshee还提供了CSV,PDF,HTML以及XML等文件处理接口。
2022年06月21日
1,340 阅读
1 评论
0 点赞
2022-06-21
【Git】删除commit
被提交到仓库的某个文件需要删除,可以使用 git rm 命令: 1. git rm <file> // 从工作区和暂存区删除某个文件 2. git commit -m "" // 再次提交到仓库 如果只想从暂存区删除文件,本地工作区不做出改变,可以: 1. git rm --cached <file> 如果在工作区不小心删错了某个文件,可以用 git checkout 将暂存区的文件覆盖工作区的文件,从而把误删的文件恢复: 1. git checkout -- <file> 用 git rm 删除文件,同时还会将这个删除操作记录下来; 用 rm 删除文件,删除的仅仅是本地物理文件,没有将其从 git 的记录中剔除。 git add 和 git rm 有相似的功能, 但 git add 仅能记录添加、改动的动作,删除的动作需靠 git rm 来完成。 git commit --amend 重写最近commit message 面试容易被问
2022年06月21日
195 阅读
0 评论
0 点赞
2022-06-21
【Git】Git基本命令
安装完以后,报家门 git config --global user.name xiaopohai <!-- 创建用户名 --> git config --global user.email 3584685883@qq.com <!-- 创建邮箱 --> 创建版本库 cd:E:/<!-- 进入目录 --> mkdir test<!-- 创建文件夹 --> git init <!-- 创建版本库 --> 添加文件 git status<!-- 查看状态变化 --> git add .<!-- 把所有文件提交到暂存区 --> git add 文件名<!-- 把改文件放到暂存区 --> git commit -m "init"<!-- -m 是注释 --> 删除文件 git rm 文件名<!-- 删除文件 --> git commit -m "注释"<!-- --> 上传 git push 地址 master<!-- 推送到服务器 master默认的分支 --> 为本地库添加远程库 git remote add lianshou 地址<!-- lianshou为地址的别名 --> 遇到无法和合并 pull 后面加上 --allow-unrelated-histories 初始化 git clone 地址 拉文件 git pull 地址 master 查看改动日志 git log git log --pretty=oneline 切换版本 git reset --hard HEAD^^^<!-- HEAD当前指针最新的 ^一个符号往前切换一次--> git reset --head 版本号<!-- head强制覆盖 --> git reflog<!-- 回退之后又想回退之前的版本 --> 分支管理 git branch<!-- 查看分支 --> git branch wechat<!-- wechat为新建分支名 --> git checkout wechat<!-- 切换分支 --> git merge 分支名<!-- 合并分支 --> git branch -d 分支名<!-- 删除分支 --> 查看远程地址 git remote -v<!-- 查看远程地址的别名 --> git remote remove lianshou<!-- 删除远程地址为练手的别名 --> 配置公钥ssh ssh-keygen -t rsa -C "3584685883@qq.com"<!-- 回车后一直回车 --> 删除本地与git仓库的链接 find . -name ".git" | xargs rm -Rf
2022年06月21日
189 阅读
0 评论
0 点赞
2022-06-21
【PHP】生成avatar头像
/** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2020/12/10 20:00 * @param string $email 邮箱 * @param int $s 大小 * @param string $d * @param string $g * @return string * @Description:生成avatar头像 */ function getAvatar($email='', $s=40, $d='mm', $g='g') { $hash = md5($email); $avatar = "http://www.gravatar.com/avatar/$hash?s=$s&d=$d&r=$g"; return $avatar; }
2022年06月21日
158 阅读
0 评论
0 点赞
2022-06-21
【PHP】获取文件MIME类型-根据文件扩展名来获取
function getFileType($ext){ static $mime_types = [ 'apk' => 'application/vnd.android.package-archive', '3gp' => 'video/3gpp', 'ai' => 'application/postscript', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'asc' => 'text/plain', 'atom' => 'application/atom+xml', 'au' => 'audio/basic', 'avi' => 'video/x-msvideo', 'bcpio' => 'application/x-bcpio', 'bin' => 'application/octet-stream', 'bmp' => 'image/bmp', 'cdf' => 'application/x-netcdf', 'cgm' => 'image/cgm', 'class' => 'application/octet-stream', 'cpio' => 'application/x-cpio', 'cpt' => 'application/mac-compactpro', 'csh' => 'application/x-csh', 'css' => 'text/css', 'dcr' => 'application/x-director', 'dif' => 'video/x-dv', 'dir' => 'application/x-director', 'djv' => 'image/vnd.djvu', 'djvu' => 'image/vnd.djvu', 'dll' => 'application/octet-stream', 'dmg' => 'application/octet-stream', 'dms' => 'application/octet-stream', 'doc' => 'application/msword', 'dtd' => 'application/xml-dtd', 'dv' => 'video/x-dv', 'dvi' => 'application/x-dvi', 'dxr' => 'application/x-director', 'eps' => 'application/postscript', 'etx' => 'text/x-setext', 'exe' => 'application/octet-stream', 'ez' => 'application/andrew-inset', 'flv' => 'video/x-flv', 'gif' => 'image/gif', 'gram' => 'application/srgs', 'grxml' => 'application/srgs+xml', 'gtar' => 'application/x-gtar', 'gz' => 'application/x-gzip', 'hdf' => 'application/x-hdf', 'hqx' => 'application/mac-binhex40', 'htm' => 'text/html', 'html' => 'text/html', 'ice' => 'x-conference/x-cooltalk', 'ico' => 'image/x-icon', 'ics' => 'text/calendar', 'ief' => 'image/ief', 'ifb' => 'text/calendar', 'iges' => 'model/iges', 'igs' => 'model/iges', 'jnlp' => 'application/x-java-jnlp-file', 'jp2' => 'image/jp2', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'js' => 'application/x-javascript', 'kar' => 'audio/midi', 'latex' => 'application/x-latex', 'lha' => 'application/octet-stream', 'lzh' => 'application/octet-stream', 'm3u' => 'audio/x-mpegurl', 'm4a' => 'audio/mp4a-latm', 'm4p' => 'audio/mp4a-latm', 'm4u' => 'video/vnd.mpegurl', 'm4v' => 'video/x-m4v', 'mac' => 'image/x-macpaint', 'man' => 'application/x-troff-man', 'mathml' => 'application/mathml+xml', 'me' => 'application/x-troff-me', 'mesh' => 'model/mesh', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mif' => 'application/vnd.mif', 'mov' => 'video/quicktime', 'movie' => 'video/x-sgi-movie', 'mp2' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpga' => 'audio/mpeg', 'ms' => 'application/x-troff-ms', 'msh' => 'model/mesh', 'mxu' => 'video/vnd.mpegurl', 'nc' => 'application/x-netcdf', 'oda' => 'application/oda', 'ogg' => 'application/ogg', 'ogv' => 'video/ogv', 'pbm' => 'image/x-portable-bitmap', 'pct' => 'image/pict', 'pdb' => 'chemical/x-pdb', 'pdf' => 'application/pdf', 'pgm' => 'image/x-portable-graymap', 'pgn' => 'application/x-chess-pgn', 'pic' => 'image/pict', 'pict' => 'image/pict', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'pnt' => 'image/x-macpaint', 'pntg' => 'image/x-macpaint', 'ppm' => 'image/x-portable-pixmap', 'ppt' => 'application/vnd.ms-powerpoint', 'ps' => 'application/postscript', 'qt' => 'video/quicktime', 'qti' => 'image/x-quicktime', 'qtif' => 'image/x-quicktime', 'ra' => 'audio/x-pn-realaudio', 'ram' => 'audio/x-pn-realaudio', 'ras' => 'image/x-cmu-raster', 'rdf' => 'application/rdf+xml', 'rgb' => 'image/x-rgb', 'rm' => 'application/vnd.rn-realmedia', 'roff' => 'application/x-troff', 'rtf' => 'text/rtf', 'rtx' => 'text/richtext', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'sh' => 'application/x-sh', 'shar' => 'application/x-shar', 'silo' => 'model/mesh', 'sit' => 'application/x-stuffit', 'skd' => 'application/x-koan', 'skm' => 'application/x-koan', 'skp' => 'application/x-koan', 'skt' => 'application/x-koan', 'smi' => 'application/smil', 'smil' => 'application/smil', 'snd' => 'audio/basic', 'so' => 'application/octet-stream', 'spl' => 'application/x-futuresplash', 'src' => 'application/x-wais-source', 'sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'application/x-sv4crc', 'svg' => 'image/svg+xml', 'swf' => 'application/x-shockwave-flash', 't' => 'application/x-troff', 'tar' => 'application/x-tar', 'tcl' => 'application/x-tcl', 'tex' => 'application/x-tex', 'texi' => 'application/x-texinfo', 'texinfo' => 'application/x-texinfo', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'tr' => 'application/x-troff', 'tsv' => 'text/tab-separated-values', 'txt' => 'text/plain', 'ustar' => 'application/x-ustar', 'vcd' => 'application/x-cdlink', 'vrml' => 'model/vrml', 'vxml' => 'application/voicexml+xml', 'wav' => 'audio/x-wav', 'wbmp' => 'image/vnd.wap.wbmp', 'wbxml' => 'application/vnd.wap.wbxml', 'webm' => 'video/webm', 'wml' => 'text/vnd.wap.wml', 'wmlc' => 'application/vnd.wap.wmlc', 'wmls' => 'text/vnd.wap.wmlscript', 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'wmv' => 'video/x-ms-wmv', 'wrl' => 'model/vrml', 'xbm' => 'image/x-xbitmap', 'xht' => 'application/xhtml+xml', 'xhtml' => 'application/xhtml+xml', 'xls' => 'application/vnd.ms-excel', 'xml' => 'application/xml', 'xpm' => 'image/x-xpixmap', 'xsl' => 'application/xml', 'xslt' => 'application/xslt+xml', 'xul' => 'application/vnd.mozilla.xul+xml', 'xwd' => 'image/x-xwindowdump', 'xyz' => 'chemical/x-xyz', 'zip' => 'application/zip' ]; return isset($mime_types[$ext]) ? $mime_types[$ext] : 'application/octet-stream'; }
2022年06月21日
190 阅读
0 评论
0 点赞
2022-06-21
【MySQL】Cannot add foreign key constraint 错误解决办法
产生这个错误的多数原因有一下两点: 1,两张表里要设主键和外键的字段的数据类型或者数据长度不一样 (例如这个是int 另外一个是tinyint,或者都是int,但是设置的长度不同)2,某个表里已经有记录了3、两个表的引擎不一样,查看表的引擎语句:show table status from 数据库名 where name='表名';4、要设置外键的字段不能为主键5、改建所参考的字段必须为主键6、两个字段必须具有相同的数据类型和约束我遇到的情况就是4、5。后面关联的表的字段必须被设置为主键,才能关联成功。参考方案:https://blog.csdn.net/TCF_JingFeng/article/details/84332709参考方案:https://www.cnblogs.com/olddriver123/p/8335263.html
2022年06月21日
196 阅读
0 评论
0 点赞
2022-06-21
【PHP】QueryList安装与使用(快速简单学采集)
示例 采集百度搜索结果列表的标题和链接。 **采集代码** $data = QueryList::get('https://www.baidu.com/s?wd=QueryList', null, [ 'headers' => [ 'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 'Accept-Encoding' => 'gzip, deflate, br', ] ])->rules([ 'title' => ['h3', 'text'], 'link' => ['h3>a', 'href'] ]) ->range('.result') ->queryData(); print_r($data); 采集结果 Array ( [0] => Array ( [title] => QueryList|基于phpQuery的无比强大的PHP采集工具 [link] => http://www.baidu.com/link?url=GU_YbDT2IHk4ns1tjG2I8_vjmH0SCJEAPuuZN ) [1] => Array ( [title] => PHP 用QueryList抓取网页内容 - wb145230 - 博客园 [link] => http://www.baidu.com/link?url=zn0DXBnrvIF2ibRVW34KcRVFG1_bCdZvqvwIhUqiXaS ) [2] => Array ( [title] => 介绍- QueryList指导文档 [link] => http://www.baidu.com/link?url=pSypvMovqS4v2sWeQo5fDBJ4EoYhXYi0Lxx ) //... ) QueryList安装:https://querylist.cc/docs/guide/v4/installation好用的工具:八爪鱼后羿火车头文章摘要:https://querylist.cc/docs/guide/v4/exampleQueryList手册:https://querylist.cc/docs/guide/v4
2022年06月21日
242 阅读
0 评论
0 点赞
2022-06-21
【Linux】crontab定时任务
启用 crontab: crontab -e 查看 crontab -l 删除 crontab -r 进入Vi输入i进入编辑模式 编辑一个定时 00 */1 * * * curl http://we7.yoby123.cn/xxx.php 退出esc 输入**:wq** * 表示可能的值 , 表示取值 1,2,34,5 - 表示范围 1-5 / 表示频率 /10 每十分钟 按分钟
2022年06月21日
160 阅读
0 评论
0 点赞
2022-06-21
【Linux】Linux常用操作
进入home cd /home 清除屏幕 clear 查看当前目录文件列表 ls -lt 不带参数显示文件夹和文件,参数显示详情 查看当前路径 pwd 创建文件夹 mkdir test 支持多级 以动或重命名 mv dir1 dir2 删除目录和内容 rm -rf dir1 r目录 f文件 退出VI 按ESC 输出:q! Vi编辑模式 i 退出编辑 ESC zip文件压缩备份 后面是压缩某个文件夹绝对路径 zip -r ./filename.zip /home 查看发行版本号 lsb_release -a 查看32/64位 uname -a 查看某个端口进程 lsof -i:4443 关闭端口进程 kill 19999 查看全部使用或监听端口 netstat -tlunp 磁盘空间使用情况 df -h 查看内存使用状况 free -m 创建权限777目录 mkdir -m 777 file3 查看开放的端口 iptables-save 添加开放端口 firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --reload debian查看发行信息 cat /etc/os-release 查看防火墙状态:firewall-cmd --state 开启防火墙:systemctl start firewalld 关闭防火墙:systemctl stop firewalld 重启防火墙 firewall-cmd --reload 重启nginx /etc/init.d/nginx restart 启动 /etc/init.d/nginx start 停止 /etc/init.d/nginx stop 重启apoache /etc/init.d/httpd restart 重启mysql /etc/init.d/mysqld restart ftp重启 /etc/init.d/pure-ftpd restart redis启动/停止 /etc/init.d/redis start/etc/init.d/redis stop 宝塔强制修改root密码123456 cd /www/server/panel && python tools.py root 123456 修改宝塔面板端口 echo '8881' > /www/server/panel/data/port.pl && /etc/init.d/bt restart 重启宝塔面板 /etc/init.d/bt restart
2022年06月21日
156 阅读
0 评论
0 点赞
2022-06-21
【JavaScript】JavaScript基础-ES6新语法
const 变量不变 let 变量可变 箭头函数,支持默认设置参数 const fn=(a=1,b=2)=>{return a+b;} const fn1 = (a,b)=>a+b; //简写,当返回值可省略括号 字符模板,不再使用+链接字符串 const a = 20; const b = 30; const string = `${a}+${b}=${a+b}`; 解析结构 const obj={ a:1, b:2, c:3 } const {a,b}=obj; 对象解析结构 let [a, b, c] = [1, 2, 3];数组的解析结构 let [a, ...b] = [1, 2, 3]; 剩余运算 a=1 b=[2,3] 简写,当属性和值相同 const person = { name, age,fn(){ return this.name; } }等价 var person = { name: name, age: age , fn:function fn(){ return this.name; } }; 类 class Person { //构造方法 constructor(name, age) { this.name = name; this.age = age; } getName() { return this.name } } 模块 接口定义可以是变量,函数,类 var m=1 export {m} export default默认方法或变量 import {m} from 'm';
2022年06月21日
165 阅读
0 评论
0 点赞
2022-06-21
【JavaScript】JavaScript基础-本地存储
sessionStorage 支持IE8+ 火狐,chrome等用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。 sessionStorage.setItem('testKey','这是一个测试的value值'); sessionStorage['testKey'] = '这是一个测试的value值'; sessionStorage.getItem('testKey'); sessionStorage['testKey']; sessionStorage.setItem('user', JSON.stringify(userEntity)); 存储对象 var userJsonStr = JSON.parse(sessionStorage.getItem('user')); sessionStorage.removeItem(string key) :将指定的键名(key)从 sessionStorage 对象中移除。 sessionStorage.clear() localStorage 即本地存储,可用于长久保存整个网站的数据,保存的数据没有过期时间,直到手动去除数据比较大的临时保存方案。如在线编辑文章时的自动保存。多页面访问共同数据 localStorage.setItem('testKey','这是一个测试的value值'); localStorage['testKey'] = '这是一个测试的value值'; localStorage.getItem('testKey'); localStorage['testKey']; localStorage.setItem('user', JSON.stringify(userEntity)); var userJsonStr = JSON.parse(( localStorage .getItem('user')); localStorage.removeItem(string key) localStorage.clear()
2022年06月21日
186 阅读
0 评论
0 点赞
2022-06-21
【JavaScript】JavaScript基础-语言基础
数据类型 undefined,null,boolean,number,string,Array基本数据类型 Object复杂数据类型 类型转换 parseInt("666" ) 非数字返回NaN parseFloat("2.45"); (1).toString(); (10).toString(2);//二进制 String(undefined); null也会输出字符串 !!"3.5" true typeof null; object 字符串 "123我爱你".charAt(3) 返回我,3是位置 "123我爱你".indexOf("我") 返回3 找不到-1 "123我爱你".match(/爱(.*)/) 返回数组 ["爱你", "你"] 没有找到返回 null "我爱你中国美国英国".substring(1,4); 返回爱你中,从第1到4不包括4 "我爱你中国美国英国".substr(3,5) 第三个开始截取5个字符 "我爱你中国人".replace(/中国/,"美国"); "我爱你中国人".search(/中国/); 找到返回下标 没找到返回-1 "123我爱你".split(""); 返回数组 支持正则 "aA".toLowerCase();转小写 toUpperCase大写 var string = (2).toString(); var string = 2+''; 数组 var arr =Array(1,2,3); var arr =[1,2,3]; var arr ={"31536000":"年","2592000":"个月","604800":"星期","86400":"天","3600":"小时","60":"分钟","1":"秒"}; [1,2,3].join(',')//数组转换字符串 '1,2,3'.split(',')//字符串转换数组 $.isArray([]);// 是否数组 返回true arr.push("white","test");//尾部插入数组值 返回长度 arr.unshift("first"); //头部插入 arr.pop();//尾部删除 返回被删除元素 arr.shift();//头部删除 arr.reverse();//颠倒数组 arr.sort(function(num1, num2) { return num1 > num2;});//排序 返回排序后 arr.concat(["ccc","bbbb"],'3333',['vvccxx',['oolll','lll']]);//合并数组 返回新数据 arr.slice(1,3); //复制数组 从第一个开始第三个结束 返回新数组 arr.splice(0,2);//删除前两个 arr.splice(1,1,100,200);//从第二个删除1个 并添加2个新元素 var max = Math.max.apply(Math, arr) //3 var min = Math.min.apply(Math,arr) //1 arr.indexOf(str);//查找元素位置 字符操作 var arr=["中国","美国","日本","韩国"]; arr.forEach(function(v,k){ log(k)无返回值 }) arr.map(function(value,index,array){ return XXX }) json与对象 var str = '{"a":"2a","b":true,"c":34,"d":[1,2,"a"]}';//json操作 JSON.parse(str);//json字符串转换成对象 var obj = eval('(' + str + ')');//3种方法 var k1 = {a:1,b:[1,2]};//对象 var k2 = {"k1":1,"k2":"中国"};//json标准格式 或者是关联数组 JSON.stringify(k1) //json对象转换成字符串 时间戳13位长 +new Date() 当前时间戳 +new Date('2014/12/24 02:08:01'); 转换时间戳 Date.now() 当前时间戳 new Date(Date.parse("2012-12-15 09:41:30".replace(/-/g,"/"))); Date对象 new Date(1419184274000) Date对象
2022年06月21日
121 阅读
0 评论
0 点赞
2022-06-21
【JavaScript】JavaScript基础-浏览器对象
弹出框 alert(1); var ret = prompt("请输入内容!",""); var v = confirm('此操作不可恢复,确认吗?'); 返回true可操作 window.close();关闭当前窗口 window.print();打印 计时器 function fn() { var d=new Date(); var t=d.toLocaleTimeString(); document.getElementById("a1").innerHTML=t; } var t = setTimeout("fn()",5000); 执行一次 clearTimeout(t); 提前结束 var id=setInterval("fn()",1000);//每1秒执行一次 clearInterval(id); 取消定时 读写localStorage,长时间存储 sessionStorage关闭后删除 localStorage.setItem("key1", "123"); localStorage.removeItem("bar"); var foo = localStorage.getItem("bar"); 选择器 var id=document.getElementById("id"); var id = document.querySelector("#k"); 支持标签,.class,a[target=_blank]属性 var id = document.querySelectorAll("li"); window document.write("123") 输出 console.log("控制台") var url = location.href; location.href='http://www.baidu.com'; var domain = document.domain;//不含http var url = (window.location.href).substring(0,(window.location.href).indexOf(document.location.pathname));//包含http var from = document.referrer;来源 location.reload(true);刷新 history.go(0); history.go(1);前进 history.go(-1);后退 document.title; document.title = "标题"; document.querySelector('#c').dataset.sex = "男";data属性 document.querySelector('#c').dataset.sex; document.getElementById('demo1').setAttribute('role', 'button'); 设置获取属性 document.getElementById('foo').removeAttribute('role'); document.getElementById('foo').innerHTML = 'Goodbye!';设置值 逻辑 if (time<10) { document.write("<b>早上好</b>"); } else if (time>=10 && time<16) { document.write("<b>今天好</b>"); } else { document.write("<b>晚上好!</b>"); } switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; default: 与 case 1 和 case 2 不同时执行的代码 } for (var i=0;i<cars.length;i++) { document.write(cars[i] + "<br>"); } while (条件) { 需要执行的代码 } 监听事件 var el= document.querySelector('#btn'); el.addEventListener('click',function(){ document.getElementById('loading1').classList.add('loading1'); })
2022年06月21日
189 阅读
0 评论
0 点赞
2022-06-21
【PHP】ThinkPHP6 基本操作
请求变量 use think\facade\Request; Request::param('name'); Request::param();全部请求变量 返回数组 Request::param(['name', 'email']); 多个变量 Request::param('a','1') $a不存在使用默认值1 Request::param('username','','strip_tags'); 参数过滤 去掉html标签 htmlspecialchars转换成实体入库 strtolower小写 Request::header(); 请求头数组,支持单个 cookie input("name"); Request::session();获取 $_SESSION 变量 Request::cookie();获取 $_COOKIE 变量 Request::server();获取 $_SERVER 变量 Request::env();返回env数组 Request::file();获取 $_FILES 变量 Request::baseUrl(); /index/index Request::host(true); 域名:www.baidu.com,默认无参数包含端口:80 Request::url(1); 完整域名和地址 http://tp6.api.shanliwawa.top:80/index/index Request::domain(1) http://tp6.api.shanliwawa.top Request::time() 请求时间戳 Request::app() 应用名 index Request::controller() 控制器 Index 参数true小写 Request::action() 操作 index 参数true 小写 Request::method(true); 请求类型获取 GET isGet isPost isPut isDelete isAjax isMobile isHead 判断是否某种类型 Request::has('id','get'); 检测变量id是否存在 url('index/hello', ['id'=>5,'name'=>'李白'],'do'); http://tp6.api.shanliwawa.top/index/hello/李白.do?id=5 url('index/hello#aa'); 锚点 Cache::set('name', $value, 3600); 1小时后过期 Cache::get('name'); 获取缓存 多缓存类型配置 return [ // 缓存类型为File 'type' => 'redis', // 全局缓存有效期(0为永久有效) ,开发下一定要设置-1 否在刷新后 还在 'expire'=> -1, // 缓存前缀 'prefix'=> 'think', // 缓存目录 'host' => '127.0.0.1', ]; return [ // 使用复合缓存类型 'type' => 'complex', // 默认使用的缓存 'default' => [ // 驱动方式 'type' => 'file', // 缓存保存目录 'path' => '../runtime/default', ], // 文件缓存 'file' => [ // 驱动方式 'type' => 'file', // 设置不同的缓存保存目录 'path' => '../runtime/file/', ], // redis缓存 'redis' => [ // 驱动方式 'type' => 'redis', // 服务器地址 'host' => '127.0.0.1', ], ]; use think\facade\Cache; Cache::store('file')->set('name','123',0); $v = Cache::store('redis')->get('name'); Cache::store('default')->get('name');文件缓存 Cache::delete('name'); Cache::clear(); Cache::set('name', [1,2,3]); Cache::push('name', 4); Cache::remember('start_time', time()); 不存在则创建 Cache::inc('name',1); 自增1 Cache::dec('name',1); 自减1 $redis = Cache::handler(); redis对象 配置redis session return [ 'type' => 'redis', 'prefix' => 'think', 'auto_start' => true, // redis主机 'host' => '127.0.0.1', // redis端口 'port' => 6379, // 密码 'password' => '', ] session('name', ['thinkphp']); 设置支持字符串 数组 session('name');获取 session('name', null);删除 session(null);清空 cookie('name', 'value', 3600); 设置不支持数组,序列化后存储 cookie('name'); cookie('name', null); cookie('think_lang','en-us');//设置语言类型 lang('add user error');//翻译 config('cache.type') 读取配置 验证 {:token_field()} 模板中输出令牌 {:token_meta()} ajax提交 $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); Route::post('blog/save','blog/save')->token(); 路由中使用验证 think\facade\Validate $rule = [ 'name' => 'require|max:25', 'age' => 'number|between:1,120', 'email' => 'email', ]; $msg = [ 'name.require' => '名称必须', 'name.max' => '名称最多不能超过25个字符', 'age.number' => '年龄必须是数字', 'age.between' => '年龄只能在1-120之间', 'email' => '邮箱格式错误', ]; $data = [ 'name' => 'thinkphp', 'age' => 10, 'email' => 'thinkphp@qq.com', ]; $validate = Validate::rule($rule)->message($msg); $result = $validate->check($data); if(!$result) { dump($validate->getError()); } 路由 Route::get('new/<id>','News/read'); // 定义GET请求路由规则 Route::post('new/<id>','News/update'); // 定义POST请求路由规则 Route::put('new/:id','News/update'); // 定义PUT请求路由规则 Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则 Route::any('new/:id','News/read'); // 所有请求都支持的路由规则 ->allowCrossDomain();跨域 输出响应 $data=['code'=>200,'msg'=>'信息提示','list'=>['中国']]; json($data); jsonp($data); xml($data); redirect('http://www.thinkphp.cn'); redirect('/index/hello/name'); //站内跳转 download('./static/2.xlsx'); 下载 数据库 use think\facade\Db; $rs =Db::name('user')->where('id',1)->find(); 查询一条记录 name不含前缀 $rs =Db::table('ims_user')->where('sex', 2)->select(); 多条数据 table含前缀 $rs1 =Db::name('user')->where('id', 1)->value('name'); 查询某个字段值 $rs =Db::table('ims_user')->where('sex', 2)->column('name,id','id'); 返回name,id列,后面是key $userId = Db::name('user')->insertGetId($data);//插入数据返回id Db::name('user') ->limit(100) ->insertAll($data); 插入多条数据,分每次100 Db::name('user') ->where('id', 1) ->update(['name' => 'thinkphp']); 更新 Db::table('think_user')->delete(1); Db::table('think_user')->delete([1,2,3]); Db::table('think_user')->where('id',1)->delete(); Db::name('user')->delete(true);//清空数据 where('id','<>',1) 不等于1 > >= like where("id=:id and username=:name", ['id' => 1 , 'name' => 'thinkphp']) field('id,title,content') 指定字段 limit(10,25) 第十条开始25条 单数字返回数据条数 page(1,10) 第一页十条 order(['id'=>'desc','sex'=>'desc']) 排序 group('user_id,test_time') 分组 count() max('id') min() avg() sum() 聚合函数 whereTime('birthday', '>=', '1970-10-1') 支持< = whereTime('create_time','-2 hours') 查询2小时 whereBetweenTime('create_time', '2017-01-01', '2017-06-30') 查询时间段 whereYear('create_time') 今年 whereYear('create_time','2018') last year 去年 whereMonth('create_time') last month上月 2018-06 具体月份 whereWeek('create_time') last week 上周 whereDay('create_time')今天 yesterday昨天 2018-11-1具体 Db::query("select * from think_user where status=1"); 原生查询 Db::execute("update think_user set name='thinkphp' where status=1");//更新插入删除 Db::query("select * from think_user where id=? AND status=?", [8, 1]);//绑定 $list = Db::name('user')->where('status',1)->paginate(10); 分页每页10条 模型 定义全局常量 define('__URL__',\think\facade\Request::domain(1)); http://tp6.api.shanliwawa.top define('__ROOT__',\think\facade\app::getRootPath()); 系统根目录 C:\www\tp6\ define("PRE",config('database.prefix')); 表前缀 绝对路径获取 \think\facade\app::getRootPath() 根目录C:\www\tp6\ \think\facade\app::getAppPath() 应用路径 C:\www\tp6\app\index\ \think\facade\app::getConfigPath() 配置路径C:\www\tp6\config\ \think\facade\app::version() 核心版本 模板视图 use think\facade\View; View::assign([ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); View::assign('data',[ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); View::fetch('index'); 助手函数 view('index', [ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); 模板输出 {$name} {$data.name} 等价 {$data['name']} {:dump($data)} 使用函数 :开头 {$user.nickname|default="这家伙很懒,什么也没留下"} {$Think.cookie.name} // 输出$_COOKIE['name']变量 {$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量 {$Think.session.user_id} // 输出$_SESSION['user_id']变量 {$Think.get.page} // 输出$_GET['page']变量 {$Request.param.name} 获取name {$data.name|raw} 不转义输出 {$data.create_time|date='Y-m-d H:i'} {literal} Hello,{$name}! 原样输出 {/literal} {load href="/static/js/common.js,/static/js/common.css" /} 加载js,css {php}echo 'Hello,world!';{/php} {/* 注释内容 */ } 或 {// 注释内容 } {include file="public/header" /} 模板包含 {include file="Public/header" title="$title" keywords="开源WEB开发框架" /} 传入参数 {foreach $list as $key=>$vo } {$vo.id}:{$vo.name} {/foreach} {for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" } {/for} {if 表达式}value1 {elseif 表达式 /}value2 {else /}value3 {/if} 记录日志 log.php 可添加 'json' => 1 表示json格式 trace("日志信息") app.php中 'app_trace' => true, trace.php改为默认html 'type' => 'Console', 上传 $file = request()->file('image'); 移动到框架应用根目录/uploads/ 目录下 $info = $file->move( '../uploads'); if($info){ 成功上传后 获取上传信息 输出 jpg echo $info->getExtension(); 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg echo $info->getSaveName(); 输出 42a79759f284b767dfcb2a0197904287.jpg echo $info->getFilename(); }else{ 上传失败获取错误信息 echo $file->getError(); } 多文件xphr foreach($files as $file){} 验证,生成带md5文件名 $info = $file->rule('md5')->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move( '../uploads');
2022年06月21日
194 阅读
0 评论
0 点赞
2022-06-21
【Vue】Vue基础语法
简单例子 <div id="app"> {{ message }} </div> <script> var app = new Vue({ el: '#app', data: { message: '测试vue!' } }) </script> <div id="app"> <ul><li v-for="rs in todos"> {{rs.text}}</li></ul> </div> var app = new Vue({ el: '#app', data: { todos: [ { text: '学习 JavaScript' }, { text: '学习 Vue' }, { text: '整个牛项目' } ] } }) 模板语法 一次插值,后面不会改变 v-once 输出原始值 <span v-html:style="msg">你好</span> 输出属性 <span v-bind:style="msg">你好</span> if语句 <span v-if="msg">true看见我</span> <h1 v-if="msg=='ok'">是</h1> <h1 v-else-if="msg=='ok1'">是1</h1> <h1 v-else>否</h1> 管理重复数据 key="username-input" 监听事件 <a v-on:click="alert(1)">123</a> v-bind缩写 : v-on 缩写@ 数组方式调用class <div v-bind:class="[activeClass, errorClass]"></div> 绑定内联样式 <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div> 显示隐藏 <h1 v-show="msg=='ok'">是</h1> 不支持<template>和else,是display显示隐藏 列表渲染 <li v-for="item in items"> {{ item.message }} </li> 带索引 <li v-for="(item, index) in items"> {{ parentMessage }} - {{ index }} - {{ item.message }} </li> 对象也支持三个参数 <div v-for="(value, key, index) in object"> {{ index }}. {{ key }}: {{ value }} </div> 唯一性 <div v-for="item in items" :key="item.id"> <!-- 内容 --> </div> 方法 <button v-on:click="fn">创建</button> var app = new Vue({ el: '#app', data: {msg:'ok1' } ,methods:{ 'fn':function(event){ alert("q"+this.msg) } } }) 事件修饰符 <!-- 阻止单击事件继续传播 --> <a v-on:click.stop="doThis"></a> <!-- 提交事件不再重载页面 --> <form v-on:submit.prevent="onSubmit"></form> <!-- 修饰符可以串联 --> <a v-on:click.stop.prevent="doThat"></a> <!-- 只有修饰符 --> <form v-on:submit.prevent></form> <!-- 添加事件监听器时使用事件捕获模式 --> <!-- 即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理 --> <div v-on:click.capture="doThis">...</div> <!-- 只当在 event.target 是当前元素自身时触发处理函数 --> <!-- 即事件不是从内部元素触发的 --> <div v-on:click.self="doThat">...</div> <!-- 点击事件将只会触发一次 --> <a v-on:click.once="doThis"></a> <!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 --> <!-- 而不会等待 `onScroll` 完成 --> <!-- 这其中包含 `event.preventDefault()` 的情况 --> <div v-on:scroll.passive="onScroll">...</div> <!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` --> <input v-on:keyup.13="submit"> .enter .tab .delete (捕获“删除”和“退格”键) .esc .space .up .down .left .right 表单 <input v-model="message" placeholder="edit me"> <input type="checkbox" id="checkbox" v-model="checked"> <!-- 在“change”时而非“input”时更新 --> <input v-model.lazy="msg" > <input v-model.number="age" type="number"> <input v-model.trim="msg">
2022年06月21日
157 阅读
0 评论
0 点赞
2022-06-21
【MySQL】MySQL添加用户、删除用户与授权及基本操作
> MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): **1.新建用户** 1.1 登录MYSQL: @>mysql -u root -p @>密码 1.2 创建用户: mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234")); 这样就创建了一个名为:test 密码为:1234 的用户。 > 注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。 1.3 然后登录一下: mysql>exit; @>mysql -u test -p @>输入密码 mysql>登录成功 **2.为用户授权** > 授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 2.1 登录MYSQL(有ROOT权限),这里以ROOT身份登录: @>mysql -u root -p @>密码 2.2 首先为用户创建一个数据库(testDB): mysql>create database testDB; 2.3 授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限): mysql>grant all privileges on testDB.* to test@localhost identified by '1234'; mysql>flush privileges;//刷新系统权限表 > 格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 2.4 如果想指定部分权限给一用户,可以这样来写: mysql>grant select,update on testDB.* to test@localhost identified by '1234'; mysql>flush privileges; //刷新系统权限表 2.5 授权test用户拥有所有数据库的某些权限: mysql>grant select,delete,update,create,drop on *.* to test@"%" identified by "1234"; > //test用户对所有数据库都有select,delete,update,create,drop 权限。 > //@"%"表示对所有非本地主机授权,不包括localhost。(localhost地址设为127.0.0.1,如果设为真实的本地地址,不知道是否可以,没有验证。) > //对localhost授权:加上一句grant all privileges on testDB.* to test@localhost identified by '1234';即可。 **3. 删除用户** @>mysql -u root -p @>密码 mysql>Delete FROM user Where User='test' and Host='localhost'; mysql>flush privileges; mysql>drop database testDB; //删除用户的数据库 删除账户及权限:>drop user 用户名@'%'; >drop user 用户名@ localhost; **4. 修改指定用户密码** @>mysql -u root -p @>密码 mysql>update mysql.user set password=password('新密码') where User="test" and Host="localhost"; mysql>flush privileges; **5. 列出所有数据库** mysql>show database; **6. 切换数据库** mysql>use '数据库名'; **7. 列出所有表** mysql>show tables; **8. 显示数据表结构** mysql>describe 表名; **9. 删除数据库和数据表** mysql>drop database 数据库名; mysql>drop table 数据表名;
2022年06月21日
163 阅读
0 评论
0 点赞
2022-06-21
【PHP】ThinkPHP5 实现sentry通知,记录日志
<?php namespace app\index\common; use think\Log; class Logs { //sentry日志收集器 static public function sentryLogs($e,$line,array $data = []) { Log::init([ 'type' => 'File', 'path' => LOG_PATH, ]); $sentryClient = new \Raven_Client( 'https://c5485e6c233347ca8a7990a2bf77514a:9a69f3eb68c446f8ae3247eb368c1ff6@sentry.io/1193480', [ 'name' => \Raven_Compat::gethostname(),//服务器主机名 'environment' => 'production', 'level' => 'error', //附加数据 'extra' => $data, 'app_path' => ROOT_PATH, 'sample_rate' => 1,//值0.00将拒绝发送任何事件,值1.00将发送100%的事件。 'curl_method' => 'async',//curl异步发送,比同步体验好很多 //回掉方法,在发送数据之前操作 'send_callback' => function ($data) { }, ]); //单独设置用户信息 $sentryClient->user_context([ 'id' => 2966, 'username' => 'XPH', 'email' => '3584685883@qq.com', 'mobile' => '176****376', 'ip_address' => $_SERVER['REMOTE_ADDR'] ]); if ( $e && is_object($e) ) { $sentryClient->captureException($e); $errorMsg = "\n文件:".$e->getFile()."\n行数:".$e->getLine()."\n错误代码:".$e->getCode()."\n错误信息:".$e->getMessage()."\n"; }else{ //当没有异常只想记录信息的时候可以使用这个 $sentryClient->captureMessage($e); $errorMsg = $e."\n行数:".$line; } Log::record($errorMsg); } }
2022年06月21日
158 阅读
0 评论
0 点赞
1
...
7
8
9
...
11