侧边栏壁纸
  • 累计撰写 12 篇文章
  • 累计收到 1 条评论

答辩

ASN__
2026-03-27 / 0 评论 / 3 阅读 / 正在检测是否收录...

校园二手交易系统答辩问题及回答

一、系统架构与技术选型

1. 请介绍一下系统的整体架构设计

回答:
本系统采用B/S三层架构模式构建,包括前端展示层、后端服务层和数据持久化层。

  • 前端展示层:基于Vue 3框架构建,使用Vant移动端组件库开发响应式界面。采用单页面应用(SPA)模式,通过Vue Router管理路由导航,使用Pinia进行全局状态管理,采用组件化开发模式提升代码复用性。
  • 后端服务层:基于NestJS框架开发,采用模块化方式组织代码结构。核心业务模块包括认证授权模块、用户信息模块、商品资源模块、交易订单模块、信用档案模块、后台管理模块等。每个模块内部遵循控制器-服务-数据访问对象的分层设计。
  • 数据持久化层:采用MySQL 8.0作为关系型数据库,引入Redis作为缓存层存储会话Token和热点数据,提升系统响应效率。

代码位置:

  • 后端入口:back-end/src/main.ts
  • 模块配置:back-end/src/app.module.ts
  • 前端路由:frontEnd/src/router/index.ts

2. 为什么选择NestJS作为后端框架?与Express有什么区别?

回答:
选择NestJS主要基于以下考虑:

  1. 架构规范性:NestJS提供了完整的架构支撑体系,包括依赖注入、模块化组织、切面编程等特性,强制开发者遵循最佳实践,代码结构更清晰。
  2. TypeScript原生支持:NestJS完全采用TypeScript编写,与前端Vue 3的TypeScript开发形成统一的技术栈,类型定义一致,降低沟通成本。
  3. 内置功能丰富

    • Guards组件实现权限访问控制
    • Interceptors组件统一处理日志输出与响应格式标准化
    • Pipes组件完成请求参数校验
    • Filters组件统一异常处理
  4. 与Express的关系:NestJS底层使用Express作为HTTP服务器,但在此基础上提供了更高层次的抽象和结构化支持。

代码示例:

// back-end/src/app.module.ts - 模块化组织
@Module({
  imports: [
    AuthModule,
    UsersModule,
    GoodsModule,
    OrdersModule,
    // ...
  ],
  providers: [
    { provide: APP_FILTER, useClass: ApiExceptionFilter },
    { provide: APP_INTERCEPTOR, useClass: ApiResponseInterceptor },
  ],
})

3. 系统是如何实现前后端分离的?API是如何设计的?

回答:
系统采用RESTful API设计风格实现前后端分离:

  1. API设计规范

    • 统一前缀:/api/v1
    • 资源命名:使用复数名词(如/goods/orders
    • HTTP方法语义:GET查询、POST创建、PATCH更新、DELETE删除
    • 统一响应格式:{ code, message, data }
  2. 接口文档:集成Swagger自动生成API文档,访问/api/docs查看
  3. 认证机制:采用JWT双令牌认证,Access Token用于接口访问,Refresh Token用于令牌刷新

代码位置:

  • API文档配置:back-end/src/main.ts
  • 统一响应拦截器:back-end/src/common/interceptors/api-response.interceptor.ts
  • 统一异常过滤器:back-end/src/common/filters/api-exception.filter.ts

4. 为什么选择Vue 3而不是Vue 2?组合式API有什么优势?

回答:
选择Vue 3的原因:

  1. 性能提升:Vue 3重写了虚拟DOM算法,编译优化更智能,运行时性能更好
  2. 组合式API优势

    • 更好的逻辑复用:通过自定义Hook提取可复用逻辑
    • 更好的TypeScript支持:类型推断更准确
    • 更灵活的代码组织:相关逻辑可以放在一起,不再受选项式API的分散限制
  3. Tree-shaking支持:按需引入API,打包体积更小

代码示例:

// frontEnd/src/stores/auth.ts - 组合式API风格
export const useAuthStore = defineStore('auth', () => {
  const user = ref<User | null>(null)
  const token = ref<string | null>(localStorage.getItem('token'))
  
  const isAuthenticated = computed(() => !!token.value)
  
  const login = async (params: LoginParams) => {
    const response = await authApi.login(params)
    setToken(response.accessToken)
    // ...
  }
  
  return { user, token, isAuthenticated, login }
})

二、认证授权模块

5. 请详细说明JWT双令牌认证机制的实现

回答:
系统采用Access Token + Refresh Token双令牌机制:

  1. Access Token

    • 有效期:2小时
    • 载荷:用户ID、角色、唯一标识符(jti)
    • 用途:接口访问鉴权
  2. Refresh Token

    • 有效期:7天
    • 载荷:用户ID、唯一标识符
    • 存储:Redis中存储,key为refresh:token:{userId}
    • 用途:刷新会话
  3. 令牌旋转策略:每次刷新生成新的Refresh Token,旧Token立即失效,防止令牌被窃取后长期有效
  4. 黑名单机制:用户登出时将Access Token的jti加入Redis黑名单,防止已登出的Token继续使用

代码位置:back-end/src/modules/auth/auth.service.ts

核心代码:

// 签发Access Token
private async signAccessToken(userId: number, role: number) {
  const jti = randomUUID();
  const expiresInSeconds = 60 * 60 * 2; // 2小时
  const accessToken = await this.jwt.signAsync(
    { sub: userId, role, jti },
    { expiresIn: expiresInSeconds },
  );
  return { accessToken, expiresIn: expiresInSeconds, jti };
}

// 用户登出 - 加入黑名单
async logout(userId: number, accessJti: string, refreshToken: string) {
  await this.redis.set(`jwt:blacklist:${accessJti}`, '1', 'EX', 60 * 60 * 24);
  // 删除Refresh Token
  await this.redis.del(`refresh:token:${userId}`);
}

6. 密码是如何加密存储的?为什么选择bcrypt?

回答:
系统使用bcrypt算法对密码进行加密存储:

  1. bcrypt特点

    • 自带盐值:每次加密自动生成随机盐,防止彩虹表攻击
    • 计算成本可调:通过cost factor控制计算复杂度,抵御暴力破解
    • 单向加密:无法反向解密,只能通过比较验证
  2. 实现方式

    // 注册时加密
    const passwordHash = await bcrypt.hash(dto.password, 10); // cost factor = 10
    
    // 登录时验证
    const ok = await bcrypt.compare(dto.password, user.password);
  3. 安全性:即使数据库泄露,攻击者也无法获取原始密码

代码位置:back-end/src/modules/auth/auth.service.ts 第62行、第132行


7. 如何实现用户权限控制?管理员和普通用户如何区分?

回答:
系统通过角色字段实现权限控制:

  1. 角色定义

    • role=1:普通用户
    • role=2:管理员
  2. JWT载荷携带角色信息

    { sub: userId, role, jti }
  3. Guard守卫实现

    • JwtAuthGuard:验证JWT有效性
    • AdminGuard:验证是否为管理员角色
  4. 路由级别控制

    // back-end/src/modules/admin/admin.guard.ts
    canActivate(context: ExecutionContext): boolean {
      const request = context.switchToHttp().getRequest();
      const user = request.user;
      if (user.role !== 2) {
     throw new ForbiddenException('需要管理员权限');
      }
      return true;
    }
  5. 前端路由守卫

    // frontEnd/src/router/index.ts
    if (roles && roles.includes('admin') && userRole !== 2) {
      next('/home')
      return
    }

三、商品资源模块

8. 商品状态流转是如何设计的?有哪些状态?

回答:
商品状态采用状态机模式设计,共7种状态:

状态值状态名称说明
0PENDING_AUDIT待审核
1ONLINE在售
2SOLD已售空
3OFFLINE下架
4REJECTED审核拒绝
5VIOLATION违规商品
6DELETED软删除

状态流转规则:

  • 发布 → 待审核(0)
  • 审核通过 → 在售(1)
  • 审核拒绝 → 审核拒绝(4)
  • 库存为0 → 已售空(2)
  • 卖家主动下架 → 下架(3)
  • 管理员标记违规 → 违规商品(5)

代码位置:back-end/src/modules/goods/goods.service.ts 第51-79行


9. 商品浏览量是如何实现的?为什么采用异步累加?

回答:
商品浏览量采用异步累加机制:

  1. 实现方式

    // 异步累加浏览量(不阻塞响应)
    this.goodsRepo.increment({ id: goodsId }, 'viewCount', 1).catch(() => {});
  2. 为什么异步

    • 浏览量是非关键业务数据,不需要同步等待
    • 异步处理可以提升接口响应速度
    • 即使累加失败也不影响用户查看商品详情
  3. 优化考虑

    • 高并发场景可改为Redis计数器,定时批量同步到数据库
    • 可添加防刷机制(同一用户短时间内重复访问只计一次)

代码位置:back-end/src/modules/goods/goods.service.ts 第181行


10. 商品搜索是如何实现的?支持哪些筛选条件?

回答:
商品搜索通过TypeORM的QueryBuilder实现:

  1. 支持的筛选条件

    • 分类筛选:categoryId
    • 关键词搜索:标题或描述模糊匹配
    • 价格区间:minPrice、maxPrice
    • 成色等级:condition
    • 状态筛选:status
  2. 实现代码

    const qb = this.goodsRepo
      .createQueryBuilder('goods')
      .where('goods.status NOT IN (6, 7)'); // 排除软删除
    
    if (query.keyword) {
      qb.andWhere('(goods.title LIKE :keyword OR goods.description LIKE :keyword)', 
     { keyword: `%${query.keyword}%` });
    }
    if (query.minPrice != null) {
      qb.andWhere('goods.price >= :minPrice', { minPrice: query.minPrice });
    }
    // ...
  3. 性能优化

    • 分页查询,默认每页20条
    • 按创建时间倒序排列
    • 关键字段建立索引

代码位置:back-end/src/modules/goods/goods.service.ts 第89-147行


四、交易订单模块

11. 订单状态机是如何设计的?状态如何流转?

回答:
订单状态采用状态机模式,共7种状态:

状态值状态名称说明
1CREATED待付款
2PAID待发货
3SHIPPED待收货
4COMPLETED已完成
5REFUNDING退款中
6REFUNDED已退款
7CANCELLED已取消

状态流转规则:

  • 创建订单 → 待付款(1)
  • 支付成功 → 待发货(2)
  • 卖家发货 → 待收货(3)
  • 买家确认收货 → 已完成(4)
  • 申请退款 → 退款中(5)
  • 退款成功 → 已退款(6)
  • 取消订单 → 已取消(7)

代码位置:back-end/src/modules/orders/orders.service.ts 第28-43行


12. 订单创建时如何保证数据一致性?

回答:
订单创建使用数据库事务保证数据一致性:

  1. 事务处理流程

    await this.ordersRepo.manager.transaction(async (em) => {
      // 1. 扣减库存
      goods.stock -= quantity;
      if (goods.stock <= 0) goods.status = 2; // 已售空
      await em.save(goods);
    
      // 2. 创建订单
      await em.save(this.ordersRepo.create({
     orderNo,
     buyerId,
     sellerId: goods.sellerId,
     goodsId: goods.id,
     price: price.toFixed(2),
     // ...
      }));
    });
  2. 一致性保证

    • 库存扣减和订单创建在同一事务中
    • 任一步骤失败,整个事务回滚
    • 避免超卖问题

代码位置:back-end/src/modules/orders/orders.service.ts 第183-227行


13. 订单超时自动取消是如何实现的?

回答:
系统设计了订单超时机制:

  1. 超时规则

    • 待付款订单:30分钟超时自动取消
    • 待发货订单:72小时超时提醒
    • 待收货订单:7天自动确认收货
  2. 前端倒计时

    if (order.status === OrderStatus.CREATED) {
      const expireAt = new Date(order.createTime.getTime() + 30 * 60 * 1000);
      const seconds = Math.max(0, Math.floor((expireAt.getTime() - now.getTime()) / 1000));
      countDown = { type: 'payment', expireAt, seconds };
    }
  3. 后端处理

    • 可通过定时任务扫描超时订单
    • 或使用消息队列延迟队列实现

代码位置:back-end/src/modules/orders/orders.service.ts 第388-400行


14. 退款流程是如何设计的?

回答:
退款流程设计如下:

  1. 退款申请条件

    • 已付款、已发货、已完成(7天内)的订单可申请退款
    • 已完成订单超过7天无法申请
  2. 退款处理流程

    • 买家申请退款 → 订单状态变为退款中(5)
    • 卖家同意 → 金额退回买家钱包,恢复商品库存
    • 卖家拒绝 → 填写拒绝原因,订单恢复原状态
  3. 退款代码实现

    async handleRefund(userId: number, orderNo: string, dto: RefundHandleDto) {
      if (dto.action === RefundAction.AGREE) {
     await this.dataSource.transaction(async (em) => {
       // 1. 更新订单状态
       order.status = OrderStatus.REFUNDED;
       await em.save(order);
    
       // 2. 退款到买家钱包
       buyerWallet.balance = (Number(balanceBefore) + Number(order.price)).toFixed(2);
       await em.save(buyerWallet);
    
       // 3. 恢复商品库存
       goods.stock += order.quantity;
       await em.save(goods);
     });
      }
    }

代码位置:back-end/src/modules/orders/orders.service.ts 第708-801行


五、信用评价模块

15. 信用评级体系是如何设计的?有什么作用?

回答:
信用评级体系是本系统的创新点:

  1. 信用分规则

    • 初始值:600分
    • 分值范围:0-1000分
    • 六个等级:极好(≥900)、优秀(≥800)、良好(≥700)、一般(≥600)、较差(≥500)、极差(<500)
  2. 加分规则

    • 实名认证:+50分
    • 订单完成:+5分
    • 收到好评:+3分
  3. 扣分规则

    • 取消订单:-10分
    • 超时违约:-20分
    • 违规处理:-50分
  4. 周期限制:每条规则设定每日、每周、每月的积分变化上限,防止恶意刷分
  5. 作用

    • 为买家提供卖家信用参考
    • 约束用户行为,降低交易风险
    • 信用过低可限制部分功能

代码位置:back-end/src/modules/credit/credit.service.ts


16. 信用分的周期限制是如何实现的?

回答:
周期限制通过信用历史表查询实现:

private async checkPeriodLimit(
  userId: number,
  ruleCode: string,
  dailyLimit: number,
  weeklyLimit: number,
  monthlyLimit: number,
): Promise<boolean> {
  const now = new Date();
  const todayStart = new Date(now);
  todayStart.setHours(0, 0, 0, 0);

  // 检查每日上限
  if (dailyLimit > 0) {
    const dailyCount = await this.creditHistoryRepo
      .createQueryBuilder('ch')
      .where('ch.userId = :userId', { userId })
      .andWhere('ch.reason LIKE :reason', { reason: `%[${ruleCode}]%` })
      .andWhere('ch.changeScore > 0')
      .andWhere('ch.createTime >= :todayStart', { todayStart })
      .getCount();
    if (dailyCount >= dailyLimit) return false;
  }
  // 类似检查每周、每月上限...
}

代码位置:back-end/src/modules/credit/credit.service.ts 第152-207行


六、钱包支付模块

17. 钱包充值流程是如何设计的?

回答:
钱包充值采用两阶段设计:

阶段1:创建充值订单

  1. 校验充值渠道(支付宝/微信)
  2. 校验充值限额(单次≤10000元,单日≤50000元)
  3. 生成支付单号,创建payment_record记录
  4. 返回支付参数给前端

阶段2:支付成功回调

  1. 更新payment_record状态为PAID
  2. 写入wallet_transaction流水
  3. 更新wallet_account余额
  4. 发送充值成功通知

代码位置:back-end/src/modules/wallet/wallet.service.ts 第223-315行


18. 提现功能有哪些限制?如何保证资金安全?

回答:
提现功能设计了多重限制:

  1. 金额限制

    • 单次提现上限:5000元
    • 单日提现上限:20000元
    • 最低提现金额:10元
  2. 次数限制:每日最多提现3次
  3. 余额校验:可用余额必须≥提现金额
  4. 账户状态:钱包账户必须为启用状态
  5. 资金安全

    • 使用数据库事务
    • 悲观锁锁定账户
    • 先冻结余额,审核通过后扣减

代码位置:back-end/src/modules/wallet/wallet.service.ts 第436-561行


19. 如何防止钱包并发操作导致的数据不一致?

回答:
系统采用悲观锁机制防止并发问题:

await this.dataSource.transaction(async (em) => {
  // 悲观锁锁定钱包账户
  const account = await em.findOne(WalletAccountEntity, {
    where: { userId },
    lock: { mode: 'pessimistic_write' },
  });
  
  // 执行余额操作
  account.balance = newBalance.toFixed(2);
  await em.save(account);
});

原理

  • 悲观锁在读取数据时加锁,其他事务必须等待
  • 结合数据库事务,保证操作的原子性
  • 避免超扣、重复扣款等问题

代码位置:back-end/src/modules/wallet/wallet.service.ts 第504-515行


七、数据库设计

20. 数据库表是如何设计的?核心表有哪些?

回答:
系统核心包含7张数据表:

表名说明核心字段
user用户表id, student_id, username, password, credit_score, role
goods商品表id, seller_id, title, price, stock, status, view_count
orders订单表id, order_no, buyer_id, seller_id, goods_id, status, price
wallet_account钱包账户表id, user_id, balance, frozen_balance
category商品分类表id, name, icon, sort_order
credit_history信用历史表id, user_id, change_score, reason
credit_rule信用规则表id, rule_code, rule_name, score_change

表关系设计

  • 用户-商品:1:N(一个用户可发布多个商品)
  • 用户-订单:1:N(用户可作为买家或卖家参与订单)
  • 用户-钱包:1:1(每个用户拥有唯一钱包账户)
  • 商品-分类:N:1(多个商品归属于同一分类)

SQL文件位置:整体架构文档/campus_secondhand.sql


21. 如何优化数据库查询性能?

回答:
系统从多个方面优化查询性能:

  1. 索引设计

    • 主键索引:所有表的id字段
    • 唯一索引:学号、手机号、订单号
    • 外键索引:seller_id、buyer_id、goods_id
    • 查询索引:status、create_time
  2. 查询优化

    • 使用QueryBuilder构建高效查询
    • 分页查询,避免全表扫描
    • 只查询需要的字段
  3. 缓存策略

    • Redis缓存热点数据(如分类列表)
    • JWT Token存储在Redis
  4. 异步处理

    • 浏览量累加异步执行
    • 通知发送异步处理

八、系统安全性

22. 系统有哪些安全防护措施?

回答:
系统实现了多层次的安全防护:

  1. 认证安全

    • JWT双令牌机制
    • 密码bcrypt加密存储
    • Token黑名单机制
  2. 授权安全

    • 基于角色的访问控制(RBAC)
    • 接口级别权限校验(Guard)
  3. 输入安全

    • 请求参数校验(ValidationPipe)
    • XSS过滤
    • SQL注入防护(TypeORM参数化查询)
  4. 业务安全

    • 信用评级约束用户行为
    • 交易金额限制
    • 举报机制

代码位置:

  • 参数校验:back-end/src/main.ts 第14-20行
  • XSS过滤:back-end/src/common/utils/xss.util.ts

23. 如何防止XSS攻击?

回答:
系统通过以下方式防止XSS攻击:

  1. 输入过滤

    // xss.util.ts
    import validator from 'validator';
    
    export function sanitizeXss(input: string): string {
      return validator.escape(input);
    }
  2. 参数校验

    // main.ts
    app.useGlobalPipes(
      new ValidationPipe({
     transform: true,
     whitelist: true,
     forbidNonWhitelisted: true,
      }),
    );
  3. 前端转义:Vue默认对插值表达式进行HTML转义

九、前端实现

24. 前端状态管理是如何实现的?

回答:
前端使用Pinia进行状态管理:

  1. Store设计

    • auth.ts:用户认证状态(token、用户信息、登录状态)
    • app.ts:应用全局状态
  2. 组合式API风格

    export const useAuthStore = defineStore('auth', () => {
      const user = ref<User | null>(null)
      const token = ref<string | null>(null)
      
      const isAuthenticated = computed(() => !!token.value)
      
      const login = async (params) => { /* ... */ }
      const logout = async () => { /* ... */ }
      
      return { user, token, isAuthenticated, login, logout }
    })
  3. 持久化:Token和用户信息存储在localStorage

代码位置:frontEnd/src/stores/auth.ts


25. 前端路由守卫是如何实现的?

回答:
前端通过Vue Router的导航守卫实现权限控制:

router.beforeEach(async (to, from, next) => {
  const authStore = useAuthStore()
  const { requiresAuth, requiresGuest, roles } = to.meta

  // 需要登录但未登录
  if (requiresAuth && !authStore.isAuthenticated) {
    next('/login')
    return
  }

  // 登录页但已登录
  if (requiresGuest && authStore.isAuthenticated) {
    next('/home')
    return
  }

  // 角色权限校验
  if (roles && roles.includes('admin') && authStore.user?.role !== 2) {
    next('/home')
    return
  }

  next()
})

代码位置:frontEnd/src/router/index.ts 第261-285行


十、项目难点与解决方案

26. 项目开发过程中遇到了哪些难点?如何解决的?

回答:

难点1:订单状态流转的复杂性

  • 问题:订单涉及多种状态和状态转换,容易出现非法状态转换
  • 解决:采用状态机模式,定义明确的状态枚举和转换规则,每次状态变更前校验当前状态是否允许转换

难点2:并发场景下的数据一致性

  • 问题:钱包余额操作、库存扣减等场景存在并发风险
  • 解决:使用数据库事务+悲观锁机制,保证操作的原子性

难点3:信用评级体系的规则配置

  • 问题:信用规则需要灵活配置,同时要防止恶意刷分
  • 解决:设计信用规则配置表,支持动态配置;实现周期限制检查机制

难点4:前后端Token同步

  • 问题:Token过期后需要无感刷新
  • 解决:实现Token刷新机制,前端拦截401错误自动刷新Token

27. 系统还有哪些可以改进的地方?

回答:

  1. 实时通讯:新增买卖双方实时在线沟通功能,降低沟通成本
  2. 智能推荐:基于用户浏览历史、校园身份标签进行商品推荐
  3. 搜索优化:引入Elasticsearch实现全文搜索,提升搜索体验
  4. 消息推送:集成WebSocket实现实时消息推送
  5. 安全升级:敏感数据加密存储,引入风控系统
  6. 性能优化:引入消息队列处理异步任务,提升系统吞吐量

十一、代码定位速查

28. 如果老师问某个功能的代码在哪里,如何快速定位?

回答:

请参考本文档附件《后端代码架构快速定位指南》,按照以下方式快速定位:

  1. 按模块定位:根据功能所属模块,在back-end/src/modules/下找到对应目录
  2. 按层次定位

    • 控制器(Controller):处理HTTP请求
    • 服务(Service):处理业务逻辑
    • 实体(Entity):数据库表映射
  3. 按功能定位

    • 登录注册 → modules/auth/
    • 商品管理 → modules/goods/
    • 订单交易 → modules/orders/
    • 钱包支付 → modules/wallet/
    • 信用评价 → modules/credit/
    • 后台管理 → modules/admin/

附件:后端代码架构快速定位指南

一、项目目录结构总览

back-end/
├── src/
│   ├── common/              # 公共模块
│   │   ├── constants/       # 常量定义(错误码)
│   │   ├── decorators/      # 自定义装饰器
│   │   ├── exceptions/      # 自定义异常
│   │   ├── filters/         # 异常过滤器
│   │   ├── interceptors/    # 拦截器
│   │   ├── types/           # 类型定义
│   │   └── utils/           # 工具函数
│   │
│   ├── infrastructure/      # 基础设施
│   │   ├── database/        # 数据库模块
│   │   ├── logger/          # 日志配置
│   │   └── redis/           # Redis模块
│   │
│   ├── modules/             # 业务模块(核心)
│   │   ├── admin/           # 后台管理模块
│   │   ├── auth/            # 认证授权模块
│   │   ├── categories/      # 商品分类模块
│   │   ├── comments/        # 评论模块
│   │   ├── credit/          # 信用评价模块
│   │   ├── goods/           # 商品资源模块
│   │   ├── notifications/   # 消息通知模块
│   │   ├── orders/          # 交易订单模块
│   │   ├── payments/        # 支付模块
│   │   ├── users/           # 用户信息模块
│   │   └── wallet/          # 电子钱包模块
│   │
│   ├── app.module.ts        # 应用主模块
│   ├── app.controller.ts    # 应用控制器
│   ├── app.service.ts       # 应用服务
│   └── main.ts              # 应用入口
│
├── dist/                    # 编译输出目录
├── coverage/                # 测试覆盖率报告
├── .env                     # 环境变量配置
└── package.json             # 项目依赖配置

二、核心模块详细定位

1. 认证授权模块 (auth)

目录: src/modules/auth/

文件功能关键代码位置
auth.controller.ts认证接口控制器登录、注册、刷新Token、登出接口
auth.service.ts认证业务逻辑密码加密、Token签发、黑名单机制
jwt.strategy.tsJWT策略Token验证策略
jwt-auth.guard.tsJWT守卫接口权限拦截
dto/auth.dto.ts数据传输对象登录、注册参数定义

关键功能代码定位:

  • 用户注册:auth.service.tsregister() 方法(第40-96行)
  • 用户登录:auth.service.tslogin() 方法(第109-164行)
  • Token刷新:auth.service.tsrefresh() 方法(第176-224行)
  • 用户登出:auth.service.tslogout() 方法(第234-244行)

2. 商品资源模块 (goods)

目录: src/modules/goods/

文件功能关键代码位置
goods.controller.ts商品接口控制器商品CRUD接口
goods.service.ts商品业务逻辑发布、查询、上下架、举报
goods.entity.ts商品实体数据库表映射
report.entity.ts举报实体举报记录表映射
dto/goods.dto.ts数据传输对象商品参数定义

关键功能代码定位:

  • 商品列表:goods.service.tslist() 方法(第89-147行)
  • 商品详情:goods.service.tsdetail() 方法(第156-227行)
  • 发布商品:goods.service.tscreate() 方法(第236-270行)
  • 更新商品:goods.service.tsupdate() 方法(第280-319行)
  • 删除商品:goods.service.tsdelete() 方法(第329-367行)
  • 下架商品:goods.service.tsoffline() 方法(第379-418行)
  • 举报商品:goods.service.tsreport() 方法(第520-560行)

商品状态说明:

// 状态枚举(goods.service.ts 第24-32行)
// 0: 待审核 (PENDING_AUDIT)
// 1: 在售 (ONLINE)
// 2: 已售空 (SOLD)
// 3: 下架 (OFFLINE)
// 4: 审核拒绝 (REJECTED)
// 5: 违规商品 (VIOLATION)
// 6: 软删除 (DELETED)

3. 交易订单模块 (orders)

目录: src/modules/orders/

文件功能关键代码位置
orders.controller.ts订单接口控制器订单CRUD接口
orders.service.ts订单业务逻辑创建、支付、发货、确认、退款
order.entity.ts订单实体数据库表映射
dto/orders.dto.ts数据传输对象订单参数定义

关键功能代码定位:

  • 创建订单:orders.service.tscreateOrder() 方法(第148-241行)
  • 订单列表:orders.service.tslistOrders() 方法(第250-324行)
  • 订单详情:orders.service.tsdetail() 方法(第369-443行)
  • 取消订单:orders.service.tscancel() 方法(第454-491行)
  • 订单发货:orders.service.tsship() 方法(第502-533行)
  • 确认收货:orders.service.tsconfirm() 方法(第544-642行)
  • 申请退款:orders.service.tsrefund() 方法(第653-695行)
  • 处理退款:orders.service.tshandleRefund() 方法(第708-801行)

订单状态说明:

// 状态枚举(orders.service.ts 第28-43行)
export enum OrderStatus {
  CREATED = 1,    // 待付款
  PAID = 2,       // 待发货
  SHIPPED = 3,    // 待收货
  COMPLETED = 4,  // 已完成
  REFUNDING = 5,  // 退款中
  REFUNDED = 6,   // 已退款
  CANCELLED = 7,  // 已取消
}

4. 电子钱包模块 (wallet)

目录: src/modules/wallet/

文件功能关键代码位置
wallet.controller.ts钱包接口控制器余额查询、充值、提现接口
wallet.service.ts钱包业务逻辑充值、提现、交易流水
wallet-account.entity.ts钱包账户实体账户表映射
wallet-transaction.entity.ts交易流水实体流水表映射
dto/wallet.dto.ts数据传输对象钱包参数定义

关键功能代码定位:

  • 钱包信息:wallet.service.tsgetMe() 方法(第114-128行)
  • 交易流水:wallet.service.tsgetTransactions() 方法(第140-181行)
  • 充值功能:wallet.service.tstopup() 方法(第223-315行)
  • 提现功能:wallet.service.tswithdraw() 方法(第436-561行)

交易类型说明:

// 交易类型(wallet.service.ts 第16-21行)
// TOPUP: 充值
// ORDER_PAY: 订单支付
// ORDER_REFUND: 订单退款
// WITHDRAW: 提现
// ADMIN_ADJUST: 管理员调账

5. 信用评价模块 (credit)

目录: src/modules/credit/

文件功能关键代码位置
credit.service.ts信用业务逻辑加分、扣分、周期限制检查
credit.module.ts信用模块定义模块配置

关键功能代码定位:

  • 增加信用分:credit.service.tsaddCredit() 方法(第39-94行)
  • 扣减信用分:credit.service.tsdeductCredit() 方法(第104-140行)
  • 周期限制检查:credit.service.tscheckPeriodLimit() 方法(第152-207行)
  • 按规则加分:credit.service.tsaddCreditByRule() 方法(第216-235行)
  • 按规则扣分:credit.service.tsdeductCreditByRule() 方法(第244-262行)
  • 信用等级:credit.service.tsgetCreditLevel() 方法(第269-283行)

信用等级划分:

// 信用等级(credit.service.ts 第269-283行)
// ≥900: 极好 (excellent)
// ≥800: 优秀 (great)
// ≥700: 良好 (good)
// ≥600: 一般 (normal)
// ≥500: 较差 (poor)
// <500: 极差 (bad)

6. 用户信息模块 (users)

目录: src/modules/users/

文件功能关键代码位置
users.controller.ts用户接口控制器用户信息接口
users.service.ts用户业务逻辑用户信息管理、实名认证
user.entity.ts用户实体用户表映射
credit-history.entity.ts信用历史实体信用历史表映射
receiver.entity.ts收货地址实体地址表映射
dto/users.dto.ts数据传输对象用户参数定义

7. 后台管理模块 (admin)

目录: src/modules/admin/

子目录/文件功能
admin.controller.ts后台管理控制器
admin.service.ts后台管理服务
admin.guard.ts管理员权限守卫
users/用户管理
goods/商品审核管理
orders/订单管理
reports/举报管理
credit/信用规则管理
categories/分类管理
stats/数据统计
audit-log.entity.ts审计日志实体

三、公共模块定位

1. 错误码定义

文件: src/common/constants/error-codes.ts

// 错误码分段
// 1000-1999: 认证与授权
// 2000-2999: 用户域
// 3000-3999: 商品域
// 4000-4999: 订单域
// 5000-5999: 支付域
// 8000-8999: 钱包域
// 9000-9999: 系统与基础设施

2. 异常过滤器

文件: src/common/filters/api-exception.filter.ts

功能:统一捕获和处理异常,返回标准格式的错误响应

3. 响应拦截器

文件: src/common/interceptors/api-response.interceptor.ts

功能:统一包装响应数据,返回标准格式{ code, message, data }


四、快速定位技巧

1. 按功能关键词搜索

在IDE中使用全局搜索功能,搜索以下关键词:

  • 接口路径:如/auth/login/goods/orders
  • 方法名:如createOrderhandleRefundaddCredit
  • 状态值:如OrderStatus.CREATEDGoodsStatus.ONLINE

2. 按API路径定位

  1. 在控制器文件中搜索路由装饰器
  2. 找到对应的处理方法
  3. 跟踪到服务层查看业务逻辑

3. 按数据库表定位

  1. 在实体文件中查看表结构定义
  2. 在服务文件中查看对该表的操作

五、前端代码定位

1. 目录结构

frontEnd/src/
├── api/           # API接口定义
├── components/    # 公共组件
├── hooks/         # 自定义Hook
├── router/        # 路由配置
├── stores/        # 状态管理
├── styles/        # 样式文件
├── types/         # 类型定义
├── utils/         # 工具函数
└── views/         # 页面组件
    ├── admin/     # 后台管理页面
    ├── auth/      # 登录注册页面
    ├── goods/     # 商品详情页面
    ├── order/     # 订单页面
    ├── publish/   # 发布页面
    └── user/      # 用户中心页面

2. 关键文件定位

功能文件位置
路由配置router/index.ts
认证状态stores/auth.ts
API请求封装utils/request.ts
登录页面views/auth/Login.vue
商品详情views/goods/GoodsDetail.vue
订单列表views/order/OrderList.vue
后台管理views/admin/

文档版本: v1.0
更新日期: 2026年3月
适用项目: 基于Node+Vue融合信用评级的校园二手交易系统

0

评论

博主关闭了所有页面的评论