前言
本人比较喜欢看视频,但都是需要VIP所以开发个APP能免费看各大平台的视频。本平台仅做学习使用
技术栈
APP => flutter
后台管理=>vue3+ts
后端=>nestjs+typeorm+mysql
1、APP
2、后台管理系统(Admin)
3、后端
3-1、项目创建
npm i -g @nestjs/cli 安装nest脚手架
nest new ttvideo_serve
因为考虑APP和后台公用一个数据库,所以我们使用 nest的monorepo
模式
在nest项目文件中输入命令
nest generate app server
并且在项目文件中admin=>main.ts
设置全局跟路由
app.setGlobalPrefix("/server");
3-2 创建数据库模块
nest g lib db
询问是否使用@apps 我们输入@libs
然后在apps会自动创建libs文件夹
npm install --save @nestjs/typeorm typeorm mysql
3-2-1 使用ConfigModel配置公共配置文件
npm i --save @nestjs/config cross-env
- 1、我们在项目根目录中创建文件夹
config
&创建database.config.ts
文件 - 2、在
package.json
文件中 start&bulid命令加上cross-env NODE_ENV=development
、cross-env NODE_ENV=production
- 3、在项目根目录创建文件
.development.env
、.production.env
// .development.env
SERVER_PORT=9000 //这个是server端的启动端口
THUA_API_PORT=9001 // 这个是app接口端的启动端口
DATABASE_USER=root // 这个是数据库登陆name
DATABASE_PASSWORD=****// 这个是数据库登陆密码
DATABASE_PORT=3306// 这个是数据库登陆端口
DATABASE_HOST=******// 这个是数据库登陆地址
DATABASE_BASENAME=ttvideo// 这个是数据库名称
上述配置请根据实际的需求进行调整,你可以配置开发/线上不同的配置
// database.config.ts
import { join } from 'path';
export default () => ({
// 这里需要额外增加database标识符,因在configService中不好拿
database: {
type: 'mysql',
host: process.env.DATABASE_HOST,
port: process.env.DATABASE_PORT,
username: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_BASENAME,
entities: [join(__dirname, '../', '**/**.entity{.ts,.js}')],
synchronize: true
}
})
这里需要注意的是:entities的地址可能会出错,这里可以尝试修改根目录nest-cli.json
// nest-cli.json
"compilerOptions": {
"webpack": false, //修改这里 原配置这里是true
"tsConfigPath": "apps/thua-server/tsconfig.app.json" // 这里不用修改
},
3-2-2 使用配置文件配置数据库
如果你根据上述步骤来,我们是会有libs/db文件夹的
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import dataBaseConfig from 'config/database.config';
import { DbService } from './db.service';
// 根据你的环境推导env文件
const getEnvPath = () => {
return `.${process.env.NODE_ENV}.env`
}
@Module({
imports: [
ConfigModule.forRoot({ envFilePath: getEnvPath(), load: [dataBaseConfig], isGlobal: true }),
TypeOrmModule.forRootAsync({
useFactory: (config: ConfigService) => {
// 这里的database 就是刚刚dataBaseConfig为什么要加标识符
console.log(config.get('database'));
return config.get('database')
},
inject: [ConfigService]
})
],
providers: [DbService],
exports: [DbService],
})
export class DbModule { }
3-2-3 创建实体文件
在libs/db/src
下创建entitys
文件夹来创建实体
根据你实际的需求创建实体
- userAdmin(后台用户实体)
- video(视频实体)
- Collection(视频单集实体)
- PlayTimes(收集用户播放视频的实体)
- Analysis(视频解析实体)
- Bullet(弹幕实体)
注意这些实体文件会根据你具体的配置写入数据库中的表字段等
具体的配置你可以去typeorm文档参考
3-3用户身份鉴权(登录注册)
具体操作可以按照该文章进行操作newst鉴权,不过需要特别注意的是:UsersController
需要在users.module.ts
删除
//users.module.ts
import { UserAdmin } from '@libs/db/models/userAdmin.entity';
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
imports: [TypeOrmModule.forFeature([UserAdmin])],
//controllers: [UsersController],
providers: [UsersService],
exports: [UsersService]
})
export class UsersModule { }
需要在总模块//app.models.ts中导入
//需要在总模块//app.models.ts中导入
import { DbModule } from '@libs/db';
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
import { AuthModule } from './auth/auth.module';
import { UsersController } from './users/users.controller';
@Module({
imports: [DbModule, UsersModule, AuthModule],
controllers: [UsersController],
providers: [],
})
export class AdminModule { }