Conversation
移除项目中的 OpenIddict 依赖及相关配置,改用 JWT Bearer 进行身份验证。 具体变更: - 移除 Domain、Application 及 EntityFrameworkCore 层中的 OpenIddict 模块与包引用 - 删除 OpenIddictDataSeedContributor 数据种子类 - 新增 AccountAppService 实现用户名密码登录并生成 JWT Token - 在 Web 模块中配置 JWT Bearer 认证,替换原有的 OpenIddict 验证逻辑 - 添加 SQL 脚本用于删除 OpenIddict 相关的数据库表 - 更新 appsettings.json 添加 JWT 配置项 - 补充 AGENTS.md 及 SQL 脚本说明文档 BREAKING CHANGE: 彻底移除 OpenIddict 支持,需执行 SQL 脚本清理数据库表,客户端需适配 JWT 认证流程
添加登录尝试次数限制功能,防止暴力破解攻击。将 DTO 类从服务层分离至契约层,并改进错误处理和日志记录机制。主要变更包括: - 使用 IMemoryCache 实现15分钟内最多5次登录失败限制 - 将 LoginDto 和 LoginResultDto 移至 Application.Contracts 项目 - 新增 IAccountAppService 接口,遵循接口分离原则 - 增强异常处理,统一业务异常和系统异常的日志记录 - 添加 JWT Secret Key 配置验证,确保关键配置完整 - 移除未使用的 AbpAccount 模块依赖,清理项目引用
在应用层、领域层、基础设施层及 API 层中移除 AbpIdentity 相关模块依赖, 配合自定义 JWT 认证架构的改造
- 引入 Serilog.AspNetCore、Serilog.Sinks.Console 和 Serilog.Sinks.File 依赖 - 配置控制台和文件双日志输出,支持按日滚动和文件大小限制 - 在 Program.cs 中使用 Serilog 替换默认日志系统,添加全局异常捕获 - 在 appsettings.json 中添加完整的 Serilog 配置,包括日志级别和输出模板 - 更新 Dockerfile 创建 /app/logs 日志目录并设置权限 - 更新 README.md 添加日志配置说明和使用示例
移除手动初始化 LoggerConfiguration 的代码,改用 builder.Host.UseSerilog 扩展方法。这样可以更好地与依赖注入和配置系统集成,确保日志配置正确读取 应用程序设置并支持从服务容器中解析依赖。
新增自定义密码哈希接口和实现,使用 PBKDF2 算法替代 ABP Identity 的默认实现。重构登录服务逻辑,使用仓储直接查询用户并通过密码哈希器验证,移除了对 IdentityUserManager 的依赖。同时新增用户实体并移除 ABP Identity 和 Account 模块的相关引用,简化了认证流程。
- 添加重要说明章节,记录 ABP Framework 迁移状态 - 补充后端服务启动时的绑定地址配置说明
从 Application.Contracts、Application、HttpApi 和 HttpApi.Client 项目中移除了未使用的 ABP Account 模块相关包引用和模块依赖
- 新增 UserManagementAppService 支持用户增删改查及密码管理 - 新增密码重置流程接口,支持发送验证码、验证令牌及重置密码 - 添加用户管理相关的权限定义及中文本地化资源 - 新增用户管理功能文档及实施方案
重构密码哈希器代码,将魔术数字替换为常量定义,使用 using 语句 确保资源正确释放,并改进了密码验证逻辑。同时新增两个 SQL 维护 脚本用于批量重置用户密码和设置默认密码。清理了应用模块中不必要 的依赖注册。
删除了数据库迁移器和 HTTP API 客户端项目及其相关代码和配置文件。 BREAKING CHANGE: 移除 DFApp.DbMigrator 和 DFApp.HttpApi.Client 项目
修改登录逻辑,在生成 JWT 时将用户权限列表写入 Token Claims。 新增 JwtPermissionValueProvider 以支持基于 Token 的权限校验。 新增 JwtClaimsPrincipalContributor 以解析权限声明。 在应用模块中注册自定义权限提供者。
移除对 IPermissionManager 的依赖,改用直接查询数据库的方式获取用户权限。 - 添加 PermissionGrant 仓储依赖 - 直接从数据库查询用户角色关联 - 手动查询权限授予记录以获取用户权限列表 - 保持 JWT 声明添加逻辑不变
- 移除 ABP Framework、Autofac 及 EF Core 相关依赖与模块 - 集成 SqlSugar ORM,实现自定义仓储 (Repository) 和实体基类体系 - 实现基于 JWT Token 的自定义权限验证与授权处理器 - 实现 AOP 审计字段自动填充、全局异常过滤及软删除过滤器 - 将项目重构为轻量级 ASP.NET Core 单体架构 - 更新项目文档并添加 Phase 1 迁移总结
为核心领域组件和基础设施组件添加了全面的单元测试,并建立 TDD 开发指南文档。 - 新增 EntityBase、AuditedEntity、FullAuditedEntity 的单元测试,覆盖实体初始化、主键设置、相等性比较、并发标记及软删除等功能 - 新增 GlobalExceptionFilter 的单元测试,验证对业务异常、未找到异常、验证异常及未处理异常的正确处理 - 配置测试项目依赖,集成 xUnit、Moq、FluentAssertions 和 coverlet.collector - 新增后端 TDD 测试指南文档,详细说明了测试框架、项目结构、AAA 模式、Mock 使用规范及覆盖率目标 - Phase 1 测试共包含 28 个用例,通过率 100%
为简化架构以适应 TDD 开发模式,移除了软删除功能。 - 禁用 SqlSugar 全局软删除过滤器配置 - 将 FullAuditedEntity 和 ISoftDelete 标记为废弃 - 新增 Phase 2.1 迁移总结文档 - 新增软删除功能废除说明文档
- 将 23 个实体类从 ABP Framework 基类迁移至自定义基类 (`AuditedEntity` 和 `CreationAuditedEntity`) - 为所有实体添加 SqlSugar ORM 映射属性 (`[SugarTable]` 和 `[SugarColumn]`) - 移除软删除功能,将基类从 `FullAuditedAggregateRoot` 调整为 `AuditedEntity` - 保持数据库表名和列名完全一致,确保数据兼容性 - 涉及模块:ElectricVehicle, Lottery, Bookkeeping, Configuration, IP, FileFilter, FileUploadDownload, Media, Rss, Account - 添加 Phase 2.2 迁移总结文档及相关数据库迁移脚本
将 Identity 模块的 6 个实体类(Permission、PermissionGrant、 PermissionGroup、Role、RoleClaim、UserRole)从 ABP Identity 基类 迁移到自定义基类,并添加 SqlSugar 属性以支持 ORM 映射。 同时生成了详细的迁移总结文档和数据库验证脚本。
- 移除 SqlSugar 仓储中的软删除方法,完成 Phase 2.1 的遗留清理 - 为通用仓储和只读仓储的 GetPagedListAsync 方法添加排序支持 - 添加 Phase 3.1 迁移总结文档,记录此次变更详情
- 将 6 个自定义仓储从 EF Core 迁移至 SqlSugar - 创建 3 个自定义仓储以保留业务逻辑(KeywordFilterRule、GasolinePrice、ConfigurationInfo) - 对 3 个简单仓储直接使用通用仓储替代(BookkeepingExpenditure、TellStatusResult、FilesItem) - 移除导航查询,标记导航属性为 [SugarColumn(IsIgnore = true)] - 修改实体类以移除 required 关键字,满足 SqlSugar 泛型约束 - 更新依赖注入配置,注册新的仓储实现 - 新增 6 份详细的子任务迁移文档及 Phase 3.2 总结文档
迁移 4 个服务(ConfigurationInfoService、GasolinePriceService、 BookkeepingCategoryService、KeywordFilterRuleService)到 DFApp.Web/Services 目录, 采用新的服务基类(AppServiceBase/CrudServiceBase)和 SqlSugar 仓储, 移除软删除逻辑,替换异常类型为 BusinessException,添加迁移总结文档。
- 添加 start.sh 脚本,支持一键启动/停止服务(默认后端+前端,all 模式含彩票代理) - 服务使用 nohup + disown 后台运行,关闭终端不退出 - 启动前检查端口占用并安全清理(保护 VS Code 进程) - 所有服务绑定 0.0.0.0 以支持远程开发 - 创建 BookkeepingExpenditureRepository 实现,修复 BookkeepingCategoryService 依赖注入失败 - Program.cs 添加 AddMemoryCache 注册,修复 AccountAppService 依赖注入失败
- 创建全新 AppPermissionGrants 表替代 ABP 旧权限表,使用 long 主键 + 角色名称匹配, 彻底解决 GUID 大小写和 SqlSugar LINQ 翻译兼容问题 - 新增 RBAC 权限管理模块:角色管理、权限授予管理、用户角色管理(共 15 个 API 端点) - 修复登录后 JWT Token 无角色/权限 claims 的问题 - 修复 SqlSugar IN 查询语法和链式 Where 不兼容问题 - 移除 ICreatorId 全局查询过滤器 - JWT Token 添加 ClaimTypes.Name claim - start.sh 后端改为 HTTP 模式,前端环境变量同步更新 - 数据迁移脚本:旧权限表数据迁移到新表
- 将 DFApp.Vue 前端项目合并到 client/ 子目录 - 更新 start.sh 中的前端路径 (DFApp.Vue -> client) - 合并 .gitignore(添加 Node.js/Vue 前端忽略规则) - 合并 AGENTS.md 为统一的 monorepo 说明文档 - 合并 .vscode/ 配置(扩展推荐、编辑器设置、代码片段) - 删除重复文件(client/.github、client/dist、client/.vscode)
- 前端 API 层(15 个文件): - aria2.ts: aria2Manage → aria2-manage 前缀,多个端点路径和方法变更 - bookkeeping.ts: chart-jSDto → chart 等路径简化 - electric-vehicle.ts: oil-cost-comparison GET→POST,汽油价格端点路径变更 - lottery.ts: SSQ/KL8 模拟前缀大小写修正,多个端点路径和参数变更 - lotteryDataFetch.ts: 4 个数据获取端点路径简化 - fileUpload.ts: /api/FileUploadInfo → /api/app/file-upload-info (PascalCase→kebab-case) - logViewer.ts: /api/LogViewer → /api/app/log-viewer (PascalCase→kebab-case) - tgLogin.ts: t-gLogin → tg-login 前缀,status/chats POST→GET - mediaInfo.ts: invalid-items → invalid - keywordFilter.ts: test-filter → test, toggle-rule POST→PUT - rssFetch.ts: fetch-rss-feed 路径简化 - rssSubscriptionDownload.ts/rssMirror.ts: clearAll POST→DELETE - role.ts: /api/identity/roles → /api/app/role-management - identity-user.ts: /api/identity/users → /api/app/user-management - permission.ts: /api/permission-management → /api/app/permission-grant-management - 后端 Controller(3 个文件): - RoleManagementController: 添加显式 kebab-case 路由属性 - PermissionGrantManagementController: 添加显式 kebab-case 路由属性 - UserRoleManagementController: 添加显式 kebab-case 路由属性
前后端分页参数名称不匹配导致分页功能完全失效: - 前端发送 skipCount/maxResultCount,后端期望 pageIndex/pageSize - 后端因参数名不匹配始终使用默认值,翻页请求始终返回第一页 修改内容: - types/api.ts: PagedRequestDto 类型定义 skipCount→pageIndex, maxResultCount→pageSize - 26 个 Vue 视图文件: 分页参数传递从 skipCount/maxResultCount 改为 pageIndex/pageSize - api/role.ts, api/identity-user.ts: 内联分页参数类型同步更新 curl 测试验证:lottery/paged、external-link/paged 等端点分页正常工作
1. 后端 JSON 序列化策略改为 camelCase (PropertyNamingPolicy = JsonNamingPolicy.CamelCase)
- 原来设置 PropertyNamingPolicy = null 导致输出 PascalCase (Items/TotalCount)
- 前端期望 camelCase (items/totalCount),字段名不匹配导致数据无法读取
2. 前端响应拦截器解包后端统一响应格式
- 后端响应被包装为 { Success, Message, Code, Data } 结构
- 拦截器现在自动解包 Data 字段,返回业务数据
3. start.sh 添加后端编译步骤
- 启动前执行 dotnet build,编译失败则停止启动
4. .gitignore 添加 .playwright-cli/ 排除规则
15 个 API 方法调用了后端非分页端点(返回 List<T>), 但前端期望 PagedResultDto<T>(含 items 和 totalCount),导致 result.items 为 undefined。 修复:将列表获取方法的 URL 从基础端点改为 /paged 端点: - bookkeeping.ts: getCategories → /paged - electric-vehicle.ts: getVehicles/getCosts/getChargingRecords → /paged - dynamicIp.ts: getDynamicIPs → /paged - fileUpload.ts: getFileUploadInfos → /paged - externalLink.ts: getList → /paged - configuration.ts: getConfigurations → /paged - aria2.ts: getAria2Status → /filtered-list - keywordFilter.ts: getList → /paged - mediaInfo.ts: getList → /paged - lottery.ts: getLotteries/getLotteryResults/getSSQSimulations/getKL8Simulations → /paged
后端 JSON 序列化已改为 camelCase (success/data), 但拦截器仍检查大写字段名 (Success/Data),导致解包不生效, 前端拿到的是完整包装对象而非业务数据。
响应拦截器已将 { success, data } 解包为 data,
但路由守卫中仍用 .then(({ data }) => ...) 再次解构,
导致 routes 为 undefined,路由注册失败,页面无法渲染。
GetListAsync 从返回 flat list 改为返回带分组的权限树结构, 通过反射读取 DFAppPermissions 权限定义,推断父子权限关系, 并合并数据库中的授予状态(支持通过角色间接授予的权限提示)。
- 移除 ABP Framework 遗留的 ExtraProperties 和 IsDeleted 列 - 修复 EntityBase 主键 IsIdentity 配置,解决 long 类型主键插入失败 - 涉及 17 个 App 表的列清理和 16 个实体文件的 IsIdentity 修复 - 登录时将用户数据(roles/permissions)写入 Pinia store,修复页面刷新后权限丢失
- 电车管理、充电记录、费用记录、支出记录的日期字段默认值从 "" 改为 null - handleEdit 中使用 ?? null 替代 || "" 避免将 null 转为空字符串 - 对齐前端类型定义与后端 DateTime? 语义
- 将 .In(id).FirstAsync() 替换为 .InSingle(id) 进行单主键查询 - 修复所有实体的 Update、Delete、Get 操作返回 404 的问题
- ABP 时期创建的数据 Guid 为大写格式,SqlSugar 查询使用小写格式 - SQLite TEXT 比较默认区分大小写,导致旧数据查询返回 404 - 将所有表中的 Guid 统一转为小写,涉及 30 张表
- 添加 ExternalLinkController 的 DELETE {id}/file 端点
- 修复 ElStatistic value 属性期望 Number 但传入 String 的问题
- 重写 ReadLastLinesAsync 方法,从 O(n²) 改为基于 Split 的倒序块读取 - 修复 Success 方法重载歧义导致日志内容放入 message 而非 data - 前端日志内容请求超时从 10s 增加到 60s
- 全面排查 224 处 Success 调用,发现 12 处存在重载歧义 - Success(string) 被编译器匹配到 Success(string message, object? data) 导致数据放入 message 而非 data - 涉及 TGLogin、Aria2Manage、Aria2、RssMirrorItem、ConfigurationInfo、FileUploadInfo 等 6 个 Controller
- 删除 10 个废弃/重复/无用的 SQL 文件 - 将保留的 13 个文件按执行顺序重新编号命名(01-13) - 更新 sql/README.md 文档,添加执行顺序说明 - 排除 DFApp-old.db 不纳入版本控制
- 更新技术栈描述,涵盖后端(ASP.NET Core 10.0 + SqlSugar)、前端(Vue 3 + Element Plus)及附加服务 - 添加解决方案结构、端口配置、快速启动指南等章节 - 移除 ABP Framework 遗留内容,反映迁移后的轻量级架构
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.