update
This commit is contained in:
		
							parent
							
								
									8cfbfa85cb
								
							
						
					
					
						commit
						894d296159
					
				@ -12,15 +12,17 @@
 | 
			
		||||
        "preview": "vite preview"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@3rapp/common": "workspace:*",
 | 
			
		||||
        "@3rapp/api": "workspace:*",
 | 
			
		||||
        "@ant-design/cssinjs": "^1.20.0",
 | 
			
		||||
        "antd": "^5.17.0",
 | 
			
		||||
        "axios": "^1.6.8",
 | 
			
		||||
        "deepmerge": "^4.3.1",
 | 
			
		||||
        "react": "^18.2.0",
 | 
			
		||||
        "react-dom": "^18.2.0"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@3rapp/code-config": "workspace:*",
 | 
			
		||||
        "@3rapp/utils": "workspace:*",
 | 
			
		||||
        "@types/node": "^20.12.10",
 | 
			
		||||
        "@types/react": "^18.2.66",
 | 
			
		||||
        "@types/react-dom": "^18.2.22",
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
import { pathResolve } from '@3rapp/utils';
 | 
			
		||||
import { pathResolve } from '@3rapp/common';
 | 
			
		||||
import merge from 'deepmerge';
 | 
			
		||||
import { ConfigEnv, UserConfig } from 'vite';
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,16 @@ export const createConfig = (params: ConfigEnv, configure?: Configure): UserConf
 | 
			
		||||
                    localsConvention: 'camelCaseOnly',
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            server: {
 | 
			
		||||
                proxy: {
 | 
			
		||||
                    '/api': {
 | 
			
		||||
                        target: 'http://localhost:3001/api',
 | 
			
		||||
                        changeOrigin: true,
 | 
			
		||||
                        rewrite: (path) => path.replace(/^\/api/, ''),
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
                cors: true,
 | 
			
		||||
            },
 | 
			
		||||
            plugins: createPlugins(isBuild),
 | 
			
		||||
        },
 | 
			
		||||
        typeof configure === 'function' ? configure(params, isBuild) : {},
 | 
			
		||||
 | 
			
		||||
@ -1,15 +1,34 @@
 | 
			
		||||
// src/app.tsx
 | 
			
		||||
 | 
			
		||||
import { PostEntity } from '@3rapp/api/modules/content/entities/post.entity';
 | 
			
		||||
import { StyleProvider } from '@ant-design/cssinjs';
 | 
			
		||||
import { Button, ConfigProvider, theme, App as AntdApp } from 'antd';
 | 
			
		||||
// import 'dayjs/locale/zh-cn';
 | 
			
		||||
import zhCN from 'antd/locale/zh_CN';
 | 
			
		||||
 | 
			
		||||
import { FC } from 'react';
 | 
			
		||||
import axios from 'axios';
 | 
			
		||||
import { FC, useEffect, useState } from 'react';
 | 
			
		||||
 | 
			
		||||
import $styles from './app.module.css';
 | 
			
		||||
 | 
			
		||||
const getPosts = async () => {
 | 
			
		||||
    let data: PostEntity[] = [];
 | 
			
		||||
    try {
 | 
			
		||||
        const res = await axios.get('/api/posts');
 | 
			
		||||
        data = res.data;
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
        console.log('Error:', err);
 | 
			
		||||
    }
 | 
			
		||||
    return data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const App: FC = () => {
 | 
			
		||||
    const [data, setData] = useState<PostEntity[]>([]);
 | 
			
		||||
    useEffect(() => {
 | 
			
		||||
        (async () => {
 | 
			
		||||
            setData(await getPosts());
 | 
			
		||||
        })();
 | 
			
		||||
    }, []);
 | 
			
		||||
    return (
 | 
			
		||||
        <ConfigProvider
 | 
			
		||||
            locale={zhCN}
 | 
			
		||||
@ -38,6 +57,12 @@ const App: FC = () => {
 | 
			
		||||
                            >
 | 
			
		||||
                                点此打开
 | 
			
		||||
                            </Button>
 | 
			
		||||
                            <h2>文章列表</h2>
 | 
			
		||||
                            <ul>
 | 
			
		||||
                                {data.map((item) => (
 | 
			
		||||
                                    <li key={item.id}>{item.title}</li>
 | 
			
		||||
                                ))}
 | 
			
		||||
                            </ul>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </AntdApp>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								apps/admin/src/type.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								apps/admin/src/type.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
			
		||||
export interface Post {
 | 
			
		||||
    title: string;
 | 
			
		||||
    body: string;
 | 
			
		||||
}
 | 
			
		||||
@ -3,8 +3,6 @@
 | 
			
		||||
    "collection": "@nestjs/schematics",
 | 
			
		||||
    "sourceRoot": "src",
 | 
			
		||||
    "compilerOptions": {
 | 
			
		||||
        "deleteOutDir": true,
 | 
			
		||||
        "builder": "swc",
 | 
			
		||||
        "typeCheck": true
 | 
			
		||||
        "deleteOutDir": true
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -3,8 +3,15 @@
 | 
			
		||||
    "version": "0.0.1",
 | 
			
		||||
    "description": "",
 | 
			
		||||
    "author": "",
 | 
			
		||||
    "private": true,
 | 
			
		||||
    "license": "UNLICENSED",
 | 
			
		||||
    "main": "dist/main.js",
 | 
			
		||||
    "types": "dist/main.d.ts",
 | 
			
		||||
    "exports": {
 | 
			
		||||
        ".": {
 | 
			
		||||
            "import": "./dist/main.d.ts"
 | 
			
		||||
        },
 | 
			
		||||
        "./*": "./dist/*.d.ts"
 | 
			
		||||
    },
 | 
			
		||||
    "scripts": {
 | 
			
		||||
        "cli": "nest",
 | 
			
		||||
        "db": "mikro-orm",
 | 
			
		||||
@ -23,15 +30,18 @@
 | 
			
		||||
        "test:e2e": "jest --config ./test/jest-e2e.json"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "@3rapp/common": "workspace:*",
 | 
			
		||||
        "@mikro-orm/cli": "^6.2.5",
 | 
			
		||||
        "@mikro-orm/core": "^6.2.5",
 | 
			
		||||
        "@mikro-orm/migrations": "^6.2.5",
 | 
			
		||||
        "@mikro-orm/nestjs": "^5.2.3",
 | 
			
		||||
        "@mikro-orm/postgresql": "^6.2.5",
 | 
			
		||||
        "@mikro-orm/reflection": "^6.2.5",
 | 
			
		||||
        "@mikro-orm/seeder": "^6.2.5",
 | 
			
		||||
        "@nestjs/common": "^10.3.8",
 | 
			
		||||
        "@nestjs/core": "^10.3.8",
 | 
			
		||||
        "@nestjs/platform-fastify": "^10.3.8",
 | 
			
		||||
        "deepmerge": "^4.3.1",
 | 
			
		||||
        "fastify": "^4.26.2",
 | 
			
		||||
        "lodash": "^4.17.21",
 | 
			
		||||
        "reflect-metadata": "^0.2.2",
 | 
			
		||||
@ -41,6 +51,7 @@
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@3rapp/code-config": "workspace:*",
 | 
			
		||||
        "@faker-js/faker": "^8.4.1",
 | 
			
		||||
        "@mikro-orm/sql-highlighter": "^1.0.1",
 | 
			
		||||
        "@nestjs/cli": "^10.3.2",
 | 
			
		||||
        "@nestjs/schematics": "^10.1.1",
 | 
			
		||||
        "@nestjs/testing": "^10.3.8",
 | 
			
		||||
 | 
			
		||||
@ -1,20 +1,14 @@
 | 
			
		||||
import { MikroOrmModule } from '@mikro-orm/nestjs';
 | 
			
		||||
import { Module } from '@nestjs/common';
 | 
			
		||||
 | 
			
		||||
import { AppController } from './app.controller';
 | 
			
		||||
import { AppService } from './app.service';
 | 
			
		||||
import { database } from './config/database.config';
 | 
			
		||||
import { moduleImports } from './module.list';
 | 
			
		||||
import { ContentModule } from './modules/content/content.module';
 | 
			
		||||
import { DatabaseModule } from './modules/database/database.module';
 | 
			
		||||
import { UserModule } from './modules/user/user.module';
 | 
			
		||||
 | 
			
		||||
@Module({
 | 
			
		||||
    imports: [
 | 
			
		||||
        MikroOrmModule.forRoot({
 | 
			
		||||
            ...database(),
 | 
			
		||||
            // registerRequestContext: true,
 | 
			
		||||
            // autoLoadEntities: true,
 | 
			
		||||
        }),
 | 
			
		||||
        ...moduleImports,
 | 
			
		||||
    ],
 | 
			
		||||
    imports: [DatabaseModule.forRoot(database()), UserModule, ContentModule],
 | 
			
		||||
    controllers: [AppController],
 | 
			
		||||
    providers: [AppService],
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
@ -1,27 +1,16 @@
 | 
			
		||||
import { Migrator } from '@mikro-orm/migrations';
 | 
			
		||||
import { defineConfig, Utils } from '@mikro-orm/postgresql';
 | 
			
		||||
import { defineConfig } from '@mikro-orm/postgresql';
 | 
			
		||||
 | 
			
		||||
import { SeedManager } from '@mikro-orm/seeder';
 | 
			
		||||
import { PostgreSqlOptions } from '@mikro-orm/postgresql/PostgreSqlMikroORM';
 | 
			
		||||
 | 
			
		||||
import { moduleImports } from '@/module.list';
 | 
			
		||||
import { getEntities } from '@/modules/database/helpers';
 | 
			
		||||
import { getBbOptions } from '@/modules/database/helpers';
 | 
			
		||||
 | 
			
		||||
export const database = () =>
 | 
			
		||||
    defineConfig({
 | 
			
		||||
        host: '127.0.0.1',
 | 
			
		||||
        user: 'postgres',
 | 
			
		||||
        password: '123456',
 | 
			
		||||
        dbName: '3rapp',
 | 
			
		||||
        entities: getEntities(moduleImports),
 | 
			
		||||
        extensions: [Migrator, SeedManager],
 | 
			
		||||
        migrations: {
 | 
			
		||||
            disableForeignKeys: false,
 | 
			
		||||
            tableName: 'migrations',
 | 
			
		||||
            path: Utils.detectTsNode() ? 'src/database/migrations' : 'dist/database/migrations',
 | 
			
		||||
        },
 | 
			
		||||
        seeder: {
 | 
			
		||||
            path: Utils.detectTsNode() ? 'src/database/seeders' : 'dist/database/seeders',
 | 
			
		||||
            defaultSeeder: 'DatabaseSeeder',
 | 
			
		||||
        },
 | 
			
		||||
    });
 | 
			
		||||
    defineConfig(
 | 
			
		||||
        getBbOptions<PostgreSqlOptions>({
 | 
			
		||||
            host: '127.0.0.1',
 | 
			
		||||
            user: 'postgres',
 | 
			
		||||
            password: '123456',
 | 
			
		||||
            dbName: '3rapp',
 | 
			
		||||
        }),
 | 
			
		||||
    );
 | 
			
		||||
export default database();
 | 
			
		||||
 | 
			
		||||
@ -14,6 +14,8 @@ async function bootstrap() {
 | 
			
		||||
    });
 | 
			
		||||
    // 设置全局访问前缀
 | 
			
		||||
    app.setGlobalPrefix('api');
 | 
			
		||||
    // 关闭nestjs进程自动关闭mikroorm等进程
 | 
			
		||||
    app.enableShutdownHooks();
 | 
			
		||||
    // 启动后的输出
 | 
			
		||||
    await app.listen(3001, () => {
 | 
			
		||||
        console.log();
 | 
			
		||||
 | 
			
		||||
@ -1,6 +0,0 @@
 | 
			
		||||
import { ModuleMetadata } from '@nestjs/common';
 | 
			
		||||
 | 
			
		||||
import { ContentModule } from './modules/content/content.module';
 | 
			
		||||
import { UserModule } from './modules/user/user.module';
 | 
			
		||||
 | 
			
		||||
export const moduleImports: ModuleMetadata['imports'] = [UserModule, ContentModule];
 | 
			
		||||
@ -1,11 +1,14 @@
 | 
			
		||||
import { AnyEntity, EntityName } from '@mikro-orm/core';
 | 
			
		||||
import { MikroOrmModule } from '@mikro-orm/nestjs';
 | 
			
		||||
import { Module } from '@nestjs/common';
 | 
			
		||||
 | 
			
		||||
import { PostController } from './controllers/post.controller';
 | 
			
		||||
import { PostEntity } from './entities/post.entity';
 | 
			
		||||
import { PostService } from './services/post.service';
 | 
			
		||||
 | 
			
		||||
@Module({})
 | 
			
		||||
export class ContentModule {
 | 
			
		||||
    static entities(): EntityName<AnyEntity>[] {
 | 
			
		||||
        return [PostEntity];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@Module({
 | 
			
		||||
    imports: [MikroOrmModule.forFeature({ entities: [PostEntity] })],
 | 
			
		||||
    controllers: [PostController],
 | 
			
		||||
    providers: [PostService],
 | 
			
		||||
    exports: [PostService],
 | 
			
		||||
})
 | 
			
		||||
export class ContentModule {}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								apps/api/src/modules/content/controllers/post.controller.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								apps/api/src/modules/content/controllers/post.controller.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
import { Controller, Get } from '@nestjs/common';
 | 
			
		||||
 | 
			
		||||
import { PostService } from '../services/post.service';
 | 
			
		||||
 | 
			
		||||
@Controller('posts')
 | 
			
		||||
export class PostController {
 | 
			
		||||
    constructor(private postService: PostService) {}
 | 
			
		||||
 | 
			
		||||
    @Get()
 | 
			
		||||
    async list() {
 | 
			
		||||
        return this.postService.list();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -11,10 +11,10 @@ export class PostEntity {
 | 
			
		||||
    id = v4();
 | 
			
		||||
 | 
			
		||||
    @Property({ index: true })
 | 
			
		||||
    title: string;
 | 
			
		||||
    title!: string;
 | 
			
		||||
 | 
			
		||||
    @Property({ type: 'text', lazy: true })
 | 
			
		||||
    body: string;
 | 
			
		||||
    body!: string;
 | 
			
		||||
 | 
			
		||||
    @Property({ type: ArrayType, nullable: true })
 | 
			
		||||
    keywords?: string[];
 | 
			
		||||
 | 
			
		||||
@ -4,9 +4,8 @@ import { PostRepository } from '../repositories/post.repository';
 | 
			
		||||
 | 
			
		||||
@Injectable()
 | 
			
		||||
export class PostService {
 | 
			
		||||
    constructor(protected postRepo: PostRepository) {}
 | 
			
		||||
    constructor(private readonly postRepo: PostRepository) {}
 | 
			
		||||
 | 
			
		||||
    // @CreateRequestContext<PostService>((t) => t.postRepo)
 | 
			
		||||
    async list() {
 | 
			
		||||
        return this.postRepo.findAll();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										28
									
								
								apps/api/src/modules/database/database.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								apps/api/src/modules/database/database.module.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
import { MikroORM } from '@mikro-orm/core';
 | 
			
		||||
import { MikroOrmModule, MikroOrmModuleSyncOptions } from '@mikro-orm/nestjs';
 | 
			
		||||
// import { SqlHighlighter } from '@mikro-orm/sql-highlighter';
 | 
			
		||||
import { DynamicModule, Module, OnModuleInit } from '@nestjs/common';
 | 
			
		||||
 | 
			
		||||
import { getBbOptions } from './helpers';
 | 
			
		||||
 | 
			
		||||
@Module({})
 | 
			
		||||
export class DatabaseModule implements OnModuleInit {
 | 
			
		||||
    constructor(private readonly orm: MikroORM) {}
 | 
			
		||||
 | 
			
		||||
    async onModuleInit(): Promise<void> {
 | 
			
		||||
        await this.orm.getMigrator().up();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static forRoot(options: MikroOrmModuleSyncOptions = {}): DynamicModule {
 | 
			
		||||
        return {
 | 
			
		||||
            global: true,
 | 
			
		||||
            module: DatabaseModule,
 | 
			
		||||
            imports: [
 | 
			
		||||
                MikroOrmModule.forRootAsync({
 | 
			
		||||
                    useFactory: () => getBbOptions<MikroOrmModuleSyncOptions>(options),
 | 
			
		||||
                }),
 | 
			
		||||
            ],
 | 
			
		||||
            exports: [MikroOrmModule],
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,11 +1,35 @@
 | 
			
		||||
import { deepMerge } from '@3rapp/common';
 | 
			
		||||
import { base, zh_CN, en, Faker } from '@faker-js/faker';
 | 
			
		||||
import { ModuleMetadata } from '@nestjs/common';
 | 
			
		||||
import { isFunction } from 'lodash';
 | 
			
		||||
import { Utils } from '@mikro-orm/core';
 | 
			
		||||
import { Migrator } from '@mikro-orm/migrations';
 | 
			
		||||
 | 
			
		||||
export const getEntities = (modules: ModuleMetadata['imports'] = []) =>
 | 
			
		||||
    modules
 | 
			
		||||
        .map((m) => ('entities' in m && isFunction(m.entities) ? m.entities() : []))
 | 
			
		||||
        .reduce((o, n) => [...o, ...n], []);
 | 
			
		||||
import { MikroOrmModuleSyncOptions } from '@mikro-orm/nestjs';
 | 
			
		||||
import { SeedManager } from '@mikro-orm/seeder';
 | 
			
		||||
 | 
			
		||||
export const getBbOptions = <T>(options: MikroOrmModuleSyncOptions) =>
 | 
			
		||||
    deepMerge(
 | 
			
		||||
        {
 | 
			
		||||
            // registerRequestContext: false,
 | 
			
		||||
            extensions: [Migrator, SeedManager],
 | 
			
		||||
            migrations: {
 | 
			
		||||
                disableForeignKeys: false,
 | 
			
		||||
                tableName: 'migrations',
 | 
			
		||||
                path: Utils.detectTsNode() ? 'src/database/migrations' : 'dist/database/migrations',
 | 
			
		||||
            },
 | 
			
		||||
            seeder: {
 | 
			
		||||
                path: Utils.detectTsNode() ? 'src/database/seeders' : 'dist/database/seeders',
 | 
			
		||||
                defaultSeeder: 'DatabaseSeeder',
 | 
			
		||||
            },
 | 
			
		||||
            entities: ['dist/**/*.entity.js', 'node_modules/@3rapp/**/*.entity.js'],
 | 
			
		||||
            entitiesTs: ['src/**/*.entity.ts', 'node_modules/@3rapp/**/*.entity.ts'],
 | 
			
		||||
 | 
			
		||||
            // highlighter: new SqlHighlighter(),
 | 
			
		||||
            // metadataProvider: TsMorphMetadataProvider,
 | 
			
		||||
            debug: true,
 | 
			
		||||
        } as MikroOrmModuleSyncOptions,
 | 
			
		||||
        options,
 | 
			
		||||
        'replace',
 | 
			
		||||
    ) as T;
 | 
			
		||||
 | 
			
		||||
const faker = new Faker({
 | 
			
		||||
    locale: [zh_CN, en, base],
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "@3rapp/utils",
 | 
			
		||||
    "name": "@3rapp/common",
 | 
			
		||||
    "version": "0.0.0",
 | 
			
		||||
    "files": [
 | 
			
		||||
        "dist"
 | 
			
		||||
							
								
								
									
										1
									
								
								packages/common/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								packages/common/src/index.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
export * from './utils/tools';
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
export * from './tools';
 | 
			
		||||
							
								
								
									
										1052
									
								
								pnpm-lock.yaml
									
									
									
									
									
								
							
							
						
						
									
										1052
									
								
								pnpm-lock.yaml
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -15,6 +15,7 @@
 | 
			
		||||
            "dependsOn": ["^lint"]
 | 
			
		||||
        },
 | 
			
		||||
        "dev": {
 | 
			
		||||
            "dependsOn": ["^dev"],
 | 
			
		||||
            "cache": false,
 | 
			
		||||
            "persistent": true
 | 
			
		||||
        },
 | 
			
		||||
@ -22,7 +23,7 @@
 | 
			
		||||
            "dependsOn": ["^build"]
 | 
			
		||||
        },
 | 
			
		||||
        "@3rapp/admin#dev": {
 | 
			
		||||
            "dependsOn": ["@3rapp/utils#build"]
 | 
			
		||||
            "dependsOn": ["@3rapp/common#build"]
 | 
			
		||||
        },
 | 
			
		||||
        "@3rapp/api#db": {
 | 
			
		||||
            "cache": false,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user