#!/usr/bin/env node /** * john4 客户下单系统(Page Data 前后台)演示搭建。 * Usage: node scripts/setup-customer-order-demo.mjs */ import fs from 'node:fs/promises'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { loadH5Environment } from './load-env.mjs'; import { createDbPool } from '../db.mjs'; import { bindWorkspaceHtmlForPageData } from '../page-data-workspace-bind.mjs'; import { resolveMindSpaceStorageRoot } from '../mindspace-runtime-config.mjs'; import { createUserDataSpaceService } from '../user-data-space-service.mjs'; const root = path.join(path.dirname(fileURLToPath(import.meta.url)), '..'); loadH5Environment(import.meta.dirname); const USER_ID = process.env.CUSTOMER_ORDER_USER_ID ?? '32035858-9a20-425b-89da-c118ef0779aa'; const WORKSPACE_ROOT = path.join(root, 'MindSpace', USER_ID); const ADMIN_PASSWORD = '88888888'; const DATASET = 'customer_orders'; const ORDER_FORM_HTML = ` 客户下单

客户下单

请填写订单信息,提交后将保存到 Page Data。

`; const ORDER_ADMIN_HTML = ` 订单管理后台

客户订单管理后台

查看订单、按商品统计、导出 CSV

请输入管理口令

`; const FORM_POLICY = { accessMode: 'public', datasets: { customer_orders: { insert: true, read: false, columns: { insert: ['customer_name', 'phone', 'product_name', 'quantity', 'address', 'remark', 'status'], }, }, }, }; const ADMIN_POLICY = { accessMode: 'password', datasets: { customer_orders: { insert: false, read: true, columns: { read: ['id', 'customer_name', 'phone', 'product_name', 'quantity', 'address', 'remark', 'status', 'created_at'], }, }, }, }; async function main() { const publicDir = path.join(WORKSPACE_ROOT, 'public'); await fs.mkdir(publicDir, { recursive: true }); await fs.writeFile(path.join(publicDir, 'customer-order-form.html'), ORDER_FORM_HTML, 'utf8'); await fs.writeFile(path.join(publicDir, 'customer-order-admin.html'), ORDER_ADMIN_HTML, 'utf8'); const dataSpace = createUserDataSpaceService({ workspaceRoot: WORKSPACE_ROOT, userId: USER_ID }); await dataSpace.executeSql(`CREATE TABLE IF NOT EXISTS customer_orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, customer_name TEXT NOT NULL DEFAULT '', phone TEXT NOT NULL DEFAULT '', product_name TEXT NOT NULL DEFAULT '', quantity TEXT NOT NULL DEFAULT '1', address TEXT NOT NULL DEFAULT '', remark TEXT NOT NULL DEFAULT '', status TEXT NOT NULL DEFAULT '待处理', created_at TEXT NOT NULL DEFAULT (datetime('now', '+8 hours')) );`); await dataSpace.upsertDataset({ name: DATASET, table: DATASET, description: '客户下单系统订单表', actions: ['read', 'insert'], columns: { insert: FORM_POLICY.datasets.customer_orders.columns.insert, read: ADMIN_POLICY.datasets.customer_orders.columns.read, }, }); const pool = createDbPool(); const storageRoot = resolveMindSpaceStorageRoot(root); const pages = [ { relativePath: 'public/customer-order-form.html', accessMode: 'public', password: null, policy: FORM_POLICY }, { relativePath: 'public/customer-order-admin.html', accessMode: 'password', password: ADMIN_PASSWORD, policy: ADMIN_POLICY }, ]; console.log('==> 客户下单系统 Page Data 演示\n'); for (const page of pages) { const result = await bindWorkspaceHtmlForPageData({ pool, h5Root: root, storageRoot, userId: USER_ID, workspaceRoot: WORKSPACE_ROOT, relativePath: page.relativePath, accessMode: page.accessMode, password: page.password, pageDataPolicy: page.policy, }); console.log(`✓ ${page.relativePath}`); console.log(` pageId: ${result.pageId}`); console.log(` URL: ${result.workspaceUrl}\n`); } console.log('后台口令:', ADMIN_PASSWORD); await pool.end(); } main().catch((err) => { console.error(err instanceof Error ? err.stack ?? err.message : err); process.exit(1); });