鍍金池/ 問答/HTML/ eggjs怎么實(shí)現(xiàn)任何字段模型的方法?

eggjs怎么實(shí)現(xiàn)任何字段模型的方法?

我最近玩了strapi框架,認(rèn)識(shí)到了這個(gè)結(jié)構(gòu)最好的地方是,一,任何字段模型,二,可擴(kuò)展插件。其中,這個(gè)任何字段模型的方法有點(diǎn)復(fù)雜,我還沒摸清好幾十天,估計(jì)是剛接觸到后端技術(shù)還沒有知道那么多。

參考 strapi 任何字段模型

圖片描述

即使選擇好了幾個(gè)類型,這些類型會(huì)保存到數(shù)據(jù)庫(kù)新表,比如建立article表,article的字段會(huì)有對(duì)應(yīng)類型,這樣結(jié)構(gòu)挺好靈活,不用每次手動(dòng)增加mvc之類的代碼,直接存好數(shù)據(jù)庫(kù)。

比如創(chuàng)建一張文章表,文章表還沒有加入字段模型,那么在后臺(tái)里面選擇字符串、日期、數(shù)字來做成標(biāo)題,作者。。。之類,然后就會(huì)建立類似MVC模式的結(jié)構(gòu),自然會(huì)保存到那張文章表。

這個(gè)結(jié)構(gòu)值得我參考,不過我不知道這個(gè)方法怎么實(shí)現(xiàn)?

我目前做的是采用eggjs這個(gè)框架,那么在eggjs里面怎么實(shí)現(xiàn)這個(gè)字段模型方法?

最后一句話:我希望您現(xiàn)在就是我的好老師!謝謝!

回答
編輯回答
款爺
  1. 簡(jiǎn)單分析一下題意,你的意思應(yīng)該是指:
    1.1 通過【圖形化的界面】添加【數(shù)據(jù)表中的屬性列】。產(chǎn)生的效果就是【MongoDB中出現(xiàn)對(duì)應(yīng)的數(shù)據(jù)表(table_article)】,同時(shí)框架文件夾中生成了【對(duì)應(yīng)的數(shù)據(jù)模型(article.model)】
    1.2 糾正你的說法,應(yīng)該是strapi這個(gè)框架【整體采用了MVC設(shè)計(jì)范例】。【1.1】并不是生成了MVC的結(jié)構(gòu),只是生成了Model
  2. 如何實(shí)現(xiàn)【1.1】所說的效果?
    2.1 雖然給你的感覺是通過【圖形化的界面】生成。但是始終離不開【命令行】的操作。在strapi的文檔中有專門介紹【CLI】的板塊,可以參考并搜索框架的源碼,始終是需要自己去探索的,別人都只是幫助你解釋概念而已
    2.2 strapi并不是第一個(gè)實(shí)現(xiàn)【1.1】方式的框架,Laravel同樣非常典型。如果你覺得strapi的英文文檔難以理解,可以去看一下Laravel的中文文檔。和strapi的【CLI】相同的,在Laravel中我們使用Artisan指令
    2.3 strapi使用的是MongoDB,你同時(shí)可能還需要看一下MongoDB文檔中的命令行指令
2018年8月30日 07:59
編輯回答
舊螢火

推薦用 egg-sequelize 文檔也很全

模型

// app/model/user.js

module.exports = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;

  const User = app.model.define('user', {
    login: STRING,
    name: STRING(30),
    password: STRING(32),
    age: INTEGER,
    last_sign_in_at: DATE,
    created_at: DATE,
    updated_at: DATE,
  });

  User.findByLogin = function* (login) {
    return yield this.findOne({
      where: {
        login: login
      }
    });
  }

  User.prototype.logSignin = function* () {
    yield this.update({ last_sign_in_at: new Date() });
  }

  return User;
};

控制器

// app/controller/user.js
module.exports = app => {
  return class UserController extends app.Controller {
    * index() {
      const users = yield this.ctx.model.User.findAll();
      this.ctx.body = users;
    }

    * show() {
      const user = yield this.ctx.model.User.findByLogin(this.ctx.params.login);
      yield user.logSignin();
      this.ctx.body = user;
    }
  }
}
2017年2月27日 07:18
編輯回答
傻叼

謝邀,簡(jiǎn)單說兩句。目前 Egg.js 里面 Model 層的編寫比較混亂,沒有一個(gè)較為統(tǒng)一的方案,各自 ORM 插件也各自為戰(zhàn),限制較多,多 ORM 共存時(shí)也存在較大的兼容性問題。具體可以參考:RFC-1775 重定義 Model 層,我個(gè)人目前采用的是 egg-sequelize,個(gè)人覺得還是比較好用,sequelize 文檔也比較全。

2018年6月14日 09:48