diff --git a/README.md b/README.md index dd260b2..3136506 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,159 @@ # NonDetainmentSoft -非羁押人员管理系统 \ No newline at end of file +非羁押人员管理系统 + +## 1. 项目概述 +ATS.NonCustodial.Admin 是一个基于 .NET 9.0 开发的后端管理系统,主要用于非监禁人员管理业务,提供案件管理、业务申请、设备管理等功能模块。系统采用分层架构设计,具有良好的扩展性和可维护性。 + +## 2. 技术栈 +- 开发框架 :.NET 9.0 +- ORM框架 :Entity Framework Core 9.0.8 +- 数据库 :MySQL +- 身份认证 :JWT / IdentityServer4 +- 依赖注入 :Autofac +- 实时通信 :SignalR +- 任务调度 :Quartz +- API文档 :Swagger +- 缓存 :Redis +- 日志 :Serilog +- 数据映射 :AutoMapper +## 3. 项目架构 +项目采用典型的分层架构设计,各层职责明确: + +``` +src/ +├── 1.datas/ # 数据层 +│ ├── ATS.NonCustodial.DbMigrations/ # 数据库迁移 +│ ├── ATS.NonCustodial.Domain/ # 领域模型 +│ └── ATS.NonCustodial.EntityFrameworkCore/ # EF Core 实现 +├── 2.services/ # 业务服务层 +│ └── ATS.NonCustodial.Application/ # 应用服务实现 +├── 3.contracts/ # 接口层 +│ └── ATS.NonCustodial.Application.Contracts/ # 服务接口定义 +├── 4.apps/ # 应用层 +│ └── ATS.NonCustodial.Admin.Api/ # Web API 应用 +└── 5.shared/ # 共享层 + ├── ATS.NonCustodial.Admin.Jobs/ # 定时任务 + ├── ATS.NonCustodial.AdminUi/ # 管理UI组件 + ├── ATS.NonCustodial.AuditLogging/ # 审计日志 + ├── ATS.NonCustodial.Domain.Shared/ # 领域共享 + ├── ATS.NonCustodial.DynamicApi/ # 动态API + └── ATS.NonCustodial.Shared/ # 通用工具 +``` + +## 4. 核心模块 +### 4.1 案件管理模块 +负责非监禁人员案件的创建、查询、更新和删除,包含案件信息、监管人员和被监管人员管理。 + +主要实体: + +- AppCaseManagement :案件管理实体 +- AppCaseSupervisor :监管人员实体 +- AppCaseSupervisedPerson :被监管人员实体 +### 4.2 业务申请模块 +处理被监管人员的各类业务申请,如请假、外出活动等,包含申请提交、审核、统计等功能。 + +主要服务: + +- AppBusinessApplicationService :业务申请服务 +- 提供申请创建、查询、审核、统计等功能 +### 4.3 设备管理模块 +管理与被监管人员关联的电子设备,如定位设备等。 + +主要服务: + +- AppDeviceManagementService :设备管理服务 +### 4.4 用户权限管理 +处理系统用户、角色和权限的管理。 + +主要服务: + +- RoleService :角色管理服务 +- UserService :用户管理服务 +### 4.5 文件管理模块 +提供文件上传、下载、管理功能,支持多种文件类型。 + +主要配置: + +- UploadConfigConfiguration :文件上传配置,支持头像、图片、资料等类型 +## 5. 系统配置 +### 5.1 数据库配置 +系统使用 MySQL 数据库,配置位于 appsettings.json 的 ConnectionStringsConfiguration 节点: + +``` +"ConnectionStringsConfiguration": { + "AdminAuditLogDbConnection": "Server=localhost;database=fsl_cs;uid=root;pwd=sa@admin;...", + "AdminDbConnection": "Server=localhost;database=fsl_cs;uid=root;pwd=sa@admin;..." +}, +"DatabaseProviderConfiguration": { + "ProviderType": "MySql" +} +``` + +### 5.2 身份认证配置 +支持 JWT 和 IdentityServer4 两种认证方式,JWT 配置如下: + +``` +"JwtConfiguration": { + "Issuer": "http://127.0.0.1:8006", + "Audience": "http://127.0.0.1:8006", + "SymmetricSecurityKey": "ertJKl#521*a@790asD&1#0123456789", + "Expires": 1440, + "RefreshTokenExpires": 1440 +} +``` + +### 5.3 文件上传配置 +定义了多种文件类型的上传规则: + +``` +"UploadConfigConfiguration": { + "Avatar": { + "UploadPath": "../upload/admin/avatar", + "RequestPath": "/upload/admin/avatar", + "MaxSize": 1048576 + }, + "Image": { + "UploadPath": "../upload/admin/image", + "RequestPath": "/upload/admin/image", + "MaxSize": 10485760 + }, + "MaterialManager": { + "UploadPath": "../upload/admin/materials", + "RequestPath": "/upload/admin/materials" + } +} +``` + +## 6. 服务启动流程 +1. 入口点 : Program.cs 调用 HostApp.Run() 方法启动服务 +2. 配置加载 :通过 ConfigHelper 加载配置文件 +3. 依赖注入 :使用 Autofac 注册服务组件 +4. 数据库初始化 :应用数据库迁移和种子数据 +5. 中间件配置 :配置认证授权、CORS、路由等中间件 +6. 服务运行 :启动 Web 服务器和 SignalR 服务 +## 7. 关键特性 +### 7.1 动态 API +使用自定义的 DynamicApi 属性自动生成 API 接口,简化开发流程。 + +### 7.2 实时通信 +通过 SignalR 实现监管人员和系统之间的实时消息推送和通知。 + +### 7.3 审计日志 +系统内置审计日志功能,记录用户操作和系统事件。 + +### 7.4 定时任务 +使用 Quartz 框架实现系统定时任务,如数据同步、状态更新等。 + +### 7.5 多数据库支持 +通过 EF Core 支持多种数据库,当前使用 MySQL。 + +## 8. 部署配置 +系统支持 Docker 容器化部署,提供了 Dockerfile 用于构建镜像。默认监听端口为 8006。 + +## 9. 安全措施 +- JWT/IdentityServer4 身份认证 +- 基于角色的访问控制 +- 输入验证和防注入 +- CORS 跨域配置 +- 请求限流(使用 AspNetCoreRateLimit) \ No newline at end of file diff --git a/src/1.datas/ATS.NonCustodial.Domain/Entities/Admins/AppSMS.cs b/src/1.datas/ATS.NonCustodial.Domain/Entities/Admins/AppSMS.cs index 8ec4c07..027d35c 100644 --- a/src/1.datas/ATS.NonCustodial.Domain/Entities/Admins/AppSMS.cs +++ b/src/1.datas/ATS.NonCustodial.Domain/Entities/Admins/AppSMS.cs @@ -20,7 +20,7 @@ namespace ATS.NonCustodial.Domain.Entities.Admins { Id = id; } - public string receiver { get; set; } + public string? receiver { get; set; } public string phone { get; set; } = string.Empty;