feat: add examples
This commit is contained in:
		
							parent
							
								
									7a1e5807a9
								
							
						
					
					
						commit
						09c42abdcc
					
				
							
								
								
									
										77
									
								
								examples/collections/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								examples/collections/src/index.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					import { Application } from '@nocobase/server/src';
 | 
				
			||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const keys = __dirname.split(path.sep);
 | 
				
			||||||
 | 
					const slug = keys[keys.length - 2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const options = {
 | 
				
			||||||
 | 
					  database: {
 | 
				
			||||||
 | 
					    username: process.env.DB_USER,
 | 
				
			||||||
 | 
					    password: process.env.DB_PASSWORD,
 | 
				
			||||||
 | 
					    database: process.env.DB_DATABASE,
 | 
				
			||||||
 | 
					    host: process.env.DB_HOST,
 | 
				
			||||||
 | 
					    port: process.env.DB_PORT as any,
 | 
				
			||||||
 | 
					    dialect: process.env.DB_DIALECT as any,
 | 
				
			||||||
 | 
					    dialectOptions: {
 | 
				
			||||||
 | 
					      charset: 'utf8mb4',
 | 
				
			||||||
 | 
					      collate: 'utf8mb4_unicode_ci',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    hooks: {
 | 
				
			||||||
 | 
					      beforeDefine(model, options) {
 | 
				
			||||||
 | 
					        options.tableName = `examples_${slug}_${options.tableName || options.name.plural}`;
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  resourcer: {
 | 
				
			||||||
 | 
					    prefix: `/api/examples/${slug}`,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					console.log(options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const app = new Application(options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 用户
 | 
				
			||||||
 | 
					app.collection({
 | 
				
			||||||
 | 
					  name: 'users',
 | 
				
			||||||
 | 
					  fields: [
 | 
				
			||||||
 | 
					    { type: 'string', name: 'username', unique: true },
 | 
				
			||||||
 | 
					    { type: 'password', name: 'password', unique: true },
 | 
				
			||||||
 | 
					    { type: 'hasMany', name: 'posts', foreignKey: 'author_id' },
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 文章
 | 
				
			||||||
 | 
					app.collection({
 | 
				
			||||||
 | 
					  name: 'posts',
 | 
				
			||||||
 | 
					  fields: [
 | 
				
			||||||
 | 
					    { type: 'string', name: 'title' },
 | 
				
			||||||
 | 
					    { type: 'text', name: 'content' },
 | 
				
			||||||
 | 
					    { type: 'belongsToMany', name: 'tags' },
 | 
				
			||||||
 | 
					    { type: 'hasMany', name: 'comments' },
 | 
				
			||||||
 | 
					    { type: 'belongsTo', name: 'author', target: 'users' },
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 标签
 | 
				
			||||||
 | 
					app.collection({
 | 
				
			||||||
 | 
					  name: 'tags',
 | 
				
			||||||
 | 
					  fields: [
 | 
				
			||||||
 | 
					    { type: 'string', name: 'name' },
 | 
				
			||||||
 | 
					    { type: 'belongsToMany', name: 'posts' },
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 评论
 | 
				
			||||||
 | 
					app.collection({
 | 
				
			||||||
 | 
					  name: 'comments',
 | 
				
			||||||
 | 
					  fields: [
 | 
				
			||||||
 | 
					    { type: 'text', name: 'content' },
 | 
				
			||||||
 | 
					    { type: 'belongsTo', name: 'user' },
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.parse(process.argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// yarn examples collections db sync
 | 
				
			||||||
 | 
					// yarn examples collections start
 | 
				
			||||||
							
								
								
									
										4
									
								
								examples/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								examples/index.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					const example = process.argv[2];
 | 
				
			||||||
 | 
					process.argv.splice(2, 1);
 | 
				
			||||||
 | 
					console.log(process.argv);
 | 
				
			||||||
 | 
					require(`./${example}/src`);
 | 
				
			||||||
							
								
								
									
										0
									
								
								examples/middleware/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								examples/middleware/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								examples/models/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								examples/models/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								examples/plugins/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								examples/plugins/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								examples/repositories/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								examples/repositories/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										65
									
								
								examples/resources/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								examples/resources/src/index.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,65 @@
 | 
				
			|||||||
 | 
					import { Application } from '@nocobase/server/src';
 | 
				
			||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const keys = __dirname.split(path.sep);
 | 
				
			||||||
 | 
					const slug = keys[keys.length - 2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const options = {
 | 
				
			||||||
 | 
					  database: {
 | 
				
			||||||
 | 
					    username: process.env.DB_USER,
 | 
				
			||||||
 | 
					    password: process.env.DB_PASSWORD,
 | 
				
			||||||
 | 
					    database: process.env.DB_DATABASE,
 | 
				
			||||||
 | 
					    host: process.env.DB_HOST,
 | 
				
			||||||
 | 
					    port: process.env.DB_PORT as any,
 | 
				
			||||||
 | 
					    dialect: process.env.DB_DIALECT as any,
 | 
				
			||||||
 | 
					    dialectOptions: {
 | 
				
			||||||
 | 
					      charset: 'utf8mb4',
 | 
				
			||||||
 | 
					      collate: 'utf8mb4_unicode_ci',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    hooks: {
 | 
				
			||||||
 | 
					      beforeDefine(model, options) {
 | 
				
			||||||
 | 
					        options.tableName = `examples_${slug}_${options.tableName || options.name.plural}`;
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  resourcer: {
 | 
				
			||||||
 | 
					    prefix: `/api/examples/${slug}`,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					console.log(options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const app = new Application(options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.resource({
 | 
				
			||||||
 | 
					  name: 'server',
 | 
				
			||||||
 | 
					  actions: {
 | 
				
			||||||
 | 
					    async getTime(ctx, next) {
 | 
				
			||||||
 | 
					      ctx.body = new Date();
 | 
				
			||||||
 | 
					      await next();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.parse(process.argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					根据配置生成相关数据表
 | 
				
			||||||
 | 
					yarn examples simple db sync
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					启动服务
 | 
				
			||||||
 | 
					yarn examples simple start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					客户端发送请求
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					创建数据
 | 
				
			||||||
 | 
					curl --location --request POST 'http://localhost:3000/api/examples/simple/users' \
 | 
				
			||||||
 | 
					--header 'Content-Type: application/json' \
 | 
				
			||||||
 | 
					--data-raw '{
 | 
				
			||||||
 | 
					    "username": "abc",
 | 
				
			||||||
 | 
					    "password": "123456"
 | 
				
			||||||
 | 
					}'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					查看列表
 | 
				
			||||||
 | 
					curl --location --request GET 'http://localhost:5051/api/examples/simple/users'
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
							
								
								
									
										134
									
								
								examples/saas/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								examples/saas/src/index.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,134 @@
 | 
				
			|||||||
 | 
					import { Application } from '@nocobase/server/src';
 | 
				
			||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					import mount from 'koa-mount';
 | 
				
			||||||
 | 
					import compose from 'koa-compose';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const keys = __dirname.split(path.sep);
 | 
				
			||||||
 | 
					const slug = keys[keys.length - 2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const apps = new Map<string, Application>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function createApp(opts) {
 | 
				
			||||||
 | 
					  const { name, prefix } = opts;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  const options = {
 | 
				
			||||||
 | 
					    database: {
 | 
				
			||||||
 | 
					      username: process.env.DB_USER,
 | 
				
			||||||
 | 
					      password: process.env.DB_PASSWORD,
 | 
				
			||||||
 | 
					      database: process.env.DB_DATABASE,
 | 
				
			||||||
 | 
					      host: process.env.DB_HOST,
 | 
				
			||||||
 | 
					      port: process.env.DB_PORT as any,
 | 
				
			||||||
 | 
					      dialect: process.env.DB_DIALECT as any,
 | 
				
			||||||
 | 
					      dialectOptions: {
 | 
				
			||||||
 | 
					        charset: 'utf8mb4',
 | 
				
			||||||
 | 
					        collate: 'utf8mb4_unicode_ci',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      hooks: {
 | 
				
			||||||
 | 
					        beforeDefine(model, options) {
 | 
				
			||||||
 | 
					          options.tableName = `examples_${slug}_${name}_${options.tableName || options.name.plural}`;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    resourcer: {
 | 
				
			||||||
 | 
					      prefix,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  console.log(options);
 | 
				
			||||||
 | 
					  const app = new Application(options);
 | 
				
			||||||
 | 
					  if (name) {
 | 
				
			||||||
 | 
					    apps.set(name, app);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  app.resource({
 | 
				
			||||||
 | 
					    name: 'server',
 | 
				
			||||||
 | 
					    actions: {
 | 
				
			||||||
 | 
					      async getInfo(ctx, next) {
 | 
				
			||||||
 | 
					        ctx.body = name;
 | 
				
			||||||
 | 
					        await next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  app.collection({
 | 
				
			||||||
 | 
					    name: 'users',
 | 
				
			||||||
 | 
					    fields: [
 | 
				
			||||||
 | 
					      { type: 'string', name: 'username' },
 | 
				
			||||||
 | 
					      { type: 'password', name: 'password' },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  return app;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const app = createApp({
 | 
				
			||||||
 | 
					  name: 'main',
 | 
				
			||||||
 | 
					  prefix: `/api/examples/${slug}/main`
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.collection({
 | 
				
			||||||
 | 
					  name: 'applications',
 | 
				
			||||||
 | 
					  fields: [
 | 
				
			||||||
 | 
					    { type: 'string', name: 'name', unique: true },
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.command('app-create').argument('<appName>').action(async (appName) => {
 | 
				
			||||||
 | 
					  const App = app.db.getModel('applications');
 | 
				
			||||||
 | 
					  const server = await App.create({
 | 
				
			||||||
 | 
					    name: appName,
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  const api = createApp({
 | 
				
			||||||
 | 
					    name: appName,
 | 
				
			||||||
 | 
					    prefix: `/api/examples/${slug}/${appName}`,
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  await api.db.sync();
 | 
				
			||||||
 | 
					  await api.destroy();
 | 
				
			||||||
 | 
					  console.log(server.toJSON());
 | 
				
			||||||
 | 
					  await app.destroy();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.command('dbsync')
 | 
				
			||||||
 | 
					  .option('-f, --force')
 | 
				
			||||||
 | 
					  .option('--app [app]')
 | 
				
			||||||
 | 
					  .action(async (...args) => {
 | 
				
			||||||
 | 
					    const cli = args.pop();
 | 
				
			||||||
 | 
					    const force = cli.opts()?.force;
 | 
				
			||||||
 | 
					    const appName = cli.opts()?.app;
 | 
				
			||||||
 | 
					    console.log('ac ac', cli.opts());
 | 
				
			||||||
 | 
					    const api = apps.get(appName) || app;
 | 
				
			||||||
 | 
					    await api.load();
 | 
				
			||||||
 | 
					    await api.db.sync(
 | 
				
			||||||
 | 
					      force
 | 
				
			||||||
 | 
					        ? {
 | 
				
			||||||
 | 
					          force: true,
 | 
				
			||||||
 | 
					          alter: {
 | 
				
			||||||
 | 
					            drop: true,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        : {},
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    await api.destroy();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.use(async function(ctx, next) {
 | 
				
			||||||
 | 
					  const appName = ctx.path.split('/')[4];
 | 
				
			||||||
 | 
					  if (appName === 'main') {
 | 
				
			||||||
 | 
					    return next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const App = ctx.db.getModel('applications');
 | 
				
			||||||
 | 
					  const model = await App.findOne({
 | 
				
			||||||
 | 
					    where: { name: appName },
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  console.log({ appName, model })
 | 
				
			||||||
 | 
					  if (!model) {
 | 
				
			||||||
 | 
					    return next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (!apps.has(appName)) {
 | 
				
			||||||
 | 
					    const app1 = createApp({
 | 
				
			||||||
 | 
					      name: appName,
 | 
				
			||||||
 | 
					      prefix: `/api/examples/${slug}/${appName}`
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    apps.set(appName, app1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const server = apps.get(appName);
 | 
				
			||||||
 | 
					  await compose(server.middleware)(ctx, next);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.parse(process.argv);
 | 
				
			||||||
							
								
								
									
										63
									
								
								examples/simple/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								examples/simple/src/index.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					import { Application } from '@nocobase/server/src';
 | 
				
			||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const keys = __dirname.split(path.sep);
 | 
				
			||||||
 | 
					const slug = keys[keys.length - 2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const options = {
 | 
				
			||||||
 | 
					  database: {
 | 
				
			||||||
 | 
					    username: process.env.DB_USER,
 | 
				
			||||||
 | 
					    password: process.env.DB_PASSWORD,
 | 
				
			||||||
 | 
					    database: process.env.DB_DATABASE,
 | 
				
			||||||
 | 
					    host: process.env.DB_HOST,
 | 
				
			||||||
 | 
					    port: process.env.DB_PORT as any,
 | 
				
			||||||
 | 
					    dialect: process.env.DB_DIALECT as any,
 | 
				
			||||||
 | 
					    dialectOptions: {
 | 
				
			||||||
 | 
					      charset: 'utf8mb4',
 | 
				
			||||||
 | 
					      collate: 'utf8mb4_unicode_ci',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    hooks: {
 | 
				
			||||||
 | 
					      beforeDefine(model, options) {
 | 
				
			||||||
 | 
					        options.tableName = `examples_${slug}_${options.tableName || options.name.plural}`;
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  resourcer: {
 | 
				
			||||||
 | 
					    prefix: `/api/examples/${slug}`,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					console.log(options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const app = new Application(options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.collection({
 | 
				
			||||||
 | 
					  name: 'users',
 | 
				
			||||||
 | 
					  fields: [
 | 
				
			||||||
 | 
					    { type: 'string', name: 'username' },
 | 
				
			||||||
 | 
					    { type: 'password', name: 'password' },
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.parse(process.argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					根据配置生成相关数据表
 | 
				
			||||||
 | 
					yarn examples simple db sync
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					启动服务
 | 
				
			||||||
 | 
					yarn examples simple start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					客户端发送请求
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					创建数据
 | 
				
			||||||
 | 
					curl --location --request POST 'http://localhost:3000/api/examples/simple/users' \
 | 
				
			||||||
 | 
					--header 'Content-Type: application/json' \
 | 
				
			||||||
 | 
					--data-raw '{
 | 
				
			||||||
 | 
					    "username": "abc",
 | 
				
			||||||
 | 
					    "password": "123456"
 | 
				
			||||||
 | 
					}'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					查看列表
 | 
				
			||||||
 | 
					curl --location --request GET 'http://localhost:5051/api/examples/simple/users'
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user