Giter VIP home page Giter VIP logo

front-end-resource-collection's Introduction

Front-end-resource-collection

前后端总结。

Javascript

标题 标题
Javascript深浅拷贝例子2 Javascript中的apply和call继承
前端程序员经常忽视的一个JavaScript面试题 我如何用前端技术得到XXOO网站的VIP
Javascript的jsonp原理 Javascript监听触摸事件
深入理解Javascript函数编程 Javascript面向对象编程
Javascript滑屏切换场景 Javascript获取经纬度,关于调用百度API的问题
妙用Javascript运算符 Javascript中的var self = this
Javascript的setTimeout详细用例 sessionstorage,localstorage和cookie
JS日期对比 JSONP参考文章:json和jsonpjson详解菜鸟教程jsonp
Javascript的createElement Javascript的createDocumentFragment
sessionStorage和localStorage 像素帧动画
JavaScript中的this陷阱的最全收集--没有之一 JS函数式编程指南
前端 TOP 100 小白的零基础JavaScript全栈教程
js属性get和set方法 前端小白菜的烹饪指南
浅谈 JS 创建对象的 8 种模式 浅谈 JS 对象添加 getter与 setter 的5种方法以及如何让对象属性不可配置或枚举
JavaScript ECAMScript5 新特性——get/set访问器 JavaScript的原始类型、引用类型、栈、堆、浅拷贝、深拷贝的概念
javaScript事件总览,要实现Angular的方法(未) javascript - "Thinking in AngularJS" if I have a jQuery background?
JS操作DOM元素属性和方法
标题 标题
console全集
介绍 地址
你可能不需要jquery: 用原生实现jquery写法 github仓库 / 对比网站
注释规范(待整理) github

动画

Article Article
popmotion,动画库 css动画库 animate.css
Effeckt hover.css
animatable 利用 快速灵活的 2D WebGL 渲染器创建漂亮的数字内容
一个轻量级的 Javascript 动画引擎anime 一个针对 HTML 和 SVG 的 JavaScript 可视化库
JavaScript 3D 库:three.js 基于 CSS3 变换和过渡的页面效果框架: impress.js
酷炫的效果 js,jquery,css,html5特效
好玩的动画效果刘看山 缓动函数(依据贝赛尔曲线实现)

canvas

Article Article
Canvas API HTML5 canvas

新技术

Reference Reference
2018 年最值得关注的 JavaScript 趋势

准则&规范

Reference Reference
干净的 JavaScript 代码准则clean-code-javascript JavaScript 风格指南

UI

引用 Reference
WeUI Bootstrap
MUI-最接近原生APP体验的高性能前端框架 Amaze UI**首个开源HTML5跨屏前端框架
Frozen UI Foundation
SUI ZUI
淘宝HTML5前端框架 KISSY - 阿里前端JavaScript库
网易Nej - Nice Easy Javascript Kendo UI MVVM Demo
Smart UI 雅虎UI - CSS UI
core UI

CSS

Article Article
CSS Flex布局 移动前端开发CSS3
响应式布局 媒体查询 CSS图片响应式布局
lessDemo的less文件
Reference Reference
CSS 语法参考 CSS3动画手册
腾讯css3动画制作工具 animate.css
Animated Books with CSS 3D Transforms Browserhacks
NEC,网易出品的更好的css方案 storybook
div居中对齐 CSS新特性
sass教程
小技巧 小技巧
一个div在另外一个div横向居中,纵向自定义

HTML

Article Article
HTML5有哪些让你惊艳的demo Wallpaperbetter
前沿的技术

图表

Article Article
echarts官网 echarts github
Highcharts

兼容性

Article Article
html/css标签、属性在各个浏览器中的支持情况

React

React Reference
React教程 菜鸟教程 React Router 使用教程
React开发中文手册-极客学院 React教程-汇智网
React.js快速开始 Reactjs 2016最佳实践
React 入门教程 汇智网 React教程
轻松入门React和Webpack React中文索引
Redux 中文文档 React Router官方文档中文翻译
React入门教程 React介绍及实践教程
React.js 官方网址 React.js 官方文档
React.js material UI React.js TouchstoneJS UI
React.js amazeui UI React 入门实例教程 - 阮一峰
React Native 中文版 Webpack 和 React 小书 - gitbook

Node

Node Article
node技巧 NodeJs静态服务器
Reference Reference
Node.js 包教不包会 七天学会NodeJS
从零开始nodejs系列文章 Node入门
Node初学者入门,一本全面的NodeJS教程

Gulp

Gulp Article
Gulp Demo
Gulp Reference
Gulp官网 Gulp中文网
Gulp资料收集 Gulp:任务自动管理工具 - ruanyifeng
Gulp插件 Gulp不完全入门教程
Gulp 入门指南

webpack

转载 转载
搜罗一切webpack的好文章好工具

其他

Other Article
Cordova配置(WebApp混合开发环境) 微信公众号开发
Atom技巧总结 Mac小技巧
CSDN页面内JS跳转脚本 CSDN博客隐藏配置
百度设置小度机器人出现 前端冷知识,妙用浏览器地址栏
Vim笔记 Cordova配置&&Ionic配置(WebApp混合开发环境)
IE8及以下按钮超链接无法跳转的问题

浏览器

Article Article
判断浏览器及其版本 浏览器概念
浏览器渲染过程详解

阿里手淘

Article Article
可伸缩布局方案 article

分享功能

Share Reference
百度分享(PC) JiaThis(PC)
社会化分享组件(Mobile) ShareSDK轻松实现社会化功能(Mobile)
友盟分享(Mobile)

在线演示

Reference Reference
js 在线编辑 - runjs js 在线编辑 - jsbin
js 在线编辑 - codepen js 在线编辑 - jsfiddle
java 在线编辑 - runjs js 在线编辑 - hcharts
js 在线编辑 - jsdm sql 在线编辑 - sqlfiddle
mozilla 在线编辑器

富文本编辑器

Reference Reference
百度ueditor ckeditor
tinymce kindeditor
wysiwyg BachEditor
simditor summernote
Squire wangEditor

Chrome

Reference Reference
Chrome - 基础 Chrome - 进阶
Chrome - 性能 Chrome - 性能进阶
Chrome - 移动 Chrome - 使用技巧
Chrome - Console控制台不完全指南 chrome开发工具快捷键
Chrome 开发工具 Workspace 使用 Chrome神器Vimium快捷键学习记录
Sass调试-w3cplus 如何更专业的使用Chrome开发者工具-w3cplus
Chrome调试canvas 神器——Chrome开发者工具(一)
奇趣百科性能优化(Chrome DevTools 中的 Timeline Profils 等工具使用介绍 Chrome 开发者工具的 15 个小技巧
Chrome开发者工具不完全指南 Chrome 开发者工具使用技巧

性能优化

Reference Reference
Javascript高性能动画与页面渲染 移动H5前端性能优化指南
给网页设计师和前端开发者看的前端性能优化 张鑫旭——前端性能
web前端性能优化进阶路 Hey——前端性能
YSLOW中文介绍 Yahoo!团队实践分享:网站性能
加载,不只是少一点点 由12306谈谈网站前端性能和后端性能优化
【高性能前端1】高性能HTML 【高性能前端2】高性能CSS
前端工程与性能优化(上):静态资源版本更新与缓存 前端工程与性能优化(下):静态资源管理与模板框架
HTTPS连接的前几毫秒发生了什么 Yslow
阿里无线前端性能优化指南(Pt.1 加载期优化) 毫秒必争,前端网页性能最佳实践

CDN

Reference Reference
Jquery&Bootstrap中文网开源项目免费 CDN 服务 Bootstrap中文网开源项目免费 CDN 服务
新浪CDN 百度静态资源公共库
开放静态文件 CDN - 七牛 CDN加速 - jq22
微软CDN Angular CDN
360网站卫士常用前端公共库CDN服务

Git

Article Article
git 报错集及解决方法 git关联仓库、拉取代码、提交代码完整流程
利用git新建分支 两种方法解决git每次push都要填写账号密码问题
查看本地分支对应远程哪个分支 查看本地和远程有哪些分支
更改本地分支对应的远程分支
Reference Reference
Git操作 Git CSDN Blog
Git-scm Git-for-windows
廖雪峰-Git教程 Gogithub
Git常规命令练习 Git的资料整理
我所记录的git命令(非常实用) GitHub 漫游指南
GitHub秘籍 动画方式练习git
Git操作 Git CSDN Blog

npm

用法 用法
在npm发布自己的angular包 代理
报错解决 报错解决
关于npm 连接错误或者设置了代理

yarn

Article Article
yarn用法
Reference Reference
yarn官网: 用法/ 下载 yarn github
yarn和npm区别: Yarn vs npm: 你需要知道的一切

nginx

Reference Reference
官网 Nginx安装及配置详解
Reference Reference
淘宝在Nginx的基础上,添加了功能和特性Tengine

Sass&Less

Article Article
Less教程
Reference Reference
Sass Sass中文文档
Less

Markdown

Reference Reference
Markdown 语法说明 (简体中文版) Markdown入门参考
Mdeditor(一款国内的在线markdown编辑器) Stackedit(国外的在线markdown编辑器,功能强大,同步云盘)
Mditor一款轻量级的markdown编辑器 lepture-editor
Markdown-editor

前端文档

Reference Reference
前端知识结构 Web前端开发大系概览
免费的编程中文书籍索 前端书籍
前端免费书籍大全 重新介绍JavaScript(JS教程)
Gitbook: 国外的在线markdown可编辑成书 Front-End-Develop-Guide 前端开发指南
前端开发笔记本 大前端工具集
前端开发者手册 结合个人经历总结的前端入门方法
2016最新前端学习计划 前端应该看哪些书籍

前端规范

Reference Reference
通过分析github代码库总结出来的工程师代码书写习惯 HTML&CSS编码规范 by @mdo
前端编码规范之js - by yuwenhui 前端编码规范之js - by 李靖
Airbnb JavaScript 编码规范(简体中文版) AMD与CMD规范的区别
AMD与CMD规范的区别 KISSY 源码规范
前端代码规范及最佳实践 百度前端规范
JavaScript风格指南/编码规范(Airbnb公司版) 网易前端开发规范
前端规范资源列表 Web 前端开发规范文档

前端面试

Reference Reference
前端程序员经常忽视的一个JavaScript面试题 切图仔面试宝典
2016校招内推 -- 阿里巴巴前端 -- 四面面试经历 那几个月在找工作(百度,网易游戏,华为)
前端开发面试题 Front-end-Interview-questions
5个经典的前端面试问题 Front-end-Developer-Interview-Questions
BAT及各大互联网公司2014前端笔试面试题:JavaScript篇 前端开发面试题大收集
收集的前端面试题和答案 前端开发面试题
前端面试大全 关于前端面试
高级前端开发工程师面试题

前端网站

Reference Reference
掘金 百度FEX
阿里UED 菜鸟教程
QDFuns 幕课网
Codepen Sentsin
CTOLib CTOLib/Node

JS练习

Reference Reference
Codewars Javascript-puzzlers
Freecodecamp中文版 ES6katas
Now Coder牛客网 Leetcode
Nodeschool Hackerrank

读书笔记

Article Article
JavaScript权威指南(第六版) JavaScript DOM 编程艺术
JavsScript高级程序设计(第三版) 学习Javascript数据结构与算法
JavaScript设计模式与开发实践 高性能JavaScript
你不知道的JavaScript(YOU DONT KNOW JAVASCRIPT)

算法

Reference Reference
数据结构与算法 JavaScript 描述. 章节练习 常见排序算法(JS版)
经典排序 常见排序算法-js版本
算法-每日练习

书籍

书名 书名
Exploring-ES6翻译 阮一峰 ES6
ECMA-262,第 5 版 ES5
JavaScript Promise迷你书(中文版) 阮一峰 JavaScript 标准参考教程
前端网络开发小书
JavsScript高级程序设计(第三版)作者正在写的: Understanding ECMAScript 6
经典的计算机科学范例、算法和用JavaScript编写的方法汇总 computer-science-in-javascript
书单 书单
成为一名优秀的Developer的书单 前端进阶书单

博客

Reference Reference
谷歌开发者中文博客 腾讯全端团队

wordpress && php

方法 方法
php发送邮件 php抓取页面内容
wordpress模板构造 上传文件
wordprss里面分别怎么取出父子分类信息 php 请求数据
循环打印文章中自定义栏目
函数调用 函数调用
调用博客名称、地址和描述 调用文章相关 API
获得自定义文章 获得文章类型名称
如何引入文件 点击某个分类名称直接进入分类内容
文章自定义栏目调用 wordpress方法集
问题解决 问题解决
上传显示超出upload_max_filesize
插件 插件
主题更新插件: Easy Theme and Plugin Upgrades seo插件: All in One SEO Pack
wordpress富文本编辑器: Kindeditor For Wordpress 导入导出数据: WordPress 导入工具

代码风格

javascript javascript
Google JavaScript Style Guide JavaScript Style Guide,star 66k
ES5风格指南:英文版/ 中文版
ES6/ES2015风格指南中文版 React/JSX 编码规范: 英文版/ 中文版
css css
javascript里css风格指南CSS-in-JavaScript css风格指南:英文版/中文版
css加载动画集合 loaders.css

编辑器

名称 用法
在线编辑器,强大方便 jsbin编辑器地址

待探究

| TCP的三次握手四次挥手 | 前端跨域有哪些种方法及介绍? |

front-end-resource-collection's People

Contributors

deepthan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

front-end-resource-collection's Issues

点击某个分类名称直接进入分类内容

  • 通过分类别名获取Wordpress分类链接:
 <?php
  $cat=get_category_by_slug('wordpress');
  $cat_links=get_category_link($cat->term_id);
?>
<a href="<?php echo $cat_links; ?>" title="<?php echo $cat->name; ?>">更多</a>
 
  • 通过分类ID获取Wordpress分类链接
<?php
    $cat=get_term_by('id', 12, 'category');
    $cat_links=get_category_link($cat->term_id);
?>
<a href="<?php echo $cat_links; ?>" title="<?php echo $cat->name; ?>">更多</a>

php 请求数据

用php请求接口并获得返回的数据?

  1. $_post [ 'name' ] 获取POST传送过来的数据。 这个只能接收 Content-Type:application/x-www-form-urlencoded提交的数据。
  2. file_get_contents( url);请求 url地址并获得返回的数据。
  3. curl的拓展库: 可以获取其他站点的内容。跨站点传递数据


$phoneNumber = "13666666666";
$message = "this is a message";
$curlPost = 'phoneNuber='.urlencode($phoneNumber).'&MESSAGE'.urlencode($message).'&SUBMIT=send';
$ch = curl_init();
curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_setopt($ch,CURLOPT_URL, ' http:www.baidu.com');
curl_setopt($ch,CURLOPT_HEADER ,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,0);
culr_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $curlPost);
curl_setopt()为一个curl设置会话参数。
$data = curl_exec($ch);、
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close($ch);
curl_close()作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_setopt_array()以数组的形式为一个curl设置会话参数。

 ajax --> 请求本地php文件(http:localhost/wp-admin/....客户端) -> php文件用 $ch传递参数请求地址 (http:localhost/服务器接口地址) --> 返回信息传递给浏览器。

npm使用方法之 -- 代理

  • 获得当前设置的代理
npm config get proxy
  • 给npm设置代理
npm config set registry http://registry.npmjs.org/
  • 移除代理
npm config rm proxy
  • 清除缓存
npm cache clean

报错处理之 -- 关于npm 连接错误或者设置了代理

npm ERR! Windows_NT 10.0.14393
npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "i"
npm ERR! node v7.7.1
npm ERR! npm  v4.1.2
npm ERR! code ECONNRESET
npm ERR! errno ECONNRESET
npm ERR! syscall read

npm ERR! network read ECONNRESET
npm ERR! network This is most likely not a problem with npm itself
npm ERR! network and is related to network connectivity.
npm ERR! network In most cases you are behind a proxy or have bad network settings.
npm ERR! network
npm ERR! network If you are behind a proxy, please make sure that the
npm ERR! network 'proxy' config is set properly.  See: 'npm help config'

其实是版本不支持了,直接更新版本:

window + r
cmd 
cnpm install npm@latest -g

浏览器的主要概念

User Interface

用户接口。浏览器中的地址栏、前进后退、书签菜单等。除了网页显示区域以外的都是。

Brower engine

浏览器引擎。查询与操作渲染引擎的接口。

Rendering engine

渲染引擎。今天的内容主角就是它~负责显示请求的内容

Networking

网络。用于网络请求,例如HTTP请求。

JavaScript Interpreter

用于解析执行JavaScript代码

UI Backend

绘制基础原件,比如组合框、窗口。

Data Persistence

持久层。HTML5规定了完整的浏览器中的数据库:web database

利用git新建分支

git symbolic-ref HEAD refs/heads/new-branch-name
git add -A
git commit -m "..."
git push origin new-branch-name

调用文章相关 API

3. 调用文章


  <div class="post" id="post<?php the_ID(); ?>">

    <?php if(have_posts()): ?> 
        <?php while(have_posts()) : the_post(); ?>

           <h2>                                      // ' title= '  鼠标移上去显示的内容
                <a href="<?php the_permalink(); ?>"  title="<?php the_title(); ?>" >      -> 标题
                   <?php the_title(); ?>
                </a>
           </h2>

           <p>
                <?php the_content(); ?>                   -> 内容

                <div class="postmetadata">                -> 发表时间等
                    <?php the_category() ?>
                    <?php the_author(); ?>
                    <?php the_date(); ?>
                </div>
           </p>

        <?php endwhile; ?>

        <?php else: ?>
        <div>
            <p><?php  _e('Not Found'); ?></p>
        </div>
    <?php endif; ?>
  </div>

  • if(have_posts()): 检查是否有日志,那么当有日志的时候,执行下面 the_post()这个函数
  • while(have_posts()): 当博客有日志的时候,执行下面 the_post()这个函数
  • the_post(): 调用具体的日志来显示
  • endwhile: 关闭while()
  • endif: 关闭if
  • the_permalink(): 调用每篇日志地址的PHP函数
  • the_title(): 调用日志标题的函数
  • the_content(): 调用日志内容的函数
  • the_category(): 日志类别
  • the_author(): 日志作者
  • the_date(): 日志发布时间
  • the_ID(): 给每篇日志都添加一个id,给它进行样式添加。
    &&&& 主循环: the loop &&&&

php如何引入文件

  • 1: wordpress函数
<?php get_header(); ?>
<?php get_sidebar(); ?>
<?php get_footer();?>
  • 2: php函数
<?php include (TEMPLATEPATH . ‘/header.php’); ?>

php发送邮件

html: 填写要发送的信息

 <form method="post" enctype="multipart/form-data" class="join-form">
        <div class="getInfo">
            <lable class='left-inp' for='dep-advice'>Advice on e-cigarettes</lable>
            <textarea  class="text_area is_empty" cols="40" rows="7"  name='dep-advice' id='dep-advice' ></textarea>
        </div>
        
        <div  class="join-send">Submit</div>
    </form>

js : 获取要发送大的信息,并发送到php文件

 $(document).ready(function(){	
     var qurl = window.location.origin;
     $(".join-send").click(function () {
        var formData = new FormData($("form")[0]);
        $.ajax({
        	url: qurl + "/wp-content/themes/kimsun/join-us.php",
        	data: formData,
        	type: "POST",
        	async: true,
        	cache: false,
        	contentType: false,
        	processData: false,
        	success: function (msg) {
        		console.log("返回值",msg)
        	},
        	error: function (msg) {
        	
        	},
        })
    })
})

php: 接收到信息并发送

网易SMTP服务器的授权码在
首页->邮箱中心(点那个+)->客户端授权码->开启->设置授权码(授权码是用于登录第三方邮件客户端的专用密码。)
设置好之后在上面php中填入授权码即可。

<?php 
    ini_set('max_execution_time','1000');
    header("Content-Type:text/html;charset=utf-8");
	$curlPost="";

    if(isset($_POST['dep-advice'])||!empty($_POST['dep-advice'])){
        $depAdvice =  $_POST['dep-advice'];
        $curlPost = $curlPost."<div style='font-size: 16px;color: #666;'>advice:".($depAdvice).'</div>';
    }

   echo $curlPost;
   $_POST['title'] = 'join us';
   $_POST['content'] = $curlPost;
   $_POST['toemail'] = '[email protected]';
   require_once "Smtp.class.php";
   //******************** 配置信息 ********************************
   $smtpserver = "smtp.163.com";//SMTP服务器
   $smtpserverport = 25;//SMTP服务器端口
   $smtpusermail = "[email protected]";//SMTP服务器的用户邮箱
   $smtpemailto = $_POST['toemail'];//发送给谁
   $smtpuser = "1296936373";//SMTP服务器的用户帐号,注:部分邮箱只需@前面的用户名
   $smtppass = "123456";//SMTP服务器的用户密码
   $mailtitle = $_POST['title'];//邮件主题
   $mailcontent = "<h1>".$_POST['content']."</h1>";//邮件内容
   $mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件
   //************************ 配置信息 ****************************
   $smtp = new Smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.
   $smtp->debug = false;//是否显示发送的调试信息
   $state = $smtp->sendmail($smtpemailto, $smtpusermail, $mailtitle, $mailcontent, $mailtype);
  
   if($state==""){
        echo 0;
   }else if(strlen($state)!=0){
        echo 1;
    }else{
        echo 2;
    }
?>



引用的Smtp.class.php

sendmail函数里可以配置抄送人( $cc)、密送人($bcc)

<?php

/* smtp class */
class smtp {
    /* Public Variables */
    var $smtp_port;
    var $time_out;
    var $host_name;
    var $log_file;
    var $relay_host;
    var $debug;
    var $auth;
    var $user;
    var $pass;
    /* Private Variables */
    var $sock;
    /* Constractor */
    function smtp($relay_host = "", $smtp_port = 25, $auth = false, $user, $pass) {
        $this->debug = FALSE;
        $this->smtp_port = $smtp_port;
        $this->relay_host = $relay_host;
        $this->time_out = 30; //is used in fsockopen()
        //
        $this->auth = $auth; //auth
        $this->user = $user;
        $this->pass = $pass;
        //
        $this->host_name = "localhost"; //is used in HELO command
        $this->log_file = "";
        $this->sock = FALSE;
    }
    /* Main Function */
    function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "") {
        $mail_from = $this->get_address($this->strip_comment($from));
        $body = preg_replace("/(^|(\r\n))(\.)/", "\1.\3", $body);
        $header = "MIME-Version:1.0\r\n";
        if ($mailtype == "HTML") {
            $header.= "Content-Type:text/html\r\n";
        }
        $header.= "To: " . $to . "\r\n";
        if ($cc != "") {
            $header.= "Cc: " . $cc . "\r\n";
        }
        $header.= "From: $from<" . $from . ">\r\n";
        $header.= "Subject: " . $subject . "\r\n";
        $header.= $additional_headers;
        $header.= "Date: " . date("r") . "\r\n";
        $header.= "X-Mailer:By Redhat (PHP/" . phpversion() . ")\r\n";
        list($msec, $sec) = explode(" ", microtime());
        $header.= "Message-ID: <" . date("YmdHis", $sec) . "." . ($msec * 1000000) . "." . $mail_from . ">\r\n";
        $TO = explode(",", $this->strip_comment($to));
        if ($cc != "") {
            $TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
        }
        if ($bcc != "") {
            $TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
        }
        $sent = TRUE;
        foreach ($TO as $rcpt_to) {
            $rcpt_to = $this->get_address($rcpt_to);
            if (!$this->smtp_sockopen($rcpt_to)) {
                $this->log_write("Error: Cannot send email to " . $rcpt_to . "\n");
                $sent = FALSE;
                continue;
            }
            if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
                $this->log_write("E-mail has been sent to <" . $rcpt_to . ">\n");
            } else {
                $this->log_write("Error: Cannot send email to <" . $rcpt_to . ">\n");
                $sent = FALSE;
            }
            fclose($this->sock);
            $this->log_write("Disconnected from remote host\n");
        }
        return $sent;
    }
    /* Private Functions */
    function smtp_send($helo, $from, $to, $header, $body = "") {
        if (!$this->smtp_putcmd("HELO", $helo)) {
            return $this->smtp_error("sending HELO command");
        }
        //auth
        if ($this->auth) {
            if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
                return $this->smtp_error("sending HELO command");
            }
            if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
                return $this->smtp_error("sending HELO command");
            }
        }
        //
        if (!$this->smtp_putcmd("MAIL", "FROM:<" . $from . ">")) {
            return $this->smtp_error("sending MAIL FROM command");
        }
        if (!$this->smtp_putcmd("RCPT", "TO:<" . $to . ">")) {
            return $this->smtp_error("sending RCPT TO command");
        }
        if (!$this->smtp_putcmd("DATA")) {
            return $this->smtp_error("sending DATA command");
        }
        if (!$this->smtp_message($header, $body)) {
            return $this->smtp_error("sending message");
        }
        if (!$this->smtp_eom()) {
            return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
        }
        if (!$this->smtp_putcmd("QUIT")) {
            return $this->smtp_error("sending QUIT command");
        }
        return TRUE;
    }
    function smtp_sockopen($address) {
        if ($this->relay_host == "") {
            return $this->smtp_sockopen_mx($address);
        } else {
            return $this->smtp_sockopen_relay();
        }
    }
    function smtp_sockopen_relay() {
        $this->log_write("Trying to " . $this->relay_host . ":" . $this->smtp_port . "\n");
        $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
        if (!($this->sock && $this->smtp_ok())) {
            $this->log_write("Error: Cannot connenct to relay host " . $this->relay_host . "\n");
            $this->log_write("Error: " . $errstr . " (" . $errno . ")\n");
            return FALSE;
        }
        $this->log_write("Connected to relay host " . $this->relay_host . "\n");
        return TRUE;;
    }
    function smtp_sockopen_mx($address) {
        $domain = preg_replace("/^.+@([^@]+)$/", "\1", $address);
        if (!@getmxrr($domain, $MXHOSTS)) {
            $this->log_write("Error: Cannot resolve MX \"" . $domain . "\"\n");
            return FALSE;
        }
        foreach ($MXHOSTS as $host) {
            $this->log_write("Trying to " . $host . ":" . $this->smtp_port . "\n");
            $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
            if (!($this->sock && $this->smtp_ok())) {
                $this->log_write("Warning: Cannot connect to mx host " . $host . "\n");
                $this->log_write("Error: " . $errstr . " (" . $errno . ")\n");
                continue;
            }
            $this->log_write("Connected to mx host " . $host . "\n");
            return TRUE;
        }
        $this->log_write("Error: Cannot connect to any mx hosts (" . implode(", ", $MXHOSTS) . ")\n");
        return FALSE;
    }
    function smtp_message($header, $body) {
        fputs($this->sock, $header . "\r\n" . $body);
        $this->smtp_debug("> " . str_replace("\r\n", "\n" . "> ", $header . "\n> " . $body . "\n> "));
        return TRUE;
    }
    function smtp_eom() {
        fputs($this->sock, "\r\n.\r\n");
        $this->smtp_debug(". [EOM]\n");
        return $this->smtp_ok();
    }
    function smtp_ok() {
        $response = str_replace("\r\n", "", fgets($this->sock, 512));
        $this->smtp_debug($response . "\n");
        if (!preg_match("/^[23]/", $response)) {
            fputs($this->sock, "QUIT\r\n");
            fgets($this->sock, 512);
            $this->log_write("Error: Remote host returned \"" . $response . "\"\n");
            return FALSE;
        }
        return TRUE;
    }
    function smtp_putcmd($cmd, $arg = "") {
        if ($arg != "") {
            if ($cmd == "") $cmd = $arg;
            else $cmd = $cmd . " " . $arg;
        }
        fputs($this->sock, $cmd . "\r\n");
        $this->smtp_debug("> " . $cmd . "\n");
        return $this->smtp_ok();
    }
    function smtp_error($string) {
        $this->log_write("Error: Error occurred while " . $string . ".\n");
        return FALSE;
    }
    function log_write($message) {
        $this->smtp_debug($message);
        if ($this->log_file == "") {
            return TRUE;
        }
        $message = date("M d H:i:s ") . get_current_user() . "[" . getmypid() . "]: " . $message;
        if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {
            $this->smtp_debug("Warning: Cannot open log file \"" . $this->log_file . "\"\n");
            return FALSE;;
        }
        flock($fp, LOCK_EX);
        fputs($fp, $message);
        fclose($fp);
        return TRUE;
    }
    function strip_comment($address) {
        $comment = "/\([^()]*\)/";
        while (preg_match($comment, $address)) {
            $address = preg_replace($comment, "", $address);
        }
        return $address;
    }
    function get_address($address) {
        $address = preg_replace("/([ \t\r\n])+/", "", $address);
        $address = preg_replace("/^.*<(.+)>.*$/", "\1", $address);
        return $address;
    }
    function smtp_debug($message) {
        if ($this->debug) {
            echo $message;
        }
    }
}
?>         

git查看本地分支对应远程哪个分支

  • git branch -vv
    可查看对应分支信息
dev    2348b79 [origin/dev: ahead 3, behind 4] add
* i18n   0e7acc6 [origin/i18n: ahead 4, behind 18] i18n translate
master 640fd9e changes
 

上面第一行前面dev表示的是本地分支名,后面方括号里面的[origin/dev]表示的是本地分支dev对应的远程分支。

  • git config --list
    可查看配置列表
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
diff.astextplain.textconv=astextplain
rebase.autosquash=true
credential.helper=manager
user.name=deepthan
[email protected]
credential.helper=store
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
remote.origin.url=https://github.com/deepthan
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.dev.remote=origin
branch.dev.merge=refs/heads/dev

判断浏览器及其版本

1. 可耐的IE,利用其特性进行区别

  • IE9及以下可以用条件注释法
关键词 释义 例子 实际用法
[if !IE] <!--[if !IE]>不是IE浏览器则执行这里的代码<![endif]-->
lt 小于 [if lt IE 9] <!--[if lt IE9] >小于IE9则执行这里的代码 <![endif]-->
lte 小于或等于 [if lte IE 9] <!--[if lte IE9] >小于或等于IE9则执行这里的代码 <![endif]-->
gt 大于 [if gt IE 9] <!--[if gt IE9] >大于IE9则执行这里的代码 <![endif]-->
gte 大于或等于 [if gte IE 9] <!--[if gte IE9] >大于或等于IE9则执行这里的代码 <![endif]-->
  • IE10/11不支持条件性注释后的替代方法

当IE的版本到到达10/11后,开始不支持上述条件性注释。可采用如下办法:

1. 使用 IE=EmulateIE9 属性让浏览器采用IE9渲染技术
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9">

让浏览器采用IE9渲染技术,IE10/11就能识别条件性注释了吗,但是采用IE9渲染技术,你真的不怕吗?

2. 使用媒体查询语句+-ms-high-contrast属性,解析css

CSS的媒体查询语句(media query)是一种高级的CSS条件语句,它能根据一些属性和属性值计算判断CSS是否可以生效。在这里,我们要使用一个IE10/11独有的属性,它就是-ms-high-contrast,只有IE10/11实现了这个属性,它可以有两个值active或none,使用下面的媒体查询语句:

@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
/* IE10+ CSS styles go here */
}

火狐浏览器、谷歌浏览器不能识别这个属性,所以不会执行这个查询语句里的CSS,从而实现了条件性执行的效果。

3. 使用Javascript判断浏览器的类型,针对IE10/11写css

先用JavaSCript判断是否是IE浏览器,如果是,就在页面的标记上添加一个“ie”的类名:

var ms_ie = false;
var ua = window.navigator.userAgent;
var old_ie = ua.indexOf('MSIE ');
var new_ie = ua.indexOf('Trident/');
    
if ((old_ie > -1) || (new_ie > -1)) {
    ms_ie = true;
}
    
if ( ms_ie ) {
   document.documentElement.className += " ie";
}

有了这个标志性css class后,我们就可以在CSS里区别性的编写css代码了。

.testClass{
    /*这里写通用的css*/ 
}

.ie .testClass{
    /*这里写专门针对IE的css*/
}

2. 判断浏览器和版本信息

判断当前浏览类型及IE浏览器版本

function BrowserType() 
 { 
   var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 
   var isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器 
   // var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器 
   var isIE=window.ActiveXObject || "ActiveXObject" in window
   // var isEdge = userAgent.indexOf("Windows NT 6.1; Trident/7.0;") > -1 && !isIE; //判断是否IE的Edge浏览器 
   var isEdge = userAgent.indexOf("Edge") > -1; //判断是否IE的Edge浏览器
   var isFF = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器 
   var isSafari = userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") == -1; //判断是否Safari浏览器 
   var isChrome = userAgent.indexOf("Chrome") > -1 && userAgent.indexOf("Safari") > -1&&!isEdge; //判断Chrome浏览器 
  
   if (isIE)  
   { 
      var reIE = new RegExp("MSIE (\\d+\\.\\d+);"); 
      reIE.test(userAgent); 
      var fIEVersion = parseFloat(RegExp["$1"]); 
      if(userAgent.indexOf('MSIE 6.0')!=-1){
        return "IE6";
      }else if(fIEVersion == 7) 
        { return "IE7";} 
      else if(fIEVersion == 8) 
        { return "IE8";} 
      else if(fIEVersion == 9) 
        { return "IE9";} 
      else if(fIEVersion == 10) 
        { return "IE10";} 
      else if(userAgent.toLowerCase().match(/rv:([\d.]+)\) like gecko/)){ 
            return "IE11";
        } 
      else
        { return "0"}//IE版本过低
    }//isIE end 
      
    if (isFF) { return "FF";} 
    if (isOpera) { return "Opera";} 
    if (isSafari) { return "Safari";} 
    if (isChrome) { return "Chrome";} 
    if (isEdge) { return "Edge";} 
  }//myBrowser() end 

  alert(BrowserType());



关于IE各版本浏览器判别的方法整理

// 下面是支持ie11的版本的,当然ie6-10也是支持的
    function isIE() { //ie?
        if (window.ActiveXObject || "ActiveXObject" in window){
            return true;
         }else{
            return false;
         }
    }
    
    alert(isIE())   
    IE11的userAgent里是没有MSIE标志的,,所以只可以判断IE10及10以下浏览器
    function isIE(){
        if (window.navigator.userAgent.indexOf("MSIE")>=1) 
        return true; 
        else
        return false; 
    }

    
    

    // //可以判断IE10及10以下浏览器,因为IE11不支持document.all了
     if(document.all){  
        alert("is   IE!");  
      }
      
    
    //判断是否是IE8及以下版本的浏览器
    //原理是利用了IE8及以下版本的浏览器与标准浏览器在处理数组的toString方法的差异做成的。
    //-[1,]是为了实现该方法
    //对于标准游览器,如果数组里面最后一个字符为逗号,JS引擎会自动剔除它
    var ie = !-[1,]; 
    if(ie){
        alert('IE8及以下版本的浏览器');
    }else{
        alert('不是IE8及以下版本的浏览器');
    }


    //判断IE11
    if(navigator.userAgent.toLowerCase().match(/rv:([\d.]+)\) like gecko/)){
        alert('IE11')
    }else{
        alert('不是IE11')
    }


    //支持Edge
    var isEdge = navigator.userAgent.indexOf("Edge") > -1; //判断是否IE的Edge浏览器
    if(isEdge){
        alert('Edge');
    }else{
        alert('不是Edge');
    }

参考:

  1. 条件注释判断浏览器
  2. IE10/11不支持条件性注释后的替代方法
  3. Conditional comments are no longer supported
  4. 用js判断浏览器类型及IE具体各版本,支持IE11及Edge浏览器

浏览器渲染过程

前端关心的三大主题:可访问性、加载性能(和浏览器的渲染机制关系密切)和重构灵活

一. 浏览器如何渲染页面

浏览器请求、加载、渲染一个页面,会经历:

  1. DNS 查询
  2. TCP 连接
  3. HTTP 请求即响应
  4. 服务器响应
  5. 客户端渲染(本文内容)
  • 1.1 浏览器解析

解析过程

  1. 浏览器通过请求的URL进行域名解析到ip,向服务器发起请求,接收文件(HTML/SVG/XHTML、CSS、JS、IMG等) ;
  2. 解析HTML/SVG/XHTML并构建 DOM Tree(Webkit有三个C++的类对应这三类文档);
  3. 解析CSS会产生CSS规则树(CSS Rule Tree);
  4. JavaScript脚本文件加载后,通过DOM API和 CSSOM API来操作 DOM Tree 和CSS Rule Tree。

DOM解析成DOM Tree

<html>
<head>
    <title>DOM解析</title>
</head>
<body>
    <div>
        <h3>标题</h3>
        <p>内容1
            <span class='second-detail'>内容2</span>
        </p>
        
    </div>
</body>
</html>

解析结果:

graph LR
html--> head
head--> title
title--> DOM解析
html--> body
body--> div
div--> h3
h3--> 标题
div--> p
p--> 内容1
p--> span
span--> 内容2

CSS解析成 CSS Rule Tree

div { margin-left:1px } /* 用 1 代表它 */
h3 { margin-left:2px } /* 用 2 代表它 */
p { margin-left:3px } /* 用 3 代表它 */
.second-detail { margin-left:4px } /* 用 4 代表它 */

解析结果:B: 1 的意思是规则节点指向的具体规则。

graph LR
A:null--> B:1
A:null--> C:2
A:null--> D:3
D:3--> E:4

CSS与DOM结合的上下文树,div:B 的意思是节点名指向的规则节点

graph LR
html:A--> body:A
body:A--> div:B
div:B--> h3:C
div:B--> p:D
p:D--> 内容1:A
p:D--> span:E

  • 1.2 浏览器渲染
  1. 计算CSS样式
  2. 解析完成后浏览器引擎通过 DOM Tree 和 CSS Rule Tree 来构建Renderting Tree
  3. Flow或Layout :通过CSS Rule Tree 匹配 DOM Tree进行定位坐标和大小,是否换行,以及position、overflow、z-index等等属性。
  4. 最终通过调用Native GUI 的API绘制网页画面的过程称为Paint。

注意: Rendering Tree 渲染树并不等同于DOM树,因为一些像Header或display:none的 东西就不在渲染树中了。

  • 1.3 简要概括整个过程:
  1. 检查HTML并构建DOM
  2. 检查CSS并构建CSSOM
  3. Web浏览器将DOM和CSSOM结合,并构建出render tree
  4. 调用Native GUI 的API绘制Web页面
  • 1.4 重绘(repaint)和回流(reflow)

当用户浏览网页时进行交互或JS脚本改变页面结构时,页面会进行重新渲染: 重绘或回流。

重绘

元素的几何尺寸没有变,只是屏幕的一部分要重画。
如改变元素的颜色,背景色等。

回流

元素的几何尺寸改变时会影响到其他元素的位置或结构时页面需要重新验证并计算Render Tree。
以下可能会产生 Reflow:

  • 一些Javascript操作DOM Tree(增加/删除等)
  • css属性发生变化
  • 元素尺寸改变
  • 文本内容改变
  • 浏览器窗口改变大小或拖动
  • 动画效果进行计算和改变 CSS 属性值
  • 伪类激活(:hover)
  • 修改网页的默认字体

如图片载入是一个可以避免的reflow—— 构建DOM tree的时候遇到img标签会直接读取后面的内容而不是等待图片加载完再进行,这样会导致图片加载完了会进行回流,之前浏览器所做的都是无用功。解决办法是设置宽度和高度这样浏览器就知道了图片的占位面积,在载入图片前就预留好了位置。

注:display:none会触发reflow,而visibility:hidden只会触发repaint,因为没有发现位置变化。

有fixed的背景图,或是有些元素不跟着滚动,滚屏也有可能会造成reflow。

性能比较

  HTML 使用的是 flow based layout ,也就是流式布局,所以,如果某元件的几何尺寸发生了变化,需要重新布局,也就叫 Reflow.  Reflow 的成本比 Repaint 的成本高得多的多。一个结点的 Reflow 很有可能导致子结点,甚至父点以及同级结点的 Reflow 。

  浏览器不会你每改一次样式,它就 Reflow 或 Repaint 一次。一般来说,浏览器会把这样的操作积攒一批,然后做一次 Reflow ,这又叫异步 reflow 或增量异步 Reflow 。但是有些情况浏览器是不会这么做的,比如:Resize 窗口,改变了页面默认的字体,等。对于这些操作,浏览器会马上进行 Reflow 。

  但是有些时候,我们的脚本会阻止浏览器这么干,比如:如果我们请求下面的一些DOM值:

offsetTop,
offsetLeft, 
offsetWidth, 
offsetHeight,
scrollTop/Left/Width/Height,
clientTop/Left/Width/Height,
IE中的 getComputedStyle(), 或 currentStyle

因为,如果我们的程序需要这些值,那么浏览器需要返回最新的值,而这样一样会flush出去一些样式的改变,从而造成频繁的reflow/repaint。

二. 优化渲染速度

  1. 指定文档编码类型,如 <meta charset="utf-8">;
  2. CSS 样式应该包含在 中, Javascript 脚本出现在 末尾;
  3. 减少 CSS 嵌套层级和选择适当的选择器;
    CSS选择器对性能的影响源于浏览器匹配选择器和文档元素时所消耗的时间。它是从右到左进行规则匹配的。
    .nav > p {font-size:12px},浏览器必须遍历页面中所有的 a 元素并且确定其父元素的 class 是否为 nav 。我们把最右边选择符(这里是p)称之为关键选择器。
    Google 资深web开发工程师 Steve Souders 对 CSS 选择器的执行效率从高到低做了一个排序:
1.id选择器(#)
2.类选择器(.)
3.标签选择器(div)
4.相邻选择器(div+p)
5.子选择器(div < p)
6.后代选择器(div p)
7.通配符选择器(*)
8.属性选择器(div[attr="attr"])
9.伪类选择器(div:nth-child)
  • 避免使用通用选择器 *
  • 避免使用标签或 class 选择器限制 id 选择器 div#nav , .nav#nav
  • 避免使用标签限制 class 选择器 div.nav
  • 避免使用多层标签选择器。使用 class 选择器替换,减少css查找
  • 避免使用子选择器
  • 使用继承(继承性:从自己开始到自己后代最小的元素),color text-开头的,line-开头的 font-开头的 都是继承的,关于盒子的 定位的,布局的都是不能继承的。
  1. 不要通过 JS 逐条修改 DOM 的样式,提前定义好 CSS 的 Class 进行操作;
  2. 尽量减少将 DOM 节点属性值放在循环当中,会导致大量读写此属性值;
  3. 尽可能的为产生动画的 HTML 元素使用 fixed 或 absolute 的 position ,那么修改他们的 CSS 是不会 Reflow 的;
  4. DOM树要小,CSS尽量用id和class,千万不要过渡层叠下去。
  5. 千万不要使用table布局。因为可能很小的一个小改动会造成整个table的重新布局。
  6. 尽可能的修改层级比较低的DOM。当然,改变层级比较底的DOM有可能会造成大面积的reflow,但是也可能影响范围很小

三. 相关名字详解

3.1 CSSOM

    CSS Object Model,css对象模型。它将样式表中的规则映射到页面对应的元素上。CSSOM识别tokens并把这些tokens转换成一个树结构上的对应的结点。所有结点以及它们所关联的页面中的样式就是所谓的CSS Object Model。
    有啥作用呢?

  • CSSOM 阻止任何东西渲染
    所有的css都是组织渲染的,因为css没处理好之前如果显示页面的话元素样式会一直在变化中,所以页面会等待所有css检查完再展示页面。CSSOM被用作创建render tree,如果不能高效的利用CSS会导致页面在加载时白屏。
  • CSSOM 在加载一个新页面时必须重新构建
    即使css文件被缓存了,但是只会节省加载css的时间,CSSOM却会重新构建,所以让页面加载速度变快的方法是写出好的css。
  • 页面中CSS的加载和页面中javascript的加载是有关系的
    javascript的加载很可能会阻塞CSSOM的构建(js可以改变css),在 CSSOM构建好之前页面上什么都不会展示出来(白屏)。

工具

  1. 查看浏览器渲染成本 speedTracer

如何让页面加载得更快:

  1. Optimize your critical rendering path
  2. Make sure your pages are calling stylesheets before javascripts.
  3. Ensure you are optimizing CSS delivery.
  4. Google – Web Performance Best Practices
  5. Yahoo – Best Practices for Speeding Up Your Web Site
  6. Steve Souders – 14 Rules for Faster-Loading Web Sites

参考文章

php抓取页面内容

抓取页面内容

首先抓取整个页面的html:

 $backInfo = file_get_contents($url);

匹配需要抓取的内容 :

// 要抓取的:<div class="check-data dis-none"></div> 内的内容
$regex='/<div class=\"check-data dis-none\".*?>.*?<\/div>/ism'; 
preg_match($regex,$backInfo,$matchTitle1);

$matchTitle 就是抓取成功的返回值,抓取的内容为array 所以要转成字符串:

 $matchTitle2 = implode("",$matchTitle1);

再在获取到的“

需要的内容
”这个里面截取需要的内容:

 preg_match('/<div class=\"check-data dis-none\">(.*?)<\/div>/', $matchTitle2, $matchTitle3);

$matchTitle3是一个数组,所以取出来内容的话用

$matchTitle3[1];

什么时候要用?
做安全性校验。。。的时候

首先js获取用户的信息、当前活动的标题、时间、地点、当前的url。传到php,之后php再抓取页面的内容,利用php正则匹配出来与传递过来的数据进行验证,若一致则请求后端接口,若不同则提示请检查项目信息后再试!

JavaScript权威指南(第六版)笔记

一: 语法结构

1.1 字符集

JavaScript程序是Unicode字符集编写的,Unicode是ASCII和Latin-1的超集。

1.2 区分大小写

js是区分大小写的,HTML不区分大小写。

1.3 标识符

标识符就是一个名字,用来对变量和函数进行命名,或用做JavaScript代码中某些循环语句中的跳转位置的标记。
js的标识符必须以 字母、下划线(_)或美元符($)开始,后续的可以是字母、数字、下划线或美元符。

1.4 关键字&保留字

  • 关键字 :js把一些标识符拿出来用作自己的关键字,因此,就不能再在程序中把这些关键字用作标识符了。
关键字 关键字 关键字 关键字 关键字
break delete function return typeof
case do if switch var
catch else in this void
continue false instanceof throw while
debugger finally new true with
default for null try
  • 保留字:关键字在当前版本没有用到但是在未来版本可能会用到。
    保留字 保留字 保留字 保留字 保留字

class | const | enum | export | extends
import | super | implements | let | private
public | yield | interface | package | protected
static |

  • 严格模式同样对下面的标识符的使用做了限制,它们不能用作变量名、函数名或参数名
name name
arguments eval
  • js预定义了很多全局变量和函数,应当避免把它们的名字用作变量名和函数名
name name name name name
arguments encodeURI Infinity Number RegEXP
Array encodeURIComponent isfinite Object String
Boolean Error isNaN parseFloat SyntaxError
Date eval JSON parseInt TypeError
decodeURI EvalError Math RangeError undefined
decodeURIComponent Function NaN ReferenceError URIError

二:类型、值和变量

js数据类型分为两类:原始类型(primitive type)和对象类型(object type)
  • 原始类型
    包括 数字、字符串、布尔值、null、undefined 。
    变量是直接按值存放的,存放在栈内存中的简单数据段,可以直接访问。
  • 对象(引用)类型
    包括数组、函数、对象。
    存放在堆内存中的对象,变量保存的是一个指针,这个指针指向另一个位置。当需要访问引用类型(如对象,数组等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。

怎么解释呢?

^-^ 小例子瞬间理解

  • 用钱买东西:其实我们的口袋就像是栈,银行就像是堆,要买的物品就变量,要付的钱就是原始类型或引用类型。
  • 我们买一包辣条(变量)从口袋(栈)拿出钱(原始类型)付款,钱(原始类型)是在口袋(栈)的,付钱速度是非常快的;
  • 如果我们买车(变量)的话也得付钱,这个钱刷银行卡(引用类型),钱在银行(堆),银行卡(引用类型)相当于指针指向你存在银行的大么一大堆钱,不管你在银行存多少钱,你的银行卡大小是固定的。你如果直接带那么多钱(原始类型)放在口袋(栈),会撑爆的~ 所以得带银行卡(引用类型),钱放在银行(堆)。
    ^-^

为变量赋值时,JavaScript的解释程序必须判断该值是原始类型还是引用类型。解析程序则需尝试判断该值是否为JavaScript的原始类型之一。由于这些原始类型占据的空间是固定的,所以可将它们存储在较小的内存区域栈中。这样存储便于迅速查找变量的值。

如果一个值是引用类型,那么它的存储空间会从堆中分配,由于引用值的大小会改变,所以不能将它放在栈中,否则会降低变量查询速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址,地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。

js数据类型也可以分为可变类型(mutable)和不可变类型(immutable)
  • 可变类型(引用类型内容)
    包括数组、函数、对象。
  • 不可变类型(原始类型内容)
    数字、字符串、布尔值、null、undefined 。
    在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。JavaScript 打破了这一传统。
堆(heap)和栈(stack)区别:

堆和栈都是内存中的一部分,有着不同的作用,而且一个程序需要在这片区域上分配内存。

区别 堆(heap) 栈(stack)
空间分配 大小需要自己申请,并指明大小 系统自动分配释放
存储区 队列优先,先进先出(FIFO—first in first out) 先进后出(FILO—First-In/Last-Out)
缓存方式 二级缓存,生命周期由虚拟机的垃圾回收算法来决定 一级缓存,被调用时处于存储空间中,调用完毕立即释放。
申请效率 由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 速度较快。但程序员是无法控制的。
那么问题来了,引用类型怎么比较是否相等呢?

比如两个单独的对象或数组必须比较它们的属性或元素:

function equalArrays(a,b){
    if(a.length != b.length) return false;  //两个长度不同的数组不相等
    for(var i = 0; i<a.length; i++){
        if(a[i] != b[i]) return false;
    }
    return true;
}
趁热理解浅拷贝和深拷贝

对于原始类型如字符串,浅拷贝是对值的复制,对于引用类型如对象来说,浅拷贝是对对象地址的复制。
如前面的买东西的例子:

  • 浅拷贝: 对于买辣条付的钱(原始类型)的复制,是真的钱;而买车是对银行卡(引用类型)的复制,两个卡都指向同一个账户,银行里的同一堆钱,而不是新开了一个账户(堆)。一个卡里面钱用了一点另外一个卡钱有会少。
  • 深拷贝: 买辣条付的钱(原始类型)的复制,是真的钱;而买车是对银行那堆钱(堆)的复制,变成了另外一堆钱,重新开一个账户办个卡(引用类型)对应着它,即使你把新卡钱花完了也不会影响之前的卡。

2.1 数字

在js真实运行环境中, 0.3-0.2 = 0.099 999 999 999 999 98

2.2 转义字符

转义字符 含义
\n 换行符
\f 换页符
\r 回车符
\" 双引号
\' 单引号
\\ 反斜线

2.3 null 和 undefined

  • 对null执行typeof预算,结果返回字符串
  • "object",它表示数字、字符串、对象是“无值的”。
    undefined表示变量没有被初始化,这个属性或元素不存在。它的值是‘未定义’
    它们都表示值得空缺,运算符‘==’ 会认为它们是相等的, '==='可以判断出来。

2.4 全局对象

全局对象属性是全局定义的符号,js程序可以直接使用。

  • 全局属性 : 比如 undefined、Infinity 和 NaN
  • 全局函数 : 比如 isNaN()、parseInt() 和 eval()
  • 构造函数 : 比如 Data()、RegExp()、String()、Object()和 Array()
  • 全局对象 : 比如 Math 和 JSON

2.5 包装对象

存取字符串、数字或布尔值属性时创建的临时对象称为包装对象。
js对象是一种复合值:它是属性或已命名值的集合,通过‘.’符号来引用属性值,当属性值是一个函数的时候,称其为方法。

var str = 'hello world';
var newstr = str.substring(str.indexof(" ")+1, str.length);  // 使用字符串的属性

只要引用了字符串str的属性,JavaScript就会将字符串值通过调用 new String(str) 的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用,一旦属性引用结束,这个新创建的对象就会被销毁。

数字和字符串可以通过 Number() 和 Boolean()构造函数创建一个临时对象,它们的属性都是可读的,不能给它们定义新的属性。

2.6 不可变的原始值和可变的对象引用

js中的原始值(undefined、null、布尔值、数字和字符串)与对象(数组和函数)有着本质区别:

  • 原始值的比较是值的比较
    原始值是不可更改的,任何方法都无法更改一个原始值。原始值的比较只有当它们的值相等时它们才相等。
var str = 'hello';   //定义一个文本
s.toUpperCase();     // 返回 'HELLO',但是没有改变s的值,它返回的是一个新的字符串的值
console.loh("s的值",s)  // 打印出'hello' ,s的值并没被改变
  • 对象的比较是引用的比较

它们的值是可修改的。

var o = { x : 1 };   // 定义一个对象
o.x  = 2 ;   // 通过修改对象的属性值来更改对象

对象通常称为引用类型(reference type),对象值都是引用,对象的比较均是引用的比较, 当且仅当它们引用同一个基对象时,它们才相等。

var a = [1,2,3];  // 定义一个变量a,引用数组 [1,2,3] 
var b = a;    // 变量b引用同一个数组
b[0] = 4;    // 通过变量b来修改引用的数组
a[0];       // => 4, 变量a也会修改,因为他们引用的是同一个数组
a === b    // true, a和b引用的同一个数组,所以他们相等。

将对象(数组)赋值给变量a,仅仅是赋值的引用值,对象(数组)本身并没有复制一次。

  • 如果想要得到对象或数组的副本,则必须显式复制对象的每个属性或数组的每个元素: 通过循环来完成数组复制
var a = [1,2,3];  // 待复制的数组
var b = [];       // 目标数组
for(var i = 0; i<a.length; i++){  // 遍历 a引用的数组的每个元素
  b[i] = a[i];    // 将元素复制到b中 
}
  • 那么怎么比较数组和对象呢?
    必须比较它们的属性或元素
function equalArrays(a,b){
    if(a.length != b.length) return false;  //两个长度不同的数组不相等
    for(var i = 0; i<a.length; i++){
        if(a[i] != b[i]) return false;
    }
    return true;
}

2.7 类型转换

JavaScript中的取值非常灵活,它将根据需要自行转换类型。

值 --> 转换 字符串 数字 布尔值 对象
undefined "undefined" NaN false throws TypeError
null "null" 0 false throws TypeError
true "true" 1 new Boolean(true)
false "false" 0 new Boolean(false)
""(空字符串) 0 false new String("")
"1.2"(非空数字) 1.2 true new String("1.2")
"one"(非空、非数字) NaN true new String("one")
0 "0" false new Number(0)
[] "" 0 true
  • parseInt(string, radix)
    • radix 为10 ,10进制
      parseInt("10",10) --> 1*10^1 + 0*10^0 = 10
    • radix 为2, 2进制
      parseInt("10",2) --> 1*2^1 + 0*2^0 = 2
    1. 参数
      string : 要被解析的值。如果参数不是一个字符串,则将其转换为字符串(使用 ToString 抽象操作)。字符串开头的空白符将会被忽略。
      radix : 一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。比如参数"10"表示使用我们通常使用的十进制数值系统。通常将值默认为10。
    2. 返回值
      返回解析后的整数值。如果被解析参数的第一个字符无法被转化成数值类型,则返回 NaN。
    3. 描述
      把第一个参数转换为字符串并解析它,并返回一个整数或NaN,如果不是NaN,返回的值将是作为指定基数中的数字的第一个参数的整数。
  • parseFloat(string)
    exp : parseFloat("3.14") -- > 3.14
    1. 参数
      string: 需要被解析成为浮点数的字符串.
    2. 描述
      parseFloat是个全局函数,不属于任何对象.将它的字符串参数解析成为浮点数并返回.如果在解析过程中遇到了正负号(+或-),数字(0-9),小数点,或者科学记数法中的指数(e或E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数.同时参数字符串首位的空白符会被忽略.
      如果参数字符串的第一个字符不能被解析成为数字,则parseFloat返回NaN.
      你可以通过调用isNaN函数来判断parseFloat的返回结果是否是NaN.如果让NaN作为了任意数学运算的操作数,则运算结果必定也是NaN.
      parseFloat 也可转换和返回Infinity值. 可以使用isFinite 函数来判断结果是否是一个有限的数值 (非Infinity, -Infinity, 或 NaN).

三: 表达式和运算符

3.1 递增 ‘++’、递减‘--’

  1. 当运算符(++)在操作数之前, ++i,对操作数进行增量计算,并返回计算后的值,称为前增量。
  2. 当运算符(++)在操作数之后,i++,它对操作数进行增量运算,但返回的是未做增量计算的值。
var i = 1, j = ++i;  // i = 2, j = 2; 数之前,返回加后的
var i = 1, j = i++;  // i = 2, j = 1; 数之后,返回没加的

‘--’同理。

四:对象

对象是JavaScript基本数据类型。对象是一种复合值,它将很多值复合在一起,可通过名字访问这些值,对象也可以看做是属性的无序集合。属性名是字符串,我们可以把对象那个看成是从字符串到值的映射。它还可以一个称为原型的对象继承属性。对象的方法通常是继承的属性。这种‘原型式继承’是js 的核心特征。

4.1 JavaScript三类对象和两类属性

  • 内置对象(native object)
    是 ECMAScript规范定义的对象或类,例如数组、函数、日期、正则表达式。
  • 宿主对象(host object)
    是有JavaScript解释器所嵌入的宿主环境(比如web浏览器)定义的。客户端JavaScript中表示网页结构的HTMLElement对象均是宿主对象。
  • 自定义对象(user-defined object)
    由运行在JavaScript代码创建的对象。
  • 自有属性(own property)
    直接在对象中定义的属性
  • 继承属性(inherited property)
    在对象的原型对象中定义的属性。

4.2 创建对象

4.2.1 对象直接量
var empty = {}; 
4.2.2 通过new创建对象

new 运算符创建并初始化一个新对象。其后跟随一个函数调用,这个函数称为构造函数。

var empty = new Object();
4.2.3 原型

每一个JavaScript对象(null除外),都和原型相关联,每一个对象都从原型继承属性。
所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过JavaScript代码 Object.prototype获得对原型对象的引用。通过关键词new和构造函数调用创建的对象的原型就是构造函数prototype属性的值。因此同使用{}创建对象一样,通过new Object()创建的对象也继承自 Object.prototype。同样,通过new Array()创建的对象的原型就是Array.prototype,通过new Date() 创建的对象的原型式Date.prototype。

没有原型的对象为数不多,Object.prototype就是其中之一,它不继承任何属性,其他原型对象都是普通对象,普通对象都具有原型。所有的内置构造函数(以及大部分自定义的构造函数)都具有一个继承自 Object.prototype的原型。例如 Date.prototype的属性继承自 Object.prototype,因此由new Date()创建的对象的属性同时继承 Date.prototype和 Object.prototype,这一系列链接的原型对象就是所谓的‘原型链’(prototype chain)。

4.2.4 Object.creat()
var o  = Object.creat({x:1, y:2});

4.3 属性的查询与设置

可以通过点(.)和方括号([])获取属性的值。

// 获取信息
var Name = book.name;
var page = book[total page];

// 设置信息
book.name = '书名';
book[total page] = '200页';

4.4 继承

JavaScript对象具有‘自有属性’(own property),也有一些属性是从原型对象继承而来的。

4.5 删除属性

delete运算符可以删除对象的属性,它的操作数应当是一个属性访问表达式。delete只是断开属性与宿主的联系,而不会去属性中的属性。

delete book.name  // book不再有属性name

delete运算符只能删除自有属性,不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象上删除它)。

4.6 枚举属性

通常使用 for/in循环遍历对象中所有可枚举的属性(包括自有属性和继承属性),把属性名称赋值给循环变量。对象继承的内置方法不可枚举的。但在代码中给对象添加的属性都是可枚举的。
还有两个用以枚举属性的函数:

  • Object.keys()
    它返回一个数组,这个数组由对象中可枚举的自有属性的名称组成。
  • Object.getOwnPropertyNames()
    它返回对象的所有自有属性的名称,而不仅仅是可枚举的属性。

4.7 属性 getter 和 setter

对象属性是由名字、值和一组特性构成,属性可以用一个或两个方法替代: getter/setter。由它们定义的属性称作‘存取器属性’(accessor property),它不同于数据属性(data property),数据属性只有一个简单的值。

和数据属性不同,存取器属性不具有可写性(writable attribute)。如果属性同时具有getter、setter方法,那么它是一个读/写属性。如果它只有getter方法,那么它是一个只读属性;如果只有setter,那么它是一个只写属性,读取只写属性总是返回undefined。

var o = {
    // 普通属性
    data_prop : value,
    
    // 存取器属性都是成对定义的函数
    get accessor_prop() { },
    set accessor_prop(value) {}
}

例子:

var p = {
    // x和y是普通可读写的数据属性
    x : 1,
    y :2,
    
    // r 是可读写的存储器属性,它有 getter 和 setter
    get r() { return this.x + this.y },
    set r(newValue) {
        var oldValue = this.x + this.y;
        var ratio = newValue / oldValue;
        this.x *= ratio;
        this.y *= ratio;
    }
    
    // onlyRead,它只有getter方法
    get onlyRead() { return this.x*this.y; }
}

和数据类型一样,存取器属性是可以继承的,因此可将p当做另一个‘点’的原型。可以给新对象定义它的 x 和 y 属性,但是 r 和 theta 属性是继承来的:

var q = inherit(p); // 创建一个继承getter和setter方法的对象
q.x = 1, q.y = 1;   // 给q添加两个属性
console.log(q.r);  // 可以使用继承的存取器属性
console,log(q.onlyRead)

git查看本地和远程有哪些分支

git branch -a 即可得到分支列表

// 本地分支
dev
* i18n  // *表示当前所处分支
master

// 远程分支
remotes/origin/dev
remotes/origin/i18n
remotes/origin/master

调用博客名称、地址和描述

1. 调用博客名称和地址

 <a href="<?php bloginfo('url'); ?>">  
    <?php bloginfo('name'); ?>
 </a>  

2. 调用博客描述

<h4>
    <?php bloginfo('description');?>
</h4>

wordpress模板构造

模板内容介绍

/*
tips: 此为当前模板信息
Theme Name: owasp
Theme URI: http://www.owasp.com
Description: owasp pages
Version: 1.2
Author: deepthan
Author URI: http://deepthan.com
tags: 简洁,大气,上档次
*/

style.css里面写这些即可模板里面展示

模板图片

名字为 screenshot.png的图片,直接放在与index.php同一级别目录下。

模板修改

  • 怎么增加自定义菜单?

    html在要显示菜单的位置加入这个

 <?php wp_nav_menu( array( 'theme_location' => 'header-menu' )); ?>

functions.php中注册菜单

  if(function_exists('register_nav_menus')){
        register_nav_menus( array(
            'header-menu' => 'home'
        ) );
    }

graph LR
外观-->主题 
主题-->自定义
自定义--> 菜单
菜单-->添加菜单
添加菜单-->显示位置
显示位置-->勾选home,添加项目

  • 自定义菜单怎么修改?
    自定义菜单二级菜单设置为横向的:
    在父标签加一个class类: horizontalMenu
.main-navigation #menu-home li.horizontalMenu > ul.sub-menu{
	max-height: 201px;
	min-width: 606px;
    padding-bottom: 38px;
}

.main-navigation li.horizontalMenu li {
    float: left;
    height: 26px;
    margin: 10px 0;
   	line-height: 46px;
}

Nginx安装及配置详解

转自 https://www.cnblogs.com/zhouxinfei/p/7862285.html

nginx概述

nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。

这里主要通过三个方面简单介绍nginx

  • 反向代理
  • 负载均衡
  • nginx特点

1. 反向代理

关于代理

说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;
此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户。

正向代理

正向代理

说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理。
在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!
上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;==正向代理模式屏蔽或者隐藏了真实客户端信息==

image

反向代理

明白了什么是正向代理,我们继续看关于反向代理的处理方式,举例如我大天朝的某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题。
那么反向代理具体是通过什么样的方式实现的分布式的集群操作呢,我们先看一个示意图:

image

通过上述的图解大家就可以看清楚了,多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色

==反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!==

项目场景

通常情况下,我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向单利服务器,反向代理了多台真实的业务处理服务器。具体的拓扑图如下:
image

2. 负载均衡

我们已经明确了所谓代理服务器的概念,那么接下来,nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?

  • 这里提到的客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载。
  • 请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则。
  • 所以将服务器接收到的请求按照规则分发的过程,称为负载均衡。

负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如**移动**联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。
image

nginx支持的负载均衡调度算法方式如下:

  1. weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
  2. ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
  3. fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
  4. url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包

3.Nginx安装

1. windows安装
下载nxinx

官方网站下载地址:

https://nginx.org/en/download.html

如下图所示,下载对应的版本的nginx压缩包,解压到自己电脑上存放软件的文件夹中即可

image

解压完成后,文件目录结构如下:

image

启动nginx
  1. 直接双击该目录下的nginx.exe,即可启动nginx服务器
  2. 命令行计入该文件夹,执行nginx命令,也会直接启动nginx服务器
D:/resp_application/nginx-1.13.5> nginx

image

访问nginx

打开浏览器,输入地址:http://localhost,访问页面,出现如下页面表示访问成功

image

停止nginx

命令行进入nginx根目录,执行如下命令,停止服务器:

# 强制停止nginx服务器,如果有未处理的数据,丢弃
D:/resp_application/nginx-1.13.5> nginx -s stop

# 优雅的停止nginx服务器,如果有未处理的数据,等待处理完成之后停止
D:/resp_application/nginx-1.13.5> nginx -s quit

image

下列内容见原文 https://www.cnblogs.com/zhouxinfei/p/7862285.html

2. ubuntu安装
3. mac os安装

获得文章类型名称

<?php 
    $post_type =get_post_type(36);
    //假设id为36的文章类型为附件类型attachment
    echo $post_type;
    //打印出attachment
?>
        

获得自定义文章

首先摸一下你的自定义的类型,显示这样的连接

http://localhost/wp-admin/term.php?taxonomy=category&tag_ID=10&post_type=post&wp_http_referer=%2Fwp-admin%2Fedit-tags.php%3Ftaxonomy%3Dcategory

下面的参数即使对应的

&post_type = post&  ,  taxonomy = category&, &tag_ID=10&
<?php
$args = array(
    'post_type' => 'post', //自定义文章类型名称,上面连接可以获得。
    'showposts' => 3 , //输出的文章数量,这个可以是缺省值,不用设置
    'tax_query' => array(
        array(
            'taxonomy' => '1',//自定义分类的名称
            'terms' => 10 // 上面显示的id
            ),
        )
    );
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
    while ($my_query->have_posts()) : $my_query->the_post();?>
    <h3><?php the_title(); ?></h3>
    <p><?php the_content(); ?></p>
    <?php endwhile; wp_reset_query(); //重置query查询
} ?>

上传文件

上传文件

html

<form method="post" enctype="multipart/form-data" class="file-form">
    <input  type='text' name='extraValue' >
    
    <div>
        <a href="javascript:;" class="file forbid-select">选择文件
            <input type="file" name="file" id="file"  >
        </a>
        <div class="file begin-up forbid-select">开始上传</div>
    </div>
</form>

如果想要把其他input值一起传过去呢?如上面的extraValue里面的值。

js

$(".begin-up").click(function () {
    let formData = new FormData($("form")[0]); // 第几个form就写其index
    $.ajax({
        url: qurl + "/wp-content/themes/owasp/upload_file.php", // 请求php文件
        data: formData, // 传递数据
        type: "POST",
        async: true,
        cache: false,
        contentType: false,
        processData: false,
        success: function (msg) {
            ...
        },
        error: function (msg) {
         ..
        },
    })
})

php

上面extraValue里面的值只要在php里面接收下即可,利用其name作为标志接收。

header("Content-Type:text/html;charset=utf-8");
$curlPost="";

if(isset($_POST['extraValue'])||!empty($_POST['extraValue'])){ // 接收其他input值
    $extraValue =  $_POST['extraValue'];
    $curlPost = $curlPost."extraValue=".urlencode($extraValue).'&';
}
$uptypes=array(  //限制上传文件类型列表
		'js', 'php'
);
$fileName=$_FILES["file"]["name"]; // 获得文件名字

function getFileExt($file_name){ // 截取.后面的内容
	while($dot = strpos($file_name, ".")){
			$file_name = substr($file_name, $dot+1);
	}
	return $file_name;
}
$nameLast= strtolower(getFileExt($fileName)); // 获取文件的格式
if(in_array($nameLast, $uptypes)){ //检查文件类型
    echo "不能上传此类型文件!";
    exit();
}
if ($_FILES["file"]["error"] > 0){
	echo "文件上传错误:" . $_FILES["file"]["error"] . "<br>";
}else{
    if (file_exists("/var/www/owasp_uploads/" . $_FILES["file"]["name"])){
    		echo $_FILES["file"]["name"] . " 文件已经存在。 "; //检测文件是否存在
	}else{
		$file_sub_path="/var/www/owasp_uploads/";   //存储地址
		// 下面把文件移动到指定位置并且执行相应的操作,因为move_uploaded_file移动文件成功则返回true失败返回false
		if(move_uploaded_file($_FILES["file"]["tmp_name"], $file_sub_path . $fileName)){
		    // 文件信息传给别人,也可以直接写在sql表里
			$type = $_FILES["file"]["type"];
			$size = $_FILES["file"]["size"];
			$curlPost = $curlPost."fileName=".urlencode($fileName).'&'
				."fileName=".urlencode($fileName).'&'
				."type=".urlencode($type).'&'
				."size=".urlencode($size);
			$url = 'http://localhost:8080/fileUpload/fileUploadList';
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
			curl_setopt($ch, CURLOPT_HEADER, 0);
			curl_setopt($ch, CURLOPT_TIMEOUT,60);
			// curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
			curl_setopt($ch,CURLOPT_POSTFIELDS, $curlPost);
			$output = curl_exec($ch);
			curl_close($ch);
		}else{
			echo '文件上传失败!';
		}
    }
}

注意事项:

  • 上传文件名字出现乱码问题:
    urlencode进行转码,并且转码后的编码格式应和服务器一致。
转码
$name=iconv("UTF-8","GB2312", $_FILES["file"]["name"]);
  • 文件写不进去:
    如果没有 upload 目录,你需要创建它,upload 目录权限为 777

css

.file {
    position: relative;
    display: inline-block;
    background: #D0EEFF;
    border: 1px solid #99D3F5;
    border-radius: 4px;
    padding: 4px 12px;
    overflow: hidden;
    color: #1E88C7;
    text-decoration: none;
    text-indent: 0;
    line-height: 20px;
}
.file input {
    position: absolute;
    font-size: 100px;
    right: 0;
    top: 0;
    opacity: 0;
}
.file:hover {
    background: #AADFFD;
    border-color: #78C3F3;
    color: #004974;
    text-decoration: none;
}
.begin-up{
    margin-left: 43px;
    text-decoration: none;
    display: inline-block;
    margin-top: -26px;
}
.begin-up:hover{
    text-decoration: none;
    cursor: pointer;
}

上传显示超出upload_max_filesize

上传显示超出upload_max_filesize

首先可以打印出文件位置

<?php echo phpinfo();?>

在 Loaded Configuration File选项里找到php.ini位置,全局搜索 upload_max_filesize和post_max_size都修改大一点,之后重启服务器。

如果这样还不起作用的话就在 .htaccess文件里面修改,在root文件夹下找到它。

php_value upload_max_filesize 20M
php_value post_max_size 20M

yarn用法

Yarn 是由 Facebook,google,Exponent 和 Tilde 制作的一种新的JavaScript 软件包管理器。其目的是解决团队在 npm 面临的问题:

  • 安装包不足够 快/连续
  • 有安全隐患,npm 允许安装包执行代码
    yarn 是从 npm 注册表获取模块的唯一的一个新的CLI客户端。对注册表本身没有任何的改变——你依旧可以跟以前一样获取和发布包。

Yarn vs npm: 功能上的差异

  • yarn.lock 文件: 每次安装一个包它的版本会自动写入lock文件,下次下载的时候会直接下载这个版本,而npm不会自动创建
  • 平行安装 :yarn 并行的执行下载任务而npm是按顺序下载
  • 更简洁的输出(cleaner output):yarn输出信息非常少而npm 的输出非常详细

一. 怎么安装yarn?

  • 通过npm来安装
npm install yarn -g

二. 下包慢咋办?设置淘宝代理!(下的还是原来的包,只是从淘宝端走的流量)

yarn config set registry https://registry.npm.taobao.org

三. 怎么用?

  • 我想下载typescript

安装到 package.json的"devDependencies"下

 npm  install --save-dev typescript

yarn是酱紫滴

yarn add typescript --dev

安装到 package.json的"dependencies"下

 npm  install --save typescript

yarn是酱紫滴

yarn add typescript

安装全局依赖包

npm install -g typescript

yarn是酱紫滴

yarn add global typescript
  • 才发现我用的是php,卸载吧
npm uninstall typescript
yarn remove  typescript
  • 不对,我又回来做前端项目了,yarn可以做什么呢?
    1. yarn add : 下载包
    2. yarn remove : 卸载包
    3. yarn init: 初始化package.json
    4. yarn installyarn: 安装所用 package.json 文件中的依赖包
    5. yarn self-update :更新yarn,我都控制不住我记几。

四. 其他命令

  • yarn licenses [ ls | generate-disclaimer ]
    yarn licenses ls 列出了所有安装包的许可证。
    其实你可以在 yarn.lock文件里面查看依赖包的所有相关信息:

    • version
    • resolved
    • dependencies

    yarn licenses generate-disclaimer生成一个免责声明包含所有执照的所有包的内容。

// yarn licenses ls

├─ License: MIT
│  └─ URL: http://github.com/yargs/yargs.git
├─ [email protected]
│  ├─ License: MIT
│  └─ URL: http://github.com/yargs/yargs.git
├─ [email protected]
│  ├─ License: MIT
│  └─ URL: http://github.com/yargs/yargs.git
├─ [email protected]
│  ├─ License: MIT
│  └─ URL: https://github.com/unshiftio/yeast.git
├─ [email protected]

**在你的项目中,你必须包括项目的许可证,在这些状态下,这是一个相当有用的工具。

  • yarn why [ package ]
    让你弄清楚你的包为什么会被下载。
// yarn why sass-loader
yarn why v1.3.2
warning You are using Node "7.7.1" which is not supported and may encounter bugs or unexpected behavior. Yarn supports the following semver range: "^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0"
[1/4] Why do we have the module "sass-loader"...?
[2/4] Initialising dependency graph...
[3/4] Finding dependency...
[4/4] Calculating file sizes...
info This module exists because "@angular/cli" depends on it.

Angular 里面用yarn

Angular Cli的包管理器预设为NPM,当执行 ng new 时会产生新的项目并以npm来下载所有的依赖。
更改包管理器为yarn

ng set --global packageManager=yarn

之后下载新的依赖包将会用yarn来下载,比NPM快很多。
如果想更改回预设的NPM

ng set --global packageManager=npm

console全集

打印DOM元素

console.dir()

lib.dom.d.ts

interface Console {
    assert(test?: boolean, message?: string, ...optionalParams: any[]): void;
    clear(): void;
    count(countTitle?: string): void;
    debug(message?: any, ...optionalParams: any[]): void;
    dir(value?: any, ...optionalParams: any[]): void;
    dirxml(value: any): void;
    error(message?: any, ...optionalParams: any[]): void;
    exception(message?: string, ...optionalParams: any[]): void;
    group(groupTitle?: string, ...optionalParams: any[]): void;
    groupCollapsed(groupTitle?: string, ...optionalParams: any[]): void;
    groupEnd(): void;
    info(message?: any, ...optionalParams: any[]): void;
    log(message?: any, ...optionalParams: any[]): void;
    msIsIndependentlyComposed(element: Element): boolean;
    profile(reportName?: string): void;
    profileEnd(): void;
    select(element: Element): void;
    table(...data: any[]): void;
    time(timerName?: string): void;
    timeEnd(timerName?: string): void;
    trace(message?: any, ...optionalParams: any[]): void;
    warn(message?: any, ...optionalParams: any[]): void;
}

白话JavaScript的原始类型、引用类型、栈、堆、浅拷贝、深拷贝的概念

JavaScript数据类型分为两类:原始类型(primitive type)和对象类型(object type)

  • 原始类型
    包括 数字、字符串、布尔值、null、undefined 。
    变量是直接按值存放的,存放在栈内存中的简单数据段,可以直接访问。
  • 对象(引用)类型
    包括数组、函数、对象。
    存放在堆内存中的对象,变量保存的是一个指针,这个指针指向另一个位置。当需要访问引用类型(如对象,数组等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。

怎么解释呢?

^-^ 小例子

  • 用钱买东西:其实我们的口袋就像是栈,银行就像是堆,要买的物品就变量,要付的钱就是原始类型或引用类型。
  • 我们买一瓶水(变量)从口袋(栈)拿出钱(原始类型)付款,钱(原始类型)是在口袋(栈)的,付钱速度是非常快的;
  • 如果我们买车(变量)的话也得付钱,这个钱刷银行卡(引用类型),钱在银行(堆),银行卡(引用类型)相当于指针指向你存在银行的大么一大堆钱,不管你在银行存多少钱,你的银行卡大小是固定的。你如果直接带那么多钱(原始类型)放在口袋(栈),会撑爆的~ 所以得带银行卡(引用类型),钱放在银行(堆)。

为变量赋值时,JavaScript的解释程序必须判断该值是原始类型还是引用类型。解析程序则需尝试判断该值是否为JavaScript的原始类型之一。由于这些原始类型占据的空间是固定的,所以可将它们存储在较小的内存区域栈中。这样存储便于迅速查找变量的值。

如果一个值是引用类型,那么它的存储空间会从堆中分配,由于引用值的大小会改变,所以不能将它放在栈中,否则会降低变量查询速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址,地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。

JavaScript数据类型分为两类也可以分为可变类型(mutable)和不可变类型(immutable)

  • 可变类型(引用类型内容)
    包括数组、函数、对象。
  • 不可变类型(原始类型内容)
    包括 数字、字符串、布尔值、null、undefined 。
    在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。JavaScript 打破了这一传统。

堆(heap)和栈(stack)区别:

堆和栈都是内存中的一部分,有着不同的作用,而且一个程序需要在这片区域上分配内存。

区别 堆(heap) 栈(stack)
空间分配 大小需要自己申请,并指明大小 系统自动分配释放
存储区 队列优先,先进先出(FIFO—first in first out) 先进后出(FILO—First-In/Last-Out)
缓存方式 二级缓存,生命周期由虚拟机的垃圾回收算法来决定 一级缓存,被调用时处于存储空间中,调用完毕立即释放。
申请效率 由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 速度较快。但程序员是无法控制的。
那么问题来了,引用类型怎么比较是否相等呢?

比如两个单独的对象或数组必须比较它们的属性或元素:

function equalArrays(a,b){
    if(a.length != b.length) return false;  //两个长度不同的数组不相等
    for(var i = 0; i<a.length; i++){
        if(a[i] != b[i]) return false;
    }
    return true;
}
趁热理解浅拷贝和深拷贝

对于原始类型如字符串,浅拷贝是对值的复制,对于引用类型如对象来说,浅拷贝是对对象地址的复制。
如前面的买东西的例子:

  • 浅拷贝: 对于买水付的钱(原始类型)的复制,是真的钱;而买车是对银行卡(引用类型)的复制,两个卡都指向同一个账户,银行里的同一堆钱,而不是新开了一个账户(堆)。一个卡里面钱用了一点另外一个卡钱有会少。
  • 深拷贝: 买水付的钱(原始类型)的复制,是真的钱;而买车是对银行那堆钱(堆)的复制,变成了另外一堆钱,重新开一个账户办个卡(引用类型)对应着它,即使你把新卡钱花完了也不会影响之前的卡。

文章自定义栏目调用

$post : wordpress内置全局变量。
$post->ID : 获得文章的id
get_post_meta ( $post->ID, '键名', boolean ) : 文章id, 键名, 布尔值: true是输出字符串, false 输出数组。
add_post_meta( $post->ID, '键名', ' 键值' ) : 添加自定义字段
add_post_meta( $post->ID, ‘_键名', ‘键值’) : 添加私有的字段,在栏目编辑里面看不到
调用模板文件:

$name = " deepthan" ;
get_template_part(' content ', $name ) 
加载 content-$name.php文件(即content-deepthan.php文件),若不存在则调用 content.php文件。 

根据分类名称获得这个分类的链接

 <php?  $report=get_category_id('新闻'); ?>  
这里的get_categoty_id()是自己封装的函数,且固定链接为朴素模式。
<a href="<?php bloginfo('url');?>/?cat=<?php  echo $report;?>"  title="<?php echo $report->name; ?>">热点技术</a>

更改本地分支对应的远程分支

一开始拉代码下来的时候,本地新建个dev分支是对应远程的dev分支(即origin/dev),那么我想更改本地dev分支关联线上的master分支:

git branch --set-upstream-to=origin/master dev

dev为本地分支,origin/master为远程分支
也可以这样写:

git branch --set-upstream dev origin/master 

一个div在另外一个div横向居中,纵向自定义

html

<div class='container'>
    <div class='wrap'>
        <div class='detail'>
           <i class="fa fa-shield" aria-hidden="true"></i>
        </div>
    </div>
</div>

css

.container{
    width: 200px;
    height: 40px;
    position: relative;
    border-bottom: 2px #E5E5E5 solid;
}
.wrap{
    width: 100%;
    height: 30px;
    position: absolute;
    bottom: -21px;
    padding-right: 20px;
}
.detail{
    width: 20px;
    height: 30px;
    margin-left: 50%;
    background: #fff;
    font-size: 19px;
    text-align: center;
    padding-left: 7px;
    color: #0061ae;
}

思路:
.wrap的div和父级一样大小,padding-right为20px,那么它的内部空间还有180,它的一半是90, .detail离左边50%即距离左边90px;加上它的一半10 是100,即位于最外层元素 200的一半。

wordpress方法

1. 调用博客名称和地址

 <a href="<?php bloginfo('url'); ?>">  
    <?php bloginfo('name'); ?>
 </a>  

2. 调用博客描述

<h4>
    <?php bloginfo('description');?>
</h4>

3. 调用文章


  <div class="post" id="post<?php the_ID(); ?>">

    <?php if(have_posts()): ?> 
        <?php while(have_posts()) : the_post(); ?>

           <h2>                                      // ' title= '  鼠标移上去显示的内容
                <a href="<?php the_permalink(); ?>"  title="<?php the_title(); ?>" >      -> 标题
                   <?php the_title(); ?>
                </a>
           </h2>

           <p>
                <?php the_content(); ?>                   -> 内容

                <div class="postmetadata">                -> 发表时间等
                    <?php the_category() ?>
                    <?php the_author(); ?>
                    <?php the_date(); ?>
                </div>
           </p>

        <?php endwhile; ?>

        <?php else: ?>
        <div>
            <p><?php  _e('Not Found'); ?></p>
        </div>
    <?php endif; ?>
  </div>

  • if(have_posts()): 检查是否有日志,那么当有日志的时候,执行下面 the_post()这个函数
  • while(have_posts()): 当博客有日志的时候,执行下面 the_post()这个函数
  • the_post(): 调用具体的日志来显示
  • endwhile: 关闭while()
  • endif: 关闭if
  • the_permalink(): 调用每篇日志地址的PHP函数
  • the_title(): 调用日志标题的函数
  • the_content(): 调用日志内容的函数
  • the_category(): 日志类别
  • the_author(): 日志作者
  • the_date(): 日志发布时间
  • the_ID(): 给每篇日志都添加一个id,给它进行样式添加。
    &&&& 主循环: the loop &&&&

4. 获得自定义文章

首先摸一下你的自定义的类型,显示这样的连接

http://localhost/wp-admin/term.php?taxonomy=category&tag_ID=10&post_type=post&wp_http_referer=%2Fwp-admin%2Fedit-tags.php%3Ftaxonomy%3Dcategory

下面的参数即使对应的

&post_type = post&  ,  taxonomy = category&, &tag_ID=10&
<?php
$args = array(
    'post_type' => 'post', //自定义文章类型名称,上面连接可以获得。
    'showposts' => 3 , //输出的文章数量,这个可以是缺省值,不用设置
    'tax_query' => array(
        array(
            'taxonomy' => '1',//自定义分类的名称
            'terms' => 10 // 上面显示的id
            ),
        )
    );
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
    while ($my_query->have_posts()) : $my_query->the_post();?>
    <h3><?php the_title(); ?></h3>
    <p><?php the_content(); ?></p>
    <?php endwhile; wp_reset_query(); //重置query查询
} ?>

5.获得文章类型名称,和上面无关。

<?php 
    $post_type =get_post_type(36);
    //假设id为36的文章类型为附件类型attachment
    echo $post_type;
    //打印出attachment
?>
        

6.如何引入文件

  • 1: wordpress函数
<?php get_header(); ?>
<?php get_sidebar(); ?>
<?php get_footer();?>
  • 2: php函数
<?php include (TEMPLATEPATH . ‘/header.php’); ?>

7. 输出日期

 <?php the_time('Y年n月j日') ?>

8.点击某个分类名称直接进入分类内容

  • 通过分类别名获取Wordpress分类链接:
 <?php
  $cat=get_category_by_slug('wordpress');
  $cat_links=get_category_link($cat->term_id);
?>
<a href="<?php echo $cat_links; ?>" title="<?php echo $cat->name; ?>">更多</a>
 
  • 通过分类ID获取Wordpress分类链接
<?php
    $cat=get_term_by('id', 12, 'category');
    $cat_links=get_category_link($cat->term_id);
?>
<a href="<?php echo $cat_links; ?>" title="<?php echo $cat->name; ?>">更多</a>

9. 文章自定义栏目调用 :

$post : wordpress内置全局变量。
$post->ID : 获得文章的id
get_post_meta ( $post->ID, '键名', boolean ) : 文章id, 键名, 布尔值: true是输出字符串, false 输出数组。
add_post_meta( $post->ID, '键名', ' 键值' ) : 添加自定义字段
add_post_meta( $post->ID, ‘_键名', ‘键值’) : 添加私有的字段,在栏目编辑里面看不到
调用模板文件:

$name = " deepthan" ;
get_template_part(' content ', $name ) 
加载 content-$name.php文件(即content-deepthan.php文件),若不存在则调用 content.php文件。 

根据分类名称获得这个分类的链接

 <php?  $report=get_category_id('新闻'); ?>  
这里的get_categoty_id()是自己封装的函数,且固定链接为朴素模式。
<a href="<?php bloginfo('url');?>/?cat=<?php  echo $report;?>"  title="<?php echo $report->name; ?>">热点技术</a>

10. 请求数据

用php请求接口并获得返回的数据?

  1. $_post [ 'name' ] 获取POST传送过来的数据。 这个只能接收 Content-Type:application/x-www-form-urlencoded提交的数据。
  2. file_get_contents( url);请求 url地址并获得返回的数据。
  3. curl的拓展库: 可以获取其他站点的内容。跨站点传递数据


$phoneNumber = "13666666666";
$message = "this is a message";
$curlPost = 'phoneNuber='.urlencode($phoneNumber).'&MESSAGE'.urlencode($message).'&SUBMIT=send';
$ch = curl_init();
curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_setopt($ch,CURLOPT_URL, ' http:www.baidu.com');
curl_setopt($ch,CURLOPT_HEADER ,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,0);
culr_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $curlPost);
curl_setopt()为一个curl设置会话参数。
$data = curl_exec($ch);、
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close($ch);
curl_close()作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_setopt_array()以数组的形式为一个curl设置会话参数。

 ajax --> 请求本地php文件(http:localhost/wp-admin/....客户端) -> php文件用 $ch传递参数请求地址 (http:localhost/服务器接口地址) --> 返回信息传递给浏览器。

两种方法解决git每次push都要填写账号密码问题

Github获取远程库时,有ssh和https方式,前者可以直接连接无需输入账号密码而后者需要:

  • ssh方式关联
  1. 在git clone的时候使用ssh方式
  2. 修改连接远程仓库的url
// 移除旧的关联
$ git remote rm origin  
// 添加新的关联
$ git remote add origin [email protected]:deepthan/Front-end-resource-collection.git  
  • https方式关联
  1. 在命令行输入命令:
git config --global credential.helper store

这一步会在用户目录下的.gitconfig文件最后添加:

 [credential]
        helper = store
  1. 现在push你的代码 (git push), 这时会让你输入用户名密码, 这一步输入的用户名密码会被记住, 下次再push代码时就不用输入用户名密码了。
    这一步会在用户目录下生成文件.git-credential记录用户名密码的信息.
    git config --global 命令实际上在操作用户目录下的.gitconfig文件, 我们cat一下此文件(cat .gitconfig), 其内容如下:
[user]
    name = alice
    email = [email protected]
[push]
    default = simple
[credential]
    helper = store

git config --global user.email "[email protected]" 操作的就是上面的email
git config --global push.default matching 操作的就是上面的push段中的default字段
git config --global credential.helper store 操作的就是上面最后一行的值

参考:解决向github提交代码是老要输入用户名密码

wordprss里面分别怎么取出父子分类信息

问题: 一级分类下面还有若干个子分类,如果点击一级分类,在本页里the_category()函数会把所有分类名字都取出来,那么怎么才能点击一级分类只显示取得一级分类信息,点击子分类只会取得子分类信息呢?

	<?php
		$current = "";
		$showParent  = false;
		if(is_single()){
			$parent = get_the_category();
			$parent = $parent[0];
			$current = "&current_category=".$parent->term_id;
		}else if(is_category()){
		    // 如果是子分类那么会进这个分支
			global $cat;
			$parent = get_category($cat);
		}
		if($parent->category_parent != 0){
			$showParent = false;
			$cat_id = $parent->category_parent;
			$parent = get_category($cat_id);
			if($parent->category_parent != 0){
				$cat_id = $parent->category_parent;
			}else{
				$cat_id = $parent->term_id;
			}
		}else{
		   // 如果是父分类那么会进这个分支
			$cat_id = $parent->term_id;
			$showParent = true;
		}
	?>

由上可定义一个变量,如果是子分类则为false,如果是父分类则是true。
再根据此布尔值进行显示父级分类信息或子分类信息。

<?php if(!is_page() && $showParent) { ?>
	<h3><?php echo $parent->cat_name; ?></h3>
<?php } else{ ; ?>
	<h3><?php the_category(', ') ?></h3>
<?php }; ?>

git操作方法

1. 本地项目上传到gitlab上指定项目地址

在项目里面打开点击右键 git bash here

//通过命令把这个目录变成git可以管理的仓库:
git init 

//关联到远程库,这里的远程仓库选择Clone with HTTPS的地址。
git remote add origin https://github.com/deepthan/Angular-demo.git

//把文件添加到版本库中,添加到暂存区里面去,不要忘记后面的小数点“.”,意为添加文件夹下的所有文件
git add .

//告诉Git,把文件提交到本地仓库。引号内为提交说明
git commit -m 'creat project'

//拉取文件合并冲突
git pull  https://github.com/deepthan/Angular-demo.git master

// 本地库的内容推送到远程
git push origin master


注意: 如果推送到远程报错了说明你本地有文件,就先拉在推,再合并冲突并提交到本地,再推送到远程

git pull  https://github.com/deepthan/Angular-demo.git master
// 再处理 本地冲突文件
git commit -m 'creat project'
git push origin master

2. 提交到不到github 上

因为你的本地仓库没有和github关联起来。

  1. 找到 .ssh文件夹,打开 id_rsa.pub文件并复制里面的数据
  2. 登录github,点击setting ,再点击SSH and GPG keys,再点击 New SSH key, 标题可以随意起,把前面复制的内容填到key框里保存即可。

3. 查看相关信息

查看git的服务器地址:

git remote -v 

看项目是从git的那个分支上拉下来的:

git remote show origin

循环打印文章中自定义栏目

  • 原始需求

在后台可以添加或删除logo。

image

需求解剖:
logo数量不一定,需要把它放在文章的自定义栏目中以一个关键词承载并在代码中打印出来。

  • 那怎么循环打印呢?
  1. 在后台的新建一篇文章,分类为轮播logo,名字也取为轮播logo(名字随便取都可以)文章自定义栏目中定义一个image名称,它的值分别是三个图片的地址。

image

  1. 代码这样写
   <?php
   $my_query = getMy_query(1,"轮播logo");
   if( $my_query->have_posts() ) {
     while ($my_query->have_posts()) : $my_query->the_post();
       $image = get_post_meta ( $post->ID, 'image', false );
       for ($x=0; $x<sizeof($image); $x++) {;?>
    	 <img src="<?php echo $image[$x];?>" alt="">
      <?php } 
      endwhile; wp_reset_query(); 
    }else{ ?>
		<p> 暂无数据 </p>
    <?php } ?>	

$my_query = getMy_query(1,"轮播logo") 从分类为轮播logo的分类中查找一篇文章
if( $my_query->have_posts() )如果查询到有文章的话
while ($my_query->have_posts()) : $my_query->the_post() 当有文章则调用文章 $image = get_post_meta ( $post->ID, 'image', false ) 取名字为image的自定义栏目, false表示以数组方式展示,true表示只取第一个
for ($x=0; $x<sizeof($image); $x++) {;?> 循环打印image里面的内容,sizeof()函数返回image数组的长度
<img src="<?php echo $image[$x];?>" alt=""> 打印出url

打开浏览器就可以看到图片渲染出来啦。

git 报错解决方法集(长期更新)

Please enter a commit message to explain why this merge is necessary.

请输入提交的理由..
解决办法:
git 在pull或者合并分支的时候有时会遇到这个界面。可以不管(直接下面3,4步),如果要输入解释的话就需要:

  1. 按键盘字母 i 进入insert模式

  2. 修改最上面那行黄色合并信息,可以不修改

  3. 按键盘左上角"Esc"

  4. 输入":wq",注意是冒号+wq,按回车键即可

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.