iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
Modern Web

Medusa.js 石化我的心系列 第 17

Day17 進階實作 - 客製化模組 新增專屬保健單

  • 分享至 

  • xImage
  •  

如果是需要製作客製化保健單,我簡單用 Mermind 建立了以下流程:

sequenceDiagram
客戶->>管理員: 建立需求單
管理員-->>客戶: 審核、給配方
客戶 -->> 管理員: 同意配方、下單
管理員 -) 客戶: 製作、運送

有了流程,我們就來製作自己的模組,首先第一步就是先建立保健單的資料模型。

Model 建立

src/modules底下建立 supplements/models/supplements.ts
並依照 Medusa.js Model 規則建立:

import { model } from "@medusajs/framework/utils"

export const Supplement = model.define("supplement", {
	id: model.id().primaryKey(),
	requirement: model.text(),
	response:model.json().nullable(),
	sure:model.boolean().default(false),
})

medusa.js 的 模型model : 建構規則簡要有以下。

  • id:產生自動轉換的id碼,為一值且是數字與英文字母結合。
  • text:字串 string 屬性
  • number:整數屬性
  • float:數字且有小數點屬性
  • bignumber:可以容納比整數還大的整數
  • boolean:布林值,只分truefalse
  • enum:列舉,用於定義一組有意義的命名常數,讓程式碼更易讀、維護。
  • dateTime:記錄時間的時間戳記
  • json:儲存 JSON 化物件
  • array:定義字串屬性的陣列
    附加在其以上屬性後面的
  • primaryKey:設定主鍵
  • default:加入預設值
  • nullable:設定可為空值
  • unique:設定為唯一值
  • index:設定此為資料庫索引
  • searchable:是用來決定 是否被加到全文搜尋 (FTS, Full-Text Search) 索引裡
    放在最外層 .define()後面
  • check:限制文字長度

建立 service

第二步我們可以建立 service ,主要要讓你對資料庫 model 進行操作、轉換的地方,其功能類似於 功能介面。

src/modules/supplements建立service.ts,並加入以下。

import { MedusaService } from "@medusajs/framework/utils"
import { Supplement } from "./models/supplements"

class SupplementModuleService extends MedusaService({
Supplement,
}) {}

export default SupplementModuleService

當我看到官方教學service 只需要這樣程式碼就可以去其他地方引用並進行對資料的操作了,不知覺好奇這邊 service 不用寫各個函式操作嗎?

真的不用,因為我們繼承 MedusaService 並且給予 Model 讓他進行轉換,除非你要新增其他種輸出函式。
以下官方網站基礎生成的方法:

  • listAndCount():印出所有列表及總列數
  • retrieve():以ID搜尋單一筆資料
  • create():創建一或多筆資料
  • update():更新資料
  • delete():刪除資料
  • softDelete():軟刪除資料
  • restore():重新儲存資料

❗❗請注意❗❗,當你在其他地方匯入service,且這個service有你自己定義的函式。
❗❗Meudsa.js 會自動將其視為非同步的函式。
❗❗所以請確保您自定義的函式必須是非同步的

import { MedusaService } from "@medusajs/framework/utils"
import { Supplement } from "./models/supplements"

class SupplementModuleService extends MedusaService({
  Supplement,
}){
  // Don't
  getStatus(): boolean {
    return false
  }

  // Do
  async getStatus(): Promise<boolean> {
    return true
  }
}

export default SupplementModuleService

定義模組並匯出

將模組會出並定義的目的就是讓Medusa.js知道我們新增了一項模組,並提供服務。

先在src/modules/supplments建立index.ts
並將以下內容寫入:

import { Module } from "@medusajs/framework/utils"
import SupplementModuleService from "./service"

export const SUPPLEMENT_MODULE = "supplements"

export default Module(SUPPLEMENT_MODULE, {
	service: SupplementModuleService,
})

定義模組的函式主要需要兩個參數:

  • 定義模組的名稱
  • service服務的位置

接下來我們將此模組導入到 Medusa.js 配置當中,也就是medusa-config.ts

module.exports = defineConfig({
  // ...
  modules: [
    {
      resolve: "./src/modules/supplements",
    },
  ],
})

這樣就差不多完成我們的 Module,但是我們還沒把我們的 Model進行產生表並且移轉,所以最後一步就是打開我們的Terminal進行移轉

npx medusa db:generate brand
npx medusa db:migrate

恭喜!!這樣就完成我們的模組建立了~

明天預告

明天我們我們建立我們的關聯。


上一篇
Day16 故事與需求分析
下一篇
Day18 進階實作 - 關聯
系列文
Medusa.js 石化我的心21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言