welcome to xlongwei.com

欢迎大家一起学习、交流、分享


QQ:9167702333 邮箱:admin@xlongwei.com

OurJS添加标签支持


分类 Java   关键字 分享   标签 ourjs   发布 hongwei  1442669692863
注意 转载须保留原文链接,译文链接,作者译者等信息。  
博客文章越来越多时,文章的聚合能力就显得非常重要了。分类是将文章一刀切,将所有文章划分到了不同的集合,关键字也是如此。搜索功能是非常好用的,查找相关文章非常方便。现在标签功能也上线了,文章可以有多个标签,文章之间的聚合就更加自然了。

首先是文章的schema,需要加上标签tags字段(参考keyword字段),还要配置标签的初始数据:
# ourjs/data/schema/article.js
  , "keyword"     : "shown"
  , "tags" 	      : "shown"

# ourjs/config.newspaper.js
var TAGS = [
    'java','web','jquery','algorithm',
    'linux','nginx','tomcat','spring','dubbo',
    'svn','mysql','maven','jpa','ourjs','discuz'
];

  , KEYWORDS        : KEYWORDS
  , TAGS			: TAGS #之前因为漏掉这个exports,怎么也读不到TAGS数据

然后是加载文章时,给tags字段赋初始值;编辑文章时,计算文章的已有标签和可选标签。
# ourjs/svr/article.js
# var formatArticle = function(article) { #所有文章都经函数formatArticle处理
  article.keyword       = article.keyword   || ''   #标签有三种情况:"" | "java" | ["java", "web"],这里统一处理成数组
  article.tags			= !article.tags ? [] : (typeof article.tags == "string" ? [article.tags] : article.tags)

#ourjs/svr/rootjs
  renderArticle.isAdmin       = userInfo.isAdmin
  renderArticle.tags2          = config.TAGS.filter(function(tag){return renderArticle.tags.indexOf(tag)==-1}) #tags2表示文章没有对应标签

接着是添加或编辑文章时,将tags对应为多个复选框。这里的it.tags表示文章已有标签,it.tags2表示其余可选的标签。
# ourjs/web/newspaper/root/edit.tmpl
<span>标签</span>
{{?it.tags && it.tags.length>0}}
{{~ it.tags :tag:index }}
<input type="checkbox" name="tags" value="{{=tag}}" style="display:inline;width:auto;margin:auto 5px auto 10px" checked="checked">{{=tag}}
{{~}}
{{?}}
{{?it.tags2.length>0}}
{{~ it.tags2 :tag:index }}
<input type="checkbox" name="tags" value="{{=tag}}" style="display:inline;width:auto;margin:auto 5px auto 10px">{{=tag}}
{{~}}
{{?}}
<br><br>

保存文章时,需要处理没有标签或一个标签的情形
# ourjs/svr/root.js
    article.verify      = parseInt(article.verify) || 0
    article.tags		= !article.tags ? [] : (typeof article.tags == "string" ? [article.tags] : article.tags)

标签文章的过滤和搜索逻辑类似,标签过滤和搜索过滤暂时不分页
# ourjs/svr/ourjs.js 
  var articles = (Articles.categoryArticles[category] || [])
  if(query.q) {
	  var q = query.q.toLowerCase()
	  var filterArticles = []
	  for(idx = 0, len = articles.length; idx < len; idx++){
		  var article = articles[idx]
		  if(article.title.toLowerCase().indexOf(q)>-1 || (article.content && article.content.toLowerCase().indexOf(q)>-1)){
			  filterArticles.push(article)
		  }
	  }
	  articles = filterArticles
  }else if(query.tag){
	  var tag = query.tag.toLowerCase()
	  var filterArticles = []
	  for(idx = 0, len = articles.length; idx < len; idx++){
		  var article = articles[idx]
		  if(article.tags.indexOf(tag)>-1){
			  filterArticles.push(article)
		  }
	  }
	  articles = filterArticles
  }else{
	  articles = articles.slice(pageNumber * pageSize, (pageNumber + 1) * pageSize)
  }

首页和文章页展示标签
{{?article.tags && article.tags.length>0}}
<b>标签</b>
{{~ article.tags :atag:idx }}
<a class="keyword" target="_blank" href="/home/?tag={{=atag}}">{{=atag}}</a>&nbsp;&nbsp;
{{~}}
{{?}} 

后续还会支持添加自定义标签。

评论列表
  • #0 沈加冰 1442677947849

    首页显示标签的bug搞死机了,本地测试一切正常,上线后列出文章也正常,一旦搜索或标签过滤就卡死,耗尽内存,把其他服务全部挤死。

  • #1 hongwei 1442740271921

    {{~ article.tags :atag:idx }},这样的小改动就好了,折腾够久