Просмотр исходного кода

Merge branch 'main' of https://git.izouma.com/wuyi/junma-api

wilhelm wong 2 месяцев назад
Родитель
Сommit
ab90f98936

+ 34 - 3
src/controllers/member.controller.ts

@@ -8,7 +8,8 @@ import {
   UpdateGuestBody,
   MemberLoginBody,
   ResetPasswordBody,
-  RegisterBody
+  RegisterBody,
+  UpdateProfileBody
 } from '../dto/member.dto'
 import { VipLevel, MemberStatus } from '../entities/member.entity'
 import { UserService } from '../services/user.service'
@@ -206,8 +207,8 @@ export class MemberController {
   async resetPassword(request: FastifyRequest<{ Body: ResetPasswordBody }>, reply: FastifyReply) {
     try {
       const { password } = request.body
-      if (password.length < 8 || !/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/.test(password)) {
-        return reply.code(400).send({ message: '密码长度必须至少8位,包含大小写字母和数字' })
+      if (password.length < 6) {
+        return reply.code(400).send({ message: '密码长度必须至少8位' })
       }
 
       await this.userService.resetPassword(request.user.id, password)
@@ -217,6 +218,36 @@ export class MemberController {
     }
   }
 
+  async updateProfile(request: FastifyRequest<{ Body: UpdateProfileBody }>, reply: FastifyReply) {
+    try {
+      const { name, email } = request.body
+
+      // 验证必填字段
+      if (!name) {
+        return reply.code(400).send({ message: '用户名为必填字段' })
+      }
+
+      // 验证用户名格式
+      if (name.length < 3 || name.length > 20) {
+        return reply.code(400).send({ message: '用户名长度必须在3-20个字符之间' })
+      }
+
+      // 验证邮箱格式
+      if (email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
+        return reply.code(400).send({ message: '邮箱格式不正确' })
+      }
+
+      await this.memberService.updateProfile(request.user.id, name, email)
+      return reply.send({ message: '个人信息更新成功' })
+    } catch (error) {
+      const errorMessage = error instanceof Error ? error.message : '更新个人信息失败'
+      if (errorMessage.includes('已被使用')) {
+        return reply.code(400).send({ message: errorMessage })
+      }
+      return reply.code(500).send({ message: '更新个人信息失败' })
+    }
+  }
+
   async updateVipLevel(
     request: FastifyRequest<{
       Params: { id: string }

+ 5 - 0
src/dto/member.dto.ts

@@ -67,3 +67,8 @@ export interface RegisterBody {
   phone?: string
   code?: string
 }
+
+export interface UpdateProfileBody {
+  name: string
+  email?: string
+}

+ 9 - 1
src/routes/member.routes.ts

@@ -8,7 +8,8 @@ import {
   UpdateGuestBody,
   MemberLoginBody,
   ResetPasswordBody,
-  RegisterBody
+  RegisterBody,
+  UpdateProfileBody
 } from '../dto/member.dto'
 import { VipLevel, MemberStatus } from '../entities/member.entity'
 import { UserRole } from '../entities/user.entity'
@@ -38,6 +39,13 @@ export default async function memberRoutes(fastify: FastifyInstance) {
   // 获取当前会员信息
   fastify.get('/profile', { onRequest: [authenticate] }, memberController.profile.bind(memberController))
 
+  // 修改用户名和邮箱
+  fastify.put<{ Body: UpdateProfileBody }>(
+    '/profile',
+    { onRequest: [authenticate] },
+    memberController.updateProfile.bind(memberController)
+  )
+
   // 重置密码
   fastify.post<{ Body: ResetPasswordBody }>(
     '/reset-password',

+ 29 - 0
src/services/member.service.ts

@@ -390,4 +390,33 @@ export class MemberService {
       return { user: savedUser, member: savedMember }
     })
   }
+
+  async updateProfile(userId: number, name: string, email?: string): Promise<void> {
+    await this.dataSource.transaction(async manager => {
+      // 检查用户名是否已被其他用户使用
+      const existingUser = await manager.findOne(User, { where: { name } })
+      if (existingUser && existingUser.id !== userId) {
+        throw new Error('用户名已被使用')
+      }
+
+      // 检查邮箱是否已被其他会员使用
+      if (email) {
+        const existingEmail = await manager.findOne(Member, { where: { email } })
+        if (existingEmail && existingEmail.userId !== userId) {
+          throw new Error('邮箱已被使用')
+        }
+      }
+
+      // 更新用户名
+      await manager.update(User, userId, { name })
+
+      // 更新会员邮箱
+      if (email) {
+        const member = await manager.findOne(Member, { where: { userId } })
+        if (member) {
+          await manager.update(Member, member.id, { email })
+        }
+      }
+    })
+  }
 }