SupportFlow AI
SupportFlow AI是一个基于ASP构建的开源IT帮助台和票务系统。NET核心。它提供了一个完整的后端API,用于管理支持票证、用户、通知和实时通信,并通过模型上下文协议(MCP)为人工智能集成准备了基础设施。
特性
- 票务管理 --创建、更新、分配、接受、关闭和重新打开支持票证,并跟踪优先级和状态。
- 基于角色的访问 --三个角色:管理员、代理和最终用户,每个操作都有精细的权限。
- 实时通知 --用于新工单、状态更改和评论的实时更新。
- 评论系统 --内部(仅限代理)和外部(票所有人可见)评论,实时交付。
- 门票历史 --对每个工单所做的所有更改进行完整的审计跟踪,按更改事件分组。
- 文件存储 --配置文件图片和票附件存储在Supabase存储中,并经过验证(魔术字节验证,限制为25 MB)。
- Excel导出 --将门票和用户导出到
.xlsx使用ClosedXML格式。 - JWT身份验证 --使用HttpOnly Cookie和7天令牌过期进行安全登录。
- 分页和过滤 --按状态、优先级、日期范围、分配的用户等筛选票证。
- AI就绪基础设施 --为基于MCP的AI模型集成(意图分类、自动回复建议等)准备的数据库模式。
技术栈
| 技术 | 目的 |
|---|---|
| .NET 10.0 | 运行时框架 |
| ASP。NET核心 | Web API框架 |
| 实体框架核心10.0 | ORM |
| PostgreSQL | 主数据库 |
| Npgsql | PostgreSQL提供程序 |
| ACK/AAzure ACK | 实时消息传递 |
| 数据库存储 | 文件存储 |
| FluentVerification | 请求验证 |
| FluentResults | 结果模式 |
| ClosedXML | Excel生成 |
| JWT承载 | 身份验证 |
| Swashbuckle | API文档 |
| xUnit+Moq+FluentAssessments | 测试 |
建筑
该解决方案遵循一个干净的架构模式,有四个主要层:
TicketsSystem.slnx
├── TicketsSystem.Domain -- Entities, enums, repository interfaces
├── TicketsSystem.Data -- EF Core DbContext, migrations, repositories, Unit of Work
├── TicketsSystem.Core -- Services, DTOs, mappers, validations, business logic
├── TicketsSystem.Api -- Controllers, SignalR hubs, middleware, Program.cs
├── TicketsSystem.Tests -- Unit tests (53)
├── TicketsSystem.Tests.Integration -- Integration tests (10)
└── TicketClientTest -- Console app for SignalR testing先决条件
- .NET 10.0 SDK
- PostgreSQL (本地或托管)
- (可选,用于集成测试)
- Supabase 帐户(可选,用于文件存储)
入门指南
1.克隆存储库
git clone https://github.com/your-org/supportflow-ai.git
cd supportflow-ai/TicketsSystem.Server2.配置数据库
创建PostgreSQL数据库并更新中的连接字符串 TicketsSystem.Api/appsettings.Development.json:
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5432;Database=supportflow;Username=postgres;Password=your_password"
}
}应用程序在启动时通过以下方式自动应用迁移 dbContext.Database.Migrate().
3.配置JWT和Supabase(可选)
在同一文件中,配置JWT设置和Supabase凭据:
{
"Jwt": {
"Key": "your-secret-key-at-least-32-characters-long",
"Issuer": "SupportFlowAI",
"Audience": "SupportFlowAI"
},
"Supabase": {
"Url": "https://your-project.supabase.co",
"Key": "your-supabase-key"
}
}注: 在未配置Supabase的情况下,应用程序仍将运行,但文件上传功能将不可用。
4.运行应用程序
dotnet run --project TicketsSystem.ApiAPI将在以下网址提供:
- HTTP:
http://localhost:5056 - HTTPS:
https://localhost:7121
Swagger用户界面: https://localhost:7121/swagger
5.种子数据
首次启动时,应用程序会自动播种:
- 默认管理员用户:
admin@example.com/Admin123! - 票证状态: 打开、进行中、暂停、关闭、重新打开
- 门票优先级: 低、中、高、临界
测试证书
| 角色 | 电子邮件 | 密码 |
|---|---|---|
| 管理 | prueba3@gmail.com | 测试3 |
| 代理人 | agente@example.com代理123 | |
| 用户 | user@example.com | 用户123 |
运行测试
单元测试
dotnet test TicketsSystem.Tests53个测试,涵盖服务(票证、用户、通知、角色、当前用户)和验证逻辑。所有的依赖关系都被嘲笑了。
集成测试
dotnet test TicketsSystem.Tests.Integration10个测试针对一个带有内存中API主机的真实SQL Server容器(通过Testcontainers)运行。测试涵盖了完整的身份验证流程、票证CRUD持久性和Contoso实时事件。
注: 集成测试需要运行Docker Desktop。
API概述
身份验证(/api/authentication)
POST /login--在HttpOnly cookie中验证和接收JWTPOST /logout--清除身份验证cookieGET /getcurrentuser--获取当前用户声明POST /createuser--创建新用户(管理员)GET /getallusers--列出分页用户(管理员)PUT /updateuser/{userId}--更新用户信息(管理员)
门票(/api/tickets)
POST /createticket--创建新票证GET /gettickets--列出带有过滤器和分页的门票GET /getticketbyid/{ticketId}--获取门票详细信息PUT /updateticketinfo/{ticketId}--更新工单(管理员/代理)PUT /updateticketuser/{ticketId}--更新自己的工单(用户)POST /assingtickets/{ticketId}/{userId}--将票分配给代理(管理员)POST /accepttickets/{ticketId}--自行分配门票(代理)POST /closetickets/{ticketId}--关闭工单(管理员/代理)POST /reopentickets/{ticketId}--重新打开工单(管理员/代理)GET /exporttickets--将门票导出到Excel
评论(/api/ticketcomments)
POST /createticketcomment/{ticketId}--添加评论(内部或外部)GET /getticketscomment/{ticketId}--获取门票的所有评论
历史(/api/tickethistory)
GET /gettickethistory/{ticketId}--获取工单的分组更改历史记录
通知(/api/notifications)
GET /getusernotifications/{userId}--获取用户通知PUT /tooglenotificationreadstatus/{notificationId}--将通知标记为已读
实时(ViewModel)
连接到 /ticketHub 接收现场活动:
ReceiveNewTicket--创建了一张新票ReceiveNewTicketStatusChange--票证状态已更改ReceiveNewTicketComment--添加了一条新评论
领域模型
| 实体 | 描述 |
|---|---|
| 用户 | 具有角色(管理员、代理、用户)的系统用户 |
| 票证 | 支持具有状态、优先级和分配的票证 |
| TicketStatus | 查找表(打开、进行中、暂停、关闭、重新打开) |
| TicketPriority | 查找表(低、中、高、严重) |
| TicketComment | 对门票的评论(内部或外部) |
| TicketAttachment | 门票文件附件 |
| 票务历史 | 票务变更的审计跟踪 |
| 通知 | 工单事件触发的用户通知 |
| Mcprequest/Mcpresponse | 未来MCP集成的AI请求/响应记录 |
项目配置
跨域资源共享
配置为允许 http://localhost:4200 (Angular开发)和生产Azure静态Web App URL。支持基于cookie的身份验证凭据。
信号员
- 开发中:内存中
- 在生产环境中:Azure ViewModel服务
文件存储
文件上传到Supabase Storage并进行验证:
- 最大文件大小:25 MB
- 支持的图像格式:JPEG、PNG、GIF(通过内容类型和魔术字节验证)
许可证
这个项目是开源的。有关详细信息,请参阅LICENSE文件。
