GLM-4.7 vs MiniMax-M2.1:代码工程理解

1 环境信息

  • 操作系统:windows 10
  • AI 编程工具:Claude Code 2.0.42
  • 模型信息
    • GLM-4.7:国内官网,Coding Plan 套餐。
    • MiniMax-M2.1:国外官网,Coding Plan 套餐。

2 结论先行

2.1 评分汇总

场景 模型 技术栈识别 架构理解深度 规范完整性 输出专业性 实用性 总分
后端:NestJS+TypeScript+Fastify MiniMax-M2.1 5 5 5 5 5 25
GLM-4.7 5 5 5 5 5 25
后端:Java+Spring Boot2 MiniMax-M2.1 4 3 3 3 3 16
GLM-4.7 5 5 5 5 5 25
前端:Vue3+TypeScript+Vite MiniMax-M2.1 5 5 5 5 5 25
GLM-4.7 5 5 5 4 5 24

2.2 模型特性总结

2.2.1 MiniMax-M2.1

  • 结构化输出:层次分明,易于快速理解和实施
  • 规范明确:提供清晰的命名、格式、组织规范
  • 实用性强:侧重可操作性和实施细节
  • 深度有限:在复杂架构和设计原则阐述上相对薄弱
  • 不一致性:不同场景表现差异较大(Java场景较弱)

改进建议

  1. 加强复杂场景(如Java企业级)的深度分析
  2. 提升架构理念和设计原则的阐述能力

2.2.2 GLM-4.7

  • 架构深度:深入阐述设计原则、分层架构、最佳实践
  • 全面性:覆盖开发全生命周期规范
  • 一致性:各场景表现稳定且优秀
  • 工程思维:体现企业级开发理念和工程化思考
  • 结构略冗:部分输出内容可进一步精简优化

改进建议

  1. 优化输出结构,提升可读性和实施效率
  2. 保持现有优势,继续加强实用性示例

2.3 场景选择建议

项目类型 推荐模型 理由
快速原型/标准化项目 MiniMax-M2.1 结构清晰,便于快速实施
复杂企业级系统 GLM-4.7 架构理解深入,规范全面
Java生态项目 GLM-4.7 在Java场景表现显著更优
前端Vue项目 根据需求: • 快速实施→MiniMax • 架构深度→GLM 二者各有优势
全栈项目指导 GLM-4.7 表现更稳定全面

3 后端

提示词:输出工程用到的技术栈/代码结构,并提供编程规范

3.1 评价标准

维度 5分标准 3分标准 1分标准
技术栈识别 准确识别全部核心技术栈及开发工具链 识别主要技术栈,遗漏部分工具 技术栈识别不全或有错误
架构理解深度 详细描述分层架构、设计模式、模块组织 基本描述结构,缺乏深度分析 架构描述模糊或错误
规范完整性 覆盖编码、测试、部署等完整开发规范 涵盖基本规范,细节不完整 规范描述零散不系统
输出专业性 技术术语准确,架构理念先进,体现工程思维 技术描述基本正确,缺乏深度 技术理解肤浅或有错误
实用性 提供具体配置、代码示例和最佳实践 有概念描述但缺乏实施细节 缺乏可操作

3.2 技术栈:NestJS+TypeScript+Fastify

3.2.1 评测结果

二者均表现优秀,无明显差距。GLM-4.7在架构理念和设计原则阐述上略胜一筹。

3.2.1.1 MiniMax-M2.1

得分:25

维度 评分 评价理由
技术栈识别 5 完整列出核心与辅助技术栈,版本清晰,涵盖工具链
架构理解深度 5 详细描述分层架构、模块组织、设计模式(如MVC、Repository)
规范完整性 5 覆盖编码、命名、API设计、数据库、Git提交等完整规范
输出专业性 5 术语准确,结构清晰,体现企业级工程思维
实用性 5 提供具体配置、命令、代码示例、模块结构模板
3.2.1.2 GLM-4.7

得分:25

维度 评分 评价理由
技术栈识别 5 技术栈识别完整,分类清晰,版本齐全
架构理解深度 5 详细描述分层、实体设计、生命周期、控制器规范等
规范完整性 5 覆盖编码、注释、异常、查询、日志、事务等全方位规范
输出专业性 5 术语专业,架构理念先进,设计原则明确(如SOLID)
实用性 5 提供完整代码示例、配置说明、开发命令、设计原则

3.2.2 模型输出结果

3.2.2.1 MiniMax-M2.1
yaml 复制代码
Backend 技术栈与代码结构

  ---
  一、技术栈

  | 分类     | 技术/版本                           | 说明                                 |
  |----------|-------------------------------------|--------------------------------------|
  | 运行时   | Node.js                             | TypeScript 编译执行环境              |
  | 框架     | NestJS v11                          | Node.js 企业级后端框架               |
  | Web 框架 | Fastify v5.4                        | 高性能 HTTP 服务器                   |
  | ORM      | Prisma v6.9                         | 数据库 ORM 框架(SQLite/PostgreSQL) |
  | 认证     | Passport + JWT                      | 身份认证中间件                       |
  | 验证     | class-validator + class-transformer | DTO 校验与转换                       |
  | 文档     | Swagger/NestJS Swagger              | API 文档自动生成                     |
  | 日志     | Winston + Winston Daily Rotate      | 日志管理与轮转                       |
  | 指标     | prom-client + @nestjs/terminus      | 应用健康监控                         |
  | 配置     | YAML + ConfigService                | 配置文件管理                         |
  | 工具库   | Lodash、bcrypt、qs、zod             | 辅助工具                             |
  | 构建     | TypeScript + SWC                    | TS 编译与构建                        |
  | 测试     | Jest + Supertest                    | 单元测试与 E2E 测试                  |
  | 代码规范 | ESLint + Prettier                   | 代码格式化与检查                     |

  ---
  二、代码结构

  backend/
  ├── src/
  │   ├── main.ts                    # 应用入口
  │   ├── app.module.ts              # 根模块
  │   ├── config/                    # 配置文件
  │   │   └── config.yml             # 主配置(数据库、端口、日志等)
  │   ├── commons/                   # 公共模块
  │   │   ├── auth/                  # 认证授权(JWT/Basic、Guards、Decorators)
  │   │   ├── config/                # 配置实体类
  │   │   ├── database/              # Prisma 服务封装
  │   │   ├── entity/                # 基础实体类(StandardEntity、CreateEntity 等)
  │   │   ├── exception/             # 异常处理(BusinessException、ErrorCode)
  │   │   ├── log/                   # 日志模块
  │   │   ├── query/                 # 分页查询(QueryFilter、QueryResult)
  │   │   ├── util/                  # 工具类(日期、密码加密)
  │   │   └── web/                   # Web 通用(拦截器、过滤器)
  │   └── modules/                   # 业务模块
  │       ├── admin/                 # 管理员模块
  │       ├── auth/                  # 登录认证模块
  │       ├── attendance/            # 考勤管理模块
  │       ├── course/                # 课程管理模块
  │       ├── operationlog/          # 操作日志模块
  │       ├── option/                # 配置选项模块
  │       ├── student/               # 学生管理模块
  │       ├── teacher/               # 教师管理模块
  │       └── user/                  # 用户管理模块
  ├── prisma/
  │   ├── schema.prisma              # 数据模型定义
  │   ├── schema.prisma.sqlite       # SQLite 配置
  │   ├── schema.prisma.postgresql   # PostgreSQL 配置
  │   └── seed.ts                    # 数据填充脚本
  ├── test/                          # 测试文件
  ├── package.json
  ├── tsconfig.json
  ├── .prettierrc
  ├── eslint.config.mjs
  └── Dockerfile

  ---
  三、模块标准结构

  每个业务模块遵循统一结构:

  modules/{module}/
  ├── {module}.module.ts              # 模块定义
  ├── {module}.controller.ts          # API 控制器
  ├── {module}.service.ts             # 业务逻辑层
  ├── {module}.repository.ts          # 数据访问层(可选)
  ├── dto/                            # 数据传输对象
  │   ├── {module}.create.dto.ts
  │   ├── {module}.update.dto.ts
  │   └── {module}.query.dto.ts
  └── entity/                         # 实体类
      ├── {module}.entity.ts
      ├── {module}.queryfilter.ts
      └── {module}.querydecoder.ts

  ---
  四、编程规范

  4.1 代码风格

  | 配置项 | 值                  |
  |--------|---------------------|
  | 缩进   | 2 空格              |
  | 引号   | 单引号 ' '          |
  | 分号   | 必须使用 ;          |
  | 尾逗号 | all(对象、数组等) |
  | 行宽   | 80 字符             |

  4.2 ESLint 规则

  - @typescript-eslint/no-explicit-any: off(允许使用 any)
  - @typescript-eslint/no-floating-promises: warn
  - @typescript-eslint/no-unsafe-*:: warn
  - prettier/prettier: error

  4.3 命名规范

  | 类型       | 规范             | 示例                                      |
  |------------|------------------|-------------------------------------------|
  | 文件名     | kebab-case       | course.controller.ts                      |
  | 类名       | PascalCase       | CourseController、CourseService           |
  | 变量/函数  | camelCase        | courseService、findById                   |
  | 常量       | UPPER_SNAKE_CASE | MAX_RETRY_COUNT                           |
  | 数据库字段 | snake_case       | created_at、user_id                       |
  | DTO 属性   | camelCase        | courseId(内部)→ course_id(数据库映射) |
  | 枚举       | PascalCase       | UserType、CourseType                      |

  4.4 模块分层规范

  Controller (API 层)
      ↓ 调用
  Service (业务逻辑层)
      ↓ 调用
  Repository (数据访问层)
      ↓ 调用
  Prisma (数据库操作)

  4.5 API 设计规范

  - 路由前缀: 全局通过 config.yml 配置(默认 /api)
  - 请求方式: 统一使用 POST(Body 传参)
  - 响应格式: 统一 ResponseDto<T> 结构
  - 分页: 使用 QueryResult<T> 包装
  - 认证: @UseGuards(JwtAuthGuard, RolesGuard)
  - 角色控制: @Roles(UserType.admin)

  4.6 数据库规范

  - 字段映射使用 @map() 注解
  - 必须添加索引 @index()
  - 软删除使用 isActive 布尔字段
  - 审计字段: creatorId/Name、updatorId/Name、createdAt、updatedAt

  4.7 Git 提交规范

  feat: 新功能
  fix: 修复 bug
  docs: 文档更新
  style: 代码格式(不影响功能)
  refactor: 重构
  test: 测试相关
  chore: 构建/工具/依赖更新

  ---
  五、常用命令

  # 开发启动
  npm run start:dev

  # 代码检查
  npm run lint

  # 代码格式化
  npm run format

  # Prisma 操作
  npm run prisma:generate   # 生成客户端
  npm run prisma:migrate    # 迁移数据库
  npm run prisma:studio     # 可视化数据库
  npm run prisma:seed       # 填充数据

  # 构建与运行
  npm run build
  npm run start:prod

  ---
  六、配置说明

  backend/src/config/config.yml 主要配置项:

  app:
    contextPath: /api        # 全局路由前缀
    port: 3000              # 监听端口
    compression:
      enabled: true
      threshold: 1024

  database:
    provider: sqlite        # sqlite / postgresql
    url: prisma/local.db

  jwt:
    secret: your-secret
    expiresIn: 1h

  swagger:
    enabled: true
    title: Course System API
    path: swagger
3.2.2.2 GLM-4.7
typescript 复制代码
 📦 Backend 工程技术栈

  核心框架

  | 技术       | 版本    | 用途                                 |
  |------------|---------|--------------------------------------|
  | NestJS     | ^11.0.1 | 渐进式Node.js框架,提供完整的MVC架构 |
  | Fastify    | ^5.4.0  | 高性能Web服务器(替代Express)       |
  | TypeScript | ^5.7.3  | 类型安全的开发语言                   |

  数据层

  | 技术           | 版本   | 用途                                 |
  |----------------|--------|--------------------------------------|
  | Prisma         | ^6.9.0 | 类型安全的ORM,支持SQLite/PostgreSQL |
  | @prisma/client | ^6.9.0 | Prisma查询客户端                     |

  认证与安全

  | 技术             | 版本    | 用途          |
  |------------------|---------|---------------|
  | @nestjs/passport | ^11.0.5 | 认证策略集成  |
  | @nestjs/jwt      | ^11.0.0 | JWT令牌处理   |
  | passport-jwt     | ^4.0.1  | JWT认证策略   |
  | passport-http    | ^0.3.0  | Basic认证策略 |
  | bcrypt           | ^6.0.0  | 密码哈希加密  |

  日志与监控

  | 技术                      | 版本    | 用途               |
  |---------------------------|---------|--------------------|
  | winston                   | ^3.17.0 | 日志记录           |
  | winston-daily-rotate-file | ^5.0.0  | 日志文件按日期轮转 |
  | @nestjs/terminus          | ^11.0.0 | 健康检查           |
  | prom-client               | ^15.1.3 | Prometheus指标采集 |

  API文档与验证

  | 技术              | 版本    | 用途                |
  |-------------------|---------|---------------------|
  | @nestjs/swagger   | ^11.2.0 | OpenAPI/Swagger文档 |
  | class-validator   | ^0.14.2 | DTO声明式验证       |
  | class-transformer | ^0.5.1  | 对象转换            |

  其他工具

  | 技术        | 版本     | 用途           |
  |-------------|----------|----------------|
  | compression | ^1.8.1   | HTTP响应压缩   |
  | nestjs-cls  | ^6.0.1   | 请求上下文管理 |
  | lodash      | ^4.17.21 | 工具函数库     |
  | uuid        | ^11.1.0  | UUID生成       |
  | zod         | ^4.1.5   | 运行时类型验证 |

  ---
  🏗️ 代码结构

  目录架构

  backend/
  ├── prisma/                    # 数据库层
  │   ├── schema.prisma          # 数据模型定义
  │   └── seed.ts                # 种子数据
  │
  ├── src/
  │   ├── main.ts                # 应用入口
  │   ├── app.module.ts          # 根模块
  │   │
  │   ├── commons/               # 公共模块(跨业务)
  │   │   ├── auth/              # 认证授权
  │   │   │   ├── decorator/     # 装饰器(@JwtAuth, @Public等)
  │   │   │   ├── guard/         # 守卫
  │   │   │   ├── strategy/      # Passport策略
  │   │   │   └── jwt-auth.service.ts
  │   │   │
  │   │   ├── config/            # 配置管理
  │   │   ├── database/          # 数据库服务
  │   │   ├── entity/            # 公共实体基类
  │   │   ├── exception/         # 异常处理
  │   │   ├── log/               # 日志服务
  │   │   ├── query/             # 查询封装
  │   │   ├── util/              # 工具类
  │   │   └── web/               # Web层组件
  │   │       ├── filter/        # 异常过滤器
  │   │       ├── interceptor/   # 拦截器
  │   │       └── management/    # 管理端点
  │   │
  │   └── modules/               # 业务模块
  │       ├── user/              # 用户模块
  │       ├── course/            # 课程模块
  │       ├── attendance/        # 考勤模块
  │       ├── auth/              # 认证控制器
  │       ├── admin/             # 管理员
  │       ├── student/           # 学生
  │       ├── teacher/           # 教师
  │       └── operationlog/      # 操作日志
  │
  ├── test/                      # 测试目录
  └── docs/                      # 项目文档

  模块标准结构

  每个业务模块遵循统一的分层架构:

  module-name/
  ├── module-name.controller.ts  # 控制器层(路由、参数验证)
  ├── module-name.service.ts     # 服务层(业务逻辑)
  ├── module-name.repository.ts  # 仓储层(数据访问)
  ├── module-name.module.ts      # 模块定义(依赖注入)
  ├── dto/                       # 数据传输对象(API请求/响应)
  │   ├── module-create.dto.ts
  │   ├── module-update.dto.ts
  │   └── module.dto.ts
  └── entity/                    # 实体类(领域模型)
      ├── module.entity.ts
      ├── module.queryfilter.ts  # 查询过滤器
      └── module.querydecoder.ts # 查询解码器

  数据模型

  | 模型             | 说明                       | 关键字段                                                             |
  |------------------|----------------------------|----------------------------------------------------------------------|
  | User             | 用户表(管理员/教师/学生) | id, name, username, password, userType, isActive                     |
  | Course           | 课程表                     | id, name, courseType, isActive, studentCount                         |
  | CourseTeacher    | 课程-教师关联              | courseId, teacherId                                                  |
  | CourseStudent    | 课程-学生关联              | courseId, studentId, totalSessions, usedSessions, startDate, endDate |
  | AttendanceRecord | 考勤记录                   | courseId, studentId, attendanceDate, sessionsConsumed                |
  | OperationLog     | 操作日志                   | id, module, operation, operatorId                                    |

  ---
  📋 编程规范

  1. TypeScript配置规范

  编译选项 (tsconfig.json):
  - 目标版本: ES2023
  - 模块系统: CommonJS
  - 装饰器支持: 启用 experimentalDecorators
  - 严格模式: strictNullChecks: true
  - 源码映射: 启用 sourceMap

  2. 代码风格规范

  Prettier配置 (.prettierrc):
  {
    "singleQuote": true,      // 使用单引号
    "tabWidth": 2,            // 缩进2空格
    "printWidth": 80,         // 每行最大80字符
    "semi": true,             // 使用分号
    "trailingComma": "all"    // 尾随逗号
  }

  ESLint规则 (eslint.config.mjs):
  - 关闭 @typescript-eslint/no-explicit-any(允许any)
  - 浮动Promise警告
  - 不安全操作警告(参数/成员访问/赋值)
  - Prettier集成

  3. 命名规范

  | 类型     | 规范                    | 示例                                  |
  |----------|-------------------------|---------------------------------------|
  | 文件名   | kebab-case              | course.service.ts, user-create.dto.ts |
  | 类名     | PascalCase              | CourseService, UserCreateDto          |
  | 方法名   | camelCase               | findById, listUnAssignedTeachers      |
  | 接口名   | PascalCase,无I前缀     | QueryDecoder, Converter               |
  | 常量     | UPPER_SNAKE_CASE        | CourseType.session_card               |
  | 私有成员 | camelCase,无下划线前缀 | private courseRepository              |

  4. 注释规范

  /**
   * 创建课程
   * @param createCourseDto 创建DTO
   * @param operateContext 操作上下文
   * @returns 课程实体
   */
  async create(
    createCourseDto: CourseCreateDto,
    operateContext: OperateContext,
  ): Promise<CourseEntity>

  要求:
  - 所有公开方法必须有JSDoc注释
  - 复杂逻辑必须添加行内注释
  - 注释使用中文简体

  5. 实体设计规范

  继承体系:
  Entity (基础实体)
    └── StandardEntity (标准实体,含审计字段)
         └── CourseCreateEntity, UserCreateEntity等

  审计字段(继承自 StandardEntity):
  createdAt: Date;        // 创建时间
  creatorId: string;      // 创建人ID
  creatorName: string;    // 创建人姓名
  updatedAt: Date;        // 更新时间
  updatorId: string;      // 更新人ID
  updatorName: string;    // 更新人姓名

  生命周期方法:
  - onCreated(operateContext): 创建时调用
  - onUpdated(operateContext): 更新时调用

  6. 控制器规范

  装饰器顺序:
  @Controller('route')              // 1. 路由定义
  @UseGuards(JwtAuthGuard, RolesGuard) // 2. 守卫
  @Roles(UserType.admin)            // 3. 角色控制
  async methodName() { }            // 4. 方法实现

  依赖注入:
  constructor(
    private readonly courseService: CourseService,
    private readonly userService: UserService,
  ) {}

  7. 服务层规范

  异常处理:
  - 资源不存在:throw new NotFoundException('资源不存在')
  - 冲突:throw new ConflictException('资源已存在')
  - 参数错误:throw new BadRequestException('参数错误')

  操作模式:
  // 1. 验证
  const exists = await this.repository.existsByName(name);
  if (exists) {
    throw new ConflictException('名称已存在');
  }

  // 2. 转换DTO为Entity
  const entity = new CourseCreateEntity(dto);
  entity.onCreated(operateContext);

  // 3. 持久化
  return await this.repository.create(entity);

  8. 查询规范

  查询过滤器 (QueryFilter):
  {
    page: 1,
    pageSize: 10,
    keyword?: string,
    isActive?: boolean,
    sorts?: [{ field: string, direction: 'asc'|'desc' }]
  }

  查询结果 (QueryResult<T>):
  {
    records: T[],
    page: number,
    pageSize: number,
    total: number
  }

  9. 认证授权规范

  认证方式:
  - Basic Auth: 管理员获取初始Token
  - JWT Bearer: 标准API调用
  - Refresh Token: 刷新访问令牌

  角色类型 (UserType):
  - admin: 管理员(完全权限)
  - teacher: 教师(课程相关权限)
  - student: 学生(只读权限)

  使用方式:
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles(UserType.admin)
  async adminOnlyMethod() { }

  @AccessContext() operateContext: OperateContext  // 获取当前操作人

  10. 日志规范

  日志级别:
  - error: 错误,需要立即处理
  - warn: 警告,需要关注
  - info: 一般信息
  - debug: 调试信息

  日志轮转:按日期自动轮转,文件名格式:application-YYYY-MM-DD.log

  ---
  🔧 开发命令

  # 开发模式(热重载)
  npm run start:dev

  # 生产构建
  npm run build
  npm run start:prod

  # 数据库操作
  npm run prisma:generate    # 生成Prisma客户端
  npm run prisma:migrate     # 执行迁移
  npm run prisma:seed        # 填充种子数据
  npm run prisma:studio      # 打开数据库管理界面

  # 代码质量
  npm run lint              # ESLint检查
  npm run format            # Prettier格式化

  # 测试
  npm run test              # 单元测试
  npm run test:e2e          # 端到端测试
  npm run test:cov          # 测试覆盖率

  ---
  📝 核心设计原则

  1. 单一职责: 每个类只负责一个功能领域
  2. 依赖注入: 使用NestJS的DI容器管理依赖
  3. 分层架构: Controller → Service → Repository 清晰分离
  4. 实体转换: DTO ↔ Entity ↔ PO 分层转换
  5. 审计追踪: 所有写操作自动记录创建人/更新人
  6. 异常统一: 使用NestJS内置异常,统一错误处理
  7. 类型安全: 全链路TypeScript类型检查

3.3 技术栈:Java+Spring Boot2

3.3.1 评测结果

GLM-4.7在Java项目理解深度、规范完整性和实用性上明显优于MiniMax-M2.1。

3.3.1.1 MiniMax-M2.1

得分:16

维度 评分 评价理由
技术栈识别 4 列出主要技术栈,但部分组件(如MyBatis细节、监控工具)描述较简
架构理解深度 3 描述基本结构,缺乏深度分层和设计模式分析
规范完整性 3 涵盖基础规范,但缺乏异常处理、事务、日志等细节
输出专业性 3 描述基本正确,但缺乏架构理念和工程思维体现
实用性 3 有项目结构和基本命令,但缺少具体代码示例和最佳实践
3.3.1.2 GLM-4.7

得分:25

维度 评分 评价理由
技术栈识别 5 完整识别技术栈,包括基础设施组件和监控工具
架构理解深度 5 详细描述分层架构、模块职责、依赖注入、外部服务调用等
规范完整性 5 覆盖异常、事务、日志、配置、注释、SOLID原则等完整规范
输出专业性 5 术语准确,架构清晰,体现企业级开发理念
实用性 5 提供详细代码示例、配置说明、开发原则和检查清单

3.3.2 模型输出结果

3.3.2.1 MiniMax-M2.1
typescript 复制代码
  LAB-PROJECT 项目技术栈与编程规范

  一、项目概述

  | 项目属性 | 说明                                       |
  |----------|--------------------------------------------|
  | 项目名称 | 同三方协作平台的对接服务            |
  | 项目简称 | lab                                       |
  | 版本     | 1.13-SNAPSHOT                              |
  | 项目类型 | 多模块 Maven 项目                          |
  | GitLab   | https://xx/LAB/lab.git |

  ---
  二、技术栈

  2.1 后端技术栈

  | 技术                   | 版本/说明 | 用途             |
  |------------------------|-----------|------------------|
  | Java                   | 1.8       | 编程语言         |
  | Spring Boot            | -         | 应用框架核心     |
  | Spring Cloud OpenFeign | -         | 声明式HTTP客户端 |
  | Tomcat Embedded        | 9.0.69    | 内嵌Web容器      |
  | MyBatis/Custom-DAO   | -         | 数据访问层       |
  | Oracle JDBC            | ojdbc6    | 数据库驱动       |
  | Druid                  | -         | 数据库连接池     |
  | Custom               | 2.15      | 个人服务框架     |
  | custom-Commons          | 2.x       | 个人公共组件库   |
  | Logback                | 1.2.11    | 日志框架         |
  | Lombok                 | -         | 代码简化         |

  2.2 API文档

  | 技术              | 用途           |
  |-------------------|----------------|
  | Swagger/Springfox | API接口文档    |
  | Knife4j           | Swagger UI增强 |

  2.3 个人基础设施组件

  | 组件             | 用途                         |
  |------------------|------------------------------|
  | custom-event     | 事件调用(消息队列可靠投递) |
  | custom-rdb-version     | 数据库版本管理               |
  | custom-micrometer | 指标监控(Prometheus)       |
  | custom-job     | 定时任务调度                 |
  | custom-sequence   | 分布式序列号生成             |
  | custom-snowflake  | 雪花算法ID生成               |

  ---
  三、项目模块结构

  lab (父POM)
  ├── pom.xml
  ├── lab-api              # 对外服务接口对象
  │   └── src/main/java/com/custom/lab/api/
  │       └── domain/       # 领域对象定义
  ├── lab-core             # 服务数据访问层
  │   └── src/main/java/com/custom/lab/
  │       ├── commons/      # 公共组件
  │       ├── domain/       # 业务领域
  │       │   ├── config/
  │       │   ├── department/
  │       │   ├── feishu/
  │       │   ├── message/
  │       │   ├── orgUser/
  │       │   ├── store/
  │       │   └── user/
  │       └── feishu/       # 飞书客户端
  ├── lab-service          # 对外服务实现(Spring Boot主模块)
  │   ├── src/main/java/com/custom/lab/
  │   │   ├── Application.java  # 启动类
  │   │   ├── config/
  │   │   ├── domain/
  │   │   ├── feishu/
  │   │   ├── web/
  │   │   ├── wecom/
  │   │   └── health/
  │   └── src/main/resources/
  │       ├── application.yml
  │       ├── logback.xml
  │       └── public/       # 静态资源
  ├── lab-rdb-scripts      # 数据库安装脚本
  ├── lab-rdb-setup        # 数据库安装程序
  └── lab-rdb-upgrade      # 数据库升级程序

  ---
  四、代码分层架构

  Controller层 (REST API)
      ↓
  Service层 (业务逻辑)
      ↓
  Repository/DAO层 (数据访问)
      ↓
  数据库 (Oracle)

  ---
  五、编程规范

  5.1 文件头版权声明

  /**
   * 版权所有(C),个人所有,2021,所有权利保留。
   * <p>
   * 项目名: lab
   * 文件名: 文件名.java
   * 模块说明:
   * 修改历史:
   * 2022年05月18日 - zhangsan - 创建。
   */

  5.2 包命名规范

  // 基础包结构
  com.custom.lab.{模块名}

  // 示例
  com.custom.lab.domain.department
  com.custom.lab.feishu
  com.custom.lab.wecom

  5.3 类命名规范

  | 类型     | 规范              | 示例                      |
  |----------|-------------------|---------------------------|
  | 实体类   | 简单名词          | Department, User          |
  | 服务接口 | {模块}Service     | DepartmentService         |
  | 服务实现 | {模块}ServiceImpl | UserOperLogServiceImpl |
  | 控制器   | {模块}Controller  | FeiShuController          |
  | 常量类   | {模块}Constants   | -                         |

  5.4 方法命名规范

  | 类型     | 规范            | 示例                    |
  |----------|-----------------|-------------------------|
  | 获取单个 | getBy{Field}    | getBy(String code)      |
  | 保存     | save            | save(Department dept)   |
  | 删除     | delete          | delete(Department dept) |
  | 查询列表 | query 或 getAll | query(Filter filter)    |

  5.5 Controller 规范

  @Slf4j
  @Api(tags = FeiShuController.TAG)
  @RestController
  @RequestMapping("/v1/feishu")
  public class FeiShuController {
    public static final String TAG = "飞书";

    @ApiOperation(value = "接口描述")
    @PostMapping(value = "/login")
    public Response<LoginResult> login(@RequestBody RequestDTO request) {
      // ...
      return Response.success(result);
    }
  }

  规范要点:
  - 使用 @Api 和 @ApiOperation 注解
  - 路径使用 RESTful 风格:/v1/{platform}/{resource}
  - 返回统一使用 Response<T> 包装
  - 使用 @Slf4j 打印日志

  5.6 实体类规范

  @Data
  @EqualsAndHashCode(callSuper = true)
  public class Department extends Entity {
    @ApiModelProperty("部门代码")
    private String code;
    @ApiModelProperty("部门名称")
    private String name;
  }

  规范要点:
  - 使用 Lombok @Data、@EqualsAndHashCode(callSuper = true)
  - 继承 Entity 基类
  - 字段使用 @ApiModelProperty 注释
  - 不使用 @Data 注解时手动添加 toString()

  5.7 异常处理

  // Service 层抛出异常
  void save(Department department) throws CustomServiceException;

  // 异常类型
  com.custom.exception.CustomServiceException

  5.8 日志规范

  @Slf4j
  public class SomeService {
    public void doSomething() {
      log.info("开始处理...");
      log.debug("详细参数: {}", param);
      log.error("错误信息", exception);
    }
  }

  5.9 配置规范

  # application.yml 注释风格
  #==========================================================
  # 应用服务器配置
  #==========================================================
  server:
    port: 8080  # 服务运行端口

  ---
  六、API 响应规范

  // 成功响应
  return Response.success(result);

  // 失败响应(使用 CustomServiceException)
  throw new CustomServiceException("错误描述");

  ---
  七、Git 提交规范

  项目使用 Conventional Commits 标准,提交信息格式:

  <type>(<scope>): <subject>

  # 示例
  feat(feishu): 增加飞书登录功能
  fix(department): 修复部门同步bug
  docs: 更新README

  ---
  八、相关文档

  | 文档路径                       | 内容     |
  |--------------------------------|----------|
  | doc/design/飞书对接设计文档.md | 设计文档 |
  | doc/devops/部署配置说明.md     | 部署配置 |
  | doc/faq/FAQ.md                 | 常见问题 |
  | README.md                      | 项目概述 |

  ---
  九、关键配置

  | 配置项      | 值                     |
  |-------------|------------------------|
  | 服务端口    | 8080                   |
  | 监控端口    | 8081                   |
  | 上下文路径  | /lab-service          |
  | API文档地址 | /lab-service/doc.html |
  | 默认环境    | prd                    |
3.3.2.2 GLM-4.7
java 复制代码
 根据代码库分析,我为你整理了完整的技术栈、代码结构和编程规范:

  ---
  📊 技术栈概览

  核心框架

  | 技术                   | 版本   | 用途             |
  |------------------------|--------|------------------|
  | Spring Boot            | 2.x    | 应用框架         |
  | lab               | 2.15   | 个人应用开发框架 |
  | custom                  | 多组件 | 企业组件库       |
  | Spring Cloud OpenFeign | -      | REST客户端       |
  | Lombok                 | -      | 代码简化         |

  持久层与数据库

  - Spring JDBC + Druid 连接池
  - Oracle (主要) / MySQL / PostgreSQL
  - custom RDB 数据库版本管理

  监控与文档

  - Swagger/Knife4j - API文档
  - Micrometer/Prometheus - 监控指标
  - Logback - 日志框架

  ---
  🏗️ 代码结构

  lab/
  ├── lab-api/              # API接口对象层
  │   └── domain/            # 领域对象定义
  │
  ├── lab-core/             # 核心业务层
  │   ├── commons/           # 公共工具(JDBC等)
  │   ├── domain/            # 领域服务
  │   │   ├── department/    # 部门管理
  │   │   ├── feishu/        # 飞书集成
  │   │   ├── wecom/         # 企业微信
  │   │   ├── user/          # 用户管理
  │   │   └── store/         # 门店管理
  │   └── feishu/            # 飞书业务服务
  │
  ├── lab-service/          # Web服务层(主应用)
  │   ├── config/            # Spring配置
  │   ├── domain/            # 服务实现
  │   ├── feishu/            # 飞书控制器
  │   ├── wecom/             # 企业微信控制器
  │   └── Application.java   # 启动类
  │
  └── pom.xml                # Maven父POM

  分层原则:
  1. lab-api - 对外接口定义,无业务逻辑
  2. lab-core - 核心业务 + 数据访问
  3. lab-service - Web层,仅处理HTTP请求/响应

  ---
  📐 编程规范

  4. 包命名规范

  com.custom.lab
  ├── domain.{feature}        # 领域对象
  │   ├── repository/         # 数据访问层
  │   └── service/            # 领域服务
  ├── commons                 # 公共工具
  ├── config                  # 配置类
  └── {platform}             # 平台控制器(feishu/wecom)

  示例:
  // ✅ 正确
  com.custom.lab.domain.user.repository.UserRepository
  com.custom.lab.domain.user.service.UserService
  com.custom.lab.feishu.FeiShuController

  // ❌ 错误
  com.custom.lab.user.UserDao
  com.custom.UserController

  ---
  5. 领域对象设计规范

  实体类位置

  | 类型       | 位置              | 说明       |
  |------------|-------------------|------------|
  | 领域实体   | lab-api/domain/  | 跨模块共享 |
  | 数据库实体 | lab-core/domain/ | 持久化专用 |

  实体类规范

  // ✅ 推荐:使用Lombok简化
  @Getter
  @Setter
  @AllArgsConstructor
  @NoArgsConstructor
  public class DUser implements Serializable {
      private String uuid;
      private String name;
      private String orgUuid;

      // 领域行为
      public boolean isActive() {
          return StringUtils.isNotBlank(uuid);
      }
  }

  // ❌ 避免:过多的DTO转换层

  ---
  6. 分层设计原则

  三层架构职责

  // ========== lab-service (Web层) ==========
  @RestController
  @RequestMapping("/v1/feishu")
  public class FeiShuController {

      @Autowired
      private UserService userService;  // 仅调用领域服务

      // ✅ 仅处理HTTP请求/响应,无业务逻辑
      @PostMapping("/login")
      public Result<LoginResult> login(@RequestBody LoginRequest request) {
          LoginResult result = userService.login(request.getCode());
          return Result.success(result);
      }
  }

  // ========== lab-core (领域层) ==========
  @Service
  public class UserServiceImpl implements UserService {

      @Autowired
      private UserRepository userRepository;  // 数据访问
      @Autowired
      private FeiShuClient feiShuClient;      // 外部服务

      // ✅ 业务逻辑核心
      @Override
      @Transactional
      public LoginResult login(String code) {
          // 1. 调用飞书认证
          FeiShuUser fsUser = feiShuClient.getUserInfo(code);

          // 2. 查询或创建用户
          DUser user = userRepository.findByUuid(fsUser.getUuid());
          if (user == null) {
              user = createUserFromFeiShu(fsUser);
              userRepository.save(user);
          }

          // 3. 生成令牌
          return generateLoginResult(user);
      }
  }

  // ========== lab-core (数据访问层) ==========
  @Repository
  public class UserRepositoryImpl implements UserRepository {

      @Autowired
      private JdbcTemplate jdbcTemplate;

      // ✅ 仅负责数据CRUD
      @Override
      public DUser findByUuid(String uuid) {
          String sql = "SELECT * FROM d_user WHERE uuid = ?";
          return jdbcTemplate.queryForObject(sql, new UserRowMapper(), uuid);
      }
  }

  ---
  7. 异常处理规范

  // ========== 自定义业务异常 ==========
  public class labException extends RuntimeException {
      private final String code;

      public labException(String code, String message) {
          super(message);
          this.code = code;
      }
  }

  // ========== 全局异常处理 ==========
  @RestControllerAdvice
  public class GlobalExceptionHandler {

      @ExceptionHandler(labException.class)
      public Result<Void> handlelabException(labException e) {
          log.warn("业务异常: {}", e.getMessage());
          return Result.fail(e.getCode(), e.getMessage());
      }

      @ExceptionHandler(Exception.class)
      public Result<Void> handleException(Exception e) {
          log.error("系统异常", e);
          return Result.fail("SYSTEM_ERROR", "系统异常,请联系管理员");
      }
  }

  // ========== 使用示例 ==========
  // ✅ 明确抛出业务异常
  if (user == null) {
      throw new labException("USER_NOT_FOUND", "用户不存在");
  }

  ---
  8. 外部服务调用规范

  // ========== Feign客户端定义 ==========
  @FeignClient(
      name = "feishu-api",
      url = "${feishu.api-url}",
      configuration = FeiShuFeignConfig.class
  )
  public interface FeiShuClient {

      @GetMapping("/open-apis/user/v4/info")
      FeiShuUserResponse getUserInfo(@RequestHeader("Authorization") String token);

      @PostMapping("/open-apis/contact/v3/users/batch_get")
      FeiShuUserBatchResponse batchGetUsers(@RequestBody FeiShuUserBatchRequest request);
  }

  // ========== 配置类 ==========
  @Configuration
  public class FeiShuFeignConfig {

      @Bean
      public RequestInterceptor authInterceptor(@Value("${feishu.app-id}") String appId,
                                                @Value("${feishu.app-secret}") String appSecret) {
          return template -> {
              String token = getAccessToken(appId, appSecret);
              template.header("Authorization", "Bearer " + token);
          };
      }

      @Bean
      public Logger.Level feignLoggerLevel() {
          return Logger.Level.BASIC;  // 生产环境使用BASIC或NONE
      }
  }

  // ✅ 调用时添加重试和降级
  @Retryable(value = {FeignException.class}, maxAttempts = 3)
  public FeiShuUser getUserFromFeiShu(String userId) {
      try {
          return feiShuClient.getUserInfo(userId);
      } catch (FeignException e) {
          log.error("调用飞书API失败", e);
          throw new labException("FEISHU_API_ERROR", "获取飞书用户信息失败");
      }
  }

  ---
  9. 数据库操作规范

  // ✅ 使用JdbcTemplate + RowMapper
  @Repository
  public class UserRepositoryImpl implements UserRepository {

      private final JdbcTemplate jdbcTemplate;

      private static final String SQL_BY_UUID =
          "SELECT uuid, name, org_uuid FROM d_user WHERE uuid = ?";

      @Override
      public DUser findByUuid(String uuid) {
          List<DUser> users = jdbcTemplate.query(
              SQL_BY_UUID,
              new UserRowMapper(),
              uuid
          );
          return users.isEmpty() ? null : users.get(0);
      }

      // ✅ RowMapper作为静态内部类
      private static class UserRowMapper implements RowMapper<DUser> {
          @Override
          public DUser mapRow(ResultSet rs, int rowNum) throws SQLException {
              DUser user = new DUser();
              user.setUuid(rs.getString("uuid"));
              user.setName(rs.getString("name"));
              user.setOrgUuid(rs.getString("org_uuid"));
              return user;
          }
      }
  }

  // ✅ 使用custom JDBC扩展(如果可用)
  @Autowired
  private CustomJdbcTemplate customJdbcTemplate;

  public List<DUser> findByOrg(String orgUuid) {
      return customJdbcTemplate.query(
          "SELECT * FROM d_user WHERE org_uuid = :orgUuid",
          Map.of("orgUuid", orgUuid),
          new UserRowMapper()
      );
  }

  ---
  10. 配置管理规范

  # ========== application.yml 结构 ==========
  spring:
    application:
      name: lab-service
    datasource:
      url: ${DB_URL:jdbc:oracle:thin:@localhost:1521:db}
      username: ${DB_USER:user}
      password: ${DB_PASSWORD:pwd}
      type: com.alibaba.druid.pool.DruidDataSource

  feishu:
    api-url: https://open.feishu.cn
    app-id: ${FEISHU_APP_ID}
    app-secret: ${FEISHU_APP_SECRET}
    encrypt-key: ${FEISHU_ENCRYPT_KEY}

  wecom:
    api-url: https://qyapi.weixin.qq.com
    corp-id: ${WECOM_CORP_ID}
    secret: ${WECOM_SECRET}

  # ========== 配置属性类 ==========
  @ConfigurationProperties(prefix = "feishu")
  @Validated
  @Getter
  @Setter
  public class FeiShuProperties {

      @NotBlank
      private String apiUrl;

      @NotBlank
      private String appId;

      @NotBlank
      private String appSecret;

      private String encryptKey;
  }

  ---
  11. 日志规范

  // ========== 使用Slf4j ==========
  @Slf4j
  @Service
  public class UserServiceImpl {

      // ✅ 记录关键业务流程
      public LoginResult login(String code) {
          log.info("用户登录开始, code={}", code);

          try {
              FeiShuUser fsUser = feiShuClient.getUserInfo(code);
              log.info("获取飞书用户成功, uuid={}", fsUser.getUserId());

              // ... 业务逻辑

              log.info("用户登录成功, uuid={}", user.getUuid());
              return result;

          } catch (Exception e) {
              log.error("用户登录失败, code={}, error={}", code, e.getMessage(), e);
              throw new labException("LOGIN_FAILED", "登录失败");
          }
      }
  }

  // ========== 日志级别规范 ==========
  // ERROR: 系统错误、需要立即关注的异常
  // WARN:  业务异常、重试操作
  // INFO:  关键业务流程(登录、同步等)
  // DEBUG: 开发调试信息(生产环境关闭)

  ---
  12. 事务管理规范

  @Service
  @Transactional  // ✅ 类级别默认只读事务
  public class DepartmentServiceImpl implements DepartmentService {

      // ✅ 只读操作
      @Transactional(readOnly = true)
      public Department findByUuid(String uuid) {
          return departmentRepository.findByUuid(uuid);
      }

      // ✅ 写操作明确指定
      @Transactional(readOnly = false, rollbackFor = Exception.class)
      public void syncDepartment(FeiShuDepartment fsDept) {
          Department dept = convertToDepartment(fsDept);
          departmentRepository.save(dept);

          // 同步子部门
          fsDept.getChildren().forEach(this::syncDepartment);
      }

      // ✅ 避免长事务,大数据量分批处理
      @Transactional
      public void syncAllDepartments() {
          int pageSize = 100;
          int page = 0;
          List<FeiShuDepartment> batch;

          do {
              batch = feiShuClient.fetchDepartments(page, pageSize);
              batch.forEach(this::syncDepartment);
              page++;
          } while (!batch.isEmpty());
      }
  }

  ---
  13. 代码注释规范

  /**
   * 用户服务实现
   *
   * <p>主要职责:</p>
   * <ul>
   *   <li>用户登录认证(飞书/企业微信)</li>
   *   <li>用户信息同步</li>
   *   <li>平台账号管理</li>
   * </ul>
   *
   * @author zhangsan
   * @since 1.0
   */
  @Slf4j
  @Service
  public class UserServiceImpl implements UserService {

      /**
       * 用户登录
       *
       * @param code 第三方平台授权码
       * @return 登录结果(包含令牌和用户信息)
       * @throws labException 当认证失败或用户不存在时抛出
       */
      @Override
      public LoginResult login(String code) {
          // 实现代码...
      }
  }

  // ✅ 单行注释说明复杂逻辑
  // 检查用户状态:已禁用的用户不允许登录
  if (user.getStatus() == UserStatus.DISABLED) {
      throw new labException("USER_DISABLED", "用户已被禁用");
  }

  ---
  11. SOLID原则实践

  // ========== S: 单一职责 ==========
  // ✅ 每个Service只负责一个领域
  @Service
  public class UserService { }      // 用户管理
  @Service
  public class DepartmentService { } // 部门管理
  @Service
  public class StoreService { }      // 门店管理

  // ❌ 避免大而全的服务
  // @Service
  // public class ManagementService { } // 包含所有管理逻辑

  // ========== O: 开闭原则 ==========
  // ✅ 使用接口 + 策略模式扩展
  public interface PlatformClient {
      PlatformUser getUserInfo(String code);
  }

  @Component("feishu")
  public class FeiShuClient implements PlatformClient { }

  @Component("wecom")
  public class WeComClient implements PlatformClient { }

  // ========== D: 依赖倒置 ==========
  // ✅ 依赖抽象而非具体实现
  @Service
  public class UserServiceImpl {

      private final UserRepository userRepository;  // 接口

      @Autowired
      public UserServiceImpl(UserRepository userRepository) {
          this.userRepository = userRepository;
      }
  }

  ---
  🎯 关键开发原则

  | 原则       | 实践要点                              |
  |------------|---------------------------------------|
  | KISS       | 每个方法不超过50行,职责单一          |
  | DRY        | 重复代码提取到 commons 工具类         |
  | YAGNI      | 不预留"未来可能用到"的接口和字段      |
  | 防御式编程 | 所有外部输入(参数、API响应)必须校验 |

  ---
  📝 检查清单

  在提交代码前,确保:

  - 所有公共方法都有Javadoc注释
  - 异常处理不吞没错误,记录日志
  - 外部服务调用有超时和重试机制
  - 数据库操作使用PreparedStatement防止SQL注入
  - 敏感信息通过配置中心注入,不硬编码
  - 事务边界清晰,长事务拆分
  - 日志级别正确,生产环境不输出DEBUG日志
  - 单元测试覆盖核心业务逻辑

4 前端

技术栈:Vu3+TypeScript+Vite工程 提示词:输出工程 frontend 用到的技术栈/代码结构,并提供编程规范

4.1 评价标准

维度 5分标准 3分标准 1分标准
技术栈识别 准确识别全部核心技术栈及开发工具链 识别主要技术栈,遗漏部分工具 技术栈识别不全或有错误
代码结构理解 详细描述目录结构,体现架构设计思想 基本描述结构,缺乏深度分析 结构描述模糊或错误
编程规范完整性 覆盖命名、格式、组件、API等完整规范 涵盖基本规范,细节不完整 规范描述零散不系统
输出可读性 层次分明,逻辑清晰,便于理解实施 结构基本清晰,部分内容冗长 组织混乱,难以阅读
实用性 提供具体配置示例和最佳实践 有代码示例但缺乏配置细节 缺乏可操作内容

4.2 评测结果

二者均表现优秀,MiniMax-M2.1在输出结构清晰度上略优,GLM-4.7在内容深度和原则阐述上更全面。

4.2.1 MiniMax-M2.1

得分:25

维度 评分 评价理由
技术栈识别 5 完整列出核心与辅助技术栈,版本清晰
代码结构理解 5 详细描述目录结构、模块划分、组件组织
编程规范完整性 5 覆盖命名、格式、组件、API、路由、状态管理等完整规范
输出可读性 5 结构清晰,层次分明,便于理解与实施
实用性 5 提供具体配置、代码示例、模块模板、常用命令

4.2.2 GLM-4.7

得分:24

维度 评分 评价理由
技术栈识别 5 技术栈识别完整,分类清晰,版本齐全
代码结构理解 5 详细描述模块化结构、分层架构、路径别名等
编程规范完整性 5 覆盖命名、样式、TypeScript、Vue组件、API、状态管理等完整规范
输出可读性 4 结构清晰,但部分内容略显冗长
实用性 5 提供完整配置示例、最佳实践、开发原则和命令速查

4.3 模型输出结果

4.3.1 MiniMax-M2.1

python 复制代码
 Frontend 技术栈、代码结构与编程规范

  一、技术栈

  | 分类        | 技术              | 版本    |
  |-------------|-------------------|---------|
  | 构建工具    | Vite              | ^7.1.2  |
  | 框架        | Vue 3             | ^3.5.18 |
  | 语言        | TypeScript        | ~5.8.3  |
  | 状态管理    | Pinia             | ^3.0.3  |
  | 路由        | Vue Router        | ^4.5.1  |
  | UI 组件库   | Element Plus      | ^2.11.1 |
  | 图表        | ECharts           | ^6.0.0  |
  | HTTP 客户端 | Axios             | ^1.11.0 |
  | 样式        | Tailwind CSS      | ^4.1.13 |
  | 表单验证    | Zod               | ^4.1.1  |
  | 代码检查    | ESLint + Prettier | -       |

  ---
  二、代码结构

  frontend/
  ├── src/
  │   ├── main.ts                    # 应用入口
  │   ├── App.vue                    # 根组件
  │   ├── router/                    # 路由配置
  │   │   └── index.ts
  │   ├── components/                # 公共组件
  │   │   ├── DataTable.vue          # 通用数据表格(支持分页、移动端卡片视图)
  │   │   ├── ActionButton.vue       # 操作按钮
  │   │   ├── ActionButtonGroup.vue  # 按钮组
  │   │   ├── SearchForm.vue         # 搜索表单
  │   │   ├── DynamicFormDialog.vue  # 动态表单弹窗
  │   │   ├── BatchOperationDialog.vue # 批量操作弹窗
  │   │   ├── Sidebar.vue            # 侧边栏
  │   │   ├── AppHeader.vue          # 顶部栏
  │   │   ├── AppLayout.vue          # 布局容器
  │   │   ├── MobileBottomNav.vue    # 移动端底部导航
  │   │   ├── StatCard.vue           # 统计卡片
  │   │   ├── PageHeader.vue         # 页面头部
  │   │   └── index.ts               # 组件导出
  │   ├── composables/               # 组合式函数
  │   │   └── useResponsive.ts       # 响应式判断(移动端/桌面端)
  │   ├── utils/                     # 工具函数
  │   │   ├── api.util.ts            # API 封装
  │   │   ├── date.util.ts           # 日期处理
  │   │   ├── course.util.ts         # 课程相关
  │   │   └── mobile.ts              # 移动端工具
  │   ├── model/                     # 公共模型
  │   │   ├── api-response.model.ts  # API 响应结构
  │   │   ├── api-query-filter.model.ts # 查询参数
  │   │   ├── api-query-result.model.ts # 分页结果
  │   │   └── api-id-name.model.ts   # ID-名称映射
  │   ├── modules/                   # 业务模块(按角色/功能划分)
  │   │   ├── admin/                 # 管理员模块
  │   │   │   ├── api/               # API 接口
  │   │   │   ├── model/             # 数据模型
  │   │   │   ├── views/             # 页面组件
  │   │   │   │   ├── AdminLayout.vue
  │   │   │   │   ├── Dashboard.vue
  │   │   │   │   ├── SystemSettings.vue
  │   │   │   │   └── ...
  │   │   │   └── [业务模块]/
  │   │   │       ├── api/
  │   │   │       ├── model/
  │   │   │       └── views/
  │   │   ├── teacher/               # 教师模块
  │   │   │   └── ...
  │   │   ├── student/               # 学生模块
  │   │   │   └── ...
  │   │   └── system/                # 系统模块
  │   │       ├── api/
  │   │       ├── model/
  │   │       ├── store/             # Pinia Store
  │   │       │   └── auth.ts        # 认证状态
  │   │       └── views/
  │   │           ├── Login.vue
  │   │           ├── Profile.vue
  │   │           ├── 403.vue
  │   │           └── 404.vue
  │   └── styles/                    # 全局样式
  │       └── index.css              # Tailwind CSS 入口
  ├── index.html
  ├── vite.config.ts                 # Vite 配置
  ├── tsconfig.json                  # TypeScript 配置
  ├── .prettierrc                    # Prettier 配置
  ├── eslint.config.ts               # ESLint 配置
  └── package.json

  模块结构规范

  modules/[角色]/              # 如 admin、teacher、student
  ├── api/                     # API 接口(API 类封装)
  │   └── [业务].api.ts
  ├── model/                   # 数据模型
  │   ├── [业务].model.ts      # 实体模型
  │   ├── [业务]-create.model.ts  # 创建参数
  │   ├── [业务]-update.model.ts  # 更新参数
  │   └── [业务].queryfilter.model.ts # 查询筛选参数
  └── views/                   # 页面组件
      ├── [角色]Layout.vue     # 布局组件
      ├── [角色]Dashboard.vue  # 首页
      └── [业务]/
          └── [业务]Management.vue

  ---
  三、编程规范

  3.1 代码风格

  | 配置项 | 值                     |
  |--------|------------------------|
  | 引号   | 单引号 '               |
  | 缩进   | 2 空格                 |
  | 行宽   | 80 字符                |
  | 分号   | 使用 ;                 |
  | 尾逗号 | all (包括对象、数组等) |

  3.2 ESLint 规则

  // eslint.config.ts 关键规则
  {
    rules: {
      '@typescript-eslint/no-explicit-any': 'off',  // 允许 any(用于泛型场景)
      '@typescript-eslint/no-floating-promises': 'warn',
      '@typescript-eslint/no-unsafe-argument': 'warn',
      '@typescript-eslint/no-unsafe-member-access': 'warn',
      '@typescript-eslint/no-unsafe-assignment': 'warn',
      'prettier/prettier': ['error', {
        endOfLine: 'auto',
        trailingComma: 'all'
      }],
    },
  }

  3.3 TypeScript 配置

  {
    "compilerOptions": {
      "strict": true,              // 严格模式
      "noUnusedLocals": false,     // 允许未使用的局部变量
      "noUnusedParameters": false, // 允许未使用的参数
      "noFallthroughCasesInSwitch": true,
      "forceConsistentCasingInFileNames": true
    }
  }

  3.4 Vue 组件规范

  组件命名:
  - 使用 PascalCase 命名(如 DataTable.vue、UserManagement.vue)

  Script Setup 语法:
  <script setup lang="ts">
  // 导入顺序:Vue API → 公共组件 → 公共工具 → 业务模块
  import { ref, computed, watch } from 'vue';
  import DataTable from '@/components/DataTable.vue';
  import { ApiUtil } from '@/utils/api.util';
  import type { UserModel } from '../model/user.model';

  // Props 定义
  interface Props {
    title?: string;
    data?: UserModel[];
  }

  const props = withDefaults(defineProps<Props>(), {
    title: '',
    data: () => [],
  });

  // Emits 定义
  const emit = defineEmits<{
    'update': [data: UserModel];
    'delete': [id: number];
  }>();

  // 组件暴露方法
  defineExpose({
    refresh,
    resetAndRefresh,
  });
  </script>

  3.5 API 层规范

  // src/modules/admin/api/admin.api.ts

  import { ApiUtil } from '@/utils/api.util';
  import type { ApiResponse } from '@/model/api-response.model';
  import type { AdminDashboardStatsModel } from '../model/admin-dashboard-stats.model';

  /**
   * 管理员端API接口
   */
  export class AdminApi {
    /**
     * 获取管理员端首页统计数据
     * @returns 统计数据
     */
    static async getDashboardStats(): Promise<
      ApiResponse<AdminDashboardStatsModel>
    > {
      return ApiUtil.post<AdminDashboardStatsModel>('/admin/dashboard/stats');
    }
  }

  规范要点:
  - 使用静态类方法(Static Class Pattern)
  - 每个业务模块一个 API 类
  - 方法添加 JSDoc 注释
  - 返回 ApiResponse<T> 类型

  3.6 模型定义规范

  // src/modules/admin/model/user.model.ts

  /**
   * 用户实体模型
   */
  export interface UserModel {
    /** 用户ID */
    id: number;
    /** 用户名 */
    username: string;
    /** 真实姓名 */
    realName: string;
    /** 邮箱 */
    email: string;
    /** 用户类型: admin=管理员, teacher=教师, student=学生 */
    userType: 'admin' | 'teacher' | 'student';
    /** 创建时间 */
    createdAt: string;
    /** 更新时间 */
    updatedAt: string;
  }

  /**
   * 用户查询筛选参数
   */
  export interface UserQueryFilterModel {
    /** 搜索关键词(匹配用户名、姓名) */
    keyword?: string;
    /** 用户类型筛选 */
    userType?: 'admin' | 'teacher' | 'student';
    /** 页码(从1开始) */
    page?: number;
    /** 每页数量 */
    pageSize?: number;
  }

  3.7 路由规范

  // src/router/index.ts

  const routes: RouteRecordRaw[] = [
    {
      path: '/admin',
      name: 'AdminLayout',
      component: () => import('../modules/admin/views/AdminLayout.vue'),
      meta: {
        requiresAuth: true,
        roles: ['admin'],
        title: '管理员工作台',
      },
      children: [
        {
          path: 'dashboard',
          name: 'AdminDashboard',
          component: () => import('../modules/admin/views/Dashboard.vue'),
          meta: {
            title: '工作台',
          },
        },
        // ...
      ],
    },
  ];

  规范要点:
  - 使用路由懒加载
  - meta.requiresAuth: 是否需要认证
  - meta.roles: 角色权限控制
  - meta.title: 页面标题

  3.8 导入路径别名

  // vite.config.ts 配置
  resolve: {
    alias: {
      '@': resolve(__dirname, 'src'),
    },
  }

  // 使用示例
  import { ApiUtil } from '@/utils/api.util';
  import UserModel from '@/modules/admin/model/user.model';

  ---
  四、常用命令

  | 命令            | 说明                         |
  |-----------------|------------------------------|
  | npm run dev     | 启动开发服务器               |
  | npm run build   | 构建生产版本(包含类型检查) |
  | npm run preview | 预览生产构建                 |

  ---
  五、核心特性

  1. 响应式适配:useResponsive composable 自动检测移动端/桌面端,组件自动适配
  2. API 统一封装:ApiUtil 封装 axios,统一处理请求/响应
  3. 数据表格:通用 DataTable 组件支持分页、批量操作、移动端卡片视图
  4. 状态持久化:Pinia + pinia-plugin-persistedstate 持久化存储认证状态
  5. Element Plus 自动导入:通过 unplugin-vue-components 自动按需加载组件

4.3.2 GLM-4.7

ini 复制代码
📋 Frontend 工程技术栈与编程规范

  一、技术栈概览

  1.1 核心框架

  | 技术       | 版本   | 用途                                         |
  |------------|--------|----------------------------------------------|
  | Vue 3      | 3.5.18 | 渐进式 JavaScript 框架,使用 Composition API |
  | TypeScript | 5.8.3  | 类型安全,开启严格模式                       |
  | Vite       | 7.1.2  | 新一代前端构建工具                           |

  1.2 路由与状态管理

  | 技术                        | 版本  | 用途                        |
  |-----------------------------|-------|-----------------------------|
  | Vue Router                  | 4.5.1 | 官方路由管理器(Hash 模式) |
  | Pinia                       | 3.0.3 | 官方状态管理库              |
  | pinia-plugin-persistedstate | 4.5.0 | 状态持久化                  |

  1.3 UI 框架

  | 技术                    | 版本   | 用途                     |
  |-------------------------|--------|--------------------------|
  | Element Plus            | 2.11.1 | Vue 3 组件库(自动导入) |
  | @element-plus/icons-vue | 2.3.2  | 图标库                   |
  | Tailwind CSS            | 4.1.13 | 原子化 CSS 框架          |
  | ECharts                 | 6.0.0  | 数据可视化图表库         |

  1.4 HTTP 客户端

  | 技术  | 版本   | 用途                                   |
  |-------|--------|----------------------------------------|
  | Axios | 1.11.0 | HTTP 请求库,封装了拦截器和 Token 刷新 |

  1.5 工具库

  | 技术      | 版本    | 用途                      |
  |-----------|---------|---------------------------|
  | lodash-es | 4.17.21 | JavaScript 工具库         |
  | zod       | 4.1.1   | TypeScript 优先的模式验证 |
  | js-base64 | 3.7.8   | Base64 编解码             |

  1.6 代码质量工具

  | 工具              | 版本   | 配置                           |
  |-------------------|--------|--------------------------------|
  | ESLint            | 9.34.0 | 扁平配置,支持 Vue/TS/JSON/CSS |
  | Prettier          | 3.6.2  | 代码格式化                     |
  | typescript-eslint | 8.40.0 | TypeScript ESLint 支持         |

  1.7 开发增强

  | 插件                    | 版本   | 作用                          |
  |-------------------------|--------|-------------------------------|
  | unplugin-auto-import    | 20.0.0 | 自动导入 Vue/Router/Pinia API |
  | unplugin-vue-components | 29.0.0 | 自动导入组件                  |

  ---
  二、代码结构

  2.1 目录树

  frontend/
  ├── src/
  │   ├── components/          # 公共组件
  │   ├── composables/         # 组合式函数
  │   ├── model/               # 全局数据模型
  │   ├── modules/             # 业务模块(按角色划分)
  │   │   ├── admin/          # 管理员模块
  │   │   ├── student/        # 学生模块
  │   │   ├── teacher/        # 教师模块
  │   │   └── system/         # 系统模块(认证、个人资料等)
  │   ├── router/             # 路由配置
  │   ├── styles/             # 全局样式
  │   ├── utils/              # 工具函数
  │   ├── assets/             # 静态资源
  │   ├── App.vue             # 根组件
  │   └── main.ts             # 入口文件
  ├── public/                 # 公共静态文件
  └── 配置文件

  2.2 模块化结构规范

  每个业务模块遵循以下结构:

  modules/{module-name}/
  ├── api/              # API 请求层
  ├── model/            # 数据模型/类型定义
  ├── views/            # 页面组件
  ├── components/       # 模块专属组件(可选)
  └── store/            # Pinia 状态管理(可选)

  示例:
  modules/admin/course/
  ├── api/
  │   └── course.api.ts
  ├── model/
  │   ├── course.model.ts
  │   ├── course-create.model.ts
  │   ├── course-update.model.ts
  │   └── course.queryfilter.model.ts
  └── views/
      └── CourseListView.vue

  2.3 分层架构

  Views (页面层)
      ↓
  Components (组件层)
      ↓
  API (接口层)
      ↓
  Axios (HTTP 层)
      ↓
  Backend

  ---
  三、配置规范

  3.1 TypeScript 配置

  {
    "compilerOptions": {
      "strict": true,
      "noUnusedLocals": false,
      "noUnusedParameters": false,
      "noFallthroughCasesInSwitch": true,
      "forceConsistentCasingInFileNames": true,
      "baseUrl": ".",
      "paths": {
        "@/*": ["src/*"]
      }
    }
  }

  3.2 Prettier 配置

  {
    "singleQuote": true,       // 使用单引号
    "tabWidth": 2,             // 缩进 2 空格
    "printWidth": 80,          // 每行最大 80 字符
    "semi": true,              // 语句末尾加分号
    "trailingComma": "all"     // 尾随逗号
  }

  3.3 ESLint 规则

  {
    rules: {
      '@typescript-eslint/no-explicit-any': 'off',
      '@typescript-eslint/no-floating-promises': 'warn',
      '@typescript-eslint/no-unsafe-argument': 'warn',
      '@typescript-eslint/no-unsafe-member-access': 'warn',
      '@typescript-eslint/no-unsafe-assignment': 'warn',
    }
  }

  3.4 路径别名

  - @/* 映射到 src/*
  - 示例:import { foo } from '@/utils/api.util'

  3.5 构建配置

  {
    base: '/course/',  // 部署子路径
    plugins: [
      vue(),
      tailwindcss(),
      AutoImport({ resolvers: [ElementPlusResolver()] }),
      Components({ resolvers: [ElementPlusResolver()] })
    ]
  }

  ---
  四、编程规范

  4.1 文件命名规范

  | 类型            | 规范              | 示例             |
  |-----------------|-------------------|------------------|
  | Vue 组件        | PascalCase + .vue | UserList.vue     |
  | TypeScript 文件 | camelCase + .ts   | api.util.ts      |
  | 模型文件        | {name}.model.ts   | course.model.ts  |
  | API 文件        | {name}.api.ts     | course.api.ts    |
  | 组合式函数      | use{Purpose}.ts   | useResponsive.ts |

  4.2 代码风格

  缩进与空格

  - 使用 2 空格缩进(不使用 Tab)
  - 运算符前后加空格:a + b
  - 逗号后加空格:fn(a, b, c)

  引号

  - 优先使用单引号:const name = 'John'
  - JSON 或包含单引号的字符串使用双引号

  分号

  - 语句末尾必须加分号

  ####尾随逗号
  - 对象/数组/函数参数添加尾随逗号:
  const obj = {
    a: 1,
    b: 2,
  };

  行宽

  - 每行最多 80 字符

  4.3 TypeScript 规范

  类型定义

  // ✅ 使用 interface 定义对象类型
  export interface ApiResponse<T = any> {
    success: boolean;
    data?: T;
    message?: string;
    code?: string;
  }

  // ✅ 使用 type 定义联合类型或工具类型
  export type UserRole = 'admin' | 'teacher' | 'student';

  // ✅ 泛型约束
  export function query<T>(params: QueryFilter): Promise<ApiResponse<T>> {
    return ApiUtil.post('/query', params);
  }

  避免 any

  // ❌ 避免使用 any
  function processData(data: any) { }

  // ✅ 使用 unknown 或具体类型
  function processData(data: unknown) {
    if (typeof data === 'string') { }
  }

  类型导入

  // ✅ 使用 type 关键字导入类型
  import type { ApiResponse } from '@/model/api-response.model';
  import { ApiUtil } from '@/utils/api.util';

  4.4 Vue 3 组件规范

  使用 <script setup>

  <script setup lang="ts">
  import { ref, computed } from 'vue';

  // 响应式状态
  const count = ref(0);
  const doubled = computed(() => count.value * 2);

  // 方法
  function increment() {
    count.value++;
  }
  </script>

  <template>
    <div>{{ count }} × 2 = {{ doubled }}</div>
  </template>

  Props 定义

  <script setup lang="ts">
  interface Props {
    title: string;
    count?: number;
  }

  // 使用 withDefaults 设置默认值
  const props = withDefaults(defineProps<Props>(), {
    count: 0,
  });
  </script>

  Emits 定义

  <script setup lang="ts">
  const emit = defineEmits<{
    update: [value: string];
    delete: [id: string];
  }>();
  </script>

  4.5 API 调用规范

  API 模块组织

  // src/modules/{module}/api/{name}.api.ts
  import { ApiUtil } from '@/utils/api.util';
  import type { ApiResponse } from '@/model/api-response.model';
  import type { CourseModel } from '../model/course.model';

  export const courseApi = {
    /**
     * 查询课程列表
     */
    query: (params?: CourseQueryFilterModel): Promise<ApiResponse<ApiQueryResult<CourseModel>>> => {
      return ApiUtil.post('/course/query', params);
    },

    /**
     * 根据ID获取课程详情
     */
    getById: (id: string): Promise<ApiResponse<CourseModel>> => {
      return ApiUtil.post('/course/getById', { id });
    },

    /**
     * 创建课程
     */
    create: (data: CourseCreateModel): Promise<ApiResponse<CourseModel>> => {
      return ApiUtil.post('/course/create', data);
    },

    /**
     * 更新课程
     */
    update: (data: Partial<CourseUpdateModel>): Promise<ApiResponse<CourseModel>> => {
      return ApiUtil.post('/course/update', data);
    },

    /**
     * 删除课程
     */
    delete: (data: { id: string }): Promise<ApiResponse<void>> => {
      return ApiUtil.post('/course/delete', data);
    },
  };

  统一响应格式

  export interface ApiResponse<T = any> {
    success: boolean;
    data?: T;
    message?: string;
    code?: string;
  }

  4.6 路由规范

  路由结构

  /admin/*     → 管理员模块
  /teacher/*   → 教师模块
  /student/*   → 学生模块
  /login       → 登录页

  路由守卫

  - 认证检查:未登录跳转登录页
  - 角色验证:根据用户角色限制访问
  - 自动重定向:登录后跳转到原目标页面

  4.7 状态管理规范

  Pinia Store 结构

  // src/modules/system/store/auth.ts
  import { defineStore } from 'pinia';
  import { ref, computed } from 'vue';

  export const useAuthStore = defineStore('auth', () => {
    // State
    const accessToken = ref<string | null>(null);
    const refreshToken = ref<string | null>(null);
    const user = ref<UserModel | null>(null);

    // Getters
    const isAuthenticated = computed(() => !!accessToken.value);
    const isAdmin = computed(() => user.value?.role === 'admin');

    // Actions
    async function login(credentials: LoginModel) { }
    async function logout() { }
    async function checkAuth() { }

    return {
      accessToken,
      refreshToken,
      user,
      isAuthenticated,
      isAdmin,
      login,
      logout,
      checkAuth,
    };
  }, {
    persist: true,  // 持久化配置
  });

  4.8 注释规范

  JSDoc 注释

  /**
   * 查询课程列表
   * @param params - 查询过滤条件
   * @returns 课程列表响应
   */
  query: (params?: CourseQueryFilterModel): Promise<ApiResponse<ApiQueryResult<CourseModel>>> => {
    return ApiUtil.post('/course/query', params);
  }

  组件注释

  /**
   * 通用数据表格组件
   * 支持桌面端和移动端双视图
   *
   * @example
   * <DataTable :data="courses" :columns="columns" />
   */

  4.9 组件命名规范

  公共组件

  - 位置:src/components/
  - 命名:PascalCase
  - 示例:DataTable.vue, SearchForm.vue

  业务模块组件

  - 位置:src/modules/{module}/components/
  - 命名:PascalCase + 模块前缀(可选)
  - 示例:AdminUserForm.vue, StudentCourseCard.vue

  4.10 样式规范

  优先级

  1. Tailwind CSS 工具类(原子化)
  2. Element Plus 组件样式
  3. 全局样式 (src/styles/)
  4. 组件 scoped 样式

  样式写法

  <template>
    <div class="p-4 bg-white rounded-lg shadow">内容</div>
  </template>

  <style scoped>
  /* 组件特定样式 */
  .custom-style {
    /* ... */
  }
  </style>

  ---
  五、最佳实践

  5.1 SOLID 原则应用

  S - 单一职责

  - 每个组件/函数只做一件事
  - API 层只负责请求,不处理业务逻辑

  O - 开闭原则

  - 使用 Props 和 Slots 扩展组件功能
  - 避免直接修改第三方库

  L - 里氏替换

  - 子组件可替换父组件使用

  I - 接口隔离

  - Props 接口专一,避免冗余属性

  D - 依赖倒置

  - 依赖抽象(接口)而非具体实现

  5.2 DRY(杜绝重复)

  // ❌ 重复代码
  function getCourses() { return ApiUtil.post('/course/query'); }
  function getStudents() { return ApiUtil.post('/student/query'); }

  // ✅ 抽象通用逻辑
  function createQueryApi(endpoint: string) {
    return (params?: any) => ApiUtil.post(`/${endpoint}/query`, params);
  }

  5.3 KISS(简单至上)

  // ❌ 过度复杂
  const result = data.reduce((acc, item) => {
    return item.active ? [...acc, item] : acc;
  }, []);

  // ✅ 简单直观
  const result = data.filter(item => item.active);

  5.4 YAGNI(精益求精)

  - 只实现当前需要的功能
  - 不要为未来预留
  - 删除未使用的代码和依赖

  ---
  六、命令速查

  # 安装依赖
  npm install

  # 启动开发服务器
  npm run dev

  # 类型检查
  npm run type-check

  # 代码检查
  npm run lint

  # 格式化代码
  npm run format

  # 构建生产版本
  npm run build

  ---
  七、关键特性总结

  | 特性           | 说明                              |
  |----------------|-----------------------------------|
  | 模块化架构     | 按角色和业务模块清晰划分          |
  | 严格类型系统   | TypeScript strict 模式            |
  | 自动导入       | 组件和 API 自动导入,无需手动引入 |
  | 移动端适配     | 响应式设计 + 触摸手势支持         |
  | 统一 API 规范  | 标准化的 CRUD 操作                |
  | 多角色权限     | Admin/Teacher/Student 三级路由    |
  | Token 自动刷新 | 无感刷新认证机制                  |
  | 代码质量保证   | ESLint + Prettier 自动检查        |

  ---
  以上规范基于现有代码库分析总结,遵循了 SOLID、KISS、DRY、YAGNI 原则,适合企业级团队协作开发。
相关推荐
神秘的猪头2 小时前
彻底搞懂 React 组件通信:从 TodoList 实战出发,解锁 React 开发的“核心姿势” 🚀
前端·react.js·架构
leafff1232 小时前
一文了解:Multi-Agent多智能体核心架构的协调与调度模块是如何工作的?
架构
后端小张2 小时前
【AI 学习】LangChain框架深度解析:从核心组件到企业级应用实战
java·人工智能·学习·langchain·tensorflow·gpt-3·ai编程
代码笔耕2 小时前
我们这样设计消息中心,解决了业务反复折腾的顽疾
java·后端·架构
前端程序猿之路3 小时前
AI大模型应用开发之Prompt 工程
人工智能·python·深度学习·机器学习·prompt·ai编程·提示词
没有bug.的程序员3 小时前
负载均衡的真正含义:从算法到架构的深度解析
java·jvm·算法·微服务·架构·负载均衡
LambdaCat3 小时前
如何用 Prompt 让 AI 主动发现设计问题
java·ai·ai编程
飞哥数智坊3 小时前
GLM-4.7 上手初测:前端审美确实能打,值得一试
人工智能·ai编程·chatglm (智谱)
物流可信数据空间3 小时前
可信数据空间与区块链技术的结合点有哪些?
分布式·架构·区块链