# 学业邑规划 - 开发规范
本文档定义了 MiAssessment 项目的开发规范和编码标准,所有开发工作必须遵循这些规范。
## 项目概述
学业邑规划是一个基于多元智能理论的学业规划测评系统,包含微信小程序和后台管理系统。
### 相关文档
- 需求文档: `docs/需求文档.md`
- 数据库设计: `docs/数据库设计文档.md`
- 开发文档: `docs/开发文档.md`
- 题库资料: `docs/题库和结论/`
- UI 设计图: `docs/设计图/`
- UI 切图: `docs/切图/`
## 一、技术栈
| 层级 | 技术 |
|------|------|
| 后端框架 | .NET 10 Web API (C#) |
| 数据库 | SQL Server 2022 |
| ORM | Entity Framework Core |
| 缓存 | Redis |
| 接口风格 | RPC 风格(仅 GET / POST 请求) |
| 小程序前端 | UniApp + Vue 3 |
| 后台管理前端 | Vue 3 + TypeScript + Vite |
## 二、项目结构
### 整体结构
```
mi-assessment/
├── docs/ # 文档资料
│ ├── 需求文档.md
│ ├── 数据库设计文档.md
│ ├── 开发文档.md
│ ├── 开发规范/ # 详细编码规范
│ ├── 设计图/ # UI 设计图
│ ├── 切图/ # UI 切图资源
│ └── 题库和结论/ # 测评题库与报告模板
├── server/MiAssessment/ # 后端服务
└── uniapp/ # 小程序前端
```
### 后端项目结构
```
server/MiAssessment/src/
├── MiAssessment.Api/ # 小程序 API 接口
├── MiAssessment.Admin/ # 后台管理系统基础模块
│ └── admin-web/ # 后台管理前端 (Vue 3)
├── MiAssessment.Admin.Business/ # 后台业务模块(主要开发区域)
├── MiAssessment.Core/ # 核心业务逻辑
├── MiAssessment.Infrastructure/ # 基础设施
└── MiAssessment.Model/ # 数据模型
```
### Admin.Business 项目结构
```
MiAssessment.Admin.Business/
├── Controllers/ # 控制器(API 入口)
├── Services/ # 业务服务
│ └── Interfaces/ # 服务接口
├── Models/ # 请求/响应模型(DTO)
│ ├── Common/ # 通用模型
│ └── {Module}/ # 各模块模型
├── Entities/ # 数据库实体类
├── Data/ # 数据库上下文
└── Attributes/ # 自定义特性
```
## 三、命名规范
### 3.1 数据库命名
| 类型 | 规范 | 示例 |
|------|------|------|
| 表名 | snake_case(小写下划线) | `users`, `assessment_records` |
| 字段名 | PascalCase | `UserId`, `CreateTime` |
| 主键 | `Id` (bigint 自增) | `Id` |
| 外键 | `{表名}Id` | `UserId`, `OrderId` |
| 时间字段 | `CreateTime`, `UpdateTime` | - |
| 状态字段 | `Status` | - |
| 软删除 | `IsDeleted` (bit) | - |
### 3.2 C# 代码命名
| 类型 | 规范 | 示例 |
|------|------|------|
| 命名空间 | PascalCase | `MiAssessment.Admin.Business.Services` |
| 类名 | PascalCase | `UserService`, `OrderController` |
| 接口 | I + PascalCase | `IUserService`, `IOrderService` |
| 方法 | PascalCase + Async 后缀 | `GetUserListAsync`, `CreateOrderAsync` |
| 属性 | PascalCase | `UserId`, `CreateTime` |
| 私有字段 | _camelCase | `_userService`, `_dbContext` |
| 参数 | camelCase | `userId`, `request` |
| 常量 | PascalCase | `MaxPageSize`, `DefaultStatus` |
### 3.3 文件命名
| 类型 | 规范 | 示例 |
|------|------|------|
| 实体类 | 单数形式 | `User.cs`, `Order.cs` |
| 服务接口 | I + 服务名 | `IUserService.cs` |
| 服务实现 | 服务名 | `UserService.cs` |
| 控制器 | 模块名 + Controller | `UserController.cs` |
| DTO 模型 | 功能 + Request/Dto | `CreateUserRequest.cs`, `UserDto.cs` |
### 3.4 前端命名 (Vue/JavaScript)
| 类型 | 规范 | 示例 |
|------|------|------|
| 组件文件 | PascalCase | `UserList.vue`, `OrderDetail.vue` |
| 组合式函数 | use + camelCase | `useUserList.js`, `useAuth.js` |
| 工具函数 | camelCase | `formatDate.js`, `request.js` |
| 变量/函数 | camelCase | `userList`, `handleSubmit` |
| 常量 | UPPER_SNAKE_CASE | `API_BASE_URL`, `MAX_PAGE_SIZE` |
| CSS 类名 | kebab-case | `user-list`, `order-card` |
## 四、代码规范
### 4.1 实体类规范
```csharp
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MiAssessment.Admin.Business.Entities;
///
/// 用户表
///
[Table("users")]
public class User
{
///
/// 主键ID
///
[Key]
public long Id { get; set; }
///
/// 用户UID
///
[Required]
[MaxLength(6)]
public string Uid { get; set; } = null!;
///
/// 创建时间
///
public DateTime CreateTime { get; set; }
///
/// 更新时间
///
public DateTime UpdateTime { get; set; }
///
/// 软删除标记
///
public bool IsDeleted { get; set; }
}
```
**要点**:
- 使用 `[Table("表名")]` 指定数据库表名
- 使用 `[Key]` 标记主键
- 使用 `[Required]` 标记必填字段
- 使用 `[MaxLength(n)]` 限制字符串长度
- 所有属性必须有 XML 注释
- 字符串属性使用 `= null!` 初始化
### 4.2 服务接口规范
```csharp
namespace MiAssessment.Admin.Business.Services.Interfaces;
///
/// 用户服务接口
///
public interface IUserService
{
///
/// 获取用户列表
///
Task> GetUserListAsync(UserQueryRequest request);
///
/// 获取用户详情
///
Task GetUserDetailAsync(long id);
///
/// 更新用户状态
///
Task UpdateUserStatusAsync(long id, int status);
}
```
### 4.3 服务实现规范
```csharp
namespace MiAssessment.Admin.Business.Services;
///
/// 用户服务实现
///
public class UserService : IUserService
{
private readonly AdminBusinessDbContext _dbContext;
private readonly ILogger _logger;
public UserService(
AdminBusinessDbContext dbContext,
ILogger logger)
{
_dbContext = dbContext;
_logger = logger;
}
///
public async Task> GetUserListAsync(UserQueryRequest request)
{
var query = _dbContext.Users
.Where(u => !u.IsDeleted);
// 条件筛选
if (!string.IsNullOrEmpty(request.Phone))
{
query = query.Where(u => u.Phone.Contains(request.Phone));
}
// 获取总数
var total = await query.CountAsync();
// 分页查询
var items = await query
.OrderByDescending(u => u.CreateTime)
.Skip(request.Skip)
.Take(request.PageSize)
.Select(u => new UserDto
{
Id = u.Id,
Uid = u.Uid,
// ...
})
.ToListAsync();
return new PagedResult(items, total, request.Page, request.PageSize);
}
}
```
### 4.4 控制器规范
```csharp
namespace MiAssessment.Admin.Business.Controllers;
///
/// 用户管理控制器
///
[Route("api/admin/user")]
public class UserController : BusinessControllerBase
{
private readonly IUserService _userService;
public UserController(IUserService userService)
{
_userService = userService;
}
///
/// 获取用户列表
///
[HttpGet("getList")]
public async Task GetList([FromQuery] UserQueryRequest request)
{
var result = await _userService.GetUserListAsync(request);
return Ok(result);
}
///
/// 更新用户状态
///
[HttpPost("updateStatus")]
public async Task UpdateStatus([FromBody] UpdateStatusRequest request)
{
var success = await _userService.UpdateUserStatusAsync(request.Id, request.Status);
return success ? Ok() : Error(ErrorCodes.UserNotFound, "用户不存在");
}
}
```
## 五、API 接口规范
### 5.1 接口风格
- **仅使用 GET 和 POST 请求**
- GET:查询操作,参数通过 Query String 传递
- POST:新增、修改、删除操作,参数通过 Request Body (JSON) 传递
### 5.2 路由规范
```
小程序 API: /api/{module}/{action}
后台管理 API: /api/admin/{module}/{action}
```
| 操作 | 方法 | 路由示例 |
|------|------|----------|
| 获取列表 | GET | `/api/admin/user/getList` |
| 获取详情 | GET | `/api/admin/user/getDetail?id=1` |
| 创建 | POST | `/api/admin/user/create` |
| 更新 | POST | `/api/admin/user/update` |
| 删除 | POST | `/api/admin/user/delete` |
| 更新状态 | POST | `/api/admin/user/updateStatus` |
| 更新排序 | POST | `/api/admin/user/updateSort` |
### 5.3 响应格式
```json
{
"code": 0,
"message": "success",
"data": {}
}
```
- `code`: 0 表示成功,非 0 表示错误
- `message`: 提示信息
- `data`: 业务数据
### 5.4 分页响应
```json
{
"code": 0,
"message": "success",
"data": {
"list": [],
"total": 100,
"page": 1,
"pageSize": 20,
"totalPages": 5
}
}
```
## 六、错误码规范
| 范围 | 说明 |
|------|------|
| 0 | 成功 |
| 1000-1999 | 通用错误 |
| 2000-2999 | 业务错误 |
| 3000-3099 | 配置模块错误 |
| 3100-3199 | 内容模块错误 |
| 3200-3299 | 测评模块错误 |
| 3300-3399 | 用户模块错误 |
| 3400-3499 | 订单模块错误 |
| 3500-3599 | 规划师模块错误 |
| 3600-3699 | 分销模块错误 |
| 5000-5999 | 系统错误 |
## 七、注释规范
### 7.1 XML 注释 (C#)
所有公开的类、方法、属性必须有 XML 注释:
```csharp
///
/// 获取用户列表
///
/// 查询参数
/// 分页用户列表
public async Task> GetUserListAsync(UserQueryRequest request)
```
### 7.2 JSDoc 注释 (JavaScript)
```javascript
/**
* 获取用户列表
* @param {Object} params - 查询参数
* @param {number} [params.page] - 页码
* @param {number} [params.pageSize] - 每页数量
* @param {string} [params.phone] - 手机号
* @returns {Promise