全部文章

<p>最近在做一个项目,图书借阅系统。</p> <p>在图书详情页面有两部分内容,一是图书详情;二是图书借阅记录列表。</p> <p>两部分数据是通过图书 id 从 api 获取,现在的需求是:两部分数据全部从 api 返回才显示页面,其中有一部分的数据还没从 api 返回,页面显示的是 loading 状态。</p> <p>api 请求数据代码如下:</p> <pre><code class="language-typescript">ngOnInit() { this.loaded = false; let bookStream = this.bookService.getBook(1); let bookLogsStream = this.bookLogService.getLogs(1); let mergedStream = bookStream.merge(bookLogsStream); mergedStream.subscribe(bookOrBookLogs => { console.log(bookOrBookLogs); }, e => { // handle error here }, () => { // complete handler console.log('complete'); this.loaded = true; }); }</code></pre> <p>无论是 <code>bookStream</code> 的数据先回来还是 <code>bookLogsStream</code> 的数据先回来都是执行 <code>observer</code> 的 <code>next</code>方法,在这里就是 <code>function(bookOrBookLogs) { console.log(bookOrBookLogs); }</code> 两部分的数据返回后,就会执行 <code>complete</code> 方法;</p> <p>RxJS 教程,可参考:<a href="http://www.oschina.net/translate/rxjs-streams">RxJS教程</a></p>
详情
<p>近期在做公司的项目,梳理了另一个同事写的 wiget 基础组件,两个 widget 中间的间距他用的是 border 来达到视觉效果,但我总感觉这个盒子很奇怪,于是把 widget 重新梳理了一遍。</p> <p>重新回顾和梳理一下盒子模型。</p> <blockquote> <p>在一个文档中,每个元素都被表示为一个矩形的盒子。</p> </blockquote> <p><img src="https://developer.mozilla.org/files/72/boxmodel%20(1).png" alt="" /> </p> <p>两个 widget 是平级的,它们的之间的间距理应用 margin 来隔开。</p> <p><strong>外边距区域</strong> <strong>用空白区域扩展边框区域,以分开相邻的元素。</strong></p>
详情
<pre><code><html lang="en"> <head> <meta charset="UTF-8"> <title>圣杯布局</title> <style> html { margin: 0; padding: 0; } body { margin: 0; padding: 0; font-size: 14px; } .wrapper { display: flex; min-height: 100vh; flex-direction: column; text-align: center; vertical-align: middle; } .wrapper header { font-size: 1.1428em; flex: 0 0 5.428em; line-height: 5.428em; background-color: #666; } .wrapper .content { display: flex; flex: 1; } .wrapper .content nav { flex: 0 0 21.428em; background-color: #77bbdd; } .wrapper .content main { flex: 1; background-color: #d6d6d6; } .wrapper .content aside { flex: 0 0 12em; background-color: #ff6633; } .wrapper footer { flex: 0 0 3.571em; line-height: 3.571em; background-color: #666; } </style> </head> <body> <div class="wrapper"> <header>Come and fine me</header> <div class="content"> <nav>#Left</nav> <main>#Center</main> <aside>#Right</aside> </div> <footer>To be or not to be.</footer> </div> </body> </html></code></pre> <p><a href="http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html">参考文章</a></p>
详情
<p>花了一个晚上弄出了发送邮件功能。Lumen 5.3 Mail</p> <h3>安装</h3> <p>在 <code>composer.json</code> 文件的 <code>require</code> 段添加 "illuminate/mail": "5.3.*",然后执行 <code>composer update</code></p> <h3>添加邮件配置</h3> <p>一个是在/config新增文件 <code>mail.php</code>, 文件内容参考:<a href="https://github.com/laravel/laravel/blob/master/config/mail.php"><a href="https://github.com/laravel/laravel/blob/master/config/mail.php">https://github.com/laravel/laravel/blob/master/config/mail.php</a></a></p> <h3>载入服务</h3> <p>在 <code>/bootstrap/app.php</code> 中添加 <code>$app->configure('mail');</code> 和注册服务提供者:<code>$app->register(Illuminate\\Mail\\MailServiceProvider::class);</code></p> <h3>测试</h3> <pre><code>use Illuminate\\Support\\Facades\\Mail; Mail::raw('邮件正文内容', function($message){ $message->to('test@qq.com', '我')->subject('邮件标题'); });</code></pre>
详情
<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>
详情