最佳实践

控制器基类

同一个分组下的Controller一般会有一些共同的特性,那么就可以把这些共同的特性放在一个控制器基类里,其他的控制器继承该控制器。

建议控制器基类名为BaseController,如:

  1. // App/Lib/Controller/Home/BaseController.js
  2. module.exports = Controller(function(){
  3. return {
  4. init: function(http){
  5. this.super("init", http);
  6. //给模版里设置title等一些字段
  7. this.assign({
  8. title: "thinkjs官网",
  9. navType: "home"
  10. })
  11. },
  12. //获取页面顶部的分类,几乎每个页面都会使用
  13. //那么可以放在基类里,供子类调用
  14. getCate: function(){
  15. var self = this;
  16. return D('Cate').select().then(function(data){
  17. self.assign("cateList", data);
  18. })
  19. }
  20. }
  21. })

基类可以通过BaseController来继承,如:

  1. // App/Lib/Controller/Home/IndexController.js
  2. module.exports = Controller("Home/BaseController", function(){
  3. return {
  4. indexAction: function(){
  5. var self = this;
  6. //获取分类列表
  7. var catePromise = this.getCate();
  8. //获取文章列表
  9. var articlePromise = D('Article').page(this.page("page")).select().then(function(data){
  10. self.assign("articleList", data);
  11. })
  12. //分类和文章列表数据都OK后渲染模版
  13. return Promise.all([catePromise, articlePromise]).then(function(){
  14. return self.display();
  15. })
  16. }
  17. }
  18. })

用户登录后才能访问

在项目中,经常要判断当前访问的用户是否有权限,如果没有权限那么后续的代码就不能在执行。最基本的案例就是判断用户是否已经登录,比如:后台管理

  1. // App/Lib/Controller/Admin/BaseController.js
  2. module.exprots = Controller(function(){
  3. return {
  4. init: function(http){
  5. this.super("init", http);
  6. var self = this;
  7. return this.session("userInfo").then(function(userInfo){
  8. //用户信息为空
  9. if(isEmpty(userInfo)){
  10. //ajax访问返回一个json的错误信息
  11. if(self.isAjax()){
  12. return self.error(403, "用户未登录,不能访问")
  13. }else{
  14. //跳转到登录页
  15. return self.redirect("/login");
  16. }
  17. }else{
  18. //用户已经登录
  19. self.userInfo = userInfo;
  20. self.assign("userInfo", userInfo);
  21. }
  22. })
  23. }
  24. }
  25. })

由于errorredirect方法返回的都是pendding promise,如果未登录的话,可以阻止后续的代码继续执行。

  1. indexAction: function(){
  2. //init方法里将用户信息赋值到this.userInfo上,那么这里就可以直接获取了
  3. var userInfo = this.userInfo;
  4. var id = userInfo.id;
  5. }

动态路由