全部文章

<p>AdminLTE 是目前见过最最最优秀的后台管理框架,基于 BootStrap 3 和 JQuery。</p> <p>几乎囊括了所有的组件,而且其它插件可以很方便集成进模板。</p> <p>共有12套皮肤可用。</p> <p>使用了<a href="http://fontawesome.io">Font Awesome</a> 和 <a href="http://ionicons.com">ionicons</a></p> <p>Github地址:<a href="https://github.com/almasaeed2010/AdminLTE">https://github.com/almasaeed2010/AdminLTE</a></p> <p>文档:<a href="https://almsaeedstudio.com/themes/AdminLTE/documentation/index.html">https://almsaeedstudio.com/themes/AdminLTE/documentation/index.html</a></p>
详情
<p>Angular 2 最终版于2016-09-15正式发布。Angular 2的愿景是:<code>Angular is a development platform for building mobile and desktop web applications(一套框架,多种平台,同时适用手机与桌面)</code>。</p> <p>Angular 2架构图:</p> <p><img src="https://angular.io/generated/images/guide/architecture/overview2.png" alt="Angular 2架构图" /></p> <p>Angular 2的核心概念:</p> <p><a href="https://angular.cn/docs/ts/latest/guide/architecture.html#!#modules">模块 (module)</a><br /> <a href="https://angular.cn/docs/ts/latest/guide/architecture.html#!#components">组件 (component)</a><br /> <a href="https://angular.cn/docs/ts/latest/guide/architecture.html#!#templates">模板 (template)</a><br /> <a href="https://angular.cn/docs/ts/latest/guide/architecture.html#!#metadata">元数据 (metadata)</a><br /> <a href="https://angular.cn/docs/ts/latest/guide/architecture.html#!#data-binding">数据绑定 (data binding)</a><br /> <a href="https://angular.cn/docs/ts/latest/guide/architecture.html#!#directives">指令 (directive)</a><br /> <a href="https://angular.cn/docs/ts/latest/guide/architecture.html#!#services">服务 (service)</a><br /> <a href="https://angular.cn/docs/ts/latest/guide/architecture.html#!#dependency-injection">依赖注入 (dependency injection)</a></p> <p>把这些核心概念掌握好,你就可以整体把握整个Angular 2了,剩下的就是一些关于项目构建(推荐使用webpack;推荐使用<a href="https://github.com/AngularClass/angular2-webpack-starter">一个种子项目</a>快速开始),TypeScript;样式模块化;怎样组织模块(特性模块,一组业务内聚的组件;核心模块,一些服务提供者。)等等。</p> <p>必须掌握:</p> <ol> <li>TypeScript, 推荐学习<a href="https://tslang.cn/">资源</a></li> <li><a href="http://less.bootcss.com/">Less</a> or <a href="http://sass-lang.com/">Sass</a></li> <li><a href="https://webpack.js.org/">Webpack</a></li> <li><a href="https://github.com/Reactive-Extensions/RxJS/tree/master/doc">Rxjs</a></li> </ol>
详情
<p>从今天开始学习《HTML5+JavaScript动画基础》,看书写的练习代码全部托管在GitHub上,地址是<a href="https://github.com/PaytonTang/game">https://github.com/PaytonTang/game</a></p> <p>每天写一个例子。</p> <p>2016-10-16:反弹</p> <pre><code>window.onload = function () { var canvas = document.getElementById("canvas"), // canvas dom 节点 context = canvas.getContext("2d"), // canvas 2d 上下文 ball = new Ball(), // 小球实例 vx = Math.random() * 10 - 5, // x轴速度向量 vy = Math.random() * 10 - 5, // y轴速度向量 bounce = -0.8; // 反弹系数 ball.x = canvas.width / 2; // 初始时小球在canvas的x轴中点 ball.y = canvas.height / 2; // 初始时小球在canvas的y轴中点 (function drawFrame () { // 帧函数,被重复调用 window.requestAnimationFrame(drawFrame, canvas); // 重复调用帧函数 context.clearRect(0, 0, canvas.width, canvas.height); // 先清除画布 // 声明canvas画布的边界变量 var left = 0, right = canvas.width, top = 0, bottom = canvas.height; // 小球的坐标改变,看起来小球就是做匀速运动 ball.x += vx; // ball.y += vy; // 边界检测与处理 if (ball.x + ball.radius > right) { ball.x = right - ball.radius; vx *= bounce; } else if (ball.x - ball.radius < left) { ball.x = left + ball.radius; vx *= bounce; } if (ball.y + ball.radius > bottom) { ball.y = bottom - ball.radius; vy *= bounce; } else if (ball.y - ball.radius < top) { ball.y = top + ball.radius; vy *= bounce; } ball.draw(context); // 重绘画布 }()); }</code></pre>
详情
<p>用 JavaScript 触发事件有两种方式:IE下的 <code>fireEvent()</code>; 遵循W3C标准的浏览器 <code>dispatchEvent()</code>;</p> <p><code>fireEvent</code> 的用法:</p> <pre><code class="language-javascript">var event = document.createEventObject(); // 初始化一些属性 element.fireEvent('clcik', event); // element是dom元素</code></pre> <p><code>dispatchEvent</code> 的用法: </p> <pre><code class="language-javascript">var event = document.createEvent('HTMLEvents'); event.initEvent('click', true, true); // 第一个参数是事件类型,第二个是是否冒泡,第三个是是否阻止浏览器默认行为。 element.dispatchEvent(event); // 触发事件</code></pre>
详情
<p>当前使用Laravel版本为5.2.43</p> <p>涉及一个知识点 <code>View::share()</code>, <a href="http://www.golaravel.com/laravel/docs/5.0/views/">官方文档</a>(此链接是Laravel5.0版本,适用于5.2)。</p> <p>直接上代码:</p> <pre><code class="language-php">// 文件在app\Http\Controllers\Controller.php namespace App\Http\Controllers; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Routing\Controller as BaseController; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Auth\Access\AuthorizesResources; use Illuminate\Support\Facades\View; class Controller extends BaseController { use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests; public $module; // 模块 public function __construct() { View::share('active', [$this->module=> 'active']); } }</code></pre> <pre><code class="language-php">// 文件在app\Http\Controllers\ArticleController.php namespace App\Http\Controllers; use App\Http\Requests; use Illuminate\Http\Request; use Illuminate\Support\Str; use Auth, Gate; use App\Article; class ArticleController extends Controller { public $module = 'article'; // 标识当前模块为'article' /** * Create a new controller instance. * * @return void */ public function __construct() { parent::__construct(); } }</code></pre> <p>前台模板: </p> <pre><code class="language-html"><ul class="nav navbar-nav"> <li class="{{ isset($active['article']) ? $active['article'] : '' }}"><a href="{{ url('article') }}">文章</a></li> </ul></code></pre>
详情
<p>2016年9月11日,午睡醒,无所事事,甚觉无趣,心中突然有个想法:何不外出游荡游荡?穿鞋,换衣,走起。</p> <p>大镜山那边黑云压境,似乎大雨将至,哪里黑,就往哪里走,一副一去不复返的视觉。</p> <p>由南华小区一直往体育中心方向走,一直走,一直走,一直走,本想去红山楼看有没有人玩遥控飞机的,走着走着,来到了古元美术馆,见有户外登山爱好者刚从山上下来,一种想随着她们下山的小路往上走,走进小路,心生害怕,于是放弃。再继续往前走,忽然听到很多小孩子的嬉笑声,抬头一看,已经来到了石溪公园的入口,印象中又一次骑自行车来过,但没有锁,没办法锁住自行车,就放弃了往上爬。对于我这个伪户外活动爱好者来说,这次无论如何都要登上山顶,一览全景。</p> <blockquote> <p>凤凰山南,邑名山场,香山之源。山场之北,有一涧磐石奇异,溪水潺湲,故曰石溪,今辟成公园。</p> </blockquote>
详情
<p>Interspire Shopping Cart 是由BigCommerce开发的一款电子商城系统,目前也有<a href="https://www.bigcommerce.com">在线版</a>的,在线版的有30天试用期。系统采用Mysql和php组合,模块功能齐全,模板可高度定制,插件功能,强大的SEO功能,特别适合外贸商城,唯一缺憾是不支持多语言。</p> <p>Interspire Shopping Cart开发积累:</p> <p>一、目录结构</p> <p>二、功能模块</p> <p>Interspire Shopping Cart二次开发和维护,随时找我。</p> <p>如有需要二次开发和新功能开发的,可以联系我,发邮件给我:jmgarden@qq.com</p>
详情
<p>今天把文章详情页展示方式改了,支持代码高亮:</p> <p>一、使用 <a href="https://highlightjs.org">highlight.js</a> 高亮代码。</p> <p>效果请查看:<a href="https://www.pcdeng.com/mobile_slider.html">移动设备下的幻灯片</a></p> <p>简单的使用:</p> <p>a.引入外部样式表</p> <pre><code class="language-html"> <link rel="stylesheet" href="css/highlight.min.css"></code></pre> <p>b.引入js </p> <pre><code class="language-javascript"> <script src="js/jquery.js"></script> <script src="js/highlight.min.js"></script></code></pre> <p>c.初始化highlight插件 </p> <pre><code class="language-javascript">$(function() { $('pre.prettyprint').each(function(i, block) { hljs.highlightBlock(block); }); });</code></pre> <p>就这么简单,而且该插件提供了 166 种编程语言和 77 种样式。</p>
详情
<p>毕业一年的多,当年毕业时在珠海一直想找份全职的前端工作,做了两个月的全职前端之后,就离开了上家公司,现在一直从事介于前端与后端(不如说是全站都兼顾)的工作,现今珠海的会不会有更多的前端职位呢?薪资到什么水平呢?以前一直给自己贴上前端er的标签,一年过去了,还是在前端与后端之间摇摆不定,希望珠海的前端职位越来越多,我心依然喜欢着前端。</p> <p><strong> 2017-05-01更新: </strong> 我目前就职于 <code>Quest</code> 珠海公司,工作主要是基于 <code>Angular 2</code> 开发后台系统,目前项目使用了 <code>Highcharts</code> 实现各类图表,使用 <code>moment</code> 处理日期与时间。</p> <p>目前团队还在磨合期,除了我一个是一直做前端的外,其它团队成员都是从 <code>C#</code> 转过来,他们对 <code>HTML</code> 和 <code>CSS</code> 理解不够,写样式没有规范,调整也是改一下样式再看一下页面,写出来的样式几乎没发重用。</p> <p><strong> 2019-12-15 更新:</strong> 我已经离开 <code>Quest</code> 珠海公司,目前就职一家做酒店任务管理系统的初创企业。</p>
详情
<p>构建html结构:</p> <p><code>tool.js</code> 的内容:</p> <pre><code class="language-javascript">function fnXMLHttp(fn) { var oXMLHttp = null; if (window.XMLHttpRequest) { //现代浏览器(IE7+,Chrome,Firefox,Safari,Opera) oXMLHttp = new XMLHttpRequest(); } else if (window.ActiveXObject) { //IE5,IE6 oXMLHttp = new ActiveXObject("" Microsoft.XMLHTTP ""); } if (oXMLHttp != null & amp; & amp; fn != undefined) { oXMLHttp.onreadystatechange = fn; } return oXMLHttp; /* XMLHttpRequest对象的属性有 onreadystatechange: 属性值为函数,当readyState属性改变时触发 readyState:属性值为数字(0:Uninitialized,1:Open,2:Send,3:Receiving,4:Loaded),HTTP请求的状态 status:属性值为数字,由服务器返回的 HTTP 状态代码:例如200,404 response:返回内容 responseText: responseXML: statusText:这个属性用名称而不是数字指定了请求的 HTTP 的状态代码 timeout: upload: onerror:数值为函数 onabort():取消当前响应,关闭连接并且结束任何未决的网络活动。 onloadstart: onloadend: onprogress: ontimeout: open(""GET"", url, true); //以GET方法+异步方式打开HTTP连接,原型open(method, url, async, username, password) send(null);发送HTTP请求 getAllResponseHeaders(); getResponseHeader(); setRequestHeader(); 请求头部 Host Connection Keep-Alive Accept-charset Accept-Encoding If-Modified-Since If-None-Match If-Range Range */ } function fnPost(url, data, fn) { var oXMLHttp = fnXMLHttp(); oXMLHttp.onreadystatechange = fnChange; oXMLHttp.open('POST', url, true); oXMLHttp.send(data); function fnChange() { if (oXMLHttp.readyState == 4 & amp; & amp; oXMLHttp.status == 200) { fn(oXMLHttp.response); } } } function bind(o, e, f) { if (window.addEventListener) { o.addEventListener(e, f, false); //false,表示在冒泡阶段调用事件处理程序 } else if (window.attachEvent) { o.attachEvent('on' + e, f); } } function $id(id) { return (typeof id === 'string') ? document.getElementById(id) : id; } function $tag(tagName, parent) { var parent = typeof parent != 'undefined' ? parent : document; return parent.getElementsByTagName(tagName); } function getStyle(obj) { if (window.getComputedStyle) { return window.getComputedStyle(obj, null); } else if (obj.currentStyle) { return obj.currentStyle; } }</code></pre> <p><code>flash.js</code> 的内容:</p> <pre><code class="language-javascript">(function() { var dBox = $id('first-view'), dLis = $tag('li', dBox), dUl = $tag('ul', dBox), dNum = $id('indicator'), timer = 0, timer1 = 0; var x1, //手指触摸时的x坐标 x2, //手指移开时的x坐标 dx, //间距 index = 0, //当前是第几个li可见 nLiLen = dLis.length, //总共多少个li nBoxWidth = $(window).width() - 16, currentPos = 0, //ul当前的距离 reg = /\-?[0-9]+\.?[0-9]*/g; //获取transform:translateX(34px)中的34 //绑定手指触摸时的处理函数 bind(dBox, 'touchstart', function(ev) { ev.preventDefault(); if (!ev.touches.length) { return false; } var touch = ev.touches[0]; x1 = touch.pageX; currentPos = parseFloat(dUl[0].style.webkitTransform.match(reg)); clearInterval(timer); clearTimeout(timer1); }); //绑定触摸过程的处理函数 bind(dBox, 'touchmove', function(ev) { ev.preventDefault(); if (!ev.touches.length) { return false; } var touch = ev.touches[0]; x2 = touch.pageX; var dx = x2 - x1; if (0 & lt; index & amp; & amp; index & lt; nLiLen - 1) { dUl[0].style.webkitTransform = 'translateX(' + (currentPos + parseFloat(dx)) + 'px)'; dUl[0].style.webkitTransition = '0ms linear'; } }); //绑定手指移开时的处理函数 bind(dBox, 'touchend', function(ev) { ev.preventDefault(); dx = x2 - x1; fnAnimate(dx); timer1 = setTimeout(fnStart, 5000); }); //绑定全部资源加载完毕的处理函数 bind(window, 'load', function() { var lis = ""; var imgs = $tag('img', dUl[0]); for (var i = 0; i & lt; nLiLen; i++) { lis += "" + i + ""; imgs[i].style.width = nBoxWidth + 'px'; dLis[i].style.width = nBoxWidth + 'px'; } dNum.innerHTML = lis; dBox.style.width = nBoxWidth + 'px'; fnSetNum(index); fnStart(); }); $(window).resize(function() { nBoxWidth = $(window).width() - 16; dBox.style.width = nBoxWidth + 'px'; var imgs = $tag('img', dUl[0]); var dLis = $tag('li', dUl[0]); for (var i = 0; i & lt; nLiLen; i++) { imgs[i].style.width = nBoxWidth + 'px'; dLis[i].style.width = nBoxWidth + 'px'; } }); function fnStart() { timer = window.setInterval(function() { dx = -21; if (index & lt; nLiLen - 1) { fnAnimate(dx); fnSetNum(index); } else { index = -1; } }, 3000); } function fnAnimate(dx) { if (Math.abs(dx) & gt; 20) { //滑动够一定距离才执行 if (dx & lt; 0) { //从右向左滑动 if (index & lt; nLiLen - 1) { index++; } } else if (dx & gt; 0) { //从左向右滑动 if (index & gt; 0) { index--; } } dUl[0].style.webkitTransform = 'translateX(-' + (index \* nBoxWidth) + 'px)'; dUl[0].style.webkitTransition = '500ms linear'; } fnSetNum(index); } function fnSetNum(index) { var lis = $tag('li', dNum); for (var i = 0; i & lt; nLiLen; i++) { lis[i].className = "" ""; } lis[index].className = 'current'; } function fnGetNum() { return index; } })(); </code></pre>
详情
<h3>在linux上创建仓库以及一些最基本操作</h3> <p>创建仓库 <code>svnadmin create 仓库名称</code></p> <p>检出 <code>svn co svn://192.168.1.133/repos /web/www/html/website</code></p> <p>更新 <code>svn up /web/www/html</code></p> <p>开启 <code>svnserve -d -r /web/svn</code></p> <hr /> <h3>遇到的问题</h3> <p>1.SVN客户端 <code>tortoiseSVN</code>,<code>show log</code> 没有显示日期,作者,备注信息</p> <p>解决办法:</p> <p>修改svn配置文件:仓库 <code>/conf/svnserve.conf</code> 改为: <code>anon-access = none auth-access = write</code></p> <hr /> <p>2.多用户访问多仓库,一个认证文件?如何创建仓库? 解决办法: 目录结构 <code>/web/svn /web/svn/websiteA</code> (一个仓库) <code>/web/svn/websiteB</code> (另外一个仓库) <code>/web/svn/websiteC</code> (再一个仓库) <code>/web/svn/websiteA/conf/svnserve.conf</code> (每一个仓库都有)</p> <p>设置各个仓库中的 <code>svnserve.conf</code></p> <pre><code>password-db = /web/svn/codeAuth/passwd authz-db = /web/svn/codeAuth/authz</code></pre> <p><code>/web/svn/auth</code> (存放认证相关文件,各个仓库共用)</p> <p><code>/web/svn/codeAuth/authz</code> (设置用户,用户组,权限)</p> <p><code>/web/svn/codeAuth/passwd</code> (设置用户密码)</p> <hr /> <p>3.同步更新问题 在 <code>/web/www/html/websiteA</code> 目录 <code>checkout</code> 一份,作为本地测试用,要求仓库有新的提交时 <code>/web/www/html/websiteA</code> 自动更新</p> <p><strong>解决办法</strong></p> <p>在创建仓库目录中有个 <code>hooks</code> (简称钩子程序),在此目录新建 <code>post-commit</code></p> <pre><code>REPOS="$1" REV="$2" export LANG=en_US.UTF-8 svn update /web/www/html/websiteA --username xxxx --password xxxx REPOS="$1" REV="$2" export LANG=en_US.UTF-8 svn update /web/www/html/websiteA --username xxxx--password xxxx echo 'whoami',$REPOS,$REV >> /web/svn/repos/hooks/svn_hook.log #mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf</code></pre>
详情
<p>边学边做,共计一个一个星期,从无到有,从不完善到完善,基于Yii构建的站点终于完成,访问地址:<a href="http://famous86.com">点击</a>访问。</p> <p>该站点,分两个应用,一个是前台应用,一个是后台应用,两个应用的配置基本相同,但也有不同,后台有明确的权限管理配置,而前台是所有访客都可以访问。</p> <p>通过做完这个站点,基本清楚明白 Yii 构建站点的流程,Yii 的特点,难点。</p> <p>Yii 有批处理的概念,就是当你清楚你的需求,设计好数据库后,通过脚手架工具,可以快速帮你构建起数据模型(Model),控制器(Controller),视图(View),而且常用的模块都构建好,你只需要按照自己的业务逻辑再有针对性地修改即可。</p> <p>如果要个性化定制界面,就要了解 view 这一层,也就是要根据系统自带的模板规则,生成的 html 结构进行分析,比如列表模块,form 表单模块,只有了解清楚这些模块的 html 结构才能写出高效,通用的 css。</p> <p>Yii 的功能实在太强大,太多了,做完这个站点只能说基本了解怎么用它,想要驾驭 Yii 还要继续努力,继续投入时间去研究。</p>
详情