Bladeren bron

操作日志

wuyi 1 jaar geleden
bovenliggende
commit
fd59588baa

+ 3 - 1
src/app.module.ts

@@ -21,6 +21,7 @@ import { BalanceModule } from './balance/balance.module'
 import { ChannelModule } from './channel/channel.module'
 import { OperaterConfigModule } from './operator_config/operator_config.module'
 import { CarrierIdModule } from './carrier-id/carrier-id.module'
+import { OperationLogModule } from './operation-log/operation-log.module'
 
 @Module({
     imports: [
@@ -84,7 +85,8 @@ import { CarrierIdModule } from './carrier-id/carrier-id.module'
         BalanceModule,
         ChannelModule,
         OperaterConfigModule,
-        CarrierIdModule
+        CarrierIdModule,
+        OperationLogModule
     ],
     controllers: [],
     providers: [

+ 21 - 5
src/balance/balance.controller.ts

@@ -4,10 +4,12 @@ import { PageRequest } from '../common/dto/page-request'
 import { BalanceRecord } from './entities/balance-record.entities'
 import { HasRoles } from '../auth/roles.decorator'
 import { Role } from '../model/role.enum'
+import { OperationLogService } from '../operation-log/operation-log.service'
+import { OperationType } from '../operation-log/entities/operation-log.entity'
 
 @Controller('balance')
 export class BalanceController {
-    constructor(private readonly balanceService: BalanceService) {
+    constructor(private readonly balanceService: BalanceService, private readonly operationLogService: OperationLogService) {
     }
 
     @Get('/:id')
@@ -20,7 +22,9 @@ export class BalanceController {
         if (req.user.roles.includes('user')) {
             return
         }
-        return await this.balanceService.rechargeBalance(req.user.userId, parseInt(id), amount)
+        const balanceRecord = await this.balanceService.rechargeBalance(req.user.userId, parseInt(id), amount)
+        await this.operationLogService.create(req, balanceRecord, 'BalanceRecord', OperationType.INSERT, '余额充值')
+        return 'Recharge success!'
     }
 
     @Get('/transfer/:id/:amount')
@@ -28,7 +32,13 @@ export class BalanceController {
         if (req.user.roles.includes('user')) {
             return
         }
-        return await this.balanceService.transferBalance(req.user.userId, parseInt(id), amount)
+        const balanceRecord = await this.balanceService.transferBalance(req.user.userId, parseInt(id), amount)
+        if (balanceRecord) {
+            await this.operationLogService.create(req, balanceRecord, 'BalanceRecord', OperationType.INSERT, '余额划转')
+            return 'Transfer success!'
+        } else {
+            return 'Balance not enough!'
+        }
     }
 
     @Post('/records')
@@ -40,8 +50,14 @@ export class BalanceController {
     }
 
     @Get('/updateRate/:id/:rate')
-    async updateRate(@Param('id') id: string, @Param('rate') rate: number) {
-        return await this.balanceService.updateRate(parseInt(id), rate)
+    async updateRate(@Req() req, @Param('id') id: string, @Param('rate') rate: number) {
+        const users = await this.balanceService.updateRate(parseInt(id), rate)
+        if (users) {
+            await this.operationLogService.create(req, users, 'Users', OperationType.UPDATE, '修改费率', users.rate)
+            return 'update rate success!'
+        } else {
+            return 'update rate fail!'
+        }
     }
 
     @Post('/export')

+ 3 - 1
src/balance/balance.module.ts

@@ -8,12 +8,14 @@ import { UsersModule } from '../users/users.module'
 import { Users } from '../users/entities/users.entity'
 import { SysConfigModule } from '../sys-config/sys-config.module'
 import { Task } from '../task/entities/task.entity'
+import { OperationLogModule } from '../operation-log/operation-log.module'
 
 @Module({
     imports: [
         TypeOrmModule.forFeature([Balance, BalanceRecord, Users, Task]),
         UsersModule,
-        SysConfigModule
+        SysConfigModule,
+        OperationLogModule
     ],
     controllers: [BalanceController],
     providers: [BalanceService],

+ 7 - 9
src/balance/balance.service.ts

@@ -41,7 +41,7 @@ export class BalanceService {
         })
     }
 
-    async rechargeBalance(supervisorId: number, userId: number, amount: number): Promise<string> {
+    async rechargeBalance(supervisorId: number, userId: number, amount: number) {
         try {
             // 获取余额
             let balance = await this.balanceRepository.findOne({
@@ -91,7 +91,7 @@ export class BalanceService {
             users.balance = balance.currentBalance
             await this.userRepository.save(users)
 
-            return 'Recharge success!'
+            return record
         } catch (e) {
             Logger.error('Error recharge ', e, 'BalanceService')
             throw e
@@ -169,9 +169,9 @@ export class BalanceService {
                 }
                 targetUsers.balance = targetBalance.currentBalance
                 await this.userRepository.save(targetUsers)
-                return 'Transfer success!'
+                return record
             } else {
-                return 'Balance not enough!'
+                return null
             }
         } catch (e) {
             Logger.error('Error transfer ', e, 'BalanceService')
@@ -259,7 +259,7 @@ export class BalanceService {
         return page
     }
 
-    async updateRate(userId: number, rate: number): Promise<string> {
+    async updateRate(userId: number, rate: number) {
         try {
             let balance = await this.balanceRepository.findOne({
                 where: {
@@ -280,12 +280,10 @@ export class BalanceService {
 
             const users = await this.usersService.findById(userId)
             users.rate = rate
-            await this.userRepository.save(users)
-
-            return 'update rate success!'
+            return await this.userRepository.save(users)
         } catch (e) {
             Logger.error('Error rate ', e, 'RcsService')
-            return 'update rate fail!'
+            return null
         }
     }
 

+ 41 - 0
src/operation-log/entities/operation-log.entity.ts

@@ -0,0 +1,41 @@
+import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'
+import { number } from 'yup'
+
+export enum OperationType {
+    INSERT = 'INSERT',
+    UPDATE = 'UPDATE',
+    DELETE = 'DELETE',
+    SELECT = 'SELECT'
+}
+
+@Entity()
+export class OperationLog {
+
+    @PrimaryGeneratedColumn()
+    id: number
+
+    @Column()
+    userId: number
+
+    @Column()
+    userName: string
+
+    @Column({ type: 'enum', enum: OperationType })
+    operationType: OperationType
+
+    @Column()
+    description: string
+
+    @Column({ type: 'text', nullable: true })
+    details: string
+
+    @Column({ nullable: true })
+    objectId: number
+
+    @Column()
+    objectName: string
+
+    @CreateDateColumn()
+    createdAt: Date
+
+}

+ 22 - 0
src/operation-log/operation-log.controller.ts

@@ -0,0 +1,22 @@
+import { Body, Controller, Post, Put, Req } from '@nestjs/common'
+import { OperationLogService } from './operation-log.service'
+import { PageRequest } from '../common/dto/page-request'
+import { OperationLog } from './entities/operation-log.entity'
+
+@Controller('operation-log')
+export class OperationLogController {
+
+    constructor(private readonly operationLogService: OperationLogService) {
+    }
+
+    @Post('/logs')
+    async findAll(@Req() req, @Body() page: PageRequest<OperationLog>) {
+        return await this.operationLogService.findAll(page)
+    }
+
+    @Put('/createOne')
+    async createOne(@Body() createOperationLogDto: OperationLog) {
+        return await this.operationLogService.createOne(createOperationLogDto)
+    }
+
+}

+ 16 - 0
src/operation-log/operation-log.module.ts

@@ -0,0 +1,16 @@
+import { Module } from '@nestjs/common'
+import { TypeOrmModule } from '@nestjs/typeorm'
+import { OperationLog } from './entities/operation-log.entity'
+import { OperationLogController } from './operation-log.controller'
+import { OperationLogService } from './operation-log.service'
+
+@Module({
+    imports: [
+        TypeOrmModule.forFeature([OperationLog])
+    ],
+    controllers: [OperationLogController],
+    providers: [OperationLogService],
+    exports: [OperationLogService]
+})
+export class OperationLogModule {
+}

+ 37 - 0
src/operation-log/operation-log.service.ts

@@ -0,0 +1,37 @@
+import { Injectable } from '@nestjs/common'
+import { OperationLog, OperationType } from './entities/operation-log.entity'
+import { Repository } from 'typeorm'
+import { InjectRepository } from '@nestjs/typeorm'
+import { paginate, Pagination } from 'nestjs-typeorm-paginate'
+import { PageRequest } from '../common/dto/page-request'
+
+@Injectable()
+export class OperationLogService {
+
+    constructor(
+        @InjectRepository(OperationLog)
+        private OperationLogRepository: Repository<OperationLog>
+    ) {
+    }
+
+    async findAll(req: PageRequest<OperationLog>): Promise<Pagination<OperationLog>> {
+        return await paginate<OperationLog>(this.OperationLogRepository, req.page, req.search)
+    }
+
+    async createOne(operationLog: OperationLog): Promise<OperationLog> {
+        return await this.OperationLogRepository.save(operationLog)
+    }
+
+    async create(req: any, Object: any, ObjectName: string, operationType: OperationType, description: string, details?: any) {
+        const log = new OperationLog()
+        log.userId = req.user.userId
+        log.userName = req.user.username
+        log.objectId = Object.id
+        log.objectName = ObjectName
+        log.operationType = operationType
+        log.description = description
+        log.details = details.toString() || JSON.stringify(Object)
+        await this.OperationLogRepository.save(log)
+    }
+
+}

+ 11 - 5
src/users/users.admin.controller.ts

@@ -23,11 +23,15 @@ import { PageRequest } from 'src/common/dto/page-request'
 import { Users } from './entities/users.entity'
 import { UserCreateDto } from './dto/user-create.dto'
 import { In, Like } from 'typeorm'
+import { OperationLogService } from '../operation-log/operation-log.service'
+import { OperationType } from '../operation-log/entities/operation-log.entity'
+
 @ApiTags('users.admin')
 @Controller('/admin/users')
 @ApiBearerAuth()
 export class UsersAdminController {
-    constructor(private readonly usersService: UsersService) {}
+    constructor(private readonly usersService: UsersService, private readonly operationLogService: OperationLogService) {
+    }
 
     @Post()
     public async list(@Req() req, @Body() page: PageRequest<Users>) {
@@ -47,8 +51,10 @@ export class UsersAdminController {
     }
 
     @Put()
-    public async create(@Body() user: UserCreateDto) {
-        return await this.usersService.create(user)
+    public async create(@Req() req, @Body() user: UserCreateDto) {
+        const users = await this.usersService.create(user)
+        await this.operationLogService.create(req, users, 'Users', OperationType.INSERT, '新增用户')
+        return users
     }
 
     @Post('/update')
@@ -59,8 +65,8 @@ export class UsersAdminController {
             }
         }
         try {
-            await this.usersService.update(userProfileDto)
-
+            const users = await this.usersService.update(userProfileDto)
+            await this.operationLogService.create(req, users, 'Users', OperationType.UPDATE, '修改用户')
             return {
                 message: 'User Updated successfully!',
                 status: HttpStatus.OK

+ 5 - 2
src/users/users.controller.ts

@@ -15,12 +15,14 @@ import { IUsers } from './interfaces/users.interface'
 import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'
 import { Users } from './entities/users.entity'
 import { Public } from 'src/auth/public.decorator'
+import { OperationLogService } from '../operation-log/operation-log.service'
+import { OperationType } from '../operation-log/entities/operation-log.entity'
 
 @ApiTags('users')
 @Controller('users')
 @ApiBearerAuth()
 export class UsersController {
-    constructor(private readonly usersService: UsersService) {
+    constructor(private readonly usersService: UsersService, private readonly operationLogService: OperationLogService) {
     }
 
     @Get('/my')
@@ -64,7 +66,8 @@ export class UsersController {
         if (req.user.roles.includes('user') || req.user.roles.includes('api')) {
             throw new InternalServerErrorException('Permission denied!')
         }
-        await this.usersService.updatePassword(userId, password)
+        const users = await this.usersService.updatePassword(userId, password)
+        await this.operationLogService.create(req, users, 'Users', OperationType.UPDATE, '修改密码')
     }
 
     @Get('/invites')

+ 4 - 2
src/users/users.module.ts

@@ -7,9 +7,10 @@ import { BcryptService } from '../shared/hashing/bcrypt.service'
 import { HashingService } from '../shared/hashing/hashing.service'
 import { SmsModule } from '../sms/sms.module'
 import { UsersAdminController } from './users.admin.controller'
+import { OperationLogModule } from '../operation-log/operation-log.module'
 
 @Module({
-    imports: [SmsModule, TypeOrmModule.forFeature([Users])],
+    imports: [SmsModule, TypeOrmModule.forFeature([Users]), OperationLogModule],
     controllers: [UsersController, UsersAdminController],
     providers: [
         {
@@ -20,4 +21,5 @@ import { UsersAdminController } from './users.admin.controller'
     ],
     exports: [UsersService]
 })
-export class UsersModule {}
+export class UsersModule {
+}