校园二手交易系统答辩问题及回答
一、系统架构与技术选型
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主要基于以下考虑:
- 架构规范性:NestJS提供了完整的架构支撑体系,包括依赖注入、模块化组织、切面编程等特性,强制开发者遵循最佳实践,代码结构更清晰。
- TypeScript原生支持:NestJS完全采用TypeScript编写,与前端Vue 3的TypeScript开发形成统一的技术栈,类型定义一致,降低沟通成本。
内置功能丰富:
- Guards组件实现权限访问控制
- Interceptors组件统一处理日志输出与响应格式标准化
- Pipes组件完成请求参数校验
- Filters组件统一异常处理
- 与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设计风格实现前后端分离:
API设计规范:
- 统一前缀:
/api/v1 - 资源命名:使用复数名词(如
/goods、/orders) - HTTP方法语义:GET查询、POST创建、PATCH更新、DELETE删除
- 统一响应格式:
{ code, message, data }
- 统一前缀:
- 接口文档:集成Swagger自动生成API文档,访问
/api/docs查看 - 认证机制:采用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的原因:
- 性能提升:Vue 3重写了虚拟DOM算法,编译优化更智能,运行时性能更好
组合式API优势:
- 更好的逻辑复用:通过自定义Hook提取可复用逻辑
- 更好的TypeScript支持:类型推断更准确
- 更灵活的代码组织:相关逻辑可以放在一起,不再受选项式API的分散限制
- 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双令牌机制:
Access Token:
- 有效期:2小时
- 载荷:用户ID、角色、唯一标识符(jti)
- 用途:接口访问鉴权
Refresh Token:
- 有效期:7天
- 载荷:用户ID、唯一标识符
- 存储:Redis中存储,key为
refresh:token:{userId} - 用途:刷新会话
- 令牌旋转策略:每次刷新生成新的Refresh Token,旧Token立即失效,防止令牌被窃取后长期有效
- 黑名单机制:用户登出时将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算法对密码进行加密存储:
bcrypt特点:
- 自带盐值:每次加密自动生成随机盐,防止彩虹表攻击
- 计算成本可调:通过cost factor控制计算复杂度,抵御暴力破解
- 单向加密:无法反向解密,只能通过比较验证
实现方式:
// 注册时加密 const passwordHash = await bcrypt.hash(dto.password, 10); // cost factor = 10 // 登录时验证 const ok = await bcrypt.compare(dto.password, user.password);- 安全性:即使数据库泄露,攻击者也无法获取原始密码
代码位置:back-end/src/modules/auth/auth.service.ts 第62行、第132行
7. 如何实现用户权限控制?管理员和普通用户如何区分?
回答:
系统通过角色字段实现权限控制:
角色定义:
- role=1:普通用户
- role=2:管理员
JWT载荷携带角色信息:
{ sub: userId, role, jti }Guard守卫实现:
JwtAuthGuard:验证JWT有效性AdminGuard:验证是否为管理员角色
路由级别控制:
// 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; }前端路由守卫:
// frontEnd/src/router/index.ts if (roles && roles.includes('admin') && userRole !== 2) { next('/home') return }
三、商品资源模块
8. 商品状态流转是如何设计的?有哪些状态?
回答:
商品状态采用状态机模式设计,共7种状态:
| 状态值 | 状态名称 | 说明 |
|---|---|---|
| 0 | PENDING_AUDIT | 待审核 |
| 1 | ONLINE | 在售 |
| 2 | SOLD | 已售空 |
| 3 | OFFLINE | 下架 |
| 4 | REJECTED | 审核拒绝 |
| 5 | VIOLATION | 违规商品 |
| 6 | DELETED | 软删除 |
状态流转规则:
- 发布 → 待审核(0)
- 审核通过 → 在售(1)
- 审核拒绝 → 审核拒绝(4)
- 库存为0 → 已售空(2)
- 卖家主动下架 → 下架(3)
- 管理员标记违规 → 违规商品(5)
代码位置:back-end/src/modules/goods/goods.service.ts 第51-79行
9. 商品浏览量是如何实现的?为什么采用异步累加?
回答:
商品浏览量采用异步累加机制:
实现方式:
// 异步累加浏览量(不阻塞响应) this.goodsRepo.increment({ id: goodsId }, 'viewCount', 1).catch(() => {});为什么异步:
- 浏览量是非关键业务数据,不需要同步等待
- 异步处理可以提升接口响应速度
- 即使累加失败也不影响用户查看商品详情
优化考虑:
- 高并发场景可改为Redis计数器,定时批量同步到数据库
- 可添加防刷机制(同一用户短时间内重复访问只计一次)
代码位置:back-end/src/modules/goods/goods.service.ts 第181行
10. 商品搜索是如何实现的?支持哪些筛选条件?
回答:
商品搜索通过TypeORM的QueryBuilder实现:
支持的筛选条件:
- 分类筛选:categoryId
- 关键词搜索:标题或描述模糊匹配
- 价格区间:minPrice、maxPrice
- 成色等级:condition
- 状态筛选:status
实现代码:
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 }); } // ...性能优化:
- 分页查询,默认每页20条
- 按创建时间倒序排列
- 关键字段建立索引
代码位置:back-end/src/modules/goods/goods.service.ts 第89-147行
四、交易订单模块
11. 订单状态机是如何设计的?状态如何流转?
回答:
订单状态采用状态机模式,共7种状态:
| 状态值 | 状态名称 | 说明 |
|---|---|---|
| 1 | CREATED | 待付款 |
| 2 | PAID | 待发货 |
| 3 | SHIPPED | 待收货 |
| 4 | COMPLETED | 已完成 |
| 5 | REFUNDING | 退款中 |
| 6 | REFUNDED | 已退款 |
| 7 | CANCELLED | 已取消 |
状态流转规则:
- 创建订单 → 待付款(1)
- 支付成功 → 待发货(2)
- 卖家发货 → 待收货(3)
- 买家确认收货 → 已完成(4)
- 申请退款 → 退款中(5)
- 退款成功 → 已退款(6)
- 取消订单 → 已取消(7)
代码位置:back-end/src/modules/orders/orders.service.ts 第28-43行
12. 订单创建时如何保证数据一致性?
回答:
订单创建使用数据库事务保证数据一致性:
事务处理流程:
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), // ... })); });一致性保证:
- 库存扣减和订单创建在同一事务中
- 任一步骤失败,整个事务回滚
- 避免超卖问题
代码位置:back-end/src/modules/orders/orders.service.ts 第183-227行
13. 订单超时自动取消是如何实现的?
回答:
系统设计了订单超时机制:
超时规则:
- 待付款订单:30分钟超时自动取消
- 待发货订单:72小时超时提醒
- 待收货订单:7天自动确认收货
前端倒计时:
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 }; }后端处理:
- 可通过定时任务扫描超时订单
- 或使用消息队列延迟队列实现
代码位置:back-end/src/modules/orders/orders.service.ts 第388-400行
14. 退款流程是如何设计的?
回答:
退款流程设计如下:
退款申请条件:
- 已付款、已发货、已完成(7天内)的订单可申请退款
- 已完成订单超过7天无法申请
退款处理流程:
- 买家申请退款 → 订单状态变为退款中(5)
- 卖家同意 → 金额退回买家钱包,恢复商品库存
- 卖家拒绝 → 填写拒绝原因,订单恢复原状态
退款代码实现:
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. 信用评级体系是如何设计的?有什么作用?
回答:
信用评级体系是本系统的创新点:
信用分规则:
- 初始值:600分
- 分值范围:0-1000分
- 六个等级:极好(≥900)、优秀(≥800)、良好(≥700)、一般(≥600)、较差(≥500)、极差(<500)
加分规则:
- 实名认证:+50分
- 订单完成:+5分
- 收到好评:+3分
扣分规则:
- 取消订单:-10分
- 超时违约:-20分
- 违规处理:-50分
- 周期限制:每条规则设定每日、每周、每月的积分变化上限,防止恶意刷分
作用:
- 为买家提供卖家信用参考
- 约束用户行为,降低交易风险
- 信用过低可限制部分功能
代码位置: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:创建充值订单
- 校验充值渠道(支付宝/微信)
- 校验充值限额(单次≤10000元,单日≤50000元)
- 生成支付单号,创建payment_record记录
- 返回支付参数给前端
阶段2:支付成功回调
- 更新payment_record状态为PAID
- 写入wallet_transaction流水
- 更新wallet_account余额
- 发送充值成功通知
代码位置:back-end/src/modules/wallet/wallet.service.ts 第223-315行
18. 提现功能有哪些限制?如何保证资金安全?
回答:
提现功能设计了多重限制:
金额限制:
- 单次提现上限:5000元
- 单日提现上限:20000元
- 最低提现金额:10元
- 次数限制:每日最多提现3次
- 余额校验:可用余额必须≥提现金额
- 账户状态:钱包账户必须为启用状态
资金安全:
- 使用数据库事务
- 悲观锁锁定账户
- 先冻结余额,审核通过后扣减
代码位置: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. 如何优化数据库查询性能?
回答:
系统从多个方面优化查询性能:
索引设计:
- 主键索引:所有表的id字段
- 唯一索引:学号、手机号、订单号
- 外键索引:seller_id、buyer_id、goods_id
- 查询索引:status、create_time
查询优化:
- 使用QueryBuilder构建高效查询
- 分页查询,避免全表扫描
- 只查询需要的字段
缓存策略:
- Redis缓存热点数据(如分类列表)
- JWT Token存储在Redis
异步处理:
- 浏览量累加异步执行
- 通知发送异步处理
八、系统安全性
22. 系统有哪些安全防护措施?
回答:
系统实现了多层次的安全防护:
认证安全:
- JWT双令牌机制
- 密码bcrypt加密存储
- Token黑名单机制
授权安全:
- 基于角色的访问控制(RBAC)
- 接口级别权限校验(Guard)
输入安全:
- 请求参数校验(ValidationPipe)
- XSS过滤
- SQL注入防护(TypeORM参数化查询)
业务安全:
- 信用评级约束用户行为
- 交易金额限制
- 举报机制
代码位置:
- 参数校验:
back-end/src/main.ts第14-20行 - XSS过滤:
back-end/src/common/utils/xss.util.ts
23. 如何防止XSS攻击?
回答:
系统通过以下方式防止XSS攻击:
输入过滤:
// xss.util.ts import validator from 'validator'; export function sanitizeXss(input: string): string { return validator.escape(input); }参数校验:
// main.ts app.useGlobalPipes( new ValidationPipe({ transform: true, whitelist: true, forbidNonWhitelisted: true, }), );- 前端转义:Vue默认对插值表达式进行HTML转义
九、前端实现
24. 前端状态管理是如何实现的?
回答:
前端使用Pinia进行状态管理:
Store设计:
auth.ts:用户认证状态(token、用户信息、登录状态)app.ts:应用全局状态
组合式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 } })- 持久化: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. 系统还有哪些可以改进的地方?
回答:
- 实时通讯:新增买卖双方实时在线沟通功能,降低沟通成本
- 智能推荐:基于用户浏览历史、校园身份标签进行商品推荐
- 搜索优化:引入Elasticsearch实现全文搜索,提升搜索体验
- 消息推送:集成WebSocket实现实时消息推送
- 安全升级:敏感数据加密存储,引入风控系统
- 性能优化:引入消息队列处理异步任务,提升系统吞吐量
十一、代码定位速查
28. 如果老师问某个功能的代码在哪里,如何快速定位?
回答:
请参考本文档附件《后端代码架构快速定位指南》,按照以下方式快速定位:
- 按模块定位:根据功能所属模块,在
back-end/src/modules/下找到对应目录 按层次定位:
- 控制器(Controller):处理HTTP请求
- 服务(Service):处理业务逻辑
- 实体(Entity):数据库表映射
按功能定位:
- 登录注册 →
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.ts | JWT策略 | Token验证策略 |
jwt-auth.guard.ts | JWT守卫 | 接口权限拦截 |
dto/auth.dto.ts | 数据传输对象 | 登录、注册参数定义 |
关键功能代码定位:
- 用户注册:
auth.service.ts→register()方法(第40-96行) - 用户登录:
auth.service.ts→login()方法(第109-164行) - Token刷新:
auth.service.ts→refresh()方法(第176-224行) - 用户登出:
auth.service.ts→logout()方法(第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.ts→list()方法(第89-147行) - 商品详情:
goods.service.ts→detail()方法(第156-227行) - 发布商品:
goods.service.ts→create()方法(第236-270行) - 更新商品:
goods.service.ts→update()方法(第280-319行) - 删除商品:
goods.service.ts→delete()方法(第329-367行) - 下架商品:
goods.service.ts→offline()方法(第379-418行) - 举报商品:
goods.service.ts→report()方法(第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.ts→createOrder()方法(第148-241行) - 订单列表:
orders.service.ts→listOrders()方法(第250-324行) - 订单详情:
orders.service.ts→detail()方法(第369-443行) - 取消订单:
orders.service.ts→cancel()方法(第454-491行) - 订单发货:
orders.service.ts→ship()方法(第502-533行) - 确认收货:
orders.service.ts→confirm()方法(第544-642行) - 申请退款:
orders.service.ts→refund()方法(第653-695行) - 处理退款:
orders.service.ts→handleRefund()方法(第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.ts→getMe()方法(第114-128行) - 交易流水:
wallet.service.ts→getTransactions()方法(第140-181行) - 充值功能:
wallet.service.ts→topup()方法(第223-315行) - 提现功能:
wallet.service.ts→withdraw()方法(第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.ts→addCredit()方法(第39-94行) - 扣减信用分:
credit.service.ts→deductCredit()方法(第104-140行) - 周期限制检查:
credit.service.ts→checkPeriodLimit()方法(第152-207行) - 按规则加分:
credit.service.ts→addCreditByRule()方法(第216-235行) - 按规则扣分:
credit.service.ts→deductCreditByRule()方法(第244-262行) - 信用等级:
credit.service.ts→getCreditLevel()方法(第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 - 方法名:如
createOrder、handleRefund、addCredit - 状态值:如
OrderStatus.CREATED、GoodsStatus.ONLINE
2. 按API路径定位
- 在控制器文件中搜索路由装饰器
- 找到对应的处理方法
- 跟踪到服务层查看业务逻辑
3. 按数据库表定位
- 在实体文件中查看表结构定义
- 在服务文件中查看对该表的操作
五、前端代码定位
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融合信用评级的校园二手交易系统
评论