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