LocalMarket Code Review - maodouio/meteor-lean-startup-camp GitHub Wiki

LocalMarket Code Review

内容纲要

  • Code Analysis 代码分析
  • Data Design 数据设计
  • Work Flow 运转流程
  • Template Appliance 模版应用

Code Analysis 代码分析

Code Download

Code Tree

li@MacbookAir ~/Github/localmarket$ tree -L 2
.
├── README.md
├── client
│   ├── head.html
│   ├── helpers.js
│   ├── init.js
│   ├── lib
│   ├── stylesheets
│   └── templates
├── cordova-build-override
│   └── platforms
├── lib
│   ├── activities.js
│   ├── bookmarks.js
│   ├── news.js
│   ├── recipes-data.js
│   └── router.js
├── mobile-config.js
├── packages
│   └── request
├── public
│   ├── apple-touch-icon-precomposed.png
│   ├── favicon.png
│   ├── font
│   ├── icon
│   └── img
├── resources
│   ├── icons
│   └── splash
└── server
    ├── _settings.js
    ├── publications.js
    └── users.js

17 directories, 15 files

Homepage Files

  • client/templates/app-body.html
  • client/templates/home.html
  • client/templates/home.js
  • lib/router.js

Homepage Items

1 News

{{latestNews.text}}

  • client/templates/home.js
    • News.latest();
News.latest = function() {
  return News.findOne({}, {sort: {date: -1}, limit: 1});
}
  • lib/news.js
    • News = new Mongo.Collection('news');

2 What's Cooking

{{#each activities}}

  • client/templates/home.js
    • Activities.latest();
Activities.latest = function() {
  return Activities.find({}, {sort: {date: -1}, limit: 1});
}
  • server/publications.js
    • Meteor.publish('latestActivity')
  • lib/router.js
    • HomeController
    • Meteor.subscribe('latestActivity')

3 Our Recipes

{{#each featuredRecipes}}

  featuredRecipes: function() {
    var recipes = _.values(RecipesData);
    var selection = [];
    
    for (var i = 0;i < FEATURED_COUNT;i++)
      selection.push(recipes.splice(_.random(recipes.length - 1), 1)[0]);

    return selection;
  },
  • lib/recipes-data.js
    • RecipesData 大数组

4 Bookmarks

  • lib/router.js
BookmarksController = RouteController.extend({
  onBeforeAction: function() {
    if (Meteor.user())
      Meteor.subscribe('bookmarks');
    else
      Overlay.open('authOverlay');
  },
  data: function() {
    if (Meteor.user())
      return _.values(_.pick(RecipesData, Meteor.user().bookmarkedRecipeNames));
  }
});
  • server/publications.js
Meteor.publish('bookmarkCounts', function() {
  return BookmarkCounts.find();
});

1 What's Cooking

  • HTML View
    • client/templates/whats-cooking.html
    • activities
  • Data Model
    • lib/activities.js

2 Our Recipes

  • HTML View
    • client/templates/recipes.html
    • client/templates/recipe-item.html
  • Data Model
    • lib/recipes-data.js

3 News

  • HTML View
    • client/templates/admin.html
  • Data Model
    • lib/news.js
News = new Mongo.Collection('news');

4 Bookmarks

  • HTML View
    • client/templates/bookmarks.html
  • Data Model
    • lib/bookmarks.js
BookmarkCounts = new Meteor.Collection('bookmarkCounts');

resources

splash app启动加载图片

  • resources/splash/

icons app使用icon

  • resources/icons/

public

  • img
  • icon

lib

  • routes.js
  • reciptes-data.js
  • activities.js
  • bookmarks.js

Data Design 数据设计

  • RecipesData
  • Activities
  • News
  • BookmarkCounts

Work Flow 运转流程

  • Html -> Template
  • Event -> js
  • Router -> data

Template Appliance 模版应用

  • users
    • 网站注册用户
  • recipes
    • 用户中内容的生产者,制造出的内容
  • activities
    • 用户中内容的消费者,对内容的消费记录,可以是多次消费
  • bookmarks
    • 用户对内容的关注,点赞,收藏,只能是一次
  • news
    • 系统对所有用户的通知,也可以是未来的广告模型
  • notifications
    • 系统对个别用户的个别提醒,可以用于用户订阅内容的更新提醒