最佳实践

控制器基类

同一个分组下的 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. //__before 会在执行具体的 action 之前执行
  5. __before: function(){
  6. // 登录页面不检测用户是否已经登录
  7. if(this.http.action === 'login'){return;}
  8. return this.session("userInfo").then(function(userInfo){
  9. // 用户信息为空
  10. if(isEmpty(userInfo)){
  11. //ajax 访问返回一个 json 的错误信息
  12. if(self.isAjax()){
  13. return self.error(403, "用户未登录,不能访问")
  14. }else{
  15. // 跳转到登录页
  16. return self.redirect("/index/login");
  17. }
  18. }else{
  19. // 用户已经登录
  20. self.userInfo = userInfo;
  21. self.assign("userInfo", userInfo);
  22. }
  23. })
  24. }
  25. }
  26. })

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

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