利用elysia,edgedb快速实现竞拍类项目

457 阅读1分钟

1. 基于bun搭建monorepo

bun搭建monorepo的文档地址:bun.sh/guides/inst…

mkdir bidder
cd bidder
bun init -y

.
├── README.md
├── bun.lockb
├── index.ts
├── node_modules
├── package.json
└── tsconfig.json

1 directory, 5 files

mkdir packages
cd packages
mkdir server client shared
cd server     // 初始化服务器端项目
bun create elysia .
cd shared        // 初始化共享lib
bun init -y
cd client   // 生成前端项目
bun create vite . --template react

1.1 tsconfig.json文件的配置

{
  "compilerOptions": {
    // Enable latest features
    "lib": ["ESNext", "DOM"],
    "target": "ESNext",
    "module": "ESNext",
    "moduleDetection": "force",
    "jsx": "react-jsx",
    "allowJs": true,

    // Bundler mode
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": true,
    "verbatimModuleSyntax": true,
    "noEmit": true,

    // Best practices
    "strict": true,
    "skipLibCheck": true,
    "noFallthroughCasesInSwitch": true,

    // Some stricter flags (disabled by default)
    "noUnusedLocals": false,
    "noUnusedParameters": false,
    "noPropertyAccessFromIndexSignature": false
  }
}

1.2 项目根目录中package.json配置

{
  "name": "bidder",
  "module": "index.ts",
  "private": true,
  "scripts": {
    "clean": "rm -rf node_modules packages/server/node_modules packages/client/node_modules",
    "dev:client": "cd packages/client && bun run dev",
    "dev:server": "cd packages/server && bun run dev",
    "dev": "concurrently \"bun run dev:server\" \"bun run dev:client\""
  },
  "type": "module",
  "workspaces": [
    "packages/*"
  ],
  "devDependencies": {
    "concurrently": "^8.2.2"
  }
}

2. edgedb数据库安装与初始化

2.1 数据库地址:www.edgedb.com/

curl https://sh.edgedb.com --proto '=https' -sSf1 | sh

cd server
edgedb project init
├── dbschema
│   ├── default.esdl
│   ├── edgeql-js
│   └── migrations
├── edgedb.toml
├── package.json
├── src
│   ├── app.ts
│   ├── auth.ts
│   ├── db
│   ├── index.ts
│   ├── nats
│   └── routes
└── tsconfig.json

2.2 default.esdl中写数据模型

  1. 用户模型

  2. 产品模型

  3. 竞拍下单模型

  4. 房间模型

module default {
    type User {
        required name: str {
            constraint exclusive;
            constraint max_len_value(50);
        };
        required passwd: str {
            constraint min_len_value(6);
        };
    }

    type Product {
        required name: str {
            constraint exclusive;
            constraint max_len_value(50);
        };
        required basePrice: int64 {
            constraint min_value(0);
        };
        currentPrice: int64 {
            default := 0;
        };
        required duration: int64 {
            default := 300;
        };
        required timer: int64 {
            default := 300;
        };

        soldAt: datetime;
        auctionStarted: bool {
            default := false;
        };
        auctionEnded: bool {
            default := false;
        };

        sold: bool {
            default := false;
        };
        required owner: User;
        purchasedBy: User;
        currentBidder: User;
        multi bids: Bid;
    }

    type Bid {
        user: User;
        amount: int64 {
            default := 0;
        };
        time: datetime {
            default := std::datetime_current();
        }
    }

    type Room {
        required product: Product;
        multi users: User;
    }
}

2.3 数据库迁移

edgedb create migration
edgedb migrate
bun add edgedb
bun add -D @edgedb/generate
bunx @edgedb/generate edgeql-js // 生成ts版本 query builder

3. 消息队列

3.1 安装nats.io server

go install github.com/nats-io/nats-server/v2@latest
nats-server

flowus.cn/share/ce3dd… 【FlowUs 息流】elysia项目实战