Compare commits
3 Commits
85b2062a2a
...
d7d9777d1a
Author | SHA1 | Date | |
---|---|---|---|
d7d9777d1a | |||
5c9ecec8fc | |||
ac80ecaf4b |
@ -2,8 +2,10 @@ import { Configure } from '@/modules/config/configure';
|
|||||||
import { ConfigureFactory } from '@/modules/config/types';
|
import { ConfigureFactory } from '@/modules/config/types';
|
||||||
import * as contentControllers from '@/modules/content/controllers';
|
import * as contentControllers from '@/modules/content/controllers';
|
||||||
import { ApiConfig, VersionOption } from '@/modules/restful/types';
|
import { ApiConfig, VersionOption } from '@/modules/restful/types';
|
||||||
|
import { createUserApi } from '@/modules/user/routes';
|
||||||
|
|
||||||
export const v1 = async (configure: Configure): Promise<VersionOption> => {
|
export const v1 = async (configure: Configure): Promise<VersionOption> => {
|
||||||
|
const userApi = createUserApi();
|
||||||
return {
|
return {
|
||||||
routes: [
|
routes: [
|
||||||
{
|
{
|
||||||
@ -17,6 +19,7 @@ export const v1 = async (configure: Configure): Promise<VersionOption> => {
|
|||||||
{ name: '标签操作', description: '对标签进行CRUD操作' },
|
{ name: '标签操作', description: '对标签进行CRUD操作' },
|
||||||
{ name: '文章操作', description: '对文章进行CRUD操作' },
|
{ name: '文章操作', description: '对文章进行CRUD操作' },
|
||||||
{ name: '评论操作', description: '对评论进行CRUD操作' },
|
{ name: '评论操作', description: '对评论进行CRUD操作' },
|
||||||
|
...userApi.tags.app,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
@ -25,6 +28,7 @@ export const v1 = async (configure: Configure): Promise<VersionOption> => {
|
|||||||
path: 'content',
|
path: 'content',
|
||||||
controllers: Object.values(contentControllers),
|
controllers: Object.values(contentControllers),
|
||||||
},
|
},
|
||||||
|
...userApi.routes.app,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
@ -13,7 +13,7 @@ import {
|
|||||||
} from 'typeorm';
|
} from 'typeorm';
|
||||||
|
|
||||||
import { PostEntity } from '@/modules/content/entities/post.entity';
|
import { PostEntity } from '@/modules/content/entities/post.entity';
|
||||||
import { UserEntity } from '@/modules/user/entities/UserEntity';
|
import { UserEntity } from '@/modules/user/entities/user.entity';
|
||||||
|
|
||||||
@Exclude()
|
@Exclude()
|
||||||
@Entity('content_comment')
|
@Entity('content_comment')
|
||||||
|
@ -18,7 +18,7 @@ import { PostBodyType } from '@/modules/content/constants';
|
|||||||
import { CategoryEntity } from '@/modules/content/entities/category.entity';
|
import { CategoryEntity } from '@/modules/content/entities/category.entity';
|
||||||
import { CommentEntity } from '@/modules/content/entities/comment.entity';
|
import { CommentEntity } from '@/modules/content/entities/comment.entity';
|
||||||
import { TagEntity } from '@/modules/content/entities/tag.entity';
|
import { TagEntity } from '@/modules/content/entities/tag.entity';
|
||||||
import { UserEntity } from '@/modules/user/entities/UserEntity';
|
import { UserEntity } from '@/modules/user/entities/user.entity';
|
||||||
|
|
||||||
@Exclude()
|
@Exclude()
|
||||||
@Entity('content_posts')
|
@Entity('content_posts')
|
||||||
|
105
src/modules/user/controllers/account.controller.ts
Normal file
105
src/modules/user/controllers/account.controller.ts
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
import {
|
||||||
|
Body,
|
||||||
|
Controller,
|
||||||
|
Get,
|
||||||
|
Patch,
|
||||||
|
Post,
|
||||||
|
Request,
|
||||||
|
SerializeOptions,
|
||||||
|
UseGuards,
|
||||||
|
} from '@nestjs/common';
|
||||||
|
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
|
import { pick } from 'lodash';
|
||||||
|
|
||||||
|
import { Depends } from '@/modules/restful/decorators/depend.decorator';
|
||||||
|
|
||||||
|
import { Guest } from '../decorators/guest.decorator';
|
||||||
|
import { RequestUser } from '../decorators/user.request.decorator';
|
||||||
|
import { UpdateAccountDto, UpdatePasswordDto } from '../dtos/account.dto';
|
||||||
|
import { CredentialDto, RegisterDto } from '../dtos/auth.dto';
|
||||||
|
import { UserEntity } from '../entities/user.entity';
|
||||||
|
import { LocalAuthGuard } from '../guards/local.auth.guard';
|
||||||
|
import { AuthService } from '../services/auth.service';
|
||||||
|
import { UserService } from '../services/user.service';
|
||||||
|
import { UserModule } from '../user.module';
|
||||||
|
|
||||||
|
@ApiTags('账户操作')
|
||||||
|
@Depends(UserModule)
|
||||||
|
@Controller('account')
|
||||||
|
export class AccountController {
|
||||||
|
constructor(
|
||||||
|
protected authService: AuthService,
|
||||||
|
protected userService: UserService,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用用户名密码注册用户
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
@Post('register')
|
||||||
|
@Guest()
|
||||||
|
async register(@Body() data: RegisterDto) {
|
||||||
|
return this.authService.register(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户登录[凭证(可以是用户名,邮箱,手机号等)+密码登录]
|
||||||
|
* @param user
|
||||||
|
* @param _data
|
||||||
|
*/
|
||||||
|
@Post('login')
|
||||||
|
@Guest()
|
||||||
|
@UseGuards(LocalAuthGuard)
|
||||||
|
async login(@RequestUser() user: ClassToPlain<UserEntity>, @Body() _data: CredentialDto) {
|
||||||
|
return { token: await this.authService.createToken(user.id) };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注销登录
|
||||||
|
* @param req
|
||||||
|
*/
|
||||||
|
@Post('logout')
|
||||||
|
@ApiBearerAuth()
|
||||||
|
async logout(@Request() req: any) {
|
||||||
|
return this.authService.logout(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取账户信息[只有用户自己才能查询]
|
||||||
|
* @param user
|
||||||
|
*/
|
||||||
|
@Get('profile')
|
||||||
|
@ApiBearerAuth()
|
||||||
|
@SerializeOptions({ groups: ['user-detail'] })
|
||||||
|
async profile(@RequestUser() user: ClassToPlain<UserEntity>) {
|
||||||
|
return this.userService.detail(user.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更改账户信息
|
||||||
|
* @param user
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
@Patch()
|
||||||
|
@ApiBearerAuth()
|
||||||
|
@SerializeOptions({ groups: ['user-detail'] })
|
||||||
|
async update(@RequestUser() user: ClassToPlain<UserEntity>, @Body() data: UpdateAccountDto) {
|
||||||
|
return this.userService.update({ id: user.id, ...pick(data, ['username', 'nickname']) });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改密码[必须知道原密码]
|
||||||
|
* @param user
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
@Patch('change-password')
|
||||||
|
@ApiBearerAuth()
|
||||||
|
@SerializeOptions({ groups: ['user-detail'] })
|
||||||
|
async changePassword(
|
||||||
|
@RequestUser() user: ClassToPlain<UserEntity>,
|
||||||
|
@Body() data: UpdatePasswordDto,
|
||||||
|
) {
|
||||||
|
return this.authService.changePassword(user, data);
|
||||||
|
}
|
||||||
|
}
|
2
src/modules/user/controllers/index.ts
Normal file
2
src/modules/user/controllers/index.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export * from './account.controller';
|
||||||
|
export * from './user.controller';
|
95
src/modules/user/controllers/user.controller.ts
Normal file
95
src/modules/user/controllers/user.controller.ts
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
import {
|
||||||
|
Body,
|
||||||
|
Controller,
|
||||||
|
Delete,
|
||||||
|
Get,
|
||||||
|
Param,
|
||||||
|
ParseUUIDPipe,
|
||||||
|
Patch,
|
||||||
|
Post,
|
||||||
|
SerializeOptions,
|
||||||
|
} from '@nestjs/common';
|
||||||
|
|
||||||
|
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
|
import { DeleteWithTrashDto, RestoreDto } from '@/modules/content/dtos/delete.with.trash.dto';
|
||||||
|
import { Depends } from '@/modules/restful/decorators/depend.decorator';
|
||||||
|
import { UserModule } from '@/modules/user/user.module';
|
||||||
|
|
||||||
|
import { Guest } from '../decorators/guest.decorator';
|
||||||
|
import { CreateUserDto, UpdateUserDto } from '../dtos/user.dto';
|
||||||
|
import { UserService } from '../services/user.service';
|
||||||
|
|
||||||
|
@ApiTags('用户管理')
|
||||||
|
@Depends(UserModule)
|
||||||
|
@Controller('users')
|
||||||
|
export class UserController {
|
||||||
|
constructor(protected service: UserService) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户列表
|
||||||
|
*/
|
||||||
|
@Get()
|
||||||
|
@Guest()
|
||||||
|
@SerializeOptions({ groups: ['user-list'] })
|
||||||
|
async list() {
|
||||||
|
return this.service.list();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户信息
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
@Get(':id')
|
||||||
|
@Guest()
|
||||||
|
@SerializeOptions({ groups: ['user-detail'] })
|
||||||
|
async detail(@Param('id', new ParseUUIDPipe()) id: string) {
|
||||||
|
return this.service.detail(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增用户
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
@Post()
|
||||||
|
@ApiBearerAuth()
|
||||||
|
@SerializeOptions({ groups: ['user-detail'] })
|
||||||
|
async store(@Body() data: CreateUserDto) {
|
||||||
|
return this.service.create(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新用户
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
@Patch()
|
||||||
|
@ApiBearerAuth()
|
||||||
|
@SerializeOptions({ groups: ['user-detail'] })
|
||||||
|
async update(@Body() data: UpdateUserDto) {
|
||||||
|
return this.service.update(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除用户
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
@Delete()
|
||||||
|
@ApiBearerAuth()
|
||||||
|
@SerializeOptions({ groups: ['user-list'] })
|
||||||
|
async delete(@Body() data: DeleteWithTrashDto) {
|
||||||
|
const { ids, trash } = data;
|
||||||
|
return this.service.delete(ids, trash);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量恢复用户
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
@Patch('restore')
|
||||||
|
@ApiBearerAuth()
|
||||||
|
@SerializeOptions({ groups: ['user-list'] })
|
||||||
|
async restore(@Body() data: RestoreDto) {
|
||||||
|
const { ids } = data;
|
||||||
|
return this.service.restore(ids);
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
|
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
|
||||||
|
|
||||||
import { UserEntity } from '../entities/UserEntity';
|
import { UserEntity } from '../entities/user.entity';
|
||||||
|
|
||||||
export const RequestUser = createParamDecorator(async (_data: unknown, ctx: ExecutionContext) => {
|
export const RequestUser = createParamDecorator(async (_data: unknown, ctx: ExecutionContext) => {
|
||||||
const request = ctx.switchToHttp().getRequest();
|
const request = ctx.switchToHttp().getRequest();
|
||||||
|
@ -6,7 +6,7 @@ import { IsPassword } from '@/modules/core/constraints/password.constraint';
|
|||||||
import { IsMatchPhone } from '@/modules/core/constraints/phone.number.constraint';
|
import { IsMatchPhone } from '@/modules/core/constraints/phone.number.constraint';
|
||||||
import { IsUnique, IsUniqueExist } from '@/modules/database/constraints';
|
import { IsUnique, IsUniqueExist } from '@/modules/database/constraints';
|
||||||
import { UserValidateGroup } from '@/modules/user/constants';
|
import { UserValidateGroup } from '@/modules/user/constants';
|
||||||
import { UserEntity } from '@/modules/user/entities/UserEntity';
|
import { UserEntity } from '@/modules/user/entities/user.entity';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户模块DTO的通用基础字段
|
* 用户模块DTO的通用基础字段
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Entity, ManyToOne, OneToOne, Relation } from 'typeorm';
|
import { Entity, ManyToOne, OneToOne, Relation } from 'typeorm';
|
||||||
|
|
||||||
import { UserEntity } from '@/modules/user/entities/UserEntity';
|
|
||||||
import { BaseToken } from '@/modules/user/entities/base.token';
|
import { BaseToken } from '@/modules/user/entities/base.token';
|
||||||
import { RefreshTokenEntity } from '@/modules/user/entities/refresh.token.entity';
|
import { RefreshTokenEntity } from '@/modules/user/entities/refresh.token.entity';
|
||||||
|
import { UserEntity } from '@/modules/user/entities/user.entity';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户认证token模型
|
* 用户认证token模型
|
||||||
|
3
src/modules/user/entities/index.ts
Normal file
3
src/modules/user/entities/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export * from './user.entity';
|
||||||
|
export * from './access.token.entity';
|
||||||
|
export * from './refresh.token.entity';
|
2
src/modules/user/guards/index.ts
Normal file
2
src/modules/user/guards/index.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export * from './local.auth.guard';
|
||||||
|
export * from './jwt.auth.guard';
|
1
src/modules/user/interceptors/index.ts
Normal file
1
src/modules/user/interceptors/index.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from './userId.interceptor';
|
18
src/modules/user/interceptors/userId.interceptor.ts
Normal file
18
src/modules/user/interceptors/userId.interceptor.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
|
||||||
|
import { isNil } from 'lodash';
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class UserIdInterceptor implements NestInterceptor {
|
||||||
|
intercept(context: ExecutionContext, next: CallHandler<any>): Observable<any> {
|
||||||
|
const request: any = context.switchToHttp().getRequest();
|
||||||
|
if (!isNil(request.user?.id)) {
|
||||||
|
if (isNil(request.body)) {
|
||||||
|
request.body = { userId: request.user.id };
|
||||||
|
} else {
|
||||||
|
request.body.userId = request.user.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return next.handle();
|
||||||
|
}
|
||||||
|
}
|
1
src/modules/user/repositories/index.ts
Normal file
1
src/modules/user/repositories/index.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from './user.repository';
|
@ -1,6 +1,6 @@
|
|||||||
import { BaseRepository } from '@/modules/database/base/repository';
|
import { BaseRepository } from '@/modules/database/base/repository';
|
||||||
import { CustomRepository } from '@/modules/database/decorators/repository.decorator';
|
import { CustomRepository } from '@/modules/database/decorators/repository.decorator';
|
||||||
import { UserEntity } from '@/modules/user/entities/UserEntity';
|
import { UserEntity } from '@/modules/user/entities/user.entity';
|
||||||
|
|
||||||
@CustomRepository(UserEntity)
|
@CustomRepository(UserEntity)
|
||||||
export class UserRepository extends BaseRepository<UserEntity> {
|
export class UserRepository extends BaseRepository<UserEntity> {
|
24
src/modules/user/routes.ts
Normal file
24
src/modules/user/routes.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import { RouteOption, TagOption } from '../restful/types';
|
||||||
|
|
||||||
|
import * as controllers from './controllers';
|
||||||
|
|
||||||
|
export function createUserApi() {
|
||||||
|
const routes: Record<'app', RouteOption[]> = {
|
||||||
|
app: [
|
||||||
|
{
|
||||||
|
name: 'app.user',
|
||||||
|
path: 'user',
|
||||||
|
controllers: Object.values(controllers),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const tags: Record<'app', (string | TagOption)[]> = {
|
||||||
|
app: [
|
||||||
|
{ name: '用户管理', description: '对用户进行CRUD操作' },
|
||||||
|
{ name: '账户操作', description: '注册登录、查看修改账户信息、修改密码等' },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
return { routes, tags };
|
||||||
|
}
|
@ -9,12 +9,12 @@ import { Configure } from '@/modules/config/configure';
|
|||||||
|
|
||||||
import { getTime } from '@/modules/core/helpers/time';
|
import { getTime } from '@/modules/core/helpers/time';
|
||||||
import { RegisterDto } from '@/modules/user/dtos/auth.dto';
|
import { RegisterDto } from '@/modules/user/dtos/auth.dto';
|
||||||
import { UserEntity } from '@/modules/user/entities/UserEntity';
|
import { UserEntity } from '@/modules/user/entities/user.entity';
|
||||||
|
import { UserRepository } from '@/modules/user/repositories';
|
||||||
import { TokenService } from '@/modules/user/services/token.service';
|
import { TokenService } from '@/modules/user/services/token.service';
|
||||||
import { decrypt } from '@/modules/user/utils';
|
import { decrypt } from '@/modules/user/utils';
|
||||||
|
|
||||||
import { UpdatePasswordDto } from '../dtos/account.dto';
|
import { UpdatePasswordDto } from '../dtos/account.dto';
|
||||||
import { UserRepository } from '../repositories/UserRepository';
|
|
||||||
|
|
||||||
import { UserService } from './user.service';
|
import { UserService } from './user.service';
|
||||||
|
|
||||||
|
3
src/modules/user/services/index.ts
Normal file
3
src/modules/user/services/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export * from './user.service';
|
||||||
|
export * from './token.service';
|
||||||
|
export * from './auth.service';
|
@ -11,9 +11,9 @@ import { v4 as uuid } from 'uuid';
|
|||||||
import { Configure } from '@/modules/config/configure';
|
import { Configure } from '@/modules/config/configure';
|
||||||
import { getTime } from '@/modules/core/helpers/time';
|
import { getTime } from '@/modules/core/helpers/time';
|
||||||
import { defaultUserConfig, getUserConfig } from '@/modules/user/config';
|
import { defaultUserConfig, getUserConfig } from '@/modules/user/config';
|
||||||
import { UserEntity } from '@/modules/user/entities/UserEntity';
|
|
||||||
import { AccessTokenEntity } from '@/modules/user/entities/access.token.entity';
|
import { AccessTokenEntity } from '@/modules/user/entities/access.token.entity';
|
||||||
import { RefreshTokenEntity } from '@/modules/user/entities/refresh.token.entity';
|
import { RefreshTokenEntity } from '@/modules/user/entities/refresh.token.entity';
|
||||||
|
import { UserEntity } from '@/modules/user/entities/user.entity';
|
||||||
import { JwtConfig, JwtPayload, UserConfig } from '@/modules/user/types';
|
import { JwtConfig, JwtPayload, UserConfig } from '@/modules/user/types';
|
||||||
|
|
||||||
import { TokenConst } from '../constants';
|
import { TokenConst } from '../constants';
|
||||||
|
@ -8,9 +8,10 @@ import { BaseService } from '@/modules/database/base/service';
|
|||||||
|
|
||||||
import { QueryHook } from '@/modules/database/types';
|
import { QueryHook } from '@/modules/database/types';
|
||||||
|
|
||||||
|
import { UserRepository } from '@/modules/user/repositories';
|
||||||
|
|
||||||
import { CreateUserDto, QueryUserDto, UpdateUserDto } from '../dtos/user.dto';
|
import { CreateUserDto, QueryUserDto, UpdateUserDto } from '../dtos/user.dto';
|
||||||
import { UserEntity } from '../entities/UserEntity';
|
import { UserEntity } from '../entities/user.entity';
|
||||||
import { UserRepository } from '../repositories/UserRepository';
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class UserService extends BaseService<UserEntity, UserRepository> {
|
export class UserService extends BaseService<UserEntity, UserRepository> {
|
||||||
|
2
src/modules/user/strategies/index.ts
Normal file
2
src/modules/user/strategies/index.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export * from './jwt.strategy';
|
||||||
|
export * from './local.strategy';
|
@ -1,3 +1,4 @@
|
|||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
import { PassportStrategy } from '@nestjs/passport';
|
import { PassportStrategy } from '@nestjs/passport';
|
||||||
|
|
||||||
import { instanceToPlain } from 'class-transformer';
|
import { instanceToPlain } from 'class-transformer';
|
||||||
@ -5,10 +6,12 @@ import { ExtractJwt, Strategy } from 'passport-jwt';
|
|||||||
|
|
||||||
import { Configure } from '@/modules/config/configure';
|
import { Configure } from '@/modules/config/configure';
|
||||||
|
|
||||||
|
import { UserRepository } from '@/modules/user/repositories';
|
||||||
|
|
||||||
import { TokenConst } from '../constants';
|
import { TokenConst } from '../constants';
|
||||||
import { UserRepository } from '../repositories/UserRepository';
|
|
||||||
import { JwtPayload } from '../types';
|
import { JwtPayload } from '../types';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
export class JwtStrategy extends PassportStrategy(Strategy) {
|
export class JwtStrategy extends PassportStrategy(Strategy) {
|
||||||
constructor(
|
constructor(
|
||||||
protected configure: Configure,
|
protected configure: Configure,
|
||||||
|
@ -2,7 +2,7 @@ import { Injectable, UnauthorizedException } from '@nestjs/common';
|
|||||||
import { PassportStrategy } from '@nestjs/passport';
|
import { PassportStrategy } from '@nestjs/passport';
|
||||||
import { Strategy } from 'passport-local';
|
import { Strategy } from 'passport-local';
|
||||||
|
|
||||||
import { AuthService } from '../services/auth.service';
|
import { AuthService } from '@/modules/user/services';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户认证本地策略
|
* 用户认证本地策略
|
||||||
|
1
src/modules/user/subscribers/index.ts
Normal file
1
src/modules/user/subscribers/index.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from './UserSubscriber';
|
@ -3,7 +3,7 @@ import { randomBytes } from 'node:crypto';
|
|||||||
import { EventSubscriber, InsertEvent, UpdateEvent } from 'typeorm';
|
import { EventSubscriber, InsertEvent, UpdateEvent } from 'typeorm';
|
||||||
|
|
||||||
import { BaseSubscriber } from '@/modules/database/base/subscriber';
|
import { BaseSubscriber } from '@/modules/database/base/subscriber';
|
||||||
import { UserEntity } from '@/modules/user/entities/UserEntity';
|
import { UserEntity } from '@/modules/user/entities/user.entity';
|
||||||
import { encrypt } from '@/modules/user/utils';
|
import { encrypt } from '@/modules/user/utils';
|
||||||
|
|
||||||
@EventSubscriber()
|
@EventSubscriber()
|
4
src/modules/user/user.module.ts
Normal file
4
src/modules/user/user.module.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
|
||||||
|
@Module({})
|
||||||
|
export class UserModule {}
|
Loading…
Reference in New Issue
Block a user