Node.js 切近实战(五) 之图书管理系统(图书Gallery)

上一节我们讲述了图书管理系统的查询,今天我们来看一下图书管理系统的Gallery,一个很简单的Gallery。在看Gallery之前我们先看一下RoboMongo,一个连接MongoDb的客户端工具,以图形化的界面操作MongoDB。先看一下

wKioL1dqWi-iRS36AAC4s4McFP4573.png

看数据非常方便,还支持table显示,文本格式显示等

wKiom1dqWn2wcoCFAACyEx2kfEQ509.png

非常过瘾,还可以用菜单进行编辑,删除操作。

wKioL1dqWsbDnF9NAACLAaUPb9Y833.png关于这个工具,谁用谁知道。

 

OK,今天主要任务还是要讲我们的图书Gallery,先看一下UI代码

1

2

3

4

5

6

7

8

9

#book_list(ng-controller='bookListCtrl')

 #book_gallary

  a(ng-repeat='model in BookList track by $id(model)' ng-href='#' on-finish-render="ngRepeatFinished")

   img(ng-src='/book/image/{{model.Image}}')

 

 

 block scripts

  script(type='text/javascript' src='/javascripts/thirdpart/justifiedGallery/jquery.justifiedGallery.min.js')

  script(type='text/javascript' src='/javascripts/local/book/booklist.js')

注意这里的on-finish-render,其实这是一个angular指令,用来判断ng-repeat是否已经完成,在这里为什么要指定track by,是因为如果你不指定的,一旦有重复的数据,angular就会报错。我们指定的话,每行就会生成自己的自增id行号。因为angular需要一个唯一值可以与生成的dom绑定,以便检索追踪。ok,这里图书Gallery使用的jQuery.justifiedGallery。我们看一下js的代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

var appModule = angular.module('bookListModule', ["kendo.directives"]);

 

appModule.controller('bookListCtrl'function ($scope, $http) {

    $scope.pageIndex = 0;

    $http.get('/book?pageIndex=' + $scope.pageIndex + '&pageSize=50')

    .success(function (result) {

        $scope.BookList = result.books;

    });

     

    $scope.$on('ngRepeatFinished'function (ngRepeatFinishedEvent) {

        angular.element("#book_gallary").justifiedGallery();

    });

}).directive('onFinishRender'function ($timeout) {

    return {

        restrict: 'A',

        link: function (scope, element, attr) {

            if (scope.$last === true) {

                $timeout(function () {

                    scope.$emit('ngRepeatFinished');

                });

            }

        }

    }

});

 

angular.element('#book_list').data('$injector''');

angular.bootstrap(angular.element('#book_list'), ['bookListModule']);

首先请求api,查询图书,将请求到的图书信息BookList绑定到UI。注意下面的指令onFinishRender是如何判断ng-repeat已经结束的,在当前scope中,有个$last属性,如果$last为true,则认为该行数据已经渲染结束,并发射事件ngRepeatFinished,发射以后,会被接收到,即$scope.$on('ngRepeatFinished')。注意这里的$setTimeout,每一行数据渲染都会走link,每一行渲染结束$scope.$last都为true,所以我们只能在每一行绑定渲染结束之后,去发射事件。

在这个事件中,我们再对图片所在Div创建Gallery。如果页面DOM都没结束,你就创建Gallery,肯定是不行的,所以上面的代码就是解决这个问题的。

最后看一下运行效果

wKioL1dqX2yxhyS-AAL25DgkWPA128.png

 

原文转自: 乐搏学院http://www.learnbo.com/front/article/cmsIndex
### 设计一个展示花朵种类的前端网页 #### 合理结构的设计 为了实现清晰的信息架构,可以采用经典的HTML5页面布局模式。通常情况下,这种类型的网站会包含头部导航栏、主体部分和页脚区域[^1]。 - **头部导航栏**:用于放置站点名称、Logo以及主要分类链接(如玫瑰、郁金香、百合等)。这可以通过`<nav>`标签来构建。 - **主体部分**:分为多个区块,每个区块代表一种花类或者一组相关内容。可利用CSS Grid或Flexbox技术优化布局[^2]。 - **页脚区域**:提供版权信息或其他补充说明。 ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>花卉百科</title> <link rel="stylesheet" href="styles.css"> </head> <body> <!-- 头部 --> <header> <h1>花卉世界</h1> <nav> <ul> <li><a href="#roses">玫瑰</a></li> <li><a href="#tulips">郁金香</a></li> <li><a href="#lilies">百合</a></li> </ul> </nav> </header> <!-- 主体 --> <main> <section id="roses"> <h2>玫瑰</h2> <p>玫瑰象征着爱情...</p> <img src="rose.jpg" alt="玫瑰图片"> </section> <section id="tulips"> <h2>郁金香</h2> <p>郁金香代表着优雅...</p> <img src="tulip.jpg" alt="郁金香图片"> </section> </main> <!-- 页脚 --> <footer> <p>© 花卉爱好者协会</p> </footer> </body> </html> ``` #### 色彩搭配方案 色彩对于用户体验至关重要,在设计过程中应考虑目标受众的情感需求。例如,粉色系适合表现浪漫氛围;黄色则传递温暖活力的感觉[^3]。建议选取柔和自然的颜色作为背景基调,并辅以鲜明对比色突出重点内容。 #### 图像效果处理技巧 高质量视觉素材能够显著提升整体观感水平。通过调整透明度参数或是叠加滤镜层等方式创造独特艺术风格[^4]。此外还可以尝试动态加载机制减少初始渲染时间消耗。 #### 内容质量和知识点应用策略 编写详尽而有趣的文章介绍各种植物特性及其文化意义。同时穿插科学术语解释原理现象以便加深理解记忆程度。比如讲解光合作用过程时提到叶绿素吸收特定波长光线完成能量转换等功能[^5]。 #### 展现个人特色的途径 融入自己擅长领域元素形成差异化竞争优势。如果绘画能力较强的话不妨手绘一些原创图案代替通用图标按钮;又或者是录制短视频演示栽培方法分享给访问者观看学习[^6]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值