Przeglądaj źródła

添加更新二维码信息的功能,新增UpdateQrCodeDto以支持二维码及备注的更新,更新相关服务和路由配置。

wuyi 3 dni temu
rodzic
commit
842e7776b2

+ 27 - 1
src/controllers/qr-code.controller.ts

@@ -9,7 +9,8 @@ import {
   ResetMaintenanceCodeDto,
   AddUserQrCodeDto,
   DeleteUserQrCodeDto,
-  QueryUserQrCodeDto
+  QueryUserQrCodeDto,
+  UpdateQrCodeDto
 } from '../dto/qr-code.dto'
 
 export class QrCodeController {
@@ -310,4 +311,29 @@ export class QrCodeController {
       return reply.code(500).send({ message })
     }
   }
+
+  /**
+   * 更新二维码信息
+   */
+  async update(request: FastifyRequest<{ Body: UpdateQrCodeDto }>, reply: FastifyReply) {
+    try {
+      const { qrCode, maintenanceCode, remark } = request.body
+
+      const updated = await this.qrCodeService.updateQrCode(qrCode, maintenanceCode, { remark })
+
+      return reply.send({
+        message: '更新成功',
+        data: {
+          qrCode: updated.qrCode,
+          remark: updated.remark
+        }
+      })
+    } catch (error) {
+      const message = error instanceof Error ? error.message : '更新失败'
+      const clientErrorKeywords = ['维护码错误', '二维码不存在']
+      const isClientError = clientErrorKeywords.some(keyword => message.includes(keyword))
+      const statusCode = isClientError ? 400 : 500
+      return reply.code(statusCode).send({ message })
+    }
+  }
 }

+ 13 - 0
src/dto/qr-code.dto.ts

@@ -117,3 +117,16 @@ export class QueryUserQrCodeDto {
   @Min(1)
   pageSize?: number = 20
 }
+
+export class UpdateQrCodeDto {
+  @IsString()
+  qrCode: string
+
+  @IsString()
+  maintenanceCode: string
+
+  @IsOptional()
+  @IsString()
+  @MaxLength(500)
+  remark?: string
+}

+ 3 - 0
src/entities/qr-code.entity.ts

@@ -47,6 +47,9 @@ export class QrCode {
   @Column({ default: 0 })
   scanCount: number
 
+  @Column({ nullable: true })
+  remark: string
+
   @Column({ type: 'datetime', nullable: true })
   activatedAt: Date
 

+ 8 - 1
src/routes/qr-code.routes.ts

@@ -10,7 +10,8 @@ import {
   ResetMaintenanceCodeDto,
   AddUserQrCodeDto,
   DeleteUserQrCodeDto,
-  QueryUserQrCodeDto
+  QueryUserQrCodeDto,
+  UpdateQrCodeDto
 } from '../dto/qr-code.dto'
 
 export default async function qrCodeRoutes(fastify: FastifyInstance) {
@@ -82,4 +83,10 @@ export default async function qrCodeRoutes(fastify: FastifyInstance) {
     { onRequest: [authenticate] },
     qrCodeController.getUserQrCodes.bind(qrCodeController)
   )
+
+  fastify.put<{ Body: UpdateQrCodeDto }>(
+    '/update',
+    { onRequest: [hasRole(UserRole.ADMIN)] },
+    qrCodeController.update.bind(qrCodeController)
+  )
 }

+ 25 - 2
src/services/qr-code.service.ts

@@ -203,7 +203,8 @@ export class QrCodeService {
         createdAt: entity.createdAt,
         updatedAt: entity.updatedAt,
         activatedAt: entity.activatedAt,
-        lastScanAt: entity.lastScanAt
+        lastScanAt: entity.lastScanAt,
+        remark: entity.remark
       }),
       isActivated: entity.isActivated,
       isVisible,
@@ -422,6 +423,27 @@ export class QrCodeService {
     await this.userQrCodeRepository.save(userQrCode)
   }
 
+  /**
+   * 更新二维码信息
+   */
+  async updateQrCode(qrCode: string, maintenanceCode: string, data: { remark?: string }): Promise<QrCode> {
+    const isValid = await this.verifyMaintenanceCode(qrCode, maintenanceCode)
+    if (!isValid) {
+      throw new Error('维护码错误')
+    }
+
+    const entity = await this.qrCodeRepository.findOne({ where: { qrCode } })
+    if (!entity) {
+      throw new Error('二维码不存在')
+    }
+
+    if (data.remark !== undefined) {
+      entity.remark = data.remark
+    }
+
+    return await this.qrCodeRepository.save(entity)
+  }
+
   async getUserQrCodes(userId: number, page: number = 0, pageSize: number = 20): Promise<PaginationResponse<any>> {
     const [content, total] = await this.userQrCodeRepository
       .createQueryBuilder('userQrCode')
@@ -471,7 +493,8 @@ export class QrCodeService {
         qrType: qrType,
         isActivated: qrCode?.isActivated,
         lastScanAt: qrCode?.lastScanAt,
-        isVisible: isVisible
+        isVisible: isVisible,
+        remark: qrCode?.remark
       }
 
       // 根据类型添加特定字段