321
This commit is contained in:
parent
570ebbc006
commit
8f19923b16
283
.kiro/specs/homepage-prize-announcement/design.md
Normal file
283
.kiro/specs/homepage-prize-announcement/design.md
Normal file
|
|
@ -0,0 +1,283 @@
|
|||
# Design Document: 首页中大奖公告
|
||||
|
||||
## Overview
|
||||
|
||||
首页中大奖公告功能实现一个假公告系统,用于在小程序首页展示虚假的中奖信息来营造热闹氛围。系统分为三个主要部分:
|
||||
|
||||
1. **后端数据层**: 创建公告配置表,存储假中奖公告数据
|
||||
2. **后台管理**: 提供CRUD API和管理界面,供管理员配置公告内容
|
||||
3. **用户端**: 前端组件实现公告轮播展示和中奖详情弹窗
|
||||
|
||||
## Architecture
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph Frontend["前端 (UniApp)"]
|
||||
HomePage["首页 index.vue"]
|
||||
Carousel["公告轮播组件"]
|
||||
Popup["中奖详情弹窗"]
|
||||
end
|
||||
|
||||
subgraph Backend["后端 (.NET)"]
|
||||
UserAPI["用户端 API<br/>ConfigController"]
|
||||
AdminAPI["后台管理 API<br/>AnnouncementController"]
|
||||
Service["AnnouncementService"]
|
||||
DbContext["HoneyBoxDbContext"]
|
||||
end
|
||||
|
||||
subgraph Database["数据库 (SQL Server)"]
|
||||
Table["prize_announcements 表"]
|
||||
end
|
||||
|
||||
subgraph AdminWeb["后台管理前端 (Vue3)"]
|
||||
AdminPage["公告管理页面"]
|
||||
end
|
||||
|
||||
HomePage --> Carousel
|
||||
Carousel --> Popup
|
||||
Carousel -->|GET /api/getPrizeAnnouncements| UserAPI
|
||||
AdminPage -->|CRUD /api/admin/announcements| AdminAPI
|
||||
UserAPI --> Service
|
||||
AdminAPI --> Service
|
||||
Service --> DbContext
|
||||
DbContext --> Table
|
||||
```
|
||||
|
||||
## Components and Interfaces
|
||||
|
||||
### 1. 数据库实体 (PrizeAnnouncement)
|
||||
|
||||
```csharp
|
||||
// server/HoneyBox/src/HoneyBox.Model/Entities/PrizeAnnouncement.cs
|
||||
public class PrizeAnnouncement
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public string UserAvatar { get; set; } // 用户头像URL
|
||||
public string UserName { get; set; } // 用户名称
|
||||
public string PrizeLevel { get; set; } // 奖品等级(如:无上、传说、史诗、稀有)
|
||||
public string PrizeName { get; set; } // 奖品名称
|
||||
public int Sort { get; set; } // 排序值,越小越靠前
|
||||
public bool IsEnabled { get; set; } // 是否启用
|
||||
public DateTime CreatedAt { get; set; }
|
||||
public DateTime UpdatedAt { get; set; }
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 用户端 API
|
||||
|
||||
```csharp
|
||||
// GET /api/getPrizeAnnouncements
|
||||
// 返回启用状态的公告列表,按排序字段升序
|
||||
public class PrizeAnnouncementDto
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public string UserAvatar { get; set; }
|
||||
public string UserName { get; set; }
|
||||
public string PrizeLevel { get; set; }
|
||||
public string PrizeName { get; set; }
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 后台管理 API
|
||||
|
||||
```csharp
|
||||
// GET /api/admin/announcements - 获取公告列表(分页)
|
||||
// POST /api/admin/announcements - 创建公告
|
||||
// PUT /api/admin/announcements/{id} - 更新公告
|
||||
// DELETE /api/admin/announcements/{id} - 删除公告
|
||||
// PATCH /api/admin/announcements/{id}/status - 切换启用状态
|
||||
|
||||
public class CreateAnnouncementRequest
|
||||
{
|
||||
public string UserAvatar { get; set; }
|
||||
public string UserName { get; set; } // 必填
|
||||
public string PrizeLevel { get; set; } // 必填
|
||||
public string PrizeName { get; set; } // 必填
|
||||
public int Sort { get; set; }
|
||||
public bool IsEnabled { get; set; }
|
||||
}
|
||||
|
||||
public class UpdateAnnouncementRequest
|
||||
{
|
||||
public string? UserAvatar { get; set; }
|
||||
public string? UserName { get; set; }
|
||||
public string? PrizeLevel { get; set; }
|
||||
public string? PrizeName { get; set; }
|
||||
public int? Sort { get; set; }
|
||||
public bool? IsEnabled { get; set; }
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 前端组件接口
|
||||
|
||||
```javascript
|
||||
// honey_box/common/server/announcement.js
|
||||
export const getPrizeAnnouncements = async () => {
|
||||
const res = await RequestManager.get("getPrizeAnnouncements", {});
|
||||
return res.data;
|
||||
}
|
||||
```
|
||||
|
||||
```vue
|
||||
<!-- 公告轮播组件 props -->
|
||||
<prize-announcement-carousel
|
||||
:announcements="announcements"
|
||||
:interval="4000"
|
||||
@click="onAnnouncementClick"
|
||||
/>
|
||||
|
||||
<!-- 中奖详情弹窗 props -->
|
||||
<prize-detail-popup
|
||||
ref="prizePopup"
|
||||
:announcement="currentAnnouncement"
|
||||
@play="onPlayClick"
|
||||
/>
|
||||
```
|
||||
|
||||
## Data Models
|
||||
|
||||
### 数据库表结构
|
||||
|
||||
```sql
|
||||
CREATE TABLE prize_announcements (
|
||||
id INT IDENTITY(1,1) PRIMARY KEY,
|
||||
user_avatar NVARCHAR(500) NULL, -- 用户头像URL
|
||||
user_name NVARCHAR(50) NOT NULL, -- 用户名称
|
||||
prize_level NVARCHAR(20) NOT NULL, -- 奖品等级
|
||||
prize_name NVARCHAR(100) NOT NULL, -- 奖品名称
|
||||
sort INT NOT NULL DEFAULT 0, -- 排序值
|
||||
is_enabled BIT NOT NULL DEFAULT 1, -- 是否启用
|
||||
created_at DATETIME2 NOT NULL DEFAULT GETDATE(),
|
||||
updated_at DATETIME2 NOT NULL DEFAULT GETDATE()
|
||||
);
|
||||
|
||||
CREATE INDEX ix_prize_announcements_is_enabled ON prize_announcements(is_enabled);
|
||||
CREATE INDEX ix_prize_announcements_sort ON prize_announcements(sort);
|
||||
```
|
||||
|
||||
### DTO 模型
|
||||
|
||||
```csharp
|
||||
// 用户端响应DTO
|
||||
public class PrizeAnnouncementDto
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public string UserAvatar { get; set; }
|
||||
public string UserName { get; set; }
|
||||
public string PrizeLevel { get; set; }
|
||||
public string PrizeName { get; set; }
|
||||
}
|
||||
|
||||
// 后台管理响应DTO
|
||||
public class AnnouncementAdminDto
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public string UserAvatar { get; set; }
|
||||
public string UserName { get; set; }
|
||||
public string PrizeLevel { get; set; }
|
||||
public string PrizeName { get; set; }
|
||||
public int Sort { get; set; }
|
||||
public bool IsEnabled { get; set; }
|
||||
public DateTime CreatedAt { get; set; }
|
||||
public DateTime UpdatedAt { get; set; }
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Correctness Properties
|
||||
|
||||
*A property is a characteristic or behavior that should hold true across all valid executions of a system—essentially, a formal statement about what the system should do. Properties serve as the bridge between human-readable specifications and machine-verifiable correctness guarantees.*
|
||||
|
||||
### Property 1: CRUD Round-Trip Consistency
|
||||
|
||||
*For any* valid announcement data, creating an announcement and then reading it back should return the same data; updating it and reading again should reflect the updates; deleting it should make it no longer retrievable.
|
||||
|
||||
**Validates: Requirements 1.1, 1.2, 1.3, 2.4**
|
||||
|
||||
### Property 2: Enabled Filter Correctness
|
||||
|
||||
*For any* set of announcements with mixed enabled/disabled states, the user-facing API should only return announcements where IsEnabled is true, and the count of returned items should equal the count of enabled announcements in the database.
|
||||
|
||||
**Validates: Requirements 2.2, 1.6**
|
||||
|
||||
### Property 3: Sort Ordering Preservation
|
||||
|
||||
*For any* set of enabled announcements with different sort values, the user-facing API should return them in ascending order by the sort field. For any two consecutive items in the result, the first item's sort value should be less than or equal to the second item's sort value.
|
||||
|
||||
**Validates: Requirements 2.3, 1.7**
|
||||
|
||||
### Property 4: Required Field Validation
|
||||
|
||||
*For any* create or update request where UserName, PrizeLevel, or PrizeName is empty or whitespace-only, the system should reject the request and return a validation error without modifying the database.
|
||||
|
||||
**Validates: Requirements 1.5**
|
||||
|
||||
### Property 5: Carousel Index Cycling
|
||||
|
||||
*For any* list of N announcements (N > 0) and any current index I, advancing to the next index should produce (I + 1) % N, ensuring the carousel cycles back to 0 after reaching the last item.
|
||||
|
||||
**Validates: Requirements 3.3**
|
||||
|
||||
### Property 6: Announcement Text Formatting
|
||||
|
||||
*For any* announcement with UserName U, PrizeLevel L, and PrizeName P, the formatted display text should contain all three values: U, L, and P in the format "用户{U}抽中了{L}的{P}!".
|
||||
|
||||
**Validates: Requirements 3.5**
|
||||
|
||||
## Error Handling
|
||||
|
||||
### 后端错误处理
|
||||
|
||||
| 错误场景 | HTTP状态码 | 错误码 | 错误消息 |
|
||||
|---------|-----------|--------|---------|
|
||||
| 公告不存在 | 404 | NotFound | 公告不存在 |
|
||||
| 必填字段为空 | 400 | ValidationError | 用户名称/奖品等级/奖品名称不能为空 |
|
||||
| 数据库操作失败 | 500 | InternalError | 操作失败,请稍后重试 |
|
||||
|
||||
### 前端错误处理
|
||||
|
||||
| 错误场景 | 处理方式 |
|
||||
|---------|---------|
|
||||
| API请求失败 | 静默失败,隐藏公告区域 |
|
||||
| 公告列表为空 | 隐藏公告区域或显示默认内容 |
|
||||
| 图片加载失败 | 显示默认头像占位图 |
|
||||
|
||||
## Testing Strategy
|
||||
|
||||
### 单元测试
|
||||
|
||||
单元测试用于验证具体示例和边界情况:
|
||||
|
||||
1. **Service层测试**
|
||||
- 创建公告成功场景
|
||||
- 更新公告成功场景
|
||||
- 删除公告成功场景
|
||||
- 公告不存在时的错误处理
|
||||
- 空列表返回处理
|
||||
|
||||
2. **前端组件测试**
|
||||
- 轮播组件初始化
|
||||
- 弹窗打开/关闭
|
||||
- 空数据处理
|
||||
|
||||
### 属性测试
|
||||
|
||||
属性测试使用 **FsCheck** (.NET) 库,每个属性测试运行最少100次迭代。
|
||||
|
||||
每个测试需要标注对应的设计文档属性:
|
||||
- **Feature: homepage-prize-announcement, Property 1: CRUD Round-Trip Consistency**
|
||||
- **Feature: homepage-prize-announcement, Property 2: Enabled Filter Correctness**
|
||||
- **Feature: homepage-prize-announcement, Property 3: Sort Ordering Preservation**
|
||||
- **Feature: homepage-prize-announcement, Property 4: Required Field Validation**
|
||||
- **Feature: homepage-prize-announcement, Property 5: Carousel Index Cycling**
|
||||
- **Feature: homepage-prize-announcement, Property 6: Announcement Text Formatting**
|
||||
|
||||
### 测试覆盖范围
|
||||
|
||||
| 测试类型 | 覆盖内容 |
|
||||
|---------|---------|
|
||||
| 单元测试 | Service层CRUD操作、边界情况、错误处理 |
|
||||
| 属性测试 | 数据一致性、过滤逻辑、排序逻辑、验证逻辑 |
|
||||
| 集成测试 | API端点、数据库交互 |
|
||||
| 手动测试 | UI动画效果、轮播切换、弹窗交互 |
|
||||
77
.kiro/specs/homepage-prize-announcement/requirements.md
Normal file
77
.kiro/specs/homepage-prize-announcement/requirements.md
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
# Requirements Document
|
||||
|
||||
## Introduction
|
||||
|
||||
首页中大奖公告功能是一个假公告系统,用于在小程序首页展示虚假的中奖信息来营造热闹氛围。后台管理员可以配置多条公告内容,前端以轮播形式循环展示,每条公告展示4秒并带有切换动画效果。用户点击公告可查看中奖详情弹窗。
|
||||
|
||||
## Glossary
|
||||
|
||||
- **Announcement_System**: 首页中大奖公告系统,负责管理和展示假中奖公告
|
||||
- **Prize_Announcement**: 单条中奖公告配置,包含用户头像、用户名、奖品等级、奖品名称等信息
|
||||
- **Announcement_Carousel**: 公告轮播组件,负责循环展示多条公告并处理切换动画
|
||||
- **Prize_Detail_Popup**: 中奖详情弹窗,展示点击公告后的详细中奖信息
|
||||
- **Admin_Panel**: 后台管理界面,用于配置和管理公告内容
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement 1: 公告数据管理
|
||||
|
||||
**User Story:** As a 后台管理员, I want to 配置假中奖公告内容, so that 可以在首页展示营造热闹氛围的中奖信息。
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Announcement_System SHALL 提供创建公告的功能,包含用户头像URL、用户名称、奖品等级、奖品名称字段
|
||||
2. THE Announcement_System SHALL 提供更新已有公告内容的功能
|
||||
3. THE Announcement_System SHALL 提供删除公告的功能
|
||||
4. THE Announcement_System SHALL 提供查询公告列表的功能,支持分页
|
||||
5. WHEN 创建或更新公告时,THE Announcement_System SHALL 验证必填字段(用户名称、奖品等级、奖品名称)不为空
|
||||
6. THE Announcement_System SHALL 为每条公告提供启用/禁用状态控制
|
||||
7. THE Announcement_System SHALL 为每条公告提供排序字段,用于控制展示顺序
|
||||
|
||||
### Requirement 2: 用户端公告获取
|
||||
|
||||
**User Story:** As a 小程序用户, I want to 在首页看到中奖公告, so that 可以了解其他用户的中奖情况并增加参与兴趣。
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Announcement_System SHALL 提供获取启用状态公告列表的API
|
||||
2. WHEN 获取公告列表时,THE Announcement_System SHALL 只返回启用状态的公告
|
||||
3. WHEN 获取公告列表时,THE Announcement_System SHALL 按排序字段升序返回公告
|
||||
4. THE Announcement_System SHALL 返回公告的用户头像URL、用户名称、奖品等级、奖品名称信息
|
||||
|
||||
### Requirement 3: 公告轮播展示
|
||||
|
||||
**User Story:** As a 小程序用户, I want to 看到公告自动轮播切换, so that 可以看到多条中奖信息。
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Announcement_Carousel SHALL 每4秒自动切换到下一条公告
|
||||
2. WHEN 公告切换时,THE Announcement_Carousel SHALL 展示进出动画效果
|
||||
3. WHEN 展示到最后一条公告后,THE Announcement_Carousel SHALL 循环回到第一条公告继续展示
|
||||
4. THE Announcement_Carousel SHALL 展示当前公告的用户头像
|
||||
5. THE Announcement_Carousel SHALL 展示格式化的公告文字:"用户{用户名}抽中了{奖品等级}的{奖品名称}!"
|
||||
6. WHEN 公告列表为空时,THE Announcement_Carousel SHALL 隐藏公告区域或显示默认内容
|
||||
|
||||
### Requirement 4: 中奖详情弹窗
|
||||
|
||||
**User Story:** As a 小程序用户, I want to 点击公告查看中奖详情, so that 可以了解更多中奖信息并参与抽奖。
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. WHEN 用户点击公告时,THE Prize_Detail_Popup SHALL 弹出展示中奖详情
|
||||
2. THE Prize_Detail_Popup SHALL 展示中奖的奖品名称
|
||||
3. THE Prize_Detail_Popup SHALL 展示【我也要玩】按钮
|
||||
4. WHEN 用户点击【我也要玩】按钮时,THE Prize_Detail_Popup SHALL 关闭弹窗
|
||||
|
||||
### Requirement 5: 后台管理界面
|
||||
|
||||
**User Story:** As a 后台管理员, I want to 通过可视化界面管理公告, so that 可以方便地添加、编辑和删除公告内容。
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Admin_Panel SHALL 展示公告列表,包含用户头像、用户名称、奖品等级、奖品名称、状态、排序、操作列
|
||||
2. THE Admin_Panel SHALL 提供新增公告的表单弹窗
|
||||
3. THE Admin_Panel SHALL 提供编辑公告的表单弹窗
|
||||
4. THE Admin_Panel SHALL 提供删除公告的确认操作
|
||||
5. THE Admin_Panel SHALL 提供切换公告启用/禁用状态的开关
|
||||
6. WHEN 表单提交时,THE Admin_Panel SHALL 验证必填字段并显示错误提示
|
||||
108
.kiro/specs/homepage-prize-announcement/tasks.md
Normal file
108
.kiro/specs/homepage-prize-announcement/tasks.md
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
# Implementation Plan: 首页中大奖公告
|
||||
|
||||
## Overview
|
||||
|
||||
本实现计划将首页中大奖公告功能分为后端数据层、后台管理API、用户端API、前端组件四个主要部分,按顺序实现以确保每个步骤都能在前一步骤的基础上进行验证。
|
||||
|
||||
## Tasks
|
||||
|
||||
- [ ] 1. 创建数据库实体和表结构
|
||||
- [ ] 1.1 创建 PrizeAnnouncement 实体类
|
||||
- 在 `HoneyBox.Model/Entities/` 创建 `PrizeAnnouncement.cs`
|
||||
- 包含 Id, UserAvatar, UserName, PrizeLevel, PrizeName, Sort, IsEnabled, CreatedAt, UpdatedAt 字段
|
||||
- _Requirements: 1.1, 1.6, 1.7_
|
||||
- [ ] 1.2 更新 HoneyBoxDbContext 添加 DbSet
|
||||
- 在 `HoneyBoxDbContext.cs` 添加 `DbSet<PrizeAnnouncement>` 和实体配置
|
||||
- 配置表名、索引、字段约束
|
||||
- _Requirements: 1.1_
|
||||
- [ ] 1.3 创建数据库建表 SQL 脚本
|
||||
- 在 `server/HoneyBox/scripts/` 创建 `create_prize_announcements.sql`
|
||||
- _Requirements: 1.1_
|
||||
|
||||
- [ ] 2. 实现后台管理 API
|
||||
- [ ] 2.1 创建 DTO 模型
|
||||
- 在 `HoneyBox.Admin.Business/Models/` 创建 `Announcement/AnnouncementModels.cs`
|
||||
- 包含 CreateAnnouncementRequest, UpdateAnnouncementRequest, AnnouncementAdminDto
|
||||
- _Requirements: 1.1, 1.2, 1.5_
|
||||
- [ ] 2.2 创建 Service 接口和实现
|
||||
- 在 `HoneyBox.Admin.Business/Services/Interfaces/` 创建 `IAnnouncementService.cs`
|
||||
- 在 `HoneyBox.Admin.Business/Services/` 创建 `AnnouncementService.cs`
|
||||
- 实现 GetListAsync, CreateAsync, UpdateAsync, DeleteAsync, ToggleStatusAsync
|
||||
- _Requirements: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6_
|
||||
- [ ] 2.3 编写 Service 属性测试
|
||||
- **Property 1: CRUD Round-Trip Consistency**
|
||||
- **Property 4: Required Field Validation**
|
||||
- **Validates: Requirements 1.1, 1.2, 1.3, 1.5, 2.4**
|
||||
- [ ] 2.4 创建 Admin Controller
|
||||
- 在 `HoneyBox.Admin.Business/Controllers/` 创建 `AnnouncementController.cs`
|
||||
- 实现 GET/POST/PUT/DELETE/PATCH 端点
|
||||
- _Requirements: 1.1, 1.2, 1.3, 1.4, 1.6_
|
||||
|
||||
- [ ] 3. Checkpoint - 后台管理 API 验证
|
||||
- Ensure all tests pass, ask the user if questions arise.
|
||||
|
||||
- [ ] 4. 实现用户端 API
|
||||
- [ ] 4.1 创建用户端 DTO
|
||||
- 在 `HoneyBox.Model/Models/Announcement/` 创建 `PrizeAnnouncementDto.cs`
|
||||
- _Requirements: 2.4_
|
||||
- [ ] 4.2 创建用户端 Service 接口和实现
|
||||
- 在 `HoneyBox.Core/Interfaces/` 创建 `IPrizeAnnouncementService.cs`
|
||||
- 在 `HoneyBox.Core/Services/` 创建 `PrizeAnnouncementService.cs`
|
||||
- 实现 GetEnabledAnnouncementsAsync 方法
|
||||
- _Requirements: 2.1, 2.2, 2.3, 2.4_
|
||||
- [ ] 4.3 编写用户端 Service 属性测试
|
||||
- **Property 2: Enabled Filter Correctness**
|
||||
- **Property 3: Sort Ordering Preservation**
|
||||
- **Validates: Requirements 2.2, 2.3, 1.6, 1.7**
|
||||
- [ ] 4.4 在 ConfigController 添加 API 端点
|
||||
- 添加 `GET /api/getPrizeAnnouncements` 端点
|
||||
- _Requirements: 2.1_
|
||||
- [ ] 4.5 注册依赖注入
|
||||
- 在 Autofac 模块中注册 IPrizeAnnouncementService
|
||||
- _Requirements: 2.1_
|
||||
|
||||
- [ ] 5. Checkpoint - 用户端 API 验证
|
||||
- Ensure all tests pass, ask the user if questions arise.
|
||||
|
||||
- [ ] 6. 实现前端公告组件
|
||||
- [ ] 6.1 创建 API 接口文件
|
||||
- 在 `honey_box/common/server/` 创建 `announcement.js`
|
||||
- 导出 getPrizeAnnouncements 函数
|
||||
- _Requirements: 2.1_
|
||||
- [ ] 6.2 创建公告轮播组件
|
||||
- 在 `honey_box/components/` 创建 `prize-announcement/prize-announcement.vue`
|
||||
- 实现4秒自动轮播、进出动画、循环展示
|
||||
- _Requirements: 3.1, 3.2, 3.3, 3.4, 3.5, 3.6_
|
||||
- [ ] 6.3 创建中奖详情弹窗组件
|
||||
- 在 `honey_box/components/` 创建 `prize-detail-popup/prize-detail-popup.vue`
|
||||
- 实现弹窗展示、奖品名称显示、【我也要玩】按钮
|
||||
- _Requirements: 4.1, 4.2, 4.3, 4.4_
|
||||
- [ ] 6.4 集成到首页
|
||||
- 修改 `honey_box/pages/shouye/index.vue`
|
||||
- 替换静态公告为动态轮播组件
|
||||
- 添加点击弹窗交互
|
||||
- _Requirements: 3.1, 3.2, 3.3, 3.4, 3.5, 4.1_
|
||||
|
||||
- [ ] 7. 实现后台管理前端页面
|
||||
- [ ] 7.1 创建 API 接口文件
|
||||
- 在 `admin-web/src/api/business/` 创建 `announcement.ts`
|
||||
- 导出 CRUD API 函数
|
||||
- _Requirements: 5.1_
|
||||
- [ ] 7.2 创建公告管理页面
|
||||
- 在 `admin-web/src/views/business/` 创建 `announcement/index.vue`
|
||||
- 实现列表展示、新增/编辑弹窗、删除确认、状态切换
|
||||
- _Requirements: 5.1, 5.2, 5.3, 5.4, 5.5, 5.6_
|
||||
- [ ] 7.3 添加路由和菜单配置
|
||||
- 在路由配置中添加公告管理页面路由
|
||||
- _Requirements: 5.1_
|
||||
|
||||
- [ ] 8. Final Checkpoint - 全功能验证
|
||||
- Ensure all tests pass, ask the user if questions arise.
|
||||
|
||||
## Notes
|
||||
|
||||
- All tasks including property tests are required for comprehensive coverage
|
||||
- 后端使用 C# / ASP.NET Core (.NET 10)
|
||||
- 前端使用 UniApp + Vue.js 2.x
|
||||
- 后台管理前端使用 Vue 3 + TypeScript
|
||||
- 属性测试使用 FsCheck 库,每个测试运行最少100次迭代
|
||||
Loading…
Reference in New Issue
Block a user