Compare commits

...

2467 Commits
v1.1.6 ... url

Author SHA1 Message Date
ccnetcore
9550ed57c0 feat: 新增api接口 2026-02-07 01:28:05 +08:00
ccnetcore
19b27d8e9a feat: 完成api页面搭建 2026-02-06 00:41:13 +08:00
ccnetcore
0b30dbb8de fix: 识别Claude上下文超限错误提示
补充对“input tokens exceeds the model's maximum context length”错误信息的判断,统一提示上下文过长的解决建议,提升异常提示准确性。
2026-02-04 23:46:22 +08:00
ccnetcore
fadaa0d129 chore: 日志中补充用户ID以增强异常定位
统一在 AiGateWayManager 各类异常日志中输出 userId,并向流式处理方法透传 userId,提升问题排查与审计能力,不影响现有业务逻辑。
2026-02-04 23:45:36 +08:00
ccnetcore
6863b773b4 fix: 延迟设置SSE响应头并兼容异常流数据
在成功获取第一条流式消息后再设置SSE响应头,避免无数据时提前建立连接;同时忽略异常类型的流消息,提升对部分AI工具的兼容性。
2026-02-04 23:34:57 +08:00
ccnetcore
82d97ab0b4 style: 调整3.6.1 2026-02-02 23:19:37 +08:00
Gsh
de94bb260b fix: 暗色主题优化,优化ai对话 2026-02-02 23:17:50 +08:00
ccnetcore
016f930021 style: 调整markdown样式问题 2026-02-02 22:03:48 +08:00
ccnetcore
9b7d98773b style: 整体文章样式优化 2026-02-02 21:33:53 +08:00
ccnetcore
6988dd224f style: 修复markdown问题 2026-02-02 19:50:05 +08:00
chenchun
c9b5418a70 fix: 修复markdown引入问题 2026-02-02 18:32:47 +08:00
chenchun
74d56ced8a Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-02-02 18:04:32 +08:00
chenchun
790fca50f3 fix: 修复markdown引入问题 2026-02-02 18:04:12 +08:00
ccnetcore
728b5958f3 fix: 修复实验性功能 2026-02-01 21:12:47 +08:00
ccnetcore
5a39330fdb style: 调整消息操作按钮左边距
移除 .message-wrapper__actions 下 el-button 的左外边距,统一按钮对齐效果
2026-02-01 21:04:08 +08:00
Gsh
70c7e0c331 feat: 消息ui优化 2026-02-01 20:31:31 +08:00
Gsh
67b215ce7a feat: 对话id补充,适配不同类型 2026-02-01 20:17:13 +08:00
ccnetcore
d05324cd12 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-02-01 19:32:54 +08:00
ccnetcore
33937703c7 feat: 完成排行榜功能 2026-02-01 19:32:46 +08:00
Gsh
7f809e0718 feat: 对话id补充 2026-02-01 19:23:21 +08:00
ccnetcore
6d54c650f0 feat: 消息创建返回ID并在流式响应中下发
- 消息管理器创建用户/系统消息时返回 MessageId
- 网关在流式响应中新增消息创建事件,返回 MessageId 与创建时间
- 统一在消息创建完成后发送 [DONE] 标识,优化流式结束时机
2026-02-01 13:02:06 +08:00
Gsh
11cbb1b612 feat: 项目加载优化 2026-02-01 00:52:10 +08:00
Gsh
3b6887dc2e feat: 消息ui优化 2026-01-31 23:38:39 +08:00
Gsh
6af3fb44f4 feat: 消息ui优化 2026-01-31 21:33:18 +08:00
Gsh
f57b5befd7 feat: 消息ui优化 2026-01-31 21:28:13 +08:00
ccnetcore
dbc6b8cf5e feat: 支持消息自定义创建时间并完善TokenUsage初始化
- 用户消息创建支持传入创建时间,用于统计与回放
- TokenUsage 为空时自动初始化,避免空引用问题
- 网关记录消息开始时间并传递至消息管理器
- 标记并停用旧的发送消息接口
- 前端版本号更新至 3.6
- 移除未使用的 VITE_BUILD_COMPRESS 类型声明
2026-01-31 21:22:09 +08:00
Gsh
007a4c223a feat: ai的消息取消气泡样式 2026-01-31 20:33:03 +08:00
Gsh
ab2c11e05c Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-31 20:26:36 +08:00
Gsh
ec382995b4 feat: 对话中消息编辑与重新生成与删除功能 2026-01-31 20:26:20 +08:00
ccnetcore
7a38526ab3 fix: 修复删除消息接口参数绑定方式
将 DeleteAsync 方法的参数绑定由 FromBody 调整为 FromQuery,避免在删除消息时参数无法正确接收的问题
2026-01-31 16:07:30 +08:00
chenchun
4441244575 feat: 新增消息软删除及批量隐藏接口 2026-01-29 14:40:03 +08:00
chenchun
adafb65221 perf: 优化markdown显示问题 2026-01-28 16:27:07 +08:00
chenchun
74e936c6d3 refactor: 将 AnthropicInput.InputSchema 改为 object 并移除相关强类型定义
将原来的 Input_schema、InputSchemaValue 等强类型移除,AnthropicInput 中的 input_schema 属性类型由 Input_schema? 改为 object?,用于接受任意结构的输入 schema,简化序列化/反序列化处理。
2026-01-28 10:48:11 +08:00
ccnetcore
36aa29f9f1 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-26 21:08:45 +08:00
ccnetcore
d4fcbdc390 feat: 发布v3.5版本 2026-01-26 21:08:21 +08:00
chenchun
ca43879cc3 fix: 优化 Anthropic 流式对话错误提示并移除 -thinking 处理
- 统一并增强错误消息:在响应包含 "prompt is too long" 或 "提示词太长" 时,增加友好提示,建议在 claudecode 中执行 /compact 或开启新会话重试。
- 将流式与非流式的异常信息处理统一,抛出包含详细提示的异常并保留日志。
- 移除对 input.Model.EndsWith("-thinking") 及替换 "-thinking" 的处理(清理冗余逻辑)。
2026-01-26 11:37:31 +08:00
ccnetcore
9b5826a6b1 请提供需要提交的变更内容或简要说明(例如:做了什么改动、涉及哪些模块)。
我将按你给定的规范生成对应的提交标题和说明。
2026-01-25 14:13:24 +08:00
ccnetcore
485f19572b feat: 合并知识库目录与内容获取接口
将原有“目录查询”和“按目录获取内容”两个工具合并为单一接口,一次性返回所有目录及对应内容,简化调用方式;新增统一的知识库项模型,并补充异常与失败场景的日志与兜底处理。
2026-01-25 14:09:10 +08:00
ccnetcore
2845f03250 feat: 新增公告管理 2026-01-24 22:08:54 +08:00
ccnetcore
1ada6360d4 feat: 完成意心ai3.4版本发布 2026-01-24 17:55:42 +08:00
ccnetcore
21b7ef4d74 feat: 完成全站深色主题改造 2026-01-24 17:28:12 +08:00
ccnetcore
9a87b41027 Merge branch 'ai-hub' into ai-hub-dark 2026-01-24 17:13:33 +08:00
Gsh
886cc3155f fix: 用量查看优化 2026-01-24 16:03:03 +08:00
Gsh
020ad797f2 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-24 15:48:30 +08:00
Gsh
1d5bca773f fix: 用量查看优化 2026-01-24 15:05:24 +08:00
ccnetcore
6b86957556 fix: 修复工具调用用量关联错误并优化细节配置
- 修复前端工具调用中用量统计先后顺序导致未正确绑定的问题
- 优化聊天代理指令文案,补充平台知识库优先策略说明
- 调整聊天列表滚动条样式,提升界面体验
- 移除未使用的 VITE_BUILD_COMPRESS 类型声明
2026-01-24 01:16:38 +08:00
ccnetcore
caa90cc227 feat: 今日模型使用统计返回模型图标信息
为 GetTodayModelUsage 接口补充模型图标数据,新增 ModelTodayUsageDto.IconUrl 字段
通过 ModelManager 查询已启用模型的 IconUrl 并映射到结果中
同时统一部分代码格式,提升可读性
2026-01-23 22:13:51 +08:00
chenchun
87c93534a5 fix: 静态文件中间件允许未知文件类型并设置默认 Content-Type 2026-01-23 16:43:35 +08:00
chenchun
b8c79ac61c feat: 新增近24小时每小时与今日模型使用量统计接口及实现 2026-01-23 14:50:46 +08:00
ccnetcore
2db8d6e699 style: 控制台暗黑主题改造 2026-01-23 00:01:54 +08:00
ccnetcore
0983837ff7 fix: 正确处理 Anthropic 流式响应结束标记
在解析流式数据时增加对 [DONE] 结束标记的判断,避免在流结束后继续反序列化数据导致异常。
2026-01-22 00:36:38 +08:00
ccnetcore
efa948154f style: 首页暗黑主题改造 2026-01-21 22:58:57 +08:00
ccnetcore
e8c1111cbc Merge branch 'ai-hub' into ai-hub-dark
# Conflicts:
#	Yi.Ai.Vue3/.claude/settings.local.json
2026-01-21 21:49:47 +08:00
ccnetcore
c9c92dcf97 Merge branch 'ai-hub' into ai-hub-dark 2026-01-21 21:49:00 +08:00
Gsh
f2c2c60127 fix: 号池管理交互优化,移动端兼容 2026-01-20 00:38:37 +08:00
Gsh
d280cc6d35 fix: 增加号池快捷切换 2026-01-20 00:15:33 +08:00
Gsh
a1e38234a7 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-19 23:00:06 +08:00
Gsh
ace5a9a1ec fix: 完善活动公告,修复图片生成参考图无法放大问题。 2026-01-19 22:58:20 +08:00
Gsh
4ce77ececc fix: 对话框支持粘贴图片 2026-01-19 22:15:01 +08:00
ccnetcore
be9442c113 feat: 新增AI应用快捷配置列表接口
新增 AI 应用快捷配置查询能力,在 IChannelService 中定义获取快捷配置列表接口,并在 ChannelService 中实现对应接口,支持按排序号及创建时间获取快捷配置数据。
2026-01-19 22:12:07 +08:00
Gsh
5895f9e794 fix: 前端打包时增加git hash 信息 2026-01-18 23:46:05 +08:00
Gsh
b0d1820919 fix: 前端打包时增加git hash 信息 2026-01-18 23:45:48 +08:00
ccnetcore
8b183e289c feat: 增加图片生成内容安全拦截校验并优化日志信息 2026-01-18 17:46:34 +08:00
ccnetcore
09ecddb552 fix: 修复图片解析、角色Claim类型及错误日志问题
- 优化 Gemini 图片解析逻辑,递归遍历 JSON 并支持从 markdown 中提取图片
- 修复管理员角色 Claim 使用错误类型的问题,统一为 ClaimTypes.Role
- 修正图片生成失败时日志内容,输出完整响应数据以便排查
2026-01-18 17:21:07 +08:00
ccnetcore
127639c20e fix: 修正JWT角色声明类型
将 RoleClaimType 从自定义字符串改为 ClaimTypes.Role,确保角色识别与授权逻辑正确运行
2026-01-18 15:53:26 +08:00
ccnetcore
9a0dc6f089 log: 升级3.3版本 2026-01-18 14:43:35 +08:00
Gsh
0c8f01c00a fix: 支持粘贴图片 2026-01-17 17:38:54 +08:00
ccnetcore
c2f074cb08 style: 支持深色主题 2026-01-13 22:55:43 +08:00
Gsh
6b6ddcf550 fix: 充值记录支持分页查询 2026-01-11 22:00:19 +08:00
ccnetcore
d9f5f1f050 style: 修改模型选择列表 2026-01-11 21:00:02 +08:00
ccnetcore
7ed7201d10 style: 修改模型选择列表 2026-01-11 20:39:53 +08:00
Gsh
a1ddd1c3e2 fix: 模型选择优化 2026-01-11 19:42:33 +08:00
Gsh
4800543a77 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-11 19:22:16 +08:00
Gsh
4090046946 fix: 模型选择优化 2026-01-11 19:21:48 +08:00
Gsh
3a19c75ca1 fix: 模型选择优化 2026-01-11 19:07:47 +08:00
ccnetcore
a67af0485e fix: 优化 Gemini 图片 base64 获取逻辑
从最后一个 part 逆序查找 inlineData 和 text,避免只读取首个 part 导致图片缺失
支持根据 inlineData.mimeType 动态生成 data:image 前缀
增强对多 part 返回结构的兼容性,提高图片解析成功率
2026-01-11 17:27:57 +08:00
ccnetcore
5de968f6c7 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-11 14:22:12 +08:00
ccnetcore
1edb92f6e8 feat: 调整VIP商品规格并下架2026限时尊享包
- 将 YiXinVip 6个月 改为 5个月方案,更新价格与枚举值
- 下架 2026 元旦限购的尊享包商品(注释保留定义)
2026-01-11 14:22:02 +08:00
Gsh
2b9bbca400 fix: ai应用侧边栏调整 2026-01-11 14:21:06 +08:00
Gsh
3bd1a977f7 fix: 联系客服优化 2026-01-11 14:13:43 +08:00
Gsh
d2b5704294 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-11 14:08:04 +08:00
Gsh
611c5ce59a fix: 对话列表折叠状态修复 2026-01-11 14:07:05 +08:00
ccnetcore
fc61b67fc0 feat: 模型列表返回中新增供应商名称字段
在模型列表查询中增加 ProviderName 字段,并在 ModelGetListOutput DTO 中暴露,用于按供应商(如 OpenAI、Anthropic 等)分组展示模型。
2026-01-11 13:57:05 +08:00
ccnetcore
a2da4c36fe feat: 模型列表返回中新增图标地址字段
在模型列表 DTO 中新增 IconUrl 属性,并在 AiChatService 查询映射时返回模型图标地址,支持前端展示模型图标。
2026-01-11 13:53:33 +08:00
ccnetcore
5e37859157 feat: 流式处理统一返回用户/系统内容并完善消息存储
引入 StreamProcessResult 统一封装流式处理结果,补充各 API 类型下用户输入与系统输出内容的提取与累计,用于会话消息持久化与用量统计;同时增强 Gemini 请求与响应内容解析能力,确保流式场景下消息与 token 使用数据完整一致。
2026-01-11 13:48:20 +08:00
Gsh
6f316d3e51 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-11 01:04:04 +08:00
Gsh
53d70ef9d7 fix: 对话格式兼容改造 2026-01-11 01:03:24 +08:00
ccnetcore
a9a9e45b7c feat: 聊天模型查询不再限制 Completions 接口类型
移除对 ModelApiType 为 Completions 的过滤条件,使聊天服务可使用更多类型的模型配置。
2026-01-11 01:03:05 +08:00
ccnetcore
629012d32a feat: 聊天模型查询不再限制 Completions 接口类型
移除对 ModelApiType 为 Completions 的过滤条件,使聊天服务可使用更多类型的模型配置。
2026-01-10 15:42:22 +08:00
ccnetcore
5f2133eb50 feat: 账户充值记录查询支持分页与条件筛选
为已登录账户的充值记录查询新增分页能力,支持按时间区间、是否免费、充值金额范围等条件筛选,并统一返回 PagedResultDto 结构,同时同步更新服务接口定义。
2026-01-10 00:56:22 +08:00
ccnetcore
ad85890907 fix: 修正 ModelApiTypeEnum 中 OpenAI 描述拼写错误 2026-01-10 00:41:19 +08:00
ccnetcore
87518af562 feat: 新增统一流式转发与统计能力,支持多API类型
新增统一流式处理机制,支持 Completions、Anthropic Messages、OpenAI Responses、Gemini GenerateContent 四种 API 的原封不动 SSE 转发
统一处理 token 用量统计、倍率计算、尊享包扣费与消息记录
新增统一发送接口 ai-chat/unified/send,支持从请求体自动解析模型 ID
提升多模型流式接入的一致性与扩展性
2026-01-10 00:22:57 +08:00
Gsh
62b26bc2a4 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-09 20:33:13 +08:00
Gsh
f237137791 fix: 模型库页面优化 2026-01-09 20:30:35 +08:00
Gsh
0d4d847e08 fix: 模型库页面优化 2026-01-09 20:27:00 +08:00
Gsh
12f1854d31 fix: 模型库页面优化 2026-01-09 17:39:31 +08:00
Gsh
73f5d43ada fix: 产品弹窗优化 2026-01-09 17:26:10 +08:00
Gsh
551122de10 fix: 产品弹窗优化 2026-01-09 17:06:18 +08:00
ccnetcore
d092254822 fix: 临时调整在线搜索时间参数处理
- 暂时忽略 daysAgo 动态计算逻辑
2026-01-09 00:05:51 +08:00
Gsh
1027006e63 fix: 前端联系我们、购买等优化 2026-01-08 23:55:39 +08:00
ccnetcore
2544c01e9d fix: 修复用量统计线程问题并完善搜索与Token计算逻辑
- OnlineSearch 增加 daysAgo 非法值保护,避免无效时间范围
- 修复 UsageStatistics 中 Prompt/Completion Token 为 0 时的统计异常
- 引入独立 UnitOfWork,解决流式处理下的并发与事务问题
- 确保用量统计、系统消息与尊享包扣减的原子性
- 补充前端 Element Plus 组件类型声明
- 统一并优化部分代码格式,不影响业务逻辑
2026-01-08 23:46:57 +08:00
ccnetcore
2f1f25ca37 fix: 更新免费模型默认ID
将 FreeModelId 从 DeepSeek-V3 调整为 DeepSeek-V3-0324,确保使用最新可用的免费模型配置
2026-01-08 22:39:21 +08:00
ccnetcore
5489f33d54 refactor: DateTimeTool 注入为单例依赖
为 DateTimeTool 实现 ISingletonDependency,统一生命周期管理,便于依赖注入使用
2026-01-08 22:24:56 +08:00
ccnetcore
6665d2fb2e feat: 新增日期时间工具并调整前端类型定义
新增 DateTimeTool Agent 工具,用于获取当前系统日期与时间
精简 Vue3 组件类型声明,移除未使用组件并补充容器、时间线等类型
移除无用的 VITE_BUILD_COMPRESS 环境变量声明
2026-01-08 22:22:32 +08:00
ccnetcore
b5ff6c141c feat: 联网搜索支持按时间范围过滤
- OnlineSearch 方法新增 daysAgo 参数,支持按最近天数筛选搜索结果
- 百度搜索请求增加 search_filter 时间范围(gte/lte)
- 补充相关模型与 JSON 源生成配置
- 更新工具描述,明确近期与实时信息范围
2026-01-08 22:19:36 +08:00
ccnetcore
f1e8b66689 fix: 完善AI网关与Anthropic异常处理日志信息
- 图片生成解析失败时补充错误日志,便于问题定位
- Anthropic 非流式对话异常时,根据提示词过长场景补充返回信息
- 统一并优化 Anthropic 流式与非流式异常日志格式,提升可读性
2026-01-08 22:09:42 +08:00
ccnetcore
c727aeed99 feat: 完成模型api改造 2026-01-08 21:38:36 +08:00
ccnetcore
40aa47bb1e chore: 清理组件类型定义并更新配置与版本标识
- 移除未使用的 Element Plus 组件与指令类型声明
- 新增 VITE_BUILD_COMPRESS 环境变量类型定义
- 更新首页加载动画中的版本号显示为 3.1
2026-01-07 22:27:58 +08:00
ccnetcore
40234343ff feat: 完成意心ai agent 2026-01-07 22:25:54 +08:00
ccnetcore
00a9bd00e5 perf: 调整公告加载与排序逻辑,优化有效公告优先级展示 2026-01-07 20:10:42 +08:00
chenchun
55c17211d8 fix: 为 Anthropic 聊天异常日志添加 ErrorId 并优化异常提示
在非流式与流式错误分支中生成 errorId,记录到日志并在抛出的异常中返回该 errorId,避免直接暴露完整响应内容并便于排查。调整了日志模板和异常提示文本。
2026-01-07 18:02:38 +08:00
chenchun
db7dc0e9a7 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-07 11:27:50 +08:00
chenchun
1727107190 feat: 为 Anthropic DTO 添加 signature、stop_sequence、cache_creation 和 service_tier 字段
在 Yi.Framework.AiHub.Domain.Shared/Dtos/Anthropic/AnthropicChatCompletionDto.cs 中新增字段:
- AnthropicChatCompletionDto: Signature、StopSequence(带 JsonPropertyName)
- AnthropicChatCompletionDtoContentBlock: signature(小写字段)
- AnthropicCompletionDtoUsage: CacheCreation、ServiceTier(带 JsonPropertyName)
2026-01-07 11:27:14 +08:00
ccnetcore
e680ac4cac feat: 引入基于 Redis 的每日任务配置缓存
将每日任务配置从硬编码字典改为通过 IDistributedCache 从 Redis 获取
新增默认任务配置作为兜底,在缓存不存在时自动写入
统一任务配置读取逻辑,支持后续动态调整任务等级与奖励
不影响现有任务流程与业务规则,仅增强配置灵活性
2026-01-06 22:13:18 +08:00
ccnetcore
6053899516 fix: 仅获取已启用的聊天模型
在获取聊天模型列表时新增 IsEnabled 条件过滤,避免返回未启用的模型,确保模型选择结果正确。
2026-01-05 22:19:23 +08:00
chenchun
5157eac35c fix: 修复 Anthropic TokenUsage 计算与流式响应的用量统计 2026-01-05 19:34:48 +08:00
chenchun
537104037b fix: 修复 AiGateWayManager 中 TokenUsage 判定逻辑,避免空引用
将条件从 "responseResult.Item2?.TokenUsage is not null || responseResult.Item2?.TokenUsage.TotalTokens > 0" 改为 "responseResult.Item2?.TokenUsage is not null && responseResult.Item2?.TokenUsage.TotalTokens > 0",
确保在访问 TotalTokens 之前先判空,避免 NullReferenceException 并正确记录 tokenUsage(文件:Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs)。
2026-01-05 15:58:44 +08:00
chenchun
29c1768ded feat: 兼容claude格式 2026-01-05 15:54:14 +08:00
chenchun
b4a97e8b09 feat: 完成系统监控页面 2026-01-05 15:44:48 +08:00
chenchun
6101ea46d3 fix: 获取图像模型时仅返回启用模型
在查询图像模型列表时加入 IsEnabled == true 过滤,避免返回已禁用的模型。文件:AiImageService.cs
2026-01-05 14:15:21 +08:00
chenchun
cad145f067 fix: 修复 GetProviderListAsync 查询过滤与排序,避免遗漏提供商 2026-01-05 10:29:18 +08:00
Gsh
9d8f8b3125 feat: 图片广场优化 2026-01-05 10:12:35 +08:00
Gsh
4f70356a5c feat: 图片详情优化 2026-01-05 00:32:15 +08:00
ccnetcore
69a8b47245 feat: 完善渠道商管理 2026-01-05 00:11:06 +08:00
ccnetcore
88225a97b8 feat: 调整边框 2026-01-04 23:31:16 +08:00
Gsh
c697d12f8b Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-04 22:49:09 +08:00
Gsh
7bb8f52813 feat: 失败提示 2026-01-04 22:48:36 +08:00
ccnetcore
b84f385d2d perf: 优化图片广场 2026-01-04 22:47:53 +08:00
Gsh
450e023b3b feat: 图片广场优化 2026-01-04 21:58:11 +08:00
Gsh
9f3b9fc513 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-04 21:29:07 +08:00
Gsh
9721b8bd74 feat: 图片广场优化 2026-01-04 21:15:41 +08:00
chenchun
bd30a40a6f feat: 完成图片模型单独扣费 2026-01-04 12:32:31 +08:00
Gsh
9ec9ace8e2 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-04 00:33:14 +08:00
Gsh
a437d55f9f feat: markdown移动端兼容 2026-01-04 00:32:01 +08:00
ccnetcore
d75a734bc1 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-04 00:08:24 +08:00
ccnetcore
9c058e9545 feat: 支持模型尊享标识并统一扣减尊享用量逻辑
新增模型是否为尊享的标识字段 IsPremium,并在网关层透传到模型描述。
使用模型描述中的 IsPremium 统一判断是否扣减尊享 token,用以替代多处重复的数据库查询。
同时整理了相关代码与注释,使尊享用量扣减逻辑更加集中和清晰。
2026-01-04 00:08:08 +08:00
Gsh
accbaf3ecb feat: 移动端兼容优化 2026-01-03 23:46:31 +08:00
Gsh
f8f2d7568c feat: 移动端兼容优化 2026-01-03 23:26:58 +08:00
Gsh
158226601b feat: 移动端兼容优化 2026-01-03 22:58:30 +08:00
Gsh
63aa8d9536 feat: 移动端兼容优化 2026-01-03 22:18:19 +08:00
ccnetcore
0147457329 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2026-01-03 22:09:41 +08:00
ccnetcore
1d47b26d0d feat: 更新图片存储地址并扩展图片记录返回信息
- 将图片存储服务地址由本地地址调整为线上正式地址
- 图片列表返回结果中新增 UserName、UserId、IsAnonymous 字段,完善用户相关信息返回
2026-01-03 22:09:30 +08:00
Gsh
cc1bc6dd82 feat: 图片广场优化 2026-01-03 22:07:20 +08:00
ccnetcore
922596c128 Merge branch 'ai-agent' into ai-hub
# Conflicts:
#	Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs
2026-01-03 21:31:09 +08:00
ccnetcore
67cb142c07 stlyle: 发布3.0版本 2026-01-03 21:24:44 +08:00
Gsh
f164b7dccc feat: 图片广场优化 2026-01-03 20:53:17 +08:00
Gsh
6cc14c1e32 feat: 图片广场优化 2026-01-03 19:21:26 +08:00
ccnetcore
e992cfc928 fix: 修复类型映射问题 2026-01-03 18:19:52 +08:00
Gsh
42edd4c230 feat: 路由动态权限控制、图片广场优化 2026-01-03 17:04:34 +08:00
ccnetcore
3892ff1937 feat: 完成匿名字段功能 2026-01-03 16:17:57 +08:00
ccnetcore
12878ba022 feat: 完成条件 2026-01-03 16:00:18 +08:00
Gsh
a3259ad36f feat: 前端新增图片生成功能 2026-01-03 15:16:18 +08:00
ccnetcore
5bb7dfb7cd feat: token 下拉列表支持可选是否包含默认项
为 GetSelectListAsync 接口新增 includeDefault 查询参数,允许调用方控制是否返回“默认”选项,默认保持原有行为。
2026-01-03 14:39:17 +08:00
ccnetcore
3447e2dc5d refactor: 清理无用代码并统一网关处理逻辑
- 移除未使用的 using 和多余空行,优化代码可读性
- 统一 yi- 前缀模型名处理逻辑,减少重复代码
- 使用 EnsureSuccessStatusCode 简化图片上传错误处理流程
- 不影响现有功能,仅做代码结构和规范优化
2026-01-03 14:07:04 +08:00
ccnetcore
88fae0cdc2 fix: 优化图片生成与上传错误处理及任务信息返回
- 图片上传接口新增状态码校验,返回明确错误信息
- 图片生成任务失败时记录完整错误信息与堆栈
- 图片任务查询结果补充发布状态、分类及错误信息
- 网关层模型名规范化与少量代码格式优化
2026-01-03 14:03:24 +08:00
ccnetcore
f7ebe44fb6 fix: 修复 SSE 事件前缀重复写入问题
注释掉重复写入 EventPrefix 的代码,避免 SSE 响应中事件类型前缀重复,确保事件格式正确。
2026-01-03 12:49:32 +08:00
ccnetcore
5a7f0ab108 feat: 支持更多类型的图片模型 2026-01-03 03:19:31 +08:00
ccnetcore
be5f57f654 feat: 完成渠道商限制 2026-01-03 02:58:21 +08:00
ccnetcore
a6e7a5e906 feat: 完成渠道商拦截 2026-01-03 02:20:52 +08:00
ccnetcore
c4ab176089 style: 优化整体title显示 2026-01-03 02:15:28 +08:00
ccnetcore
a50f877964 style: 优化控制台样式 2026-01-03 01:54:22 +08:00
ccnetcore
28cdc29369 fix: 修复图片模型会员标识判断逻辑
将 IsPremiumPackage 的判断从使用 PremiumPackageConst.ModeIds 改为直接读取模型的 IsPremium 属性,避免因配置不一致导致会员标识错误。
2026-01-03 01:46:40 +08:00
ccnetcore
e39cbaf5e7 fix: 修复模型为空问题 2026-01-03 01:45:27 +08:00
ccnetcore
9d1dd72584 style: 优化滚动条样式 2026-01-03 01:29:47 +08:00
ccnetcore
ea403fcae0 feat: 新增错误信息返回 2026-01-03 01:12:47 +08:00
ccnetcore
91533909c2 style: 优化滚动条样式 2026-01-03 01:10:04 +08:00
ccnetcore
61d5d40dbb chore: 暂时禁用多个定时任务执行逻辑
在相关 Job 的 DoWorkAsync 方法中提前 return,防止自动执行挖矿、行情生成、新闻生成及资产更新等后台任务运行。
2026-01-03 00:03:23 +08:00
ccnetcore
38dbd0aca7 Merge remote-tracking branch 'origin/ai-agent' into ai-agent 2026-01-03 00:00:25 +08:00
ccnetcore
343347ea11 feat: 新增图片广场、发布及模型查询接口
- 图片任务列表区分为“我的任务”和“图片广场(已发布)”
- 新增图片发布到广场接口,支持分类
- 新增图片模型列表查询接口
- 注释掉图片 Base64 前缀字段,统一使用 URL
- 调整相关依赖注入,支持模型仓储查询
2026-01-03 00:00:17 +08:00
Gsh
a9e11d161c fix: 前端页面架构重构优化 2026-01-02 23:08:40 +08:00
Gsh
d25ca6dc4a fix: 前端页面架构重构优化 2026-01-02 22:47:09 +08:00
ccnetcore
ba95d1798f feat: 优化AI图片存储与访问流程
- 统一图片存储服务地址常量,返回完整可访问URL
- 图片上传接口支持匿名访问,并按日期创建存储目录
- ImageStoreTask 移除无用生成图片 Base64 字段,调整大字段存储配置
- 创建图片任务时补充 ModelId 信息
- 优先使用 Authorization 头部,避免覆盖已有认证信息
- 前端补充 Element Plus Descriptions 组件类型声明
2026-01-02 21:32:48 +08:00
ccnetcore
436b5b910c Merge branch 'ai-agent-backend' into ai-agent
# Conflicts:
#	Yi.Ai.Vue3/src/pages/console/index.vue
#	Yi.Ai.Vue3/src/routers/modules/staticRouter.ts
2026-01-02 19:45:55 +08:00
ccnetcore
560a76558a feat: 完成图片生成功能 2026-01-02 19:26:09 +08:00
ccnetcore
d7f4e49c2a fix: 统一处理 yi- 前缀模型并修正统计与计费记录
- 调用模型前去除 yi- 前缀,避免实际请求模型不匹配
- 存储消息、使用量统计及尊享套餐扣减统一使用原始模型ID
- 尊享套餐常量新增 gpt-5.2、gemini-3 等模型
- 前端补充 Element Plus ElSubMenu 类型声明
2026-01-02 00:57:30 +08:00
ccnetcore
a1be2bebf7 feature: 优化排序 2026-01-02 00:51:05 +08:00
ccnetcore
3f53eb14ab chore: 添加 OpenAI NuGet 依赖
在 Stock.Domain 项目中引入 OpenAI 2.8.0 包,为后续 AI 能力集成做准备
2026-01-01 22:39:55 +08:00
ccnetcore
e46044e217 chore: 添加 OpenAI NuGet 依赖到 ChatHub Domain 模块 2026-01-01 22:36:24 +08:00
ccnetcore
80dcd76749 fix: 修复删除 2026-01-01 22:14:10 +08:00
Gsh
9c842ab802 fix: 前端页面架构重构优化 2026-01-01 18:53:27 +08:00
Gsh
b8c0f9a212 fix: 前端页面架构重构优化 2026-01-01 18:53:27 +08:00
ccnetcore
6cc0059691 Revert "feat: 支持尊享包渠道"
This reverts commit 70ae2fab44.
2026-01-01 18:53:26 +08:00
ccnetcore
33d28a8cb0 feat: 支持尊享包渠道 2026-01-01 18:53:26 +08:00
Gsh
e4621d9049 fix: 前端页面架构重构初版 2026-01-01 18:53:25 +08:00
ccnetcore
953fbc043b feat: 完成渠道商管理支持 2026-01-01 18:25:43 +08:00
ccnetcore
c649ad31c2 fix: 修正2026元旦限购礼包的Token数量配置 2026-01-01 12:15:28 +08:00
ccnetcore
50fc8c5f0a feat: 新增活动激活码礼包与2026元旦限购商品
- 新增 888w、666w、100w 尊享Token 活动激活码礼包
- 新增 2026 元旦限购 1亿 / 2亿 Tokens 商品
- 调整原 1亿 Tokens 商品展示文案
2026-01-01 12:13:14 +08:00
chenchun
64bc65114a feat: 完成渠道商管理+尊享模型替换+v1前缀兼容 2026-01-01 00:44:02 +08:00
Gsh
ae9d778ac7 fix: 前端页面架构重构优化 2025-12-31 01:05:33 +08:00
Gsh
77a9a64a41 fix: 前端页面架构重构优化 2025-12-31 01:05:33 +08:00
ccnetcore
19ea76bd60 feat: 新增 gpt-5.2-codex 高级套餐模型支持 2025-12-31 00:20:36 +08:00
ccnetcore
0c31b97824 Revert "feat: 支持尊享包渠道"
This reverts commit 70ae2fab44.
2025-12-31 00:10:44 +08:00
ccnetcore
70ae2fab44 feat: 支持尊享包渠道 2025-12-31 00:02:25 +08:00
Gsh
411a9058ca fix: 前端页面架构重构初版 2025-12-28 22:45:23 +08:00
ccnetcore
4b9f845fae feat: 激活码与VIP充值支持按天计费
- 新增 VIP 天数概念,支持月数与天数组合计算过期时间
- 激活码商品新增 VipDays 配置,并新增 1 天会员试用组合包
- VIP 充值统一按天数计算(1 个月 = 31 天),兼容原有逻辑
- 激活码兑换时支持仅天数或天月组合的 VIP 充值
2025-12-28 17:44:33 +08:00
ccnetcore
bdaa53bac8 fix: 记录使用量与错误信息时保留原始模型ID
在模型别名(yi-)转换场景下,统一使用 sourceModelId 记录消息、用量统计及异常信息,避免因模型ID被覆盖导致统计与日志不准确。
2025-12-28 01:04:58 +08:00
ccnetcore
e5b81c08f3 fix: Claude模型请求前纠正 yi- 前缀处理顺序
在调用 Anthropic ChatCompletion 之前统一去除 yi- 模型前缀,避免传递错误的 model 参数导致请求异常
2025-12-27 23:53:25 +08:00
ccnetcore
1ffab89e97 refactor: 调整 Claude 系列模型常量命名规则
统一 Claude 模型标识前缀为 yi-,去除旧的 -nx 后缀,保持与当前命名规范一致,不影响功能逻辑
2025-12-27 23:50:53 +08:00
ccnetcore
5440b226c4 fix: 修正 yi- 模型前缀截取逻辑错误
统一将模型 ID 和请求 Model 的前缀去除逻辑由错误的尾部截取改为正确的从索引 3 开始截取,避免模型名称被截断导致调用异常
2025-12-27 23:49:35 +08:00
ccnetcore
90c6022839 fix: 修正模型名称规范化逻辑由去除后缀改为处理 yi- 前缀 2025-12-27 23:44:45 +08:00
ccnetcore
184467e482 fix: 处理 Anthropic 模型名称带 -nx 后缀的情况 2025-12-27 23:21:49 +08:00
ccnetcore
68045d6458 feat: 高级套餐模型常量新增 Claude 4.5 系列支持 2025-12-27 23:02:43 +08:00
ccnetcore
d52f17a17b fix: 统一处理模型 ID 的 -nx 后缀
在网关层对模型 ID 进行规范化处理,自动移除结尾的 -nx 后缀,避免因不同写法导致的模型识别或兼容性问题。
2025-12-27 22:50:36 +08:00
ccnetcore
047937af4c feat: 完成图片异步生成 2025-12-26 23:46:36 +08:00
chenchun
a9267bfc0e docs: 修改 GeminiGenerateContentAcquirer 注释,说明图片 URL 包含前缀
更正注释中关于图片 URL 的描述,由“不包含前缀”改为“包含前缀”,以匹配方法实际返回值。
文件:Yi.Framework.AiHub.Domain.Shared/Dtos/Gemini/GeminiGenerateContentAcquirer.cs
2025-12-26 18:36:55 +08:00
chenchun
1019fd685b refactor: 重命名 ReferenceImageUrls 为 ReferenceImageBase64 并更新注释
- 文件:Yi.Framework.AiHub.Domain/Entities/Chat/ImageStoreTaskAggregateRoot.cs
- 变更:将属性 ReferenceImageUrls 重命名为 ReferenceImageBase64,注释由“参考图Url”改为“参考图Base64”(保留 SugarColumn(IsJson = true))。
- 原因:语义修正,字段实际存放的是图片的 Base64 字符串而非 URL。
- 影响与注意事项:
  - 为破坏性修改,所有引用该属性的代码(DTO、映射配置、序列化、前端/后端调用等)需同步更新。
  - 若有基于属性名的持久化映射或外部契约(JSON 字段名、数据库列名等),请确认并必要时调整映射或做兼容处理。
  - 建议全项目搜索替换旧名称并运行测试以确保无遗漏。
2025-12-26 18:32:41 +08:00
chenchun
34246d8a62 feat: 新增功能
- 移除 OpenApiService.GenerateContentAsync 的 isAsync 查询参数及其分支处理(不再在该接口直接创建并返回 ImageStore 任务 Id)。
- 保留 alt=sse 的代理处理逻辑。
- 在 ImageStoreTaskAggregateRoot 中新增字段:
  - Prompt:提示词(大文本)
  - ReferenceImageUrls:参考图 URL 列表(JSON 存储)
- 兼容性提示:接口去掉了 isAsync 参数,调用方需相应调整异步任务创建流程。
2025-12-26 18:29:47 +08:00
ccnetcore
599b6335d5 feat: 准备构建图片生成 2025-12-25 23:25:54 +08:00
chenchun
46bc48d1c1 feat: 新增获取指定日期各模型Token统计接口
- 在 AiAccountService 中新增 TokenStatisticsInput DTO 与 POST /account/token-statistics 接口(GetTokenStatisticsAsync),用于按模型统计指定日期的 token 使用量、调用次数并计算成本,返回文本摘要。
- 注入 MessageAggregateRoot 仓储(_messageRepository),使用 SqlSugar 聚合查询(Sum/Count),按 modelId 与日期范围过滤,并只统计 role == "system" 的记录。
- 成本计算逻辑:根据输入的模型 1 亿 token 成本与实际 token 数计算每 1 亿 token 成本;同时输出调用次数与 token(单位万)。
- 接口权限与入参校验:仅允许 CurrentUser.UserName 为 "Guo" 或 "cc" 访问;必须提供 ModelCosts 配置。
- 添加的引用:SqlSugar、System.Globalization、System.Text、Yi.Framework.AiHub.Domain.Entities.Chat。
2025-12-25 18:01:13 +08:00
chenchun
17675e702d feat: 在 PremiumPackageConst 中添加 glm-4.7 2025-12-25 12:00:25 +08:00
Gsh
639c683144 fix: 修复兑换中心偶尔无法打开问题 2025-12-24 23:39:23 +08:00
Gsh
96a21210b5 fix: 模型库页面移动端适配 2025-12-24 23:39:22 +08:00
ccnetcore
7495dc86a0 fix: 修复agent报错问题 2025-12-24 22:51:18 +08:00
chenchun
ee4cb20eef feat: 完成agent功能 2025-12-24 14:17:32 +08:00
chenchun
9ca3cd0b1a style: 格式化 ChatManager.cs 的参数与空白,调整换行
- 对构造函数参数、局部变量赋值和方法内空白进行了排版调整(换行与缩进、空格规范化)。
- 删除/添加了一些空行以提高可读性。
- 未修改任何业务逻辑或行为,仅代码样式层面的变更。
2025-12-24 12:20:09 +08:00
chenchun
eb6ec06157 feat: 完成agent接口功能 2025-12-24 12:18:33 +08:00
ccnetcore
62940ae25a feat: 完成agent接口 2025-12-24 00:22:46 +08:00
chenchun
dfc143379f fix: 调整 OpenAI 客户端配置并更新在线搜索返回值
- ChatManager.cs
  - 添加/调整相关 using 引用,修正 modelId 为 "gpt-5.2",并更新 agent 创建方式以匹配当前 SDK/服务端使用。
  - 保留代理示例注释(HttpClient.DefaultProxy)。
- OnlineSearchTool.cs
  - 将占位返回值 "xxx" 替换为示例查询结果 "奥德赛第一中学学生会会长是:郭老板"。

简短修正以确保与服务端模型命名及功能返回一致。
2025-12-23 17:40:00 +08:00
chenchun
bd3a9a5ce8 feat: 新增功能
- ChatManager:
  - 引入 System.Text.Json,用于将 agent thread 序列化与反序列化(示例:thread.Serialize(...) -> JsonSerializer.Deserialize -> agent.DeserializeThread)。
  - 增加示例:创建 OpenAIClient、初始化 agent、运行流式响应并处理更新。
  - 小幅格式和空行调整。
- AiChatService:
  - 为 Agent 发送接口 PostAgentSendAsync 增加注释与路由标记 HttpPost("ai-chat/agent/send")。

注意:提交中出现了硬编码的 API Key,请尽快改为从配置或机密管理中读取以防泄露。
2025-12-23 17:29:07 +08:00
chenchun
ec4fdc39fe feat: 新增agent接口 2025-12-23 17:08:42 +08:00
ccnetcore
3c3e134d2b Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-12-23 00:49:25 +08:00
ccnetcore
81089cc058 feat: 新增工具调用 2025-12-23 00:49:17 +08:00
Gsh
681194a517 feat:聊天tool前端入口 2025-12-23 00:15:32 +08:00
ccnetcore
8f515f76c0 feat: 新增tools接口 2025-12-22 00:17:10 +08:00
ccnetcore
fcb74eb28c feat: 新增10wtoken包 2025-12-20 13:30:38 +08:00
ccnetcore
44afdaef8e style: 升级2.9功能 2025-12-20 11:38:57 +08:00
ccnetcore
41c55d088d style: 升级2.9功能 2025-12-20 11:33:40 +08:00
ccnetcore
3b71fe3135 feat: 完成激活码兑换功能 2025-12-20 11:33:07 +08:00
chenchun
4326c41258 fix: 为领奖与兑换流程添加分布式锁,防止并发重复操作
- 在 DailyTaskService 与 ActivationCodeService 中引入 Medallion.Threading。
- 通过 LazyServiceProvider 获取 IDistributedLockProvider(DistributedLock 属性)。
- 在 ClaimTaskRewardAsync(DailyTaskService)和 RedeemAsync(ActivationCodeService)中使用 AcquireLockAsync 加锁(基于 userId / activation code),用于自旋等待、防抖,避免并发导致的重复发放或重复兑换问题。
2025-12-19 16:13:23 +08:00
chenchun
7f0d57b311 feat: 完成激活码功能 2025-12-19 14:16:59 +08:00
chenchun
75c208dafc feat: 完成激活码功能 2025-12-19 13:50:30 +08:00
chenchun
8021ca9eff perf: 优化封装 2025-12-19 12:58:57 +08:00
chenchun
2cf06a5677 perf: 优化订单创建逻辑 2025-12-19 11:53:17 +08:00
chenchun
2fa42cd8a3 fix: 修复 PremiumPackageConst 中的包名错误
将 "gpt-5.2-codex-high" 更正为 "gpt-5.2-codex-xhigh"。
2025-12-19 11:10:09 +08:00
chenchun
a600eb9e7e feat: 新增 gpt-5.2-codex-high 到 PremiumPackageConst
在 Yi.Framework.AiHub.Domain.Shared/Consts/PremiumPackageConst.cs 的常量数组中添加模型标识 "gpt-5.2-codex-high",并补上前一项缺失的逗号以保证语法正确。
2025-12-19 11:02:16 +08:00
ccnetcore
fcf0fd7f70 feat: 全面支持geminicli 2025-12-17 21:51:01 +08:00
chenchun
4e421c160c feat: 新增gemini支持 2025-12-17 18:47:28 +08:00
chenchun
340e2016d6 Merge remote-tracking branch 'origin/ai-hub' into ai-hub
# Conflicts:
#	Yi.Ai.Vue3/index.html
2025-12-17 16:10:05 +08:00
chenchun
5dfaead60e style: 更新版本描述 2025-12-17 16:09:36 +08:00
chenchun
c8acb12e4a style: 更新版本描述 2025-12-17 16:09:32 +08:00
chenchun
5fbcb8cbd9 style: 更新版本描述 2025-12-17 16:09:21 +08:00
chenchun
fd8d4399d3 perf: 优化markdown输出 2025-12-17 16:03:03 +08:00
chenchun
6f1efafd86 feat: 发布2.8版本 2025-12-17 12:10:24 +08:00
Gsh
2714a507d9 fix: 文件上传提示优化、element-plus-x版本回退 2025-12-16 22:54:43 +08:00
Gsh
9a9230786b fix: [临时方案]修复因element-plus-x 1.3.98 中Conversations组件销毁问题出现的布局路由缺陷 2025-12-16 22:00:15 +08:00
ccnetcore
4a8b58a65c build: 构建 2025-12-16 21:12:05 +08:00
ccnetcore
7d81f88658 feat: 完成包兼容 2025-12-16 21:08:26 +08:00
ccnetcore
0ce3c0bbdd feat:完成2.8 2025-12-15 23:59:04 +08:00
Gsh
981235e6e9 fix: 购买提示词优化 2025-12-15 21:28:24 +08:00
Gsh
d0ecb232a1 fix: 升级markdown包 2025-12-15 13:46:18 +08:00
Gsh
c7a52604e7 fix: 右上角导航优化 2025-12-14 21:34:20 +08:00
Gsh
da81b2d8a3 fix: 文件上传优化 2025-12-14 18:55:46 +08:00
ccnetcore
7b14fdd8de feat: 完成多message存储 2025-12-14 13:07:44 +08:00
ccnetcore
1fc2734eb7 feat: 新增忽略文件 2025-12-14 13:01:02 +08:00
ccnetcore
f3bef72ebb fix: 修复优惠 2025-12-14 11:43:21 +08:00
ccnetcore
7e6d2e829b feat: 修改优惠订单 2025-12-14 11:38:08 +08:00
Gsh
944626960b fix: 网页版增加对话文件支持 2025-12-14 00:54:34 +08:00
Gsh
c073868989 fix: 网页版增加对话图片支持 2025-12-13 18:09:12 +08:00
ccnetcore
d2981100fa feat: 支持gpt-5.2 2025-12-12 21:14:38 +08:00
chenchun
ce4f7e5711 refactor: 将 AnthropicInput.Messages 类型由 JsonElement? 更改为 IList<AnthropicMessageInput>
使用强类型消息集合,便于序列化与校验。
2025-12-12 09:40:24 +08:00
ccnetcore
cc812ba2cb Merge branch 'abp' into ai-hub 2025-12-11 23:33:33 +08:00
ccnetcore
8a6e5abf48 fix: 修复token鉴权 2025-12-11 23:32:57 +08:00
ccnetcore
8b191330b8 Revert "fix: 仅从 Query 获取 access_token/refresh_token,简化 OnMessageReceived 逻辑"
This reverts commit 0d2f2cb826.
2025-12-11 23:31:29 +08:00
Gsh
5ed79c6dd0 fix: vip取值优化 2025-12-11 21:47:48 +08:00
Gsh
6e2ca8f1c3 fix: 2.7 模型库优化 2025-12-11 21:35:32 +08:00
ccnetcore
a46a552097 feat: 完成模型库优化 2025-12-11 21:12:29 +08:00
chenchun
53e56134d4 Merge branch 'abp' into codex 2025-12-11 17:45:04 +08:00
chenchun
0d2f2cb826 fix: 仅从 Query 获取 access_token/refresh_token,简化 OnMessageReceived 逻辑
- 修改文件:Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs
- 将 JwtBearerEvents.OnMessageReceived 的上下文参数名改为 messageContext,统一变量名。
- 简化 Token 获取逻辑:只从 request.Query 中读取 access_token 与 refresh_token,移除从 Cookies(Token)和请求头(refresh_token)读取的分支。
2025-12-11 17:41:38 +08:00
chenchun
f90105ebb4 feat: 全站优化 2025-12-11 17:33:12 +08:00
chenchun
67ed1ac1e3 fix: 聊天模型列表仅返回 OpenAi 类型
在 Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/AiChatService.cs 中,为查询添加了 .Where(x => x.ModelApiType == ModelApiTypeEnum.OpenAi) 过滤,确保只返回 ModelType 为 Chat 且 ModelApiType 为 OpenAi 的模型,避免将非 OpenAi 的模型纳入聊天模型列表。
2025-12-11 17:17:35 +08:00
chenchun
69b84f6613 feat: 完成openai响应接口 2025-12-11 17:16:21 +08:00
ccnetcore
433d616b9b feat: 支持codex 2025-12-11 01:17:31 +08:00
chenchun
53aa575ad4 Merge branch 'abp' into ai-hub 2025-12-10 15:54:50 +08:00
chenchun
571df74c43 chore: 在 common.props 添加 SatelliteResourceLanguages=en;zh-CN
在 Yi.Abp.Net8/common.props 中新增 SatelliteResourceLanguages 属性,指定生成卫星资源语言为 en 和 zh-CN,以便打包对应的本地化资源。
2025-12-10 15:53:18 +08:00
chenchun
b7847c7e7d feat: 发布2.6版本 2025-12-10 15:14:45 +08:00
chenchun
94eb41996e Merge branch 'abp' into ai-hub 2025-12-10 15:11:44 +08:00
chenchun
cefde6848d perf: 去除35MB又臭又大的腾讯云sdk 2025-12-10 15:10:54 +08:00
chenchun
381b712b25 feat: 完成模型库功能模块 2025-12-10 15:08:16 +08:00
Gsh
c319b0b4e4 fix: 模型库优化 2025-12-10 01:34:40 +08:00
ccnetcore
1a32fa9e20 feat: 支持多选模型库条件 2025-12-10 00:31:14 +08:00
Gsh
909406238c fix: 模型库前端布局优化 2025-12-09 23:38:11 +08:00
chenchun
54a1d2a66f feat: 完成模型库 2025-12-09 19:11:30 +08:00
chenchun
8dcbfcad33 feat: 同步商品价格 2025-12-08 14:08:01 +08:00
ccnetcore
f64fd43951 Merge branch 'abp' into ai-hub 2025-12-07 18:50:37 +08:00
ccnetcore
551597765c perf: 优化sqlsguar分页查询 2025-12-07 18:50:02 +08:00
Gsh
bfda33280a fix: 图标显示优化 2025-12-05 23:32:59 +08:00
chenchun
8d0411f1f4 feat: 完成codefirst 2025-12-04 16:38:37 +08:00
chenchun
3995d4acab Merge branch 'token' into ai-hub 2025-12-04 16:35:17 +08:00
chenchun
6ff5727156 feat: 发布新版 2025-12-04 16:34:58 +08:00
chenchun
f654386dfe feat: 发布新版 2025-12-04 16:33:17 +08:00
chenchun
c03ef82643 feat:完成多token分发 2025-12-04 16:32:30 +08:00
Gsh
525545329b fix: 多api密钥增加分页 2025-11-30 00:04:33 +08:00
Gsh
755cb6f509 feat: 优化token用量查看 2025-11-29 23:44:38 +08:00
Gsh
55469708f0 feat: 新增多token用量查看 2025-11-29 23:29:54 +08:00
ccnetcore
94c52c62fe style: 修改token描述 2025-11-29 18:33:39 +08:00
ccnetcore
37b4709d76 feat: 新增token默认分组 2025-11-29 18:28:42 +08:00
ccnetcore
86555af6ce feat: 完成token下拉框 2025-11-29 18:25:43 +08:00
Gsh
ddb00879f4 feat: 新增多token功能 2025-11-29 17:35:17 +08:00
chenchun
2d0ca08314 feat: 新增功能 启动时初始化 AiHub 的 Message、Token、UsageStatistics 聚合根表并添加相应命名空间 2025-11-27 19:23:44 +08:00
chenchun
b78ecf27d5 feat: 完成token功能 2025-11-27 19:01:16 +08:00
Gsh
02a5f69958 feat: 前端2.4版本 2025-11-26 21:20:14 +08:00
Gsh
cf5bf746ef feat: 模型尊享标识优化 2025-11-25 22:14:48 +08:00
chenchun
0a5e40ee25 feat: 新增 PremiumPackageConst 模型 gpt-5.1-codex-max
在 Yi.Framework.AiHub.Domain.Shared/Consts/PremiumPackageConst.cs 的 premiumModels 列表中添加 "gpt-5.1-codex-max"(并补上末尾换行)。
2025-11-25 14:18:06 +08:00
chenchun
51a266ef58 feat: 在 PremiumPackageConst 中新增 claude-opus-4-5-20251101
文件:Yi.Framework.AiHub.Domain.Shared/Consts/PremiumPackageConst.cs
说明:向 premium package 列表中添加新模型标识 claude-opus-4-5-20251101,以支持该付费包。
2025-11-25 12:42:44 +08:00
chenchun
1f0901c90c feat: 新增功能
- 更新 PremiumPackageConst.ModeIds,新增支持的模型 ID:
  - claude-haiku-4-5-20251001
  - gemini-3-pro-preview
- 文件:Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain.Shared/Consts/PremiumPackageConst.cs
- 目的:扩展可识别的 premium 模型列表,便于后续对新模型的支持与路由处理

注意:修改后需重新编译并在相关使用处确认新模型 ID 的兼容性。
2025-11-25 10:57:08 +08:00
chenchun
a725c06396 fix: 移除对 Usage.TotalTokens 的空检查,始终按 multiplier 四舍五入并赋值
移除 TotalTokens 的 null 判断,避免保留 null 值,统一将其按 multiplier 四舍五入后赋为整数,防止后续使用出现空值异常。
2025-11-25 10:19:11 +08:00
chenchun
54547f0d7c fix: 缩放 ThorChatCompletionsResponse.Usage.TotalTokens 按 multiplier
当 Usage.TotalTokens 不为 null 时,按 multiplier 进行四舍五入缩放;与 PromptTokens/CompletionTokens 的缩放逻辑保持一致,修复 TotalTokens 未被缩放的问题。
2025-11-25 10:18:45 +08:00
chenchun
afe9c8bcae feat: 新增模型列表 IsPremiumPackage 字段并在 AiChatService 中设置
- 在 Yi.Framework.AiHub.Application.Contracts.Dtos.ModelGetListOutput 中新增 bool 属性 IsPremiumPackage。
- 在 Yi.Framework.AiHub.Application.Services.Chat.AiChatService 的模型映射中设置该属性,判断逻辑为 PremiumPackageConst.ModeIds.Contains(x.ModelId)。
- 便于前端区分并展示“尊享包”模型。
2025-11-25 09:59:31 +08:00
chenchun
688d93e5c1 feat: 完成倍率的配置化 2025-11-25 09:54:13 +08:00
chenchun
4c65b2398d fix: 将默认 max_tokens 从 100000 调整为 64000
将 Yi.Framework.AiHub.Domain/AiGateWay/Impl/ThorClaude/Chats/ClaudiaChatCompletionsService.cs 中对外请求的默认 max_tokens 值由 100000 降为 64000。

原因:避免超出模型/服务允许的 token 限制或引发资源/性能异常;仍然允许通过 input.MaxTokens 显式覆盖该默认值。已在本地构建并用简单请求验证变更生效。
2025-11-24 17:42:18 +08:00
chenchun
41435f1aa3 feat: 兼容maxtoken问题 2025-11-24 09:42:40 +08:00
chenchun
20206bbc44 fix: 调整 ThorClaude 聊天默认 max_tokens 从 2048 到 100000
修改文件:
Yi.Framework.AiHub.Domain/AiGateWay/Impl/ThorClaude/Chats/ClaudiaChatCompletionsService.cs

说明:
- 将默认 max_tokens 由 2048 提高到 100000,避免长回复被截断,提升对大输出场景的支持。
- 修改可能影响请求的响应长度与资源消耗,请确认后端/模型能够支持该上限并监控性能与计费变化。
2025-11-20 10:20:19 +08:00
chenchun
f2dc0d1825 fix: 仅对 gpt-5.1-chat 设置 MaxCompletionTokens,gpt-5-mini 单独处理 Temperature/TopP
将原先同时匹配 gpt-5.1-chat 与 gpt-5-mini 的处理拆分为两段:
- gpt-5.1-chat:仍将 MaxTokens 映射到 MaxCompletionTokens,并清空 Temperature/TopP。
- gpt-5-mini:只清空 Temperature/TopP,不再修改 MaxTokens/MaxCompletionTokens。

修复了为 gpt-5-mini 不当设置 MaxCompletionTokens 的问题。
2025-11-18 14:35:58 +08:00
chenchun
51b4d1b072 fix: 请求处理中同时重置 MaxTokens 避免与模型不兼容
在 YiFrameworkAiHubDomainModule 的请求处理器中,当清除 Temperature 与 TopP 时一并将 request.MaxTokens 设为 null,防止在不支持该参数的模型上出现错误或参数冲突。文件:Yi.Framework.AiHub.Domain/YiFrameworkAiHubDomainModule.cs。
2025-11-18 14:33:58 +08:00
chenchun
9180799e4e feat: 为 gpt-5-mini 与 databricks-claude-sonnet-4 添加请求特殊处理 2025-11-18 11:36:18 +08:00
chenchun
9788b9182b fix: 区分 gpt-5.1-chat 与 o1 的请求参数清理逻辑
将原先在同一处理器中对 gpt-5.1-chat 与 o1 一并清除 Temperature/TopP 的逻辑拆分为两个处理器:
- gpt-5.1-chat:清除 Temperature 与 TopP
- o1:仅清除 Temperature

文件:Yi.Framework.AiHub.Domain/YiFrameworkAiHubDomainModule.cs

目的:恢复/调整对不同模型的期望处理,避免对 o1 不必要地清除 TopP。
2025-11-18 11:26:05 +08:00
chenchun
260b9a4795 feat: 支持 gpt-5.1-chat 模型的特殊处理
- 将模型判断从仅 "o1" 扩展为 "gpt-5.1-chat" 或 "o1",对这些模型将 Temperature 置为 null。
- 微调了 User-Agent 字符串的空格并做了小范围的格式清理(增加空行以提升可读性)。
2025-11-18 10:39:34 +08:00
chenchun
9380e3daa8 Merge branch 'card-flip' into ai-hub 2025-11-18 10:27:53 +08:00
chenchun
bb894e14a4 Merge remote-tracking branch 'origin/card-flip' into card-flip
# Conflicts:
#	Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Repositories/SqlSugarRepository.cs
2025-11-17 11:22:44 +08:00
chenchun
b492d82442 Merge branch 'abp' into card-flip
# Conflicts:
#	Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore.Abstractions/DbConnOptions.cs
#	Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Repositories/SqlSugarRepository.cs
#	Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Caches/FileCacheItem.cs
#	Yi.Abp.Net8/src/Yi.Abp.Web/appsettings.json
2025-11-17 11:21:14 +08:00
chenchun
5eaffe2ec2 feat: 新增更新并发乐观锁配置与支持
- 在 DbConnOptions 新增 EnabledConcurrencyException(bool,默认 false) 配置项。
- 在 SqlSugarRepository 引入 IAbpLazyServiceProvider,通过 IOptions<DbConnOptions> 延迟获取配置。
- UpdateAsync 改为仅当 EnabledConcurrencyException 为 true 且实体实现 IHasConcurrencyStamp 时,使用 ExecuteCommandWithOptLockAsync 并捕获 VersionExceptions 抛出 AbpDbConcurrencyException;否则回退到原有的 UpdateAsync 实现。
- 清理/调整部分 using 引用,新增 Microsoft.Extensions.Options 与 Volo.Abp.DependencyInjection 引用。

注意:默认值为 false,需在配置中显式开启 EnabledConcurrencyException 才会启用乐观并发校验,开启后会改变之前对带版本实体自动使用乐观锁的行为。
2025-11-17 11:19:15 +08:00
Gsh
d7bcad9da7 feat: 前端打包报错处理 2025-11-17 02:03:10 +08:00
Gsh
04e11d15e2 feat: 新手引导优化 2025-11-17 01:39:13 +08:00
Gsh
97e3dc5eed feat: 公告弹窗优化 2025-11-17 01:20:20 +08:00
Gsh
695bd56a27 feat: 增加新手引导 2025-11-17 01:05:57 +08:00
ccnetcore
7919383be3 feat: 完成v2.3.0发布 2025-11-17 00:43:41 +08:00
ccnetcore
d6cc3c5d96 Merge branch 'abp' into card-flip
# Conflicts:
#	Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Repositories/SqlSugarRepository.cs
#	Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Caches/FileCacheItem.cs
2025-11-17 00:43:27 +08:00
Gsh
19f0d05a69 fix: 尊享明细表格优化 2025-11-16 23:00:19 +08:00
Gsh
3c5e575e9b fix: 公告优化 2025-11-16 22:39:42 +08:00
Gsh
f875617de1 fix: 版本号2.3 2025-11-16 22:05:44 +08:00
Gsh
9976e8a6e2 fix: 翻牌机制优化 2025-11-16 22:05:01 +08:00
Gsh
38e8cbc5ca fix: 优化邀请 2025-11-16 21:50:54 +08:00
Gsh
d95c14c903 fix: 优化尊享包记录 2025-11-16 21:39:08 +08:00
ccnetcore
ffb2f2fb4c fix: 修复尊享包查询条件并新增时间范围筛选 2025-11-16 21:32:41 +08:00
ccnetcore
4bd2fc357d refactor: 邀请码逻辑调整,支持双方填写/使用邀请码统计,并移除已被邀请状态字段 2025-11-14 23:53:29 +08:00
chenchun
da23d17af8 feat: 为尊享包 Token 列表新增按是否免费过滤并添加请求 DTO
- 新增 PremiumTokenUsageGetListInput,包含 IsFree 过滤项并继承分页 DTO
- 修改 UsageStatisticsService.GetPremiumTokenUsageListAsync 签名为使用新的输入 DTO,并根据 IsFree 添加 WhereIF 过滤
- 微调 DTO 导入与格式化(PremiumTokenUsageGetListOutput)
2025-11-14 18:00:49 +08:00
chenchun
c1a6046107 feat: 完成公告、尊享记录功能 2025-11-14 17:54:40 +08:00
chenchun
2ec7b5f4fd fix: 修复软删除时空引用异常
在 SqlSugarRepository.cs 中对 ISoftDelete 分支增加 GetByIdAsync 返回 null 的判断,避免在实体为 null 时继续反射赋值导致 NullReferenceException。若实体不存在,直接返回 false。
2025-11-13 16:49:44 +08:00
Gsh
d21f61646a fix: 系统公告与尊享额度明细 2025-11-12 23:08:52 +08:00
chenchun
eecdf442fb feat: 新增公告跳转链接字段 Url
- 在 AnnouncementAggregateRoot、AnnouncementLogDto、AnnouncementCacheDto 中新增 string? Url 属性,用于存储公告的跳转链接。
- 如果需要持久化到数据库,请同步添加对应的迁移/映射配置。
2025-11-12 21:49:31 +08:00
chenchun
8e8338743d fix: 修正 YiXinVip 枚举值及属性(8个月改为7个月,更新价格与显示名) 2025-11-10 17:03:54 +08:00
chenchun
1b4c3cbb8d feat: 支持尊享包用量统计 2025-11-10 15:18:05 +08:00
chenchun
b7756e2112 feat: 新增功能
- 概要
  - 重构并扩展公告相关模型、DTO、服务,新增公告类型、图片与时间字段,调整缓存与查询处理。
  - 新增枚举 AnnouncementTypeEnum。

- 主要改动(简要)
  - Yi.Framework.AiHub.Application.Contracts/Dtos/Announcement/AnnouncementLogDto.cs
    - 新增 ImageUrl、StartTime、EndTime、Type 字段,移除 Date 字段,Title 不再默认空串。
  - Yi.Framework.AiHub.Domain/Entities
    - 重命名 AnnouncementLogAggregateRoot -> AnnouncementAggregateRoot
    - 表名由 Ai_AnnouncementLog 改为 Ai_Announcement(SugarTable 标注)
    - 新增 ImageUrl、StartTime、EndTime、Type、Remark 字段(Remark 已存在,保持)
  - Yi.Framework.AiHub.Domain.Shared/Enums/AnnouncementTypeEnum.cs
    - 新增枚举文件(Activity=1, System=2)
  - Yi.Framework.AiHub.Application.Contracts/IServices/IAnnouncementService.cs
    - GetAsync 返回类型由 AnnouncementOutput 改为 List<AnnouncementLogDto>
  - Yi.Framework.AiHub.Application/Services/AnnouncementService.cs
    - 使用 Mapster 进行 DTO 映射
    - 查询按 StartTime 降序,返回 List<AnnouncementLogDto>,缓存结构简化
  - Yi.Abp.Web/YiAbpWebModule.cs
    - 改为初始化 AnnouncementAggregateRoot 的表(Ai_Announcement)
  - Yi.Ai.Vue3/types/import_meta.d.ts
    - 移除 VITE_BUILD_COMPRESS 环境变量声明

- 重要注意/兼容性提示
  - 接口变更:IAnnouncementService.GetAsync 返回类型已改变,调用方需同步更新(之前返回 AnnouncementOutput 的代码需调整)。
  - 数据库表变更:表名从 Ai_AnnouncementLog -> Ai_Announcement,若需保留历史数据,请在部署前做好数据迁移(重命名表或迁移数据到新表结构),或使用 CodeFirst 初始化新表(当前代码在启动时会 InitTables<AnnouncementAggregateRoot>())。
  - 新增 Mapster 适配(确保项目有 Mapster 依赖)。
  - 前端类型声明移除环境变量后,前端构建/运行脚本若依赖 VITE_BUILD_COMPRESS 需同步调整。
  - 若有缓存结构(AnnouncementCacheDto)或序列化相关约定变更,确认兼容性。

- 建议操作
  - 更新所有使用 IAnnouncementService 的代码(API 层/前端适配返回结构)。
  - 在非生产环境先执行数据迁移验证(保留旧表数据或写迁移脚本)。
  - 确认 Mapster 包已安装并编译通过。
  - 前端项目检查并同步 import_meta.d.ts 变更。
2025-11-10 15:03:02 +08:00
chenchun
cb49059e84 feat: 翻牌与邀请码逻辑重构,新增中奖记录与前7次中奖概率
- CardFlipTaskAggregateRoot.cs
  - 用 WinRecords(Dictionary<int,long>) 替代原先第8/9/10次的各自字段,且以 JSON 存库(SugarColumn IsJson)。
  - 构造函数初始化 WinRecords。
  - 新增 SetWinReward(int flipCount, long amount) 统一记录中奖。

- CardFlipService.cs
  - 读取并展示 WinRecords,按翻牌顺序映射中奖信息(不再依赖单独的第8/9/10字段)。

- CardFlipManager.cs
  - 重构中奖逻辑:
    - 前7次翻牌改为 50% 概率可中奖,奖励范围 1w–3w(新增配置常量 FREE_*)。
    - 统一通过 SetWinReward 记录任意次的中奖金额。
    - GenerateRandomReward 根据最小值自动选单位(1w 或 100w)。
  - 邀请类型翻牌校验由“仅统计被填写次数”改为“统计本周作为邀请人或被邀请人的邀请记录数量”(双方都计入),并据此判断是否可解锁邀请翻牌次数。

- InviteCodeManager.cs
  - 使用邀请码时:
    - 验证规则调整:一个账号只能填写别人的邀请码一次(hasUsedOthersCode 检查)。
    - 邀请记录的语义变化:当使用邀请码时,邀请记录同时代表邀请人和被邀请人各增加一次翻牌机会。
    - 不再将邀请码标记为单次已用;改为增加 UsedCount(一个邀请码可以被多人使用)。
    - 优化日志与提示信息。

- InviteCodeAggregateRoot.cs
  - 移除 IsUsed、UsedTime、UsedByUserId、MarkAsUsed 等单次使用相关字段/方法。
  - 保留 IsUserInvited(被邀请后不能再作为被邀请者使用)和 UsedCount(统计多人使用次数)。

注意事项
- 这是数据结构与业务逻辑的变更,数据库表结构发生变化(新增 WinRecords JSON 字段,移除若干字段)。上线前请准备相应的迁移脚本或数据迁移方案,确保历史中奖数据平滑迁移到 WinRecords。
- 变更会影响相关单元/集成测试、前端展示字段,需同步更新对应测试与界面展示逻辑。
2025-11-07 21:31:18 +08:00
chenchun
690cabfd96 feat: 新增公告功能 2025-11-06 16:59:29 +08:00
chenchun
4521212a90 feat: 新增文件缓存功能
- 在 Yi.Framework.Rbac.Application.Services.FileService 中注入 IMemoryCache,用于缓存文件元数据,减少对仓储的重复读取。
  - 在 Get 方法中通过 key "File:{code}" 缓存 FileCacheItem,设置绝对过期时间为 1 天。
  - 缓存项使用 Mapster 适配为 FileCacheItem,再适配回 FileAggregateRoot(保留现有逻辑判断和路径获取)。
- 新增缓存模型 Yi.Framework.Rbac.Domain.Shared.Caches.FileCacheItem(包含 Id、FileSize、FileName、FilePath、创建/修改信息等)。
- 增加并调整相关 using 引用(Microsoft.Extensions.Caching.Memory、Volo.Abp.Caching、Domain.Shared.Caches)。
- 同时修复了保存多文件时的缩进/空格格式(不影响功能)。
2025-11-06 11:29:21 +08:00
chenchun
771ecd9d81 Merge branch 'abp' into ai-hub
# Conflicts:
#	Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/FileService.cs
2025-11-06 11:23:46 +08:00
chenchun
94834f45c3 perf: 使用 FileStreamResult 流式返回文件,避免一次性读取到内存
改为 FileStream 并返回 FileStreamResult,减小内存占用并支持大型文件;修正变量名拼写并添加 null-forgiving 标记。
2025-11-06 11:13:50 +08:00
chenchun
a9b2979a21 Merge branch 'abp' into ai-hub 2025-11-06 11:00:04 +08:00
chenchun
22ac150acd fix: 修正 FileAggregateRoot.FilePath 的赋值,保存目录路径而非包含文件名的完整路径 2025-11-06 10:58:33 +08:00
Gsh
17337b8d78 fix: 系统公告弹窗前端 2025-11-05 23:12:23 +08:00
chenchun
09fb43ee14 refactor: 修改 YiCrudAppService.DeleteAsync 的参数名 ids -> id
在 Yi.Abp.Net8/framework/Yi.Framework.Ddd.Application/YiCrudAppService.cs 中,将 DeleteAsync 方法的参数名由 ids 改为 id,更新了对应的 XML 注释与对 Repository.DeleteManyAsync 的调用参数。仅为参数重命名,无功能变更。
2025-11-05 16:28:52 +08:00
ccnetcore
477c0e3f2c Merge branch 'invitation' into ai-hub 2025-11-02 13:00:36 +08:00
Gsh
2e4f520dac fix: 更改版本号 2025-11-02 01:27:03 +08:00
ccnetcore
067b25b9af Merge remote-tracking branch 'origin/invitation' into invitation 2025-11-02 01:21:33 +08:00
ccnetcore
36370c215d fix: 修复周邀请次数统计时使用错误的用户ID字段 2025-11-02 01:21:28 +08:00
Gsh
e24731acfe fix: 分享词修改 2025-11-02 01:17:22 +08:00
Gsh
927e9df7de fix: 分享地址固定为海外地址 2025-11-02 00:55:47 +08:00
Gsh
114b41144e fix: 增加邀请链接逻辑 2025-11-02 00:51:14 +08:00
ccnetcore
5019a36138 fix: 优化邀请码不足提示文案 2025-11-02 00:32:04 +08:00
Gsh
e15eb6149b fix: 翻牌样式优化,动画效果完善 2025-11-01 18:48:17 +08:00
Gsh
9d401a9c93 fix: 翻牌样式优化,动画效果完善 2025-11-01 17:56:19 +08:00
Gsh
eacf86e118 fix: 翻牌样式优化,动画效果待完善 2025-10-31 00:41:21 +08:00
chenchun
c4b631c815 feat: 新增翻牌幸运值悬浮球及相关逻辑
- .claude/settings.local.json:新增 Read 权限路径(Read(//e/code/github/Yi/Yi.Ai.Vue3/**))
- Yi.Ai.Vue3/src/components/userPersonalCenter/components/CardFlipActivity.vue:
  - 新增 luckyValue 响应式状态与 updateLuckyValue() 方法,并在获取任务状态后更新幸运值
  - 新增悬浮球 UI(SVG 进度环、图标、百分比文本)及样式和动画
  - 调整了 v-loading 为 false,并注释了部分错误提示(可能为调试遗留)
- 说明:样式使用嵌套写法(scss/sass 风格),请确认构建流程支持;建议确认 v-loading 与错误提示变更是否为预期并视情况修正。
2025-10-30 21:16:19 +08:00
chenchun
fb25e75a3a feat: 完成邀请机制 2025-10-30 20:17:14 +08:00
chenchun
e9099bbe04 feat: 增加基于本周填写邀请码数量的邀请翻牌校验
- 注入 ISqlSugarRepository<InvitationRecordAggregateRoot> 到 CardFlipManager 并更新构造函数。
- 在邀请类型(FlipType.Invite)翻牌时,改为校验用户本周已填写的邀请码数量是否满足本次翻牌所需(根据 InviteFlipsUsed 计算所需数量),不足则抛出友好异常提示。
- 保持原有错误处理与日志逻辑不变。
2025-10-30 20:13:49 +08:00
chenchun
f02fb91175 feat: 增加邀请码每周使用上限并调整翻牌规则(扩展免费次数、移除赠送翻牌与翻倍提示) 2025-10-30 19:51:56 +08:00
chenchun
5beef22269 fix: 修复权限判断逻辑(应为 &&,避免始终抛出权限异常)
修正 AiAccountService.GetProfitStatisticsAsync 中的条件判断,原先使用 || 导致即使为 Guo 或 cc 仍被拒绝访问。
2025-10-30 14:48:53 +08:00
chenchun
933cbb91d8 feat: 新增尊享包利润统计接口及 ElCollapseTransition 类型声明
- 在 AiAccountService 中新增 GetProfitStatisticsAsync 接口(GET account/profit-statistics),注入 PremiumPackage 仓储并统计尊享包已消耗/剩余、总成本、总收益、利润率及按200售价的成本估算。接口受授权控制。
- 注入 ISqlSugarRepository<PremiumPackageAggregateRoot> 并在构造函数中赋值。
- 在 types/components.d.ts 中新增 ElCollapseTransition 类型声明,补充前端组件类型提示。
- 注意:接口中对用户权限的判断使用了 "CurrentUser.UserName != \"Guo\" || CurrentUser.UserName != \"cc\"",该逻辑可能有误(应为 &&),建议确认并修正权限校验。
2025-10-30 14:38:58 +08:00
chenchun
efd917d184 style: 全部样式更新2.0 2025-10-30 11:21:11 +08:00
chenchun
e906208f4a feat: 新增邀请翻牌验证及相关文案与界面调整
- CardFlipManager:注入 InviteCodeManager,新增对 Invite 类型翻牌的邀请校验(未使用邀请码则抛出异常),防止未被邀请的用户使用邀请类型翻牌。
- CardFlipService:调整提示文案,统一使用“本周”前缀,并在邀请解锁提示中强调必定中奖且每次中奖最大额度翻倍。
- 前端:
  - CardFlipActivity.vue:注释掉翻牌失败的全局提示,调整统计文案为“本周已翻/本周剩余/本周邀请”,并在邀请弹窗文案中说明必定中奖且奖励翻倍。
  - Avatar.vue:更新菜单项标签为“每日任务(限时)”和“每周邀请(限时)”。
2025-10-30 11:19:22 +08:00
chenchun
cf137f6307 fix: 兼容客户端空值,Contents 为空时返回 "_" 并修正 Content 判空逻辑
修复 AnthropicMessageInput 中对 Content/Contents 的判空处理:
- 当 Contents 为 null 或 Count==0 时返回 "_",以兼容客户端对空值的特殊处理。
- 修正对 Content 的判空逻辑,使用 !string.IsNullOrEmpty(...) 确保非空字符串优先返回,避免将空字符串当作有效内容。
2025-10-29 22:23:09 +08:00
chenchun
e6b991fe86 feat: 调整翻牌与邀请码逻辑,增加第8次奖励及前端骨架屏 2025-10-29 21:55:17 +08:00
chenchun
3e75792e43 fix: 修复bug - 在可用性检查中支持忽略剩余令牌校验,避免负数用量包被错误过滤
- 将 PremiumPackageAggregateRoot.IsAvailable 增加参数 isVerifyRemainingToken=true,保持默认行为不变,允许按需跳过对 RemainingTokens 的校验。
- 在 UsageStatisticsService 中计算可用包时改为使用 p.IsAvailable(false),仅过滤过期或禁用的包,但不再因 RemainingTokens 为负而将包排除,从而保证统计(如 TotalTokens/RemainingTokens 汇总)包含负数用量的包,修正统计错误。

修改文件:
- Yi.Framework.AiHub.Domain/Entities/PremiumPackageAggregateRoot.cs
- Yi.Framework.AiHub.Application/Services/UsageStatisticsService.cs
2025-10-29 16:34:53 +08:00
Gsh
dd3f6325bb fix: 个人中心优化 2025-10-29 00:17:36 +08:00
chenchun
108ba348f6 feat: 扣减尊享包用量并调整日常任务奖励
- 在 AiGateWayManager 中新增:当请求使用尊享包模型时,按实际使用的 totalTokens 调用 PremiumPackageManager.TryConsumeTokensAsync 扣减用户尊享包用量(仅在 totalTokens > 0 时)。
- 调整 DailyTaskService 中两项日常任务的奖励配置:1000w 消耗奖励由 200w -> 100w,3000w 消耗奖励由 400w -> 200w。
- 兼顾少量格式化优化(if 条件空格调整)。
2025-10-28 17:43:23 +08:00
chenchun
bcdcec40e0 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-10-28 16:13:13 +08:00
chenchun
2ce8baea42 fix: 优化对话异常提示信息
将抛出异常的消息从 "OpenAI对话异常{StatusCode}" 修改为更详细的中文提示,包含 StatusCode 与 Response 内容,便于排查。未改变逻辑,仅调整异常文本。
2025-10-28 16:12:52 +08:00
chenchun
c6425ca206 fix: 优化对话异常提示信息
将抛出异常的消息从 "OpenAI对话异常{StatusCode}" 修改为更详细的中文提示,包含 StatusCode 与 Response 内容,便于排查。未改变逻辑,仅调整异常文本。
2025-10-28 16:02:01 +08:00
chenchun
acb359ec33 style: 删除多余的 SqlSugar InitTables 注释并调整注释格式
在 Yi.Abp.Web/YiAbpWebModule.cs 中移除两行多余的注释,调整剩余注释的空格格式,清理代码注释,不影响程序逻辑。
2025-10-27 22:01:57 +08:00
chenchun
a1395d9a33 feat: 新增翻牌顺序追踪并重构翻牌/邀请码逻辑到 Manager,更新前端
- 在 CardFlipStatusOutput 与前端 types 添加 FlipOrderIndex 字段以记录牌在翻牌顺序中的位置
- 在域实体 CardFlipTaskAggregateRoot 增加 FlippedOrder(Json 列)以保存用户实际翻牌顺序
- 将 CardFlipService 重构为调用 CardFlipManager 与 InviteCodeManager,移除大量内聚的业务实现与常量(职责下沉到 Manager)
- 调整翻牌、使用邀请码和查询相关流程为 Manager 驱动,更新返回结构与提示文本
- 更新前端 CardFlipActivity 组件与 types,允许任意未翻的卡片被点击并显示翻牌顺序位置
- 若干文案、格式与日志细节修正
2025-10-27 21:57:26 +08:00
ccnetcore
609de29e71 feat: AnthropicMessageContent 新增 Signature 字段 2025-10-26 14:51:48 +08:00
ccnetcore
2efed4f4a5 feat: AnthropicThinkingInput 新增 signature、thinking、data、text 字段 2025-10-26 10:38:01 +08:00
chenchun
aec90ec9d6 feat: 新增翻牌活动入口与全局组件声明
- 在 Header Avatar 菜单新增翻牌活动(cardFlip)入口,并添加对应插槽 <card-flip-activity/>
- 在 types/components.d.ts 中添加 CardFlipActivity 与 ElCollapseTransition 类型声明
- 在 .eslintrc-auto-import.json 中新增 ElMessage 与 ElMessageBox 自动导入
- 从 import_meta.d.ts 中移除 VITE_BUILD_COMPRESS 环境声明
- 在 YiAbpWebModule.cs 中添加相关 using 并保留数据库建表初始化的注释(CodeFirst.InitTables)
2025-10-23 21:58:47 +08:00
chenchun
1aaff2942d fix: 调整 Anthropic DTO 属性为可空类型以避免反序列化错误 2025-10-21 16:55:05 +08:00
chenchun
cdbfc5383d feat: 为充值记录新增订单类型字段并区分VIP与套餐逻辑 2025-10-20 10:18:24 +08:00
ccnetcore
f302555e0c feat: 完善描述 2025-10-18 17:40:46 +08:00
ccnetcore
86c5890476 feat: 用户中心新增每日任务组件并在头像菜单中集成 2025-10-18 17:34:46 +08:00
ccnetcore
a13ee395c7 feat: 支持 x-api-key 认证并扩展 Anthropic 响应字段,优化工具调用处理 2025-10-18 13:23:54 +08:00
Gsh
9abcd72aca fix: 增加教程导航 2025-10-16 22:50:10 +08:00
ccnetcore
4ddea6d468 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-10-16 22:12:36 +08:00
ccnetcore
867a2dc861 fix: 修正Claude聊天响应的Token统计逻辑并优化AiGateWayManager使用条件,同时移除前端无用环境变量定义 2025-10-16 22:11:09 +08:00
chenchun
4a72e3fa0d Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-10-16 09:35:56 +08:00
chenchun
8b4371aabb feat: 尊享包购买流程新增充值记录保存功能 2025-10-16 09:35:25 +08:00
Gsh
799dd08ec0 feat: 模型提示词、剩余额度、对话状态优化 2025-10-16 01:20:11 +08:00
Gsh
c5c22224cf feat: 2.0发布 2025-10-15 23:44:18 +08:00
ccnetcore
2dae47e85c feat: 修复价格 2025-10-15 23:18:26 +08:00
ccnetcore
375dd4f797 fix: 修复支付3位数问题 2025-10-15 23:04:09 +08:00
ccnetcore
acb2db8397 fix: 商品类型返回值 2025-10-15 23:00:42 +08:00
ccnetcore
b7a3e76d0b Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-10-15 19:51:28 +08:00
ccnetcore
48150b712a refactor: 会话ID为空时不存储消息内容,并移除无用注释 2025-10-15 19:49:33 +08:00
chenchun
6db9dfc308 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-10-15 11:54:06 +08:00
chenchun
2d6c1f3c46 fix: 验证交易状态仅在成功时执行充值逻辑 2025-10-15 11:53:54 +08:00
Gsh
161e10d2d1 feat: 产品样式调整 2025-10-15 00:16:57 +08:00
Gsh
a9a2a91183 feat: 产品样式调整 2025-10-15 00:05:10 +08:00
Gsh
1c9a6f108e feat: 产品样式调整 2025-10-15 00:05:10 +08:00
ccnetcore
d6adf9b736 feat: 增加 Claude 模型 Token 使用量倍数调整功能 2025-10-14 23:41:26 +08:00
ccnetcore
959eb3f782 fix: 优化服务号与支付逻辑,增加AccessToken为空校验及优惠描述完善 2025-10-14 23:02:44 +08:00
ccnetcore
7a53e0c90c refactor: 简化尊享包Token扣减逻辑,移除多包分配与校验流程 2025-10-14 22:34:05 +08:00
ccnetcore
533b87fc5b fix: 修复统计近7天token消耗时角色过滤条件错误 2025-10-14 22:22:35 +08:00
ccnetcore
15713cf7fe feat: 支持Claude模型API类型及尊享包校验与扣减逻辑 2025-10-14 22:17:21 +08:00
Gsh
31dc756868 feat: 尊享模型效果 2025-10-14 21:29:20 +08:00
ccnetcore
52f6b6130f feat: 为 HttpClient 添加默认 User-Agent 请求头 2025-10-13 23:08:15 +08:00
ccnetcore
16945b3d5b fix: 修复剩余令牌统计逻辑,增加过期时间判断 2025-10-13 22:09:47 +08:00
Gsh
bdc664fc44 feat: 增加尊享token包产品 2025-10-13 01:14:40 +08:00
Gsh
9555ef10e0 feat: 增加尊享token包产品 2025-10-13 01:03:41 +08:00
Gsh
49e6cb26fc feat: 增加尊享产品 2025-10-12 23:00:08 +08:00
ccnetcore
3ace29e692 fix: 修复无会话时仍存储消息内容的问题 2025-10-12 22:46:20 +08:00
ccnetcore
aa9dd0129b refactor: 将尊享包Token统计逻辑从AiAccountService迁移至UsageStatisticsService,并移除AiUserRoleMenuDto相关字段 2025-10-12 21:51:51 +08:00
ccnetcore
1464271fbd Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-10-12 21:12:37 +08:00
ccnetcore
754f145559 fix: 允许尊享包扣减到负数并优化Token统计逻辑 2025-10-12 21:12:21 +08:00
Gsh
6afd0cb955 feat: 个人中心优化 2025-10-12 21:08:23 +08:00
ccnetcore
d32906702a feat: 商品枚举与支付服务优化,支持中文名称、参考价格及类别筛选 2025-10-12 21:04:08 +08:00
ccnetcore
9bcdaf6bd8 fix: 更新尊享包折扣规则为每10元减2.5元,最多减50元,并同步修改提示文案 2025-10-12 20:14:07 +08:00
ccnetcore
db82a8cf08 Merge branch 'premium' into ai-hub 2025-10-12 20:10:23 +08:00
ccnetcore
a9e8b2b01f feat: 增加尊享包商品及折扣逻辑,完善VIP与尊享包相关接口和数据返回
- 新增尊享包商品类型,支持 5000W 和 10000W Tokens
- 增加尊享包折扣计算与折扣后价格获取方法
- PayService 新增获取商品列表接口,支持尊享包折扣展示
- PayManager 支持尊享包订单金额按折扣计算,并新增获取用户累计充值金额方法
- OpenApiService Anthropic接口增加VIP与尊享包用量校验
- AiGateWayManager 增加尊享包Token扣减逻辑
- AiAccountService 返回用户VIP状态、到期时间及尊享包Token统计信息
2025-10-12 20:07:58 +08:00
Gsh
85bd1ce8d6 feat: 个人中心新增尊享服务、模型列表区分 2025-10-12 18:30:34 +08:00
ccnetcore
4d09243efd feat: 完成尊享服务 2025-10-12 16:42:26 +08:00
ccnetcore
5934056fe6 fix: 修复Anthropic接口TokenUsage序列化及HttpClient创建方式问题 2025-10-12 14:38:26 +08:00
chenchun
2a81062fa3 perf: 优化 HttpClient 配置,增加 10 分钟超时设置 2025-10-12 00:02:34 +08:00
chenchun
fdc868323f fix: 修正 TokenUsage 计算逻辑,使用 CacheReadInputTokens 替代重复的 CacheCreationInputTokens 2025-10-11 23:36:26 +08:00
chenchun
593b3a4cdd fix: 修正消息与Anthropic返回的Token统计逻辑,避免零值覆盖并支持缓存Token计算 2025-10-11 23:27:46 +08:00
chenchun
2b12e18e6c fix: 为AnthropicHandles添加MaxTokens有效性校验 2025-10-11 20:32:41 +08:00
chenchun
345ed80ec8 feat: 新增claude接口转换支持 2025-10-11 15:25:43 +08:00
chenchun
29dc1ae250 fix: 限制 Azure OpenAI 请求最大 tokens 并优化响应处理空行格式 2025-10-10 15:16:16 +08:00
ccnetcore
9fdd41b134 fix: 更新会员套餐为8个月并调整价格信息 2025-10-08 21:24:29 +08:00
ccnetcore
31ee5e8ffb feat: 新增 YiXinVip 8 个月商品类型并移除 9 个月配置 2025-10-08 21:18:42 +08:00
ccnetcore
d7922bb71d fix: 修复 tokenUsage 为空时的空引用问题 2025-09-27 17:40:31 +08:00
ccnetcore
1cc5f2a14f refactor: 注释掉 Furion 统一结果 API 注册,保留 ABP 默认处理方式 2025-09-27 17:26:13 +08:00
橙子
d9997eeb28 !100 update Yi.Abp.Net8/framework/Yi.Framework.AspNetCore/UnifyResult/Fiters/FriendlyExceptionFilter.cs.
Merge pull request !100 from Gary/N/A
2025-09-22 07:14:02 +00:00
Gary
06e77aa8fd update Yi.Abp.Net8/framework/Yi.Framework.AspNetCore/UnifyResult/Fiters/FriendlyExceptionFilter.cs.
判断是否为模型验证错误,如果是,将errors传回,并打印日志

Signed-off-by: Gary <1511313969@qq.com>
2025-09-22 07:13:46 +00:00
橙子
e9e2228f6e !97 岗位状态修改
Merge pull request !97 from 嗳摸嫫/jun
2025-09-22 07:13:45 +00:00
橙子
d516a381d0 !98 update Yi.Abp.Net8/framework/Yi.Framework.Mapster/YiFrameworkMapsterModule.cs.
Merge pull request !98 from Gary/N/A
2025-09-22 07:13:26 +00:00
Gary
4e792ba976 update Yi.Abp.Net8/framework/Yi.Framework.Mapster/YiFrameworkMapsterModule.cs.
自动扫描所有继承IRegister 的Mapster 配置

Signed-off-by: Gary <1511313969@qq.com>
2025-09-22 02:58:59 +00:00
chenchun
fa3ac91ba4 fix: 修正文件整理大师Vip数量限制提示错误 2025-09-18 16:17:10 +08:00
chenchun
f90d3871fa feat: 启用 Furion 统一返回结果并优化过滤器配置
- 在 `YiAbpWebModule` 中启用 `AddFurionUnifyResultApi` 以支持 Furion 风格的统一 API 返回格式
- 调整 `UnifyResultExtensions`,移除 `AbpExceptionFilter` 和 `AbpNoContentActionFilter`,确保统一结果过滤器优先执行
2025-09-16 11:48:36 +08:00
ccnetcore
e7c152e955 fix: 修复文件整理大师文件数量限制及模型名称错误 2025-09-13 21:19:54 +08:00
ccnetcore
0223b5c104 fix: 更新客服联系方式和产品价格信息
- 统一修改客服支持提示信息为"备注ai获取专属客服支持"
- 更新会员套餐价格和描述信息
- 替换模型排行榜iframe为openrouter链接
- 调整内容截断长度从2000到10000字符
2025-09-07 18:49:58 +08:00
ccnetcore
9e41a7c446 fix: 调整YiXinVip商品价格及有效期配置 2025-09-07 18:29:41 +08:00
ccnetcore
2ba0ffc1b7 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-09-07 17:16:13 +08:00
ccnetcore
7d038e1266 style: 优化样式1.3 2025-09-07 17:16:07 +08:00
Gsh
b98285f314 fix: 处理二维码接口过多调用问题 2025-09-07 13:30:03 +08:00
ccnetcore
73438da666 fix: 将 VerifyNext 接口由 GET 改为 POST 请求 2025-09-07 01:34:52 +08:00
ccnetcore
85f2e1b579 feat: 新增文件整理大师服务及校验与对话接口 2025-09-07 01:34:25 +08:00
ccnetcore
ece89ebad0 refactor: 移除自定义 HttpClientFactory,改用依赖注入的 IHttpClientFactory 2025-09-04 22:26:06 +08:00
Gsh
6e2dd39246 fix: 未登录支付按钮改登录 2025-09-03 11:43:40 +08:00
Gsh
a61286e534 fix: 非会员模型选择跳转修改 2025-09-03 10:56:44 +08:00
Gsh
4f944a5466 fix: 优化二维码加载错误显示 2025-08-31 23:56:42 +08:00
ccnetcore
d29aac088a feat: 全面优化ai-hub前端细节 2025-08-31 01:37:36 +08:00
Gsh
8abd122773 feat: 重新登录逻辑更改 2025-08-30 23:58:57 +08:00
Gsh
08084aa0bc feat: 默认展示二维码登录 2025-08-30 23:13:46 +08:00
Gsh
e69cd5a73c feat: 用户头像路径固定 2025-08-30 23:05:14 +08:00
Gsh
76aa3bdc64 feat: 用户头像路径固定 2025-08-30 22:39:27 +08:00
Gsh
93251104af Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-08-30 22:29:21 +08:00
Gsh
3cae477f3e feat: 增加扫码登录功能 2025-08-30 22:28:38 +08:00
ccnetcore
25c736dc0a fix: 修复扫码回调在非等待状态下仍被处理的问题 2025-08-30 22:07:09 +08:00
ccnetcore
96a09d8980 fix: 修复绑定用户时返回值未包含用户ID的问题 2025-08-30 21:58:43 +08:00
ccnetcore
72387235a0 refactor: 移除分布式锁获取时的超时参数 2025-08-30 21:17:25 +08:00
ccnetcore
1b00e505b7 fix: 修复绑定微信二维码生成时未登录用户的异常提示 2025-08-30 18:02:46 +08:00
ccnetcore
1c54e47b9e feat: 新增AI账户服务及扩展用户信息获取功能,支持通过userId查询用户信息 2025-08-30 17:55:13 +08:00
ccnetcore
ba07e2c905 feat: 新增服务号注册授权页面并优化注册提示信息 2025-08-30 00:02:27 +08:00
ccnetcore
bde4611a50 fix: 修复服务号注册缓存时间及锁定范围问题 2025-08-29 23:32:40 +08:00
ccnetcore
e7326fea7b Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-08-29 22:21:11 +08:00
ccnetcore
d13b23ad2e fix: 修复服务号扫码场景缓存未保存用户ID且场景结果错误的问题 2025-08-29 22:20:52 +08:00
Gsh
8b1830a711 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-08-29 22:02:14 +08:00
Gsh
b70c530754 fix: 增加扫码 2025-08-29 22:01:44 +08:00
ccnetcore
d90e24f9ed fix: 修复服务号回调处理返回用户ID及缓存更新逻辑 2025-08-29 21:55:07 +08:00
chenchun
1fbd521d1a fix: 注册接口加分布式锁防止并发重复注册 2025-08-29 14:33:35 +08:00
chenchun
2ae6183e7f fix: 防止重复注册意社区账号 2025-08-29 14:31:04 +08:00
chenchun
7905911624 feat: 注册用户时支持传入头像参数 2025-08-29 14:11:50 +08:00
chenchun
c5b6b33d8e feat: 注册公众号用户时保存额外用户信息到数据库 2025-08-29 13:54:02 +08:00
chenchun
5d29fd6d3b feat: 为微信服务号用户信息响应模型添加JsonPropertyName映射并移除无用字段 2025-08-29 13:41:50 +08:00
chenchun
ad8f48f36b feat: 服务号用户信息获取增加日志记录 2025-08-29 11:53:36 +08:00
chenchun
f9843c13d4 fix: 修复场景缓存为空时的处理逻辑并调整注册成功缓存写入方式 2025-08-29 11:34:57 +08:00
chenchun
6bd561b094 feat: 新增微信公众号扫码注册功能及幂等处理
- 新增 `FuwuhaoConst` 常量类,统一缓存 Key 前缀管理
- `FuwuhaoOptions` 增加 FromUser、RedirectUri、PicUrl 配置项
- `FuwuhaoManager` 新增 `BuildRegisterMessage` 方法,构建注册引导图文消息
- `FuwuhaoService`
  - 增加 OpenId 与 Scene 绑定缓存,支持扫码注册有效期管理
  - 回调处理支持注册场景,返回图文消息引导用户注册
  - 新增注册接口 `RegisterByCodeAsync`,根据微信授权信息自动注册账号并更新场景状态
- `AccountManager` 注册方法增加分布式锁,防止重复注册,并校验用户名唯一性
2025-08-29 11:01:09 +08:00
chenchun
d2c6238df1 feat: 启用AI股票生成与新闻生成任务并切换至OpenAI接口配置 2025-08-28 15:40:59 +08:00
chenchun
1d108983e8 feat: 增加服务号回调签名校验及扫码回调幂等处理
- `FuwuhaoManager` 新增 `ValidateCallback` 方法,用于校验微信回调签名
- `FuwuhaoOptions` 增加 `CallbackToken` 配置项
- `QrCodeResponse` 属性添加 `JsonPropertyName` 标注,支持 JSON 序列化映射
- `FuwuhaoService` 在回调接口中增加签名校验,并通过分布式锁实现幂等处理
- 调整场景值解析逻辑,过滤非扫码/关注事件
- 优化缓存过期时间设置
2025-08-28 15:20:15 +08:00
ccnetcore
b768bca638 feat: 完成支持微信扫码功能 2025-08-27 23:42:46 +08:00
chenchun
28fcd6c9ce feat: 新增服务号回调处理服务及数据模型 2025-08-27 17:46:39 +08:00
HW-July
6005b9329d 岗位状态修改 2025-08-25 17:12:18 +08:00
ccnetcore
10559a925c style: 优化样式1.2 2025-08-25 00:39:16 +08:00
ccnetcore
942e218a9e feat: 新增 FileMaster 发送消息接口 2025-08-23 13:15:28 +08:00
ccnetcore
f6af9edc38 feat: 删除文件 2025-08-23 12:23:17 +08:00
ccnetcore
e0f6331ec3 feat:构建 2025-08-23 12:21:16 +08:00
ccnetcore
06f0c6caa7 style: 整体调整 2025-08-23 12:14:09 +08:00
ccnetcore
56ec260e3a perf: 优化已完成状态下的输出等待时间,加快响应速度 2025-08-21 21:50:06 +08:00
ccnetcore
176cf84369 fix: 修复 AiGateWayManager 中可能的空引用异常 2025-08-21 01:16:57 +08:00
Gsh
6de3b722ed fix: 新增文件助手目录 2025-08-18 23:07:34 +08:00
Gsh
2cf6326764 fix: 更新组件库 2025-08-18 21:02:55 +08:00
Gsh
ec27ee58b4 fix: 充值成功与记录页面增加联系客服,apikey教程更改 2025-08-17 22:08:03 +08:00
ccnetcore
4e42e2202e refactor: 移除代码补全兼容逻辑并优化 DTO 可空类型处理 2025-08-16 19:20:58 +08:00
ccnetcore
e60d8eceb7 feat: 新增 YiXinVip 商品价格配置及前端构建压缩环境变量定义 2025-08-16 00:08:03 +08:00
Gsh
08fb939b38 fix: 动态支付响应页面 2025-08-15 23:49:18 +08:00
ccnetcore
482dd73afd feat: 支持创建订单时自定义支付宝回调地址 2025-08-15 23:41:01 +08:00
Gsh
f09a9fee75 fix: 产品相关页面样式优化 2025-08-15 23:28:09 +08:00
chenchun
9a31d14b41 feat: 优化CORS配置支持通配符和代码格式化
- 支持CORS配置使用通配符"*"允许所有来源访问
- 优化CORS策略配置逻辑,区分通配符和具体域名处理
- 格式化代码,移除多余空行和统一代码风格
- 修复Hangfire配置中的变量赋值格式
- 更新默认CORS配置为通配符模式
2025-08-14 17:04:27 +08:00
chenchun
2fd7f88f04 feat: 新增海外站点流量限制和CORS配置优化
- 新增yxai.chat域名到CORS白名单
- 为海外站点yxai.chat添加大流量接口访问限制
- 修复Azure OpenAI图像生成服务默认尺寸设置
2025-08-14 15:14:30 +08:00
chenchun
9d4cc802e9 fix: 添加CodeGeeX跨域支持
在CORS配置中新增http://codegeex域名,支持CodeGeeX工具的跨域访问请求
2025-08-14 14:24:03 +08:00
Gsh
ee6b4827fa feat: 增加支付宝在线支付、套餐订购弹窗、会员权益、支持模型展示等 2025-08-14 00:26:39 +08:00
ccnetcore
48d8c528f6 fix: 调整YiXinVip各档价格为0.01方便测试 2025-08-13 22:21:03 +08:00
ccnetcore
40c0a5ac64 feat: 支付完成后自动为用户充值VIP并支持按商品类型计算有效期 2025-08-13 22:19:31 +08:00
chenchun
3a60bcc174 refactor: 优化交易状态枚举处理方式
- 为TradeStatusEnum枚举添加Description特性标注
- 重构GetTradeStatusDescription方法,使用反射获取Description特性值
- 简化ParseTradeStatus方法,使用Enum.TryParse替代switch表达式
- 提高代码可维护性,避免硬编码状态描述
2025-08-13 18:30:56 +08:00
chenchun
2b3fad16fd feat: 优化支付宝回调通知记录功能
- 新增SignStr字段记录支付宝回调的原始签名字符串
- 修改日志记录格式,使用键值对形式记录回调通知数据
- 更新PayManager.RecordPayNoticeAsync方法支持记录原始签名字符串
- 移除AlipayManager中冗余的注释说明
2025-08-13 18:21:05 +08:00
chenchun
f0cf6bf5c8 fix: 修复支付宝支付功能相关问题
- 修复支付接口参数顺序错误,调整商品名称和订单号参数位置
- 修复支付页面HTML返回格式,直接返回Body内容而非序列化字符串
- 添加支付相关接口的权限控制,支付回调接口允许匿名访问
- 优化支付宝回调验签逻辑,保持原始参数顺序避免验签失败
- 增加回调格式错误的异常处理
- 修复商品类型枚举显示名称为英文,新增测试商品类型
- 修正Token服务提示文案中的错别字
- 移除订单更新时不必要的时间字段设置
2025-08-13 17:42:13 +08:00
chenchun
0ba4e3240b feat: 完成支付宝接入 2025-08-13 12:07:35 +08:00
ccnetcore
9332b17fc1 feat: 集成支付宝支付SDK并添加当面付测试调用,更新CORS配置支持capacitor 2025-08-13 08:26:45 +08:00
ccnetcore
4ec4023f40 feat: 增加EmbeddingResponse的object字段并完善AiGateWayManager的Usage统计,更新CORS配置 2025-08-11 20:24:48 +08:00
chenchun
d9971541f2 feat: 支持字符串类型的embedding输入参数
在AiGateWayManager中新增对JsonElement字符串类型的处理,确保embedding请求能够正确处理单个字符串输入参数。
2025-08-11 18:10:11 +08:00
chenchun
7b0e4fcc73 fix: 修复Embedding输入处理逻辑和字段可空性
- 优化Embedding输入类型判断逻辑,支持string和JsonElement数组类型
- 将EncodingFormat字段设置为可空类型,提高兼容性
- 注释知识库场景下的消息统计功能,避免不必要的数据记录
2025-08-11 18:05:33 +08:00
chenchun
cfde73d13a fix: 修复输出为空问题 2025-08-11 16:53:33 +08:00
chenchun
c17c9000a8 refactor: 移除AiHub Domain层对Application.Contracts的循环依赖
移除Yi.Framework.AiHub.Domain项目中对Yi.Framework.AiHub.Application.Contracts的项目引用,解决领域层和应用层之间的循环依赖问题,符合DDD架构分层原则。
2025-08-11 15:51:59 +08:00
chenchun
42d537a68b style: 调整架构引用 2025-08-11 15:31:11 +08:00
chenchun
25eebec8f7 feat: 新增向量嵌入服务支持
新增SiliconFlow向量嵌入服务实现,支持文本向量化功能:
- 新增ITextEmbeddingService接口和SiliconFlowTextEmbeddingService实现
- 新增EmbeddingCreateRequest/Response等向量相关DTO
- 在AiGateWayManager中新增EmbeddingForStatisticsAsync方法
- 在OpenApiService中新增向量生成API接口
- 扩展ModelTypeEnum枚举支持Embedding类型
- 优化ThorChatMessage的Content属性处理逻辑
2025-08-11 15:29:24 +08:00
Gsh
bbe5b01872 fix: 优化token图表,增加全屏显示 2025-08-10 15:34:53 +08:00
ccnetcore
6b31536de5 fix: 修复用户过期判断逻辑,按日期比较避免当天误判 2025-08-10 12:07:09 +08:00
ccnetcore
2e5db5500f Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-08-10 11:53:52 +08:00
ccnetcore
7038d31c53 feat: 新增VIP充值接口并支持通过角色代码为用户分配角色 2025-08-10 11:53:28 +08:00
Gsh
3eb27c3d35 fix: 增加对话token显示,token消耗统计 2025-08-10 00:56:44 +08:00
ccnetcore
a9c3a1bcec fix: 修复统计中 Token 数量计算错误,将计数改为求和 2025-08-09 23:38:56 +08:00
ccnetcore
384926e73a feat: 新增用户数据导出功能 2025-08-09 22:55:26 +08:00
ccnetcore
4335c12659 chore: 注释掉生成新闻和股票价格的异步调用 2025-08-09 13:58:26 +08:00
ccnetcore
e6e4829164 feat: 新增VIP过期自动卸载功能
- 新增`AiRechargeManager`类,实现VIP过期用户的自动卸载逻辑。
- 新增`AiHubConst`常量类,统一管理角色名称。
- 在`IRoleService`中添加`RemoveUserRoleByRoleCodeAsync`方法,用于移除指定用户的角色。
- 在`RoleManager`中实现`RemoveUserRoleByRoleCodeAsync`方法。
- 优化`CurrentExtensions`中VIP角色判断逻辑,使用常量替代硬编码。
- 调整`YiAbpWebModule`中部分代码格式,提升可读性。
2025-08-09 13:14:15 +08:00
ccnetcore
f3c67cf598 fix: 修复统计数量偶发问题 2025-08-09 12:20:28 +08:00
ccnetcore
4681d468ce style: 优化验证码样式 2025-08-05 22:41:20 +08:00
chenchun
63e7d3d5f5 style: 更新主题2.2 2025-08-05 18:23:33 +08:00
chenchun
f47d8c8ce3 style: 优化2.1样式 2025-08-05 17:19:03 +08:00
chenchun
6f69f45ddc Merge branch 'bbs-sharpdance' into ai-hub 2025-08-05 14:11:16 +08:00
chenchun
e73678c788 style: 全部样式更新2.0 2025-08-05 14:09:39 +08:00
ccnetcore
09a2f91cbf style: 优化样式1.1 2025-08-04 23:55:48 +08:00
ccnetcore
29da7499a4 Merge branch 'bbs-sharpdance' into ai-hub 2025-08-04 23:37:11 +08:00
ccnetcore
5b024e9443 style: 重写ele 2025-08-04 23:34:13 +08:00
ccnetcore
225932eff1 style: 上线全局样式 2025-08-04 23:29:25 +08:00
Gsh
65d5f5ae86 fix: 加载优化、vip状态优化、apikey优化 2025-08-04 23:11:42 +08:00
ccnetcore
3e647ef14d style: 全局修改样式主题 2025-08-04 22:35:45 +08:00
chenchun
7cb3aea2e6 style: 调整样式 2025-08-04 18:27:18 +08:00
chenchun
7f4b8f1c8a feat: 添加暗色主题支持
- 在HTML根元素添加dark类名以启用暗色模式
- 引入Element Plus暗色主题CSS变量文件
- 格式化代码缩进和结构,提升代码可读性
2025-08-04 17:07:01 +08:00
ccnetcore
0a2710b865 feat: 支持图片生成 2025-08-04 01:03:47 +08:00
ccnetcore
2a301c4983 feat: 支持图片生成 2025-08-03 23:23:32 +08:00
Gsh
faa8131a1b fix: 未登录对话id逻辑玩优化 2025-08-03 21:56:51 +08:00
ccnetcore
71bd885bd0 fix: 支持router参数 2025-08-03 21:47:22 +08:00
ccnetcore
691a1e50f0 feat: 支持未登录用户统计 2025-08-03 21:32:54 +08:00
ccnetcore
ef6e9fd16d style: 优化提示词 2025-08-02 22:04:22 +08:00
chenchun
17f9ac6d54 style: 优化防抖样式 2025-08-01 17:58:07 +08:00
chenchun
3f8e6e48c0 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-07-28 14:39:09 +08:00
chenchun
bda4fdf69d feat: 兼容代码补全功能 2025-07-28 14:39:02 +08:00
Gsh
5c85ed13fd fix: 加载进度优化与登录弹窗优化 2025-07-28 13:43:46 +08:00
chenchun
1986901031 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-07-28 13:15:49 +08:00
chenchun
e1d3ec21e5 feat: 支持错误处理 2025-07-28 13:15:42 +08:00
Gsh
f45283dade Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-07-28 12:59:42 +08:00
Gsh
31c44d8df7 fix: 登录弹窗超时功能取消 2025-07-28 12:59:07 +08:00
chenchun
bf443963c8 fix: 修复ThorChatCompletionsRequest中Messages属性的可空类型问题 2025-07-28 12:50:48 +08:00
chenchun
a0eb234539 feat: 兼容了用量使用显示 2025-07-22 10:40:23 +08:00
ccnetcore
b6d670c240 perf: 兼容deepseek格式 2025-07-21 22:03:55 +08:00
ccnetcore
b5fb2c42c6 feat: 兼容deepseek协议 2025-07-21 21:57:14 +08:00
ccnetcore
d72cc529ba perf: 优化流式输出 2025-07-21 21:15:02 +08:00
Gsh
660bd00cae fix: apikey加载状态 2025-07-20 22:12:48 +08:00
Gsh
b5489711ec fix: 加载优化 2025-07-20 21:01:41 +08:00
Gsh
76717c4f8a Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-07-20 17:23:33 +08:00
ccnetcore
3d53d0bcd6 style: 完成进度条加载 2025-07-20 17:14:05 +08:00
ccnetcore
c7c9428b68 style: 完成进度条加载 2025-07-20 17:01:17 +08:00
ccnetcore
991a970d6a style: 完成进度条加载 2025-07-20 16:40:54 +08:00
ccnetcore
cbe93b9f7e style: 完成进度条加载 2025-07-20 15:15:05 +08:00
ccnetcore
5d7217b775 feat: 完成支持functioncall功能 2025-07-18 23:12:20 +08:00
ccnetcore
d6836b8bcf feat: 提交cicd产物 2025-07-18 21:08:51 +08:00
ccnetcore
c367651c78 chorm: 构建 2025-07-18 21:00:23 +08:00
ccnetcore
77123fd971 cicd: 提交流水线 2025-07-18 21:00:06 +08:00
ccnetcore
9d73a6837b Merge branch 'ai-hub' into ai-hub-dev 2025-07-18 20:46:36 +08:00
ccnetcore
651f0157dc feat: 完成兼容处理 2025-07-18 20:46:30 +08:00
Gsh
90e8dbe449 fix: 对话参数修改 2025-07-18 20:33:51 +08:00
ccnetcore
ccba2667bc Merge branch 'ai-hub' into ai-hub-dev 2025-07-18 19:51:15 +08:00
Gsh
3ce9fc9790 fix: 对话参数修改 2025-07-18 19:49:11 +08:00
ccnetcore
2f24dd77bf feat: 完成对接 2025-07-18 00:27:59 +08:00
ccnetcore
2bc07cb3df feat: 完成错误信息展示 2025-07-18 00:14:19 +08:00
ccnetcore
30678dbbb4 feat: 完成功能 2025-07-17 23:52:00 +08:00
ccnetcore
c5b0f69b51 feat: 重构完成 2025-07-17 23:16:16 +08:00
ccnetcore
e593f2cba4 feat: Thor搭建 2025-07-17 23:10:26 +08:00
ccnetcore
10f7499066 feat: 完成cicd搭建 2025-07-16 23:34:52 +08:00
Gsh
36b7e495f7 update: md渲染优化与依赖更新(0715 02:07) 2025-07-16 00:12:00 +08:00
Gsh
94b96e3c19 fix: 更新md 2025-07-15 16:42:47 +08:00
Gsh
0d1ee18da0 fix: 增加重新登录意社区 2025-07-15 00:54:34 +08:00
Gsh
cab0b61ee0 fix: 对话md渲染优化 2025-07-14 22:21:24 +08:00
Gsh
8e6611d76d Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-07-14 22:20:55 +08:00
Gsh
1ef82e5f93 fix: 对话md渲染优化 2025-07-14 22:20:32 +08:00
ccnetcore
43dc962606 feat: 支持邮箱注册功能 2025-07-13 21:26:46 +08:00
ccnetcore
020d674ca2 style: 调整header 2025-07-12 18:42:26 +08:00
ccnetcore
bb0e1081cc style: 调整header 2025-07-12 18:41:26 +08:00
Gsh
5162f9ce3b fix: 对话创建防抖 2025-07-12 00:36:11 +08:00
ccnetcore
57fae7fe4b fix: 知识库访问 2025-07-09 23:26:32 +08:00
ccnetcore
17412d7de7 feat: 新增支持Prompt 2025-07-09 23:11:57 +08:00
ccnetcore
d59f40dfba Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-07-09 22:44:36 +08:00
ccnetcore
5953be63cb feat: 兼容cline 2025-07-09 22:44:24 +08:00
Gsh
58a4311947 fix: 更新消息暂停 2025-07-09 22:31:52 +08:00
ccnetcore
c5a9b9a15f feat: 支持非流式传输 2025-07-09 21:52:00 +08:00
chenchun
716c344780 feat: 支持非流式传输功能 2025-07-09 19:12:53 +08:00
Gsh
9af8c4897b fix: 增加消息复制、消息时间 2025-07-09 00:08:30 +08:00
Gsh
ca72024a68 feat: 增加用户充值记录查询 2025-07-08 22:59:24 +08:00
chenchun
0d2bc585a9 feat: 提高模型输出速度 2025-07-08 18:24:21 +08:00
chenchun
4e3edefb35 feat: 整体调节 2025-07-08 15:47:51 +08:00
Gsh
9408242726 fix: 禁止移动端缩放、对话头像更改 2025-07-08 00:29:41 +08:00
Gsh
4710208e81 fix: 隐藏文件上传按钮,去除不必要的log打印 2025-07-07 23:29:39 +08:00
Gsh
4fc6a1e818 fix: 隐藏文件上传按钮,去除不必要的log打印 2025-07-07 23:27:55 +08:00
ccnetcore
c9b79a074b style: 增加markdown样式优化 2025-07-07 22:34:19 +08:00
Gsh
2e79eb346f fix: 添加微信群二维码 2025-07-07 21:47:21 +08:00
Gsh
3f88bd4158 fix:增加md样式重写文件 2025-07-07 21:21:55 +08:00
Gsh
f58e079741 fix:增加md样式文件 2025-07-07 21:12:35 +08:00
Gsh
6f1eb1f4b9 feat: 新增markdown渲染 2025-07-07 21:01:59 +08:00
ccnetcore
826d529997 fix: 修复接口名称 2025-07-05 17:47:44 +08:00
ccnetcore
43e60eab4a feat: 完成充值记录 2025-07-05 17:43:48 +08:00
Gsh
6c33024790 fix:百度seo添加与对话错误处理 2025-07-05 17:25:14 +08:00
Gsh
d27e625fde fix:前端模型主键换位modelId 2025-07-05 15:59:22 +08:00
橙子
9d4b3e7d0c update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2025-07-05 07:50:10 +00:00
Gsh
23cecb9360 fix:401、403错误提示,对话角色更改assistant,模型选择持久化 2025-07-05 15:49:29 +08:00
ccnetcore
7e4c835ced fix: 修复nugetapi 2025-07-05 15:31:18 +08:00
ccnetcore
aff460f555 feat: 升级yi.abp.tool 2025-07-05 15:23:08 +08:00
ccnetcore
52961b459e feat: 优化整体aihub架构 2025-07-05 15:11:56 +08:00
ccnetcore
0af2f867fc feat: 提交构建 2025-07-05 01:06:19 +08:00
chenchun
85e291e0b8 chorm: 修改构建域名 2025-07-04 19:17:45 +08:00
chenchun
6d8a859b20 feat: 关闭前端动画 2025-07-04 19:13:21 +08:00
ccnetcore
a70dfb0769 feat: 完成跨域处理 2025-07-04 00:16:58 +08:00
Gsh
c637d412e6 fix:增加用户中心,完成Apikey功能页,增加角色工具方法 2025-07-04 00:12:26 +08:00
ccnetcore
e996bc2d7f feat: 完成token模块 2025-07-03 22:44:52 +08:00
ccnetcore
15be047371 feat: 完成openapi改造 2025-07-03 22:31:39 +08:00
ccnetcore
0a0e0bca10 feat: 完成上下文功能 2025-07-03 21:28:40 +08:00
Gsh
9a8f3bd161 fix:增加seo优化 2025-07-03 17:13:21 +08:00
ccnetcore
7e2c035692 feat: 完成api接口搭建 2025-07-02 23:30:29 +08:00
chenchun
72795382a1 style: 调整样式 2025-07-02 15:03:16 +08:00
橙子
35cdff2afa update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2025-07-02 06:04:18 +00:00
橙子
dcf547f513 style: 新增赞助
Signed-off-by: 橙子 <454313500@qq.com>
2025-07-02 06:03:28 +00:00
橙子
8660d45f36 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2025-07-02 06:01:51 +00:00
橙子
63dd55e7a4 !95 修正分页导致部门结构显示异常。取消后台分页功能,同菜单结构无需分页。
Merge pull request !95 from Po/N/A
2025-07-02 03:49:56 +00:00
Po
40cd89f90c 修正分页导致部门结构显示异常。取消后台分页功能,同菜单结构无需分页。
Signed-off-by: Po <448443959@qq.com>
2025-07-02 02:50:06 +00:00
ccnetcore
44b2ade9bc feat: 完成错误信息输出 2025-07-02 00:28:44 +08:00
Gsh
1200d02fbf fix:对话时只提供最近6条记录 2025-07-02 00:11:43 +08:00
chenchun
b020f48325 style: 调整配置jwt文件 2025-07-01 16:41:58 +08:00
chenchun
917857f1ff feat: 修改超时,改成10分钟 2025-07-01 16:11:41 +08:00
ccnetcore
69d8ff1034 fix: 修改deepseek校验 2025-06-30 22:23:37 +08:00
ccnetcore
9a334101ca fix: 修复ai模型问题 2025-06-30 21:58:34 +08:00
ccnetcore
ee53b3d9c4 feat: 完成细节调整 2025-06-30 21:08:32 +08:00
Gsh
01a5ad5302 fix:模型选择限制 2025-06-30 17:53:59 +08:00
Gsh
f12f0e1f84 fix:双token更新 2025-06-30 16:59:20 +08:00
Gsh
6aefcdbed8 fix:登录判断优化 2025-06-30 16:02:39 +08:00
ccnetcore
3d22a2ef65 feat: 完成支持鉴权刷新功能 2025-06-29 19:34:09 +08:00
Gsh
a33c6dbf1a fix: 增加用户角色标识与优化产品页 2025-06-29 17:47:07 +08:00
ccnetcore
2b7c779e14 style: 新增样式 2025-06-29 16:36:34 +08:00
ccnetcore
0e36f7c0b3 feat: 完成登录校验拦截 2025-06-29 15:41:49 +08:00
ccnetcore
228a309545 Revert "fix: 修复token样式"
This reverts commit b15ad8eb5e.
2025-06-29 15:22:57 +08:00
ccnetcore
b15ad8eb5e fix: 修复token样式 2025-06-29 15:22:04 +08:00
ccnetcore
a525735b0b Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-06-29 15:18:45 +08:00
ccnetcore
6a58af8dfb feat: 完成双token刷新 2025-06-29 15:18:30 +08:00
Gsh
0089e63832 feat: 产品订阅页面优化 2025-06-29 14:42:10 +08:00
ccnetcore
d4f00eb89f style: 修改Ai_Session表类型 2025-06-29 12:21:28 +08:00
Gsh
d15e6e395b fix: 修复拦截器报错 2025-06-29 12:09:34 +08:00
Gsh
39eb4bef07 fix: bbs与ai存储refreshToken 2025-06-29 00:57:57 +08:00
ccnetcore
03de576d8c fix: 修复值对象报错问题 2025-06-28 23:39:15 +08:00
ccnetcore
216b57a4c7 feat: 更新hook fetch 库 2025-06-28 23:07:32 +08:00
Gsh
5383d2d40e fix: 前端请求头增加浏览器指纹 2025-06-28 18:44:10 +08:00
Gsh
1d7a2013e3 fix: 单点登录优化与环境变量完善 2025-06-28 18:14:12 +08:00
Gsh
24d2908cca update: 修复样式规则报错 2025-06-28 14:33:13 +08:00
ccnetcore
330845a387 style: 调整下拉框样式 2025-06-27 22:50:51 +08:00
ccnetcore
bbedd01a72 fix: 兼容claude ai 2025-06-27 22:49:08 +08:00
ccnetcore
2b07061c18 feat: 完成个个模型ai统计 2025-06-27 22:21:44 +08:00
ccnetcore
01a3c81359 feat: 完成用量统计功能模块 2025-06-27 22:13:26 +08:00
Gsh
96e275efa6 fix: 单点登录优化 2025-06-27 14:23:06 +08:00
chenchun
12eb6c73c3 feat: 完成接入claude 2025-06-26 17:54:52 +08:00
ccnetcore
4166eddd28 Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-06-26 00:38:53 +08:00
ccnetcore
6ea1592c19 style: 调整标题样式 2025-06-26 00:38:36 +08:00
Gsh
f8799a073c Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-06-26 00:37:04 +08:00
Gsh
0eb83fc930 fix: 产品页面完善,增加空白布局与布局切换 2025-06-26 00:35:13 +08:00
ccnetcore
a5dd3946f8 fix: 修复模型接口错误 2025-06-25 23:15:31 +08:00
ccnetcore
2732df24af fix: 修复模型接口错误 2025-06-25 23:05:20 +08:00
ccnetcore
f0ae27a50b fix: 修复模型接口错误 2025-06-25 22:45:57 +08:00
ccnetcore
c5037ea397 feat: 完成ai网关改造 2025-06-25 22:41:32 +08:00
chenchun
695aaedfba feat: 完成ai-hub第一期功能 2025-06-25 17:12:09 +08:00
ccnetcore
4f71d874bd style: 调整速度 2025-06-25 00:35:25 +08:00
ccnetcore
c69729fadd feat: 提交队列 2025-06-25 00:30:01 +08:00
ccnetcore
64d04996af perf: 优化sse流式传输 2025-06-25 00:23:00 +08:00
ccnetcore
8eea510583 feat: ai完成接入deepseek 2025-06-25 00:05:00 +08:00
Gsh
04c2b246f6 fix: 放开产品页面 2025-06-23 23:36:59 +08:00
ccnetcore
a46eb176d7 feat: 还原 2025-06-23 23:04:22 +08:00
ccnetcore
2bea88f1a3 feat: 新增pro打包 2025-06-23 23:03:54 +08:00
ccnetcore
06617de984 feat: 完成对接接口 2025-06-22 19:09:13 +08:00
Gsh
6459d7c024 fix: ai-hub接口替换 2025-06-21 22:12:21 +08:00
Gsh
bd4af8039f fix: 用户信息接口替换 2025-06-21 21:57:07 +08:00
Gsh
8aaa22cea3 feat: ai-hub与bbs单点登录联通 2025-06-21 21:52:44 +08:00
ccnetcore
7d902682f8 feat: 完成账户信息转发 2025-06-21 21:40:51 +08:00
ccnetcore
a81be99100 style: 调整前端样式 2025-06-21 13:34:56 +08:00
ccnetcore
b6dfe93d2c Merge remote-tracking branch 'origin/ai-hub' into ai-hub 2025-06-21 13:30:21 +08:00
ccnetcore
35aa022984 fix: 优化用户更新,超管问题 2025-06-21 13:30:12 +08:00
ccnetcore
dfe2d4cc37 fix: 优化用户更新,超管问题 2025-06-21 13:29:41 +08:00
ccnetcore
1d16502d32 feat: 完成dto搭建 2025-06-21 13:20:13 +08:00
ccnetcore
25c88187a3 feat: 改造接口 2025-06-21 13:15:14 +08:00
ccnetcore
ac04e846fa feat: 完成ai message、session搭建 2025-06-21 13:02:38 +08:00
ccnetcore
29985e2118 feat: 完成ai网关搭建 2025-06-21 01:41:05 +08:00
ccnetcore
3b74dfd49a feat:完成ai网关搭建 2025-06-21 01:08:14 +08:00
cc
6abcc49ed4 feat: 提交 2025-06-20 18:06:33 +08:00
Gsh
f16e1cd7a6 fix: 关闭打包检查 2025-06-20 01:19:15 +08:00
ccnetcore
4341b8a24b style: 设置前端logo样式 2025-06-20 00:06:10 +08:00
Gsh
a89e11d132 feat: 前端接口代理 2025-06-19 23:45:22 +08:00
ccnetcore
bc91a8cff2 feat: 新增取消功能 2025-06-19 22:24:21 +08:00
ccnetcore
8040010b98 feat: 完成ai接口 2025-06-19 21:24:13 +08:00
ccnetcore
b39f15c798 feat: 新增文件夹 2025-06-19 19:13:43 +08:00
ccnetcore
c3cf49c63e feat: 完成节点改造 2025-06-19 14:17:24 +08:00
ccnetcore
899bd7e316 feat: 完成cicd流水线 2025-06-19 01:02:08 +08:00
Gsh
890727d495 feat: 产品页面搭建 2025-06-18 23:28:27 +08:00
ccnetcore
8a8e69596a feat: 完成ai改造 2025-06-17 23:38:20 +08:00
ccnetcore
58fcc92e4d feat: 完成AzureOpenAI改造 2025-06-17 23:25:55 +08:00
Gsh
0cd795f57a feat: 前端搭建 2025-06-17 22:37:37 +08:00
ccnetcore
4830be6388 feat: 搭建ai 2025-06-16 22:39:09 +08:00
ccnetcore
901ccc7314 feat: 处理短信升级问题 2025-06-02 02:40:22 +08:00
ccnetcore
629add1e8a feat: 支持用户限制 2025-06-02 02:12:38 +08:00
chenchun
8b92cd6bed perf: 支持ai转义 2025-05-01 15:58:43 +08:00
chenchun
e63fb71ef6 fix: 支持ai转义功能 2025-05-01 15:58:03 +08:00
chenchun
aa122d2d82 Merge remote-tracking branch 'origin/abp' into abp 2025-05-01 14:55:45 +08:00
chenchun
5d6bfe36d0 logs: 日志调整 2025-05-01 14:55:32 +08:00
橙子
26dadd7dae !92 优化动态下拉框宽度样式,和延迟获取数据
Merge pull request !92 from JiangCY/abp
2025-04-17 07:09:43 +00:00
橙子
520dca6953 !93 update Yi.RuoYi.Vue3/src/utils/index.js.
Merge pull request !93 from fenngmr/fix-utils-parseTime
2025-04-17 07:09:23 +00:00
fenngmr
699f7febe4 update Yi.RuoYi.Vue3/src/utils/index.js.
Signed-off-by: fenngmr <guo_fengxian@163.com>
2025-04-14 08:11:32 +00:00
橙子
87a14ebac1 feat: 社区新增有偿悬赏功能 2025-04-12 23:18:06 +08:00
JiangCYkk
29573342b5 优化动态下拉框宽度样式,和延迟获取数据 2025-04-08 17:27:26 +08:00
橙子
91b216c06e !91 1.处理删除菜单传参错误的问题;
Merge pull request !91 from JiangCY/abp
2025-03-30 03:29:35 +00:00
JiangCYkk
83a6ec1b98 1.处理删除菜单传参错误的问题;
2.处理字典数据新增修改窗口没有提交按钮的问题;
2025-03-28 16:46:05 +08:00
JiangCYkk
c5d636d697 添加动态数据下拉框,可以通过下拉框筛选获取后台数据;
未实现滚动分页;
2025-03-28 16:45:36 +08:00
JiangCYkk
3d704220f3 添加数据库上下文改为 services.Add() 方法,TryAdd() 让后面的 YiRbacDbContext 无法注入,导致数据权限过滤失效了 2025-03-28 16:45:26 +08:00
橙子
b830317608 Merge remote-tracking branch 'origin/abp' into abp 2025-03-23 17:16:37 +08:00
橙子
21ff599a4e fix: 修复更新事件 2025-03-23 17:15:17 +08:00
chenchun
224c2b96e4 feat: 新增模型 2025-03-21 18:25:22 +08:00
chenchun
cbb3510d94 feat: 重构聊天室语义内核 2025-03-21 18:24:59 +08:00
chenchun
0b111852ec fix: 修复点数问题 2025-03-21 15:51:44 +08:00
chenchun
ff8038a616 fix: 修复股市问题 2025-03-21 15:36:22 +08:00
橙子
710ad95eda feat: 支持默认启用redis 2025-03-18 23:13:16 +08:00
橙子
f7d9effa07 feat: 上线ai股市模块 2025-03-15 00:58:10 +08:00
橙子
cec28faaf7 perf: 优化提示词 2025-03-14 00:14:44 +08:00
橙子
bcdcca82eb fix: 修复排序问题 2025-03-14 00:10:31 +08:00
chenchun
4e0cc9a24a feat: 完善前端界面 2025-03-13 20:45:23 +08:00
chenchun
53a402a656 feat: 优化提示词 2025-03-13 15:30:24 +08:00
橙子
85ed4df1e4 fix: 修复记录时间 2025-03-11 22:00:11 +08:00
chenchun
8ef91ebd03 feat: 完成股票价格生成job 2025-03-11 13:43:26 +08:00
chenchun
ccaebb8ec2 feat: 完善提示词 2025-03-11 13:40:15 +08:00
橙子
4afc1cc492 feat: 新增job db选择 2025-03-10 22:27:54 +08:00
橙子
ddba0f9aa1 style: 修改默认redisdb 2025-03-10 22:08:38 +08:00
橙子
c782246a1d feat: 完成提示词工程 2025-03-09 23:51:30 +08:00
橙子
afa5fad8c6 Merge remote-tracking branch 'origin/stock' into stock 2025-03-09 16:21:52 +08:00
橙子
d605809932 feat: 完善对接接口 2025-03-09 16:21:47 +08:00
橙子
30250db0fb feat: 完善对接接口 2025-03-09 16:21:39 +08:00
橙子
b48f584db8 style: 修改定时任务种子数据 2025-03-08 23:36:03 +08:00
橙子
56d850d74b chorm: 构建 2025-03-08 23:22:01 +08:00
橙子
3ef1323f05 stly: 更换样式 2025-03-08 22:49:08 +08:00
橙子
d9ed547a20 stly: 更换样式 2025-03-08 22:47:30 +08:00
橙子
82865631fc feat: ai完成stock模块搭建 2025-03-08 22:14:26 +08:00
橙子
337088c908 feat: 补充部分功能 2025-03-07 00:35:32 +08:00
橙子
c092ee46e9 feat: 完成ai生成 2025-03-05 23:08:58 +08:00
橙子
287634cf99 feat: 新增ai-stock模块 2025-03-02 01:54:12 +08:00
橙子
c1535fd116 perf: 优化错误提示 2025-03-01 23:43:19 +08:00
橙子
d7d4fd8a48 perf: 优化排行榜页面 2025-03-01 14:58:21 +08:00
橙子
1552b00516 perf: 优化首页 2025-03-01 02:41:33 +08:00
橙子
a40d9b79b4 feat:新增stock页面 2025-03-01 01:53:55 +08:00
橙子
0bc5b1a940 feat:新增stock页面 2025-03-01 01:53:42 +08:00
橙子
4dce50438c feat: 完成 2025-03-01 00:12:56 +08:00
橙子
de7f9264fd Merge branch 'refs/heads/stock' into perf-ai 2025-03-01 00:08:32 +08:00
橙子
f00a90f1ef Merge branch 'refs/heads/abp' into perf-ai 2025-03-01 00:08:22 +08:00
橙子
2c578cc9e4 feat: 新增模块 2025-03-01 00:06:56 +08:00
橙子
a04974d905 feat: 新增stock模块 2025-02-28 23:50:35 +08:00
chenchun
23cedbec83 feat: 支持更多ai接入 2025-02-25 15:09:17 +08:00
橙子
3e07ca822a refactor: ai+人工重构优化 framework 2025-02-23 03:06:06 +08:00
橙子
f9341fd2ac feat: 完成单元测试搭建 2025-02-23 01:41:31 +08:00
橙子
f6b19ec2a5 feat: 完成job模块优化 2025-02-23 01:31:30 +08:00
橙子
f8a4c737ee update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2025-02-22 08:32:32 +00:00
橙子
c395900861 !89 docs: Improve module and dependency documentation clarity
Merge pull request !89 from bytebistro/abp
2025-02-22 07:59:31 +00:00
橙子
b2ad667894 style: 修改md 2025-02-22 15:56:54 +08:00
橙子
45736dfce9 feat: 完成多租户优化改造 2025-02-22 15:26:00 +08:00
chenchun
753b5b0a26 feat: 优化多租户配置 2025-02-21 18:00:06 +08:00
bytebistro
3aaed801f6 docs: Improve module and dependency documentation clarity 2025-02-14 14:37:45 +08:00
橙子
1fd4f2754a feat:优化文章性能 2025-02-12 22:25:27 +08:00
橙子
bedee3391e feat:聊天室支持公式,优化文章 2025-02-12 22:25:15 +08:00
橙子
176a672e86 update README-en.md.
Signed-off-by: 橙子 <454313500@qq.com>
2025-02-09 14:29:55 +00:00
橙子
9da6bcde41 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2025-02-09 14:29:18 +00:00
橙子
3f8daa1d17 update README-Docker.md.
Signed-off-by: 橙子 <454313500@qq.com>
2025-02-09 14:25:52 +00:00
橙子
ed873da3b6 feat: 支持docker 2025-02-09 22:23:23 +08:00
橙子
c0dfa83828 doc: 完善docker文档 2025-02-09 01:49:07 +08:00
橙子
db08688968 Merge remote-tracking branch 'origin/abp' into abp 2025-02-09 01:28:22 +08:00
橙子
400a146a48 feat: 新增docker支持 2025-02-09 01:28:13 +08:00
chenchun
a645264da7 feat: 统一修改时区 2025-02-08 10:39:53 +08:00
chenchun
09d19d876f fix: 时区默认采用上海 2025-02-08 10:37:33 +08:00
橙子
373877cfcf feat: 支持hangfire内存模式 2025-02-07 17:52:38 +08:00
橙子
9e143c0a75 style: 修改job时间 2025-02-07 16:06:46 +08:00
橙子
37b16e8395 perf: 整体优化细节 2025-02-06 12:54:48 +08:00
橙子
9c94953e0e fix: 修复文件上传问题 2025-02-06 11:41:56 +08:00
橙子
2c48b8f881 feat:新增面试宝典 2025-02-05 11:58:50 +08:00
橙子
4c4b78dda7 perf: 优化包版本 2025-02-05 11:36:20 +08:00
橙子
4ba9a7917f feat:支持更新时间或者创建时间排序 2025-02-05 00:59:25 +08:00
橙子
5d286ebc9e feat: db操作支持不修改更新审计日志 2025-02-05 00:02:04 +08:00
橙子
e69bbb46b3 fix: 修复跳转刷新问题 2025-02-04 15:47:59 +08:00
橙子
f203c53e19 Merge branch 'abp' into digital-collectibles 2025-02-04 15:40:13 +08:00
橙子
8a9a0c8396 fix: 修复跳转刷新问题 2025-02-04 15:40:00 +08:00
橙子
813b08bf1c Merge branch 'abp' into digital-collectibles
# Conflicts:
#	Yi.Bbs.Vue3/src/views/home/Index.vue
2025-02-04 15:28:23 +08:00
橙子
bce9b58265 perf: 优化bbs前端整体显示 2025-02-04 15:23:20 +08:00
橙子
85223629c1 Merge branch 'refs/heads/abp' into digital-collectibles 2025-02-03 10:30:26 +08:00
橙子
9a73789788 feat: 全面支持deepseek 2025-02-03 01:18:15 +08:00
橙子
25929483c3 feat: 支持多ai聊天 2025-02-02 00:22:27 +08:00
橙子
0e90c54dbb Merge remote-tracking branch 'origin/abp' into abp 2025-02-01 21:53:12 +08:00
橙子
5dea4ab18c feat: 支持分布式锁 2025-02-01 21:53:05 +08:00
橙子
7187397687 !87 update Yi.RuoYi.Vue3/src/views/system/role/index.vue.
Merge pull request !87 from YangHaiPing/N/A
2025-01-31 13:58:12 +00:00
橙子
bf8454a963 !84 拼写错误
Merge pull request !84 from 高级CV工程师/abp
2025-01-31 13:57:21 +00:00
橙子
2b2ac9b924 !86 refactor(tool): 使工具支持跨平台运行
Merge pull request !86 from a2008q/abp
2025-01-31 13:56:36 +00:00
YangHaiPing
78b874936c update Yi.RuoYi.Vue3/src/views/system/role/index.vue.
系统管理-角色管理-数据权限:数据回显时“权限范围”字段信息展示的为对应索引值,不是下拉选项值

Signed-off-by: YangHaiPing <yang1426251993@163.com>
2025-01-30 19:10:35 +00:00
易昊弘
b9866af6cd refactor(tool): 优化模块添加命令执行逻辑
- 优化了路径组合的方式,使代码更加简洁
- 修复AddModule在mac/linux下只能添加一个文件夹的问题
2025-01-22 17:58:46 +08:00
易昊弘
350e4a5753 refactor(tool): 使工具支持跨平台运行
- 在 AddModuleCommand 和 CloneCommand 中增加了对操作系统类型的判断
- 为 Windows、macOS 和 Linux 系统分别设置了不同的进程启动信息
-优化了路径组合方式,使用 Path.Combine 以确保跨平台兼容性
2025-01-21 19:35:30 +08:00
橙子
2544d03434 Merge branch 'refs/heads/abp' into digital-collectibles 2025-01-19 18:53:20 +08:00
橙子
d1c1eed52e fix: 修复权限校验报错 2025-01-19 18:53:09 +08:00
橙子
2329cfd1da Merge branch 'refs/heads/abp' into digital-collectibles 2025-01-19 18:41:03 +08:00
橙子
9960c63f59 feat: 新增角色查看主题权限 2025-01-19 18:40:42 +08:00
橙子
680f9ae246 Merge branch 'abp' into digital-collectibles 2025-01-19 15:42:10 +08:00
橙子
7994e66283 fix: 修复有序及无序标签显示 2025-01-19 15:41:59 +08:00
橙子
2c9d344b76 feat: 完善标签分类功能 2025-01-19 15:17:48 +08:00
橙子
6a9e28700b Merge branch 'refs/heads/abp' into digital-collectibles 2025-01-19 13:23:23 +08:00
橙子
811e5c1a8c fix: 删除多余types 2025-01-19 13:23:12 +08:00
橙子
545cef34a9 feat: 新增知识宝典 2025-01-19 13:20:09 +08:00
橙子
950c89a8bc Merge branch 'refs/heads/abp' into digital-collectibles 2025-01-19 13:14:24 +08:00
橙子
7b5bc0fe3e perf: 优化主题权限 2025-01-19 13:14:08 +08:00
橙子
e05514bc41 chorm: 修改包 2025-01-19 03:32:17 +08:00
橙子
438abf6cea feat: 新增标签模块 2025-01-19 03:31:48 +08:00
橙子
5d5ebb559b Merge branch 'refs/heads/abp' into digital-collectibles 2025-01-18 01:09:42 +08:00
橙子
3be5675828 perf: 优化主题查询 2025-01-18 01:07:38 +08:00
橙子
6482218a68 fix: 修复sqlsguar删除事件 2025-01-17 17:09:50 +08:00
橙子
8d6824b03d fix: 修复授权接口 2025-01-04 17:29:05 +08:00
橙子
69ab65dbc6 Merge branch 'refs/heads/abp' into digital-collectibles 2024-12-26 23:05:18 +08:00
橙子
4b0b0e4451 fix: 修正file为空捕获 2024-12-26 23:02:10 +08:00
橙子
5d21fd0f7c Merge branch 'refs/heads/abp' into digital-collectibles 2024-12-26 21:58:53 +08:00
橙子
0184015ba8 feat:仓储支持工作单元 2024-12-26 21:58:42 +08:00
橙子
ffb329a0d9 feat:支持双开关切换 2024-12-26 21:57:27 +08:00
高级CV工程师
03a712fcfe 优化token输入 2024-12-23 19:25:56 +08:00
高级CV工程师
652c2b6fd0 拼写错误 2024-12-23 12:15:16 +08:00
橙子
f0093499d1 Merge branch 'refs/heads/abp' into digital-collectibles 2024-12-21 23:31:17 +08:00
橙子
c00ada5aee refactor: 完成文件模块优化重构 2024-12-21 23:00:43 +08:00
橙子
6c409bfa00 refactor: 重构文件模块 2024-12-21 18:00:43 +08:00
橙子
1c7637d28b Merge branch 'refs/heads/abp' into digital-collectibles 2024-12-21 15:06:15 +08:00
橙子
48dc89c43d feat: 支持对不同数据库的guid设置方式 2024-12-21 15:04:54 +08:00
橙子
b60cc50508 Merge remote-tracking branch 'origin/abp' into abp 2024-12-21 14:49:58 +08:00
橙子
4e66762036 fix: 修复问题权限赋值 2024-12-21 14:49:51 +08:00
橙子
ff4e1dd182 !82 docker 构建
Merge pull request !82 from fenngmr/feat-docker-build
2024-12-21 06:46:08 +00:00
橙子
36442072ba !83 options 拼写错误
Merge pull request !83 from 高级CV工程师/N/A
2024-12-21 06:45:35 +00:00
高级CV工程师
ea134f52be options 拼写错误
Signed-off-by: 高级CV工程师 <2535688890@qq.com>
2024-12-21 03:33:37 +00:00
fengxian.guo
fe97ba1c19 feat: docker 构建失败问题解决,及docker构建文档 2024-12-21 08:57:23 +08:00
fengxian.guo
2cd8b73aa3 feat: docker 构建失败问题解决,及docker构建文档 2024-12-21 08:37:10 +08:00
橙子
07a5b69511 !81 数据字典详情页重复代码修复
Merge pull request !81 from canye/abp
2024-12-15 09:15:23 +00:00
canye
da0e207b44 数据字典详情页重复代码修复 2024-12-15 17:02:36 +08:00
橙子
fb0edc0ee0 fix: 修复pure问题 2024-12-15 11:32:41 +08:00
橙子
8a26a4aeec fix: 修复pure若干问题 2024-12-15 11:32:04 +08:00
橙子
723ce1bd5d Merge branch 'refs/heads/abp' into digital-collectibles 2024-12-11 19:49:46 +08:00
橙子
8408b39fbb style: 文件未找到,不提示 2024-12-11 19:48:37 +08:00
橙子
5dfaf75440 feat: 新增实体领域事件 2024-12-10 22:04:46 +08:00
橙子
bb3b3702e1 fix: 支持缓存 2024-12-10 00:08:04 +08:00
橙子
81138fcaef Merge branch 'refs/heads/abp' into digital-collectibles 2024-12-10 00:06:14 +08:00
橙子
6be5398114 perf: 优化等级处理 2024-12-08 03:43:04 +08:00
chenchun
365ae8ef0a Merge branch 'refs/heads/abp' into digital-collectibles 2024-12-02 10:11:55 +08:00
chenchun
3932b24fda fix: 修复审计日志无工作单元 2024-12-02 10:11:25 +08:00
橙子
f44737216f feat: 合并 2024-11-30 23:53:24 +08:00
橙子
e4180a0c1a Merge branch 'refs/heads/abp' into digital-collectibles
# Conflicts:
#	Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs
2024-11-30 23:52:33 +08:00
橙子
356938d6d3 pref: 优化db工作单元 2024-11-30 23:45:19 +08:00
chenchun
1090907178 perf: 优化动态api启动 2024-11-29 18:01:54 +08:00
chenchun
da2f7073f9 style: 优化abp-cli提示 2024-11-29 15:25:16 +08:00
chenchun
57fe0e702c Merge remote-tracking branch 'origin/digital-collectibles' into digital-collectibles 2024-11-29 15:01:10 +08:00
chenchun
90d4a98e1e perf: 优化购买商品 2024-11-29 15:00:57 +08:00
chenchun
d047f8aa32 Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-29 14:58:27 +08:00
chenchun
f656ec32c1 perf: 优化在线hub 2024-11-29 14:58:10 +08:00
橙子
3415543175 feat: 支持自动刷新价值调整 2024-11-24 19:07:42 +08:00
chenchun
4191bc86ef Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-20 16:11:53 +08:00
chenchun
1cc0ef916f feat:去除SqlSugarDbContextFactory的缓存 2024-11-20 16:11:33 +08:00
chenchun
fdbee4562a Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-20 13:44:30 +08:00
chenchun
5d793344cd fix: 修复移除属性注入 2024-11-20 13:43:35 +08:00
橙子
559a45c917 Merge branch 'refs/heads/abp' into digital-collectibles
# Conflicts:
#	Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarCoreExtensions.cs
#	Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs
2024-11-19 21:48:48 +08:00
橙子
cadbc09846 update Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlsugarCoreExtensions.cs.
Signed-off-by: 橙子 <454313500@qq.com>
2024-11-19 13:45:54 +00:00
橙子
bcaca0b782 Merge branch 'refs/heads/multipleDbContext' into abp
# Conflicts:
#	Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarCoreExtensions.cs
2024-11-19 21:44:57 +08:00
橙子
5cee7319c6 update Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlsugarCoreExtensions.cs.
Signed-off-by: 橙子 <454313500@qq.com>
2024-11-19 13:43:25 +00:00
chenchun
e960db0d3e feat: 完成hangfire支持工作单元 2024-11-19 18:38:58 +08:00
chenchun
eb2c05e9df feat: 完成支持多db模式 2024-11-19 16:36:33 +08:00
chenchun
353a6b9d0c feat: 完成dbfactory搭建 2024-11-19 12:05:26 +08:00
chenchun
5d2d269f11 feat: 完成多db功能搭建 2024-11-19 11:53:57 +08:00
chenchun
9acb157fae feat: 完成ISqlSugarDbContextDependencies抽离 2024-11-19 11:19:13 +08:00
橙子
4198b53996 feat: 搭建多dbcontext模式 2024-11-18 00:03:20 +08:00
橙子
d8286fb005 style: 新增背景,部分页面bbs适配移动端 2024-11-17 12:19:48 +08:00
橙子
a7bf5e8873 Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-16 13:10:17 +08:00
橙子
fdec9ed6b8 feat: 支持hangfire验证 2024-11-16 13:10:06 +08:00
橙子
a2e2072634 Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-16 11:07:35 +08:00
橙子
84cd83894b fix: 修复authservice状态问题 2024-11-16 11:07:22 +08:00
橙子
32e4145927 Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-16 11:01:18 +08:00
橙子
18dd177961 fix: 修复hangfire ufc时间问题 2024-11-16 11:01:06 +08:00
橙子
e94c65d24a fix: 增加判断 2024-11-16 10:54:14 +08:00
橙子
e72c0d4480 chorm: 构建 2024-11-15 22:08:48 +08:00
橙子
1a7f1c3d15 fix: 新增商品内容 2024-11-15 22:06:15 +08:00
橙子
ace5374813 Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-15 21:39:14 +08:00
橙子
41f91ea12d Merge remote-tracking branch 'origin/abp' into abp 2024-11-15 21:38:26 +08:00
橙子
91bf5f93cd feat: bbs评论为空验证 2024-11-15 21:38:18 +08:00
橙子
9445fa8005 !78 修复移动端模式,菜单无法显示问题
Merge pull request !78 from Po/N/A
2024-11-15 13:33:22 +00:00
Po
6b491d1246 修复移动端模式,菜单无法显示问题
Signed-off-by: Po <448443959@qq.com>
2024-11-15 13:07:21 +00:00
橙子
644045b307 feat: 支持hangfire 2024-11-15 20:24:17 +08:00
橙子
0bf53a1c0d Merge branch 'refs/heads/abp' into digital-collectibles
# Conflicts:
#	Yi.Abp.Net8/Yi.Abp.sln
#	Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Jobs/AccessLogCacheJob.cs
#	Yi.Abp.Net8/src/Yi.Abp.Application/Jobs/DemoResetJob.cs
#	Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs
2024-11-15 20:16:23 +08:00
chenchun
6b47ae232d feat:完成hangfire接入 2024-11-15 18:17:53 +08:00
chenchun
536c3cc56b feat: 支持store 缓存和redis切换 2024-11-15 17:01:39 +08:00
chenchun
b75a8cb60d feat: 全量quarzt到hangfire任务 2024-11-15 16:45:01 +08:00
橙子
05ca1aa224 feat: 支持商品自动流拍 2024-11-14 20:30:48 +08:00
chenchun
02d45bb6a7 feat: 支持自动下架商品 2024-11-14 18:56:10 +08:00
橙子
8e805a4cf8 Merge remote-tracking branch 'origin/digital-collectibles' into digital-collectibles
# Conflicts:
#	Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Analyses/BbsUserAnalyseService.cs
#	Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/Analyses/ValueAnalyseService.cs
#	Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/CollectiblesManager.cs
2024-11-13 22:34:18 +08:00
chenchun
43c4c03832 feat: 完成积分、价值排行榜 2024-11-13 22:32:42 +08:00
chenchun
bf2bcd1395 feat: 完成积分、价值排行榜 2024-11-13 19:01:23 +08:00
橙子
f9217dc066 style: 新增shop 2024-11-12 22:29:06 +08:00
橙子
dad4ca4ab4 fix: 修复钱钱保留两位小数 2024-11-11 23:40:20 +08:00
橙子
b282ee8273 style: 新增wxss支持 2024-11-10 22:31:56 +08:00
橙子
3dcb7d0a39 style: 修改概率 2024-11-10 20:21:08 +08:00
橙子
6703897fb1 feat: 完善小程序通知 2024-11-10 20:17:36 +08:00
橙子
eef2ed0d64 Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-10 17:33:34 +08:00
橙子
17bc4ade84 fix: 修复审计日志错误信息 2024-11-10 17:33:20 +08:00
橙子
aea0896356 fix: 修复GetUserAsync报错问题 2024-11-10 17:23:00 +08:00
橙子
7c13ed6497 fix: 修复依赖注入问题 2024-11-10 17:14:50 +08:00
橙子
93dea4fa46 feat: 支持微信通知 2024-11-10 13:41:04 +08:00
橙子
83fb93da11 feat: 完成微信小程序消息推送 2024-11-09 19:05:42 +08:00
橙子
3fbaffe9a2 feat: 优化账号绑定逻辑 2024-11-09 01:20:53 +08:00
橙子
3b93e8b8ec fix: 修复缓存批量删除 2024-11-09 00:00:02 +08:00
chenchun
24cf087320 Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-08 13:58:13 +08:00
chenchun
ae82a2d1cf style: 修改描述 2024-11-08 13:56:43 +08:00
chenchun
2412bc1da4 style: 修改开始描述 2024-11-08 13:41:03 +08:00
chenchun
42b00515eb Merge branch 'refs/heads/tool-dev' into abp 2024-11-08 12:36:26 +08:00
chenchun
f3c5d0862b feat: 完成tool 2024-11-08 12:35:54 +08:00
chenchun
e832921edf chorm: 构建 2024-11-08 11:21:10 +08:00
chenchun
0c0ead26c0 style: 删除多余 2024-11-08 11:11:27 +08:00
chenchun
f9a018638b feat: 去除sample 2024-11-08 11:10:45 +08:00
chenchun
d5ca8ddf1e feat: 完成模板从gitee上获取 2024-11-07 17:35:22 +08:00
橙子
650c29e75a !77 修正Ruoyi查询时间条件为时间的错误问题
Merge pull request !77 from Po/N/A
2024-11-06 15:51:24 +00:00
橙子
ed5c20c612 feat: 支持版本号 2024-11-06 00:05:29 +08:00
橙子
49f1d1a8fa test: 补充测试 2024-11-05 22:36:22 +08:00
橙子
a87d6345c2 feat: 完成2.0重构 2024-11-05 22:22:42 +08:00
橙子
d83db53acb feat: 完成tool搭建 2024-11-05 22:12:30 +08:00
chenchun
c944bd3b0e feat: 搭建tool 2024-11-05 18:50:15 +08:00
chenchun
751cc3cadb feat: 支持不同类型的用户id、主键 2024-11-05 16:45:30 +08:00
Po
80fe1116a8 修正Ruoyi查询时间条件为时间的错误问题
Signed-off-by: Po <448443959@qq.com>
2024-11-05 00:26:59 +00:00
chenchun
81f9fd7473 fix:修复矿池刷新数量 2024-11-04 18:54:35 +08:00
橙子
9aaa88ef51 refactor: 重构tool工具 2024-11-03 23:15:55 +08:00
橙子
e2091eb986 chorm: 构建 2024-11-03 21:16:01 +08:00
橙子
22a8703978 feat: 完成bbs商城 2024-11-03 18:01:47 +08:00
橙子
1468a7b878 feat: 完成商城系统 2024-11-03 15:49:41 +08:00
橙子
fe7211860f feat: 搭建商城基础业务 2024-11-03 15:27:01 +08:00
橙子
fddf80e74a feat: 新增商城领域 2024-11-03 02:38:05 +08:00
橙子
5054391f6b feat: 完成账号绑定功能 2024-11-03 01:38:12 +08:00
橙子
5e096a277c Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-02 21:06:59 +08:00
橙子
ef2d00a254 feat: 新增bbs商城领域 2024-11-02 21:06:14 +08:00
橙子
d38159f68b chorm: 构建 2024-11-02 19:52:41 +08:00
橙子
dd29c9a2fa feat: bbs新增商城页面初版 2024-11-02 19:50:01 +08:00
橙子
ca1b8a728d feat: bbs支持滚动主题 2024-11-02 17:34:48 +08:00
橙子
6b647cf4ea feat: 合并pure pr 2024-11-02 16:17:48 +08:00
橙子
a21f2342d8 Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-02 15:48:40 +08:00
橙子
0e6f79c28e feat: 调整抽奖概率,提高 2024-11-02 15:48:28 +08:00
橙子
ab6563899c Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-02 15:35:10 +08:00
橙子
894d4eb051 fix: 修复时间 2024-11-02 15:34:53 +08:00
橙子
f82122edf0 Merge branch 'refs/heads/abp' into digital-collectibles 2024-11-02 15:29:07 +08:00
橙子
8d9c5bb762 feat: bbs完善钱钱实时变化 2024-11-02 15:28:45 +08:00
橙子
76d94c0bc9 fix: 修复定时任务 2024-11-02 13:31:18 +08:00
志福
7a916fc78e 添加Pure Config页面 2024-11-01 21:59:22 +08:00
志福
73db2a202a 增加Pure Config页面 2024-11-01 21:58:08 +08:00
chenchun
31dceec787 feat: 新增邀请码 2024-11-01 18:37:46 +08:00
橙子
a2106bba3e Merge branch 'refs/heads/abp' into digital-collectibles 2024-10-31 21:21:52 +08:00
橙子
f9890bdc7f feat: 提高审计日志记录 2024-10-31 21:21:31 +08:00
chenchun
b321283f99 fix: 修复code生成规则 2024-10-31 14:27:34 +08:00
chenchun
505e4b6586 feat: 完成 2024-10-30 18:25:44 +08:00
chenchun
b2efd065be feat: 新增记录 2024-10-30 12:02:34 +08:00
chenchun
050af30acb Merge branch 'refs/heads/abp' into digital-collectibles 2024-10-30 11:49:15 +08:00
chenchun
8a0c0de8a1 style: 增加评论长度 2024-10-30 11:49:02 +08:00
chenchun
677dca2231 feat: 新增记录 2024-10-30 11:48:13 +08:00
橙子
47ca08e432 Merge branch 'refs/heads/abp' into digital-collectibles 2024-10-29 22:40:38 +08:00
橙子
8c940126b5 feat: 新增yarn 2024-10-29 22:08:31 +08:00
chenchun
1cb396aa14 feat: 支持接口控制 2024-10-29 14:26:23 +08:00
橙子
a47d271a33 feat: 完善,调整矿物刷新 2024-10-28 22:40:23 +08:00
橙子
363be13d12 fix: 修复上架物品问题 2024-10-28 20:56:33 +08:00
chenchun
3bc044e148 feat: 新增挖矿成功事件 2024-10-28 18:37:15 +08:00
chenchun
b8e6dfcd99 feat:新增成功挖到矿物事件 2024-10-28 16:29:38 +08:00
chenchun
4b320c2af2 fix: 修复个人仓库 2024-10-28 13:53:09 +08:00
橙子
dc28d701ba Merge branch 'refs/heads/abp' into digital-collectibles 2024-10-27 21:48:58 +08:00
橙子
71b7b7cc79 feat:api格式从newtonjson改为微软 2024-10-27 21:48:39 +08:00
橙子
77c423f421 Merge branch 'refs/heads/abp' into digital-collectibles 2024-10-26 20:27:11 +08:00
橙子
f6be4ad7ac feat: bbs支持富文本 2024-10-26 20:26:54 +08:00
橙子
8a157ba472 Merge branch 'refs/heads/abp' into digital-collectibles
# Conflicts:
#	Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs
2024-10-26 15:52:33 +08:00
橙子
f6cbe899c6 fix: 修复NewtonsoftJson问题 2024-10-26 15:40:45 +08:00
橙子
7598c8319f feat: 去除多余引用 2024-10-26 15:17:19 +08:00
橙子
a798f36529 feat: 补充租户引用 2024-10-26 15:15:09 +08:00
橙子
779e84213e feat: 支持手机号为空的临时账号 2024-10-26 10:21:16 +08:00
橙子
254975fcd3 fix: 修复登录 2024-10-25 20:45:35 +08:00
chenchun
e5773df1ab fix: 修复bug 2024-10-25 17:55:18 +08:00
chenchun
c2290f95cf feat: 兼容支持用户名_ 2024-10-25 17:36:23 +08:00
chenchun
6eb72c0303 Merge branch 'refs/heads/abp' into digital-collectibles 2024-10-25 17:31:36 +08:00
chenchun
59d9674aeb Merge branch 'refs/heads/pr_74' into abp
# Conflicts:
#	Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/DictionaryService.cs
2024-10-25 17:31:01 +08:00
chenchun
c4e79e46cf Merge branch 'refs/heads/pr_74' into digital-collectibles
# Conflicts:
#	Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/DictionaryService.cs
2024-10-25 17:30:10 +08:00
橙子
36ed5400be !73 字典详情前端页面解决排序不显示
Merge pull request !73 from 呆呆0518/Staging
2024-10-25 06:47:56 +00:00
hao
6378c69764 字典详情crud实体增加OrderNum,列表增加倒序 2024-10-25 14:46:26 +08:00
呆呆0518
b44db20938 前端页面解决排序不显示 2024-10-25 14:36:05 +08:00
橙子
61cd7b42d4 !72 岗位排序无效问题修复
Merge pull request !72 from 窗外的麻雀/abp
2024-10-25 02:03:22 +00:00
hao
77d64796e0 岗位排序无效 2024-10-25 09:36:56 +08:00
hao
a4001c21b1 岗位修改排序失败 2024-10-25 09:36:04 +08:00
橙子
4fadba27dc style: 优化样式 2024-10-24 21:39:20 +08:00
橙子
9e1d01774f !71 Ruoyi底部分页栏太靠右了,显示不全
Merge pull request !71 from Po/N/A
2024-10-22 06:51:13 +00:00
chenchun
7eab4dd5b1 feat: 完成账号逻辑处理 2024-10-22 12:20:53 +08:00
Po
be4f0a2a90 Ruoyi底部分页栏太靠左了,显示不全
Signed-off-by: Po <448443959@qq.com>
2024-10-22 02:23:00 +00:00
橙子
0e6d380b7e feat: 补充绑定逻辑 2024-10-21 23:35:10 +08:00
橙子
1a73f7bef3 Merge branch 'refs/heads/abp' into digital-collectibles 2024-10-21 23:29:09 +08:00
橙子
c45c17748e feat: 支持代理转发ip功能后去 2024-10-21 23:28:52 +08:00
橙子
a518e7b210 Merge branch 'refs/heads/abp' into digital-collectibles
# Conflicts:
#	Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs
2024-10-21 23:08:21 +08:00
橙子
57ad7ae1a3 feat: 完善请求日志过滤 2024-10-21 23:07:44 +08:00
橙子
e2dae1c4ab Merge remote-tracking branch 'refs/remotes/origin/abp-dev-10-21' into digital-collectibles 2024-10-21 20:08:15 +08:00
chenchun
998d97b669 fix: 修复审计日志问题 2024-10-21 16:58:19 +08:00
chenchun
453d95a460 feat: 新增验证 2024-10-21 10:39:16 +08:00
橙子
0d00f91b31 style: 开启审计日志 2024-10-20 23:43:35 +08:00
橙子
d3b87e8984 style: 调整概率 2024-10-20 22:37:13 +08:00
橙子
fcaad5c6cc feat: 新增用户信息 2024-10-20 22:31:39 +08:00
橙子
8ca741792a fix: 修复挖矿计算问题 2024-10-19 22:44:50 +08:00
橙子
0f687a7e34 feat: 完成微信小程序账户应用服务 2024-10-19 16:17:26 +08:00
橙子
736995c35b feat: 新增微信小程序模块 2024-10-19 14:02:29 +08:00
chenchun
4ae548cc5b Merge branch 'refs/heads/abp' into digital-collectibles 2024-10-18 13:25:57 +08:00
chenchun
d55545849a fix: 修复人数访问 2024-10-18 13:14:51 +08:00
橙子
942868f17f fix: 修复依赖注入问题 2024-10-17 23:45:38 +08:00
橙子
8a57bf52f9 Merge branch 'refs/heads/abp' into digital-collectibles 2024-10-17 23:03:49 +08:00
橙子
260d87c97e feat: 完成 2024-10-17 00:27:20 +08:00
橙子
cb1bac25a3 style: 修改概率 2024-10-16 22:48:11 +08:00
橙子
ef20ef7014 feat: 完成搭建基础功能 2024-10-16 22:47:04 +08:00
chenchun
b88cad7b80 feat: 新增配置 2024-10-16 17:49:47 +08:00
橙子
22ba44c271 feat: 完善部门编号字段 2024-10-15 23:26:18 +08:00
橙子
ae2cc7ad9b feat: 优化访问数量统计,采用本地缓存+分布式缓存+数据库 2024-10-15 23:07:12 +08:00
橙子
3383e86064 feat: 完成基础接口搭建 2024-10-15 22:14:14 +08:00
橙子
a0ef3af155 feat: 完成基础框架搭建 2024-10-15 21:50:31 +08:00
橙子
c880f32d33 !70 修复菜单编辑新增bug
Merge pull request !70 from fuxing168/Fyun168
2024-10-15 10:38:30 +00:00
chenchun
e8fcab4c6b feat: 新增矿池机制 2024-10-15 18:32:50 +08:00
志福
7b20b68b6a 修复菜单管理里面,编辑后或者新增没有增加routerName,会导致主菜单导航时无法显示 2024-10-15 18:31:14 +08:00
橙子
974f264272 !67 修复字段名驼峰转下划线导致查询日志列表失败的兼容问题
Merge pull request !67 from 凤凰/abp
2024-10-15 01:26:04 +00:00
凤凰
bcbb2b5139 fix: 修复字段名驼峰转下划线导致查询日志列表失败的兼容问题 2024-10-15 00:25:43 +08:00
橙子
1c6a795061 feat: 框架搭建 2024-10-14 23:31:08 +08:00
橙子
36246c2945 feat: 新增数字藏品模块 2024-10-14 22:40:28 +08:00
橙子
7af54f600f feat: 搭建模块 2024-10-14 21:45:14 +08:00
橙子
e09aaa2dc7 !65 增加表单编辑器
Merge pull request !65 from 李大饼/abp
2024-10-14 08:58:56 +00:00
橙子
e3178d7579 !66 Ruoyi是否启用验证码由后台appsettings.json决定
Merge pull request !66 from Po/abp
2024-10-14 08:57:55 +00:00
Po
b59dfbc3fd Ruoyi是否启用验证码由后台appsettings.json决定 2024-10-14 16:49:33 +08:00
simiyu
0f21688b3c feat:添加表单生成器 2024-10-14 15:54:47 +08:00
橙子
801e30c1dc !64 修复Ruoyi启动的系列警告信息。
Merge pull request !64 from Po/abp
2024-10-13 10:34:46 +00:00
Po
7049175827 修复ruoyi调试警告信息 2024-10-13 18:29:02 +08:00
橙子
f27a5a135b fix: 修复找回密码问题 2024-10-13 01:04:58 +08:00
橙子
82ad9e249a !63 总算可以管理角色的用户了
Merge pull request !63 from 李大饼/abp
2024-10-12 17:01:41 +00:00
李大饼
fcff711a04 处理冲突 2024-10-12 13:42:48 +00:00
橙子
0c78b8d868 !61 fix:修复部分菜单功能下下拉菜单宽度过窄导致选中内容看不到
Merge pull request !61 from 李大饼/abp
2024-10-12 13:22:33 +00:00
李大饼
b6b54164a8 feat:添加角色用户管理,修复一堆相关问题 2024-10-12 17:16:48 +08:00
李大饼
983daddebc refactor:用户菜单界面取消默认的用户显示(主要是单元格有点宽,对于实际使用意义不大),性别列显示出来(主要是看到字典请求了,但是前端没有这一列) 2024-10-12 02:00:21 +00:00
李大饼
605db9340c refactor:用户菜单界面取消默认的用户显示(主要是单元格有点宽,对于实际使用意义不大),性别列显示出来(主要是看到字典请求了,但是前端没有这一列) 2024-10-12 09:55:39 +08:00
李大饼
36ea04bd70 fix:修复部分菜单功能下下拉菜单宽度过窄导致选中内容看不到 2024-10-12 09:39:00 +08:00
橙子
6f691e45d8 Merge remote-tracking branch 'origin/abp' into abp 2024-10-11 19:58:30 +08:00
chenchun
2c6558874d feat: 恢复备案 2024-10-11 19:58:21 +08:00
chenchun
d60b432f0c style: 恢复备案 2024-10-11 16:48:11 +08:00
橙子
adb9849650 !58 update Yi.Abp.Net8/framework/Yi.Framework.Core/Extensions/HttpContextExtensions.cs.
Merge pull request !58 from 凯明/N/A
2024-10-10 07:09:22 +00:00
橙子
48abbbf83e !60 update Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/LoginLogAggregateRoot.cs.
Merge pull request !60 from 凯明/N/A
2024-10-10 07:09:06 +00:00
橙子
9e5361338c !59 update Yi.Abp.Net8/framework/Yi.Framework.Core/Extensions/HttpContextExtensions.cs.
Merge pull request !59 from 凯明/N/A
2024-10-10 07:08:48 +00:00
凯明
c5ecd71c6e update Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/LoginLogAggregateRoot.cs.
IpTool.Search(ipAddr); 可能搜索失败报错,加入try catch

Signed-off-by: 凯明 <120665461@qq.com>
2024-10-10 06:57:13 +00:00
凯明
b09bbba21b update Yi.Abp.Net8/framework/Yi.Framework.Core/Extensions/HttpContextExtensions.cs.
//Ip规则校验 ,内网使用时,前端传递的IP会包含端口号造成校验失败    

Signed-off-by: 凯明 <120665461@qq.com>
2024-10-10 06:53:43 +00:00
凯明
2db543573c update Yi.Abp.Net8/framework/Yi.Framework.Core/Extensions/HttpContextExtensions.cs.
//Ip规则校验 ,内网使用时,前端传递的IP会包含端口号造成校验失败

Signed-off-by: 凯明 <120665461@qq.com>
2024-10-10 06:48:14 +00:00
橙子
cadd4df5d0 !57 update Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Operlog/OperLogGlobalAttribute.cs.
Merge pull request !57 from 凯明/N/A
2024-10-10 03:54:04 +00:00
凯明
427de4b42f update Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Operlog/OperLogGlobalAttribute.cs.
搜索IP归属地失败时会直接报错,改为搜索失败时保存IP地址。

Signed-off-by: 凯明 <120665461@qq.com>
2024-10-10 03:39:58 +00:00
橙子
79cb82ea24 !56 rbac/Yi.Framework.Rbac.Application.Contracts/Dtos/Menu/MenuCreateInputVo.cs.
Merge pull request !56 from 凯明/N/A
2024-10-09 12:15:15 +00:00
橙子
1b472c4ad7 !55 update Yi.Pure.Vue3/src/views/system/menu/utils/hook.tsx.
Merge pull request !55 from 凯明/N/A
2024-10-09 12:14:42 +00:00
橙子
21ab4950c8 !54 fix:修复前端表格状态列tag显示异常问题
Merge pull request !54 from 李大饼/abp
2024-10-09 12:14:16 +00:00
凯明
1b2977d591 rbac/Yi.Framework.Rbac.Application.Contracts/Dtos/Menu/MenuCreateInputVo.cs.
根目录时传入空ID会报异常

Signed-off-by: 凯明 <120665461@qq.com>
2024-10-09 09:27:32 +00:00
凯明
c54cf0bca2 update Yi.Pure.Vue3/src/views/system/menu/utils/hook.tsx.
根目录下创建菜单时,parentId为空,应该传入"00000000-0000-0000-0000-000000000000",而不是0. 

Signed-off-by: 凯明 <120665461@qq.com>
2024-10-09 09:07:08 +00:00
李大饼
935c990fe4 fix:修复前端表格状态列tag显示异常问题 2024-10-08 16:13:51 +08:00
橙子
44f94f8398 fix: 修复更新用户密码处理 2024-10-07 22:24:02 +08:00
橙子
8380cb1084 feat: 新增一键备案切换模式功能 2024-10-07 15:10:05 +08:00
橙子
83fc4f46b2 !49 pure补充头像上传逻辑
Merge pull request !49 from tyjctl/abp
2024-10-07 07:02:36 +00:00
橙子
9a97134a37 !52 解决Pure新建用户赋予权限菜单不显示问题Bug
Merge pull request !52 from Po/abp
2024-10-07 06:58:58 +00:00
橙子
912010ed70 !51 添加 PostgreSQL 数据库的配置,并新增驼峰转下划线功能
Merge pull request !51 from 凤凰/abp
2024-10-07 06:54:04 +00:00
Po
09b0bd8b09 修正Pure新建用户赋予权限菜单不显示问题 2024-10-06 22:40:17 +08:00
凤凰
c0dece8936 update Yi.RuoYi.Vue3/src/views/system/tenant/index.vue. 2024-10-05 19:40:41 +00:00
Your Name
571b610417 添加 PostgreSQL 数据库的配置,并新增驼峰转下划线功能 2024-10-06 03:32:34 +08:00
Dev Po
658339047c .gitignore排除日志目录和db文件 2024-10-05 20:19:35 +08:00
橙子
13120712b1 feat: 优化聊天室功能,修复复制等问题 2024-10-04 00:37:36 +08:00
橙子
10e1fad7f3 feat: 新增找回密码功能 2024-10-04 00:00:44 +08:00
橙子
d7629763ef feat: 新增找回密码功能接口 2024-10-03 01:10:32 +08:00
橙子
94ee0fb058 feat: 支持注册带入昵称 2024-10-02 23:25:29 +08:00
橙子
d4e8ce9c89 feat: 优化异步操作 2024-09-30 22:34:12 +08:00
橙子
707e241f25 feat: 主题展示图片 2024-09-30 00:54:28 +08:00
橙子
58fa94e8b8 feat: 新增主题图片功能 2024-09-30 00:40:47 +08:00
橙子
72d307503e style: 修改站点样式 2024-09-29 00:55:30 +08:00
橙子
d9fd9163e4 feat: 优化前端请求加载 2024-09-29 00:47:48 +08:00
chenchun
21807c3a66 Merge remote-tracking branch 'origin/abp' into abp 2024-09-25 12:09:47 +08:00
chenchun
f499d2d8a9 feat: 优化db连接字符串获取 2024-09-25 12:09:34 +08:00
tyjctl
0f9958bb26 update Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs.
Signed-off-by: tyjctl <419999127@qq.com>
2024-09-24 07:13:14 +00:00
tyjctl
8e66a9880c 补充pure用户头像上传功能 2024-09-24 14:44:06 +08:00
橙子
38e112fb06 update README-en.md.
Signed-off-by: 橙子 <454313500@qq.com>
2024-09-24 03:47:34 +00:00
chenchun
bb0e48cd41 style: 新增英文readme 2024-09-24 11:45:51 +08:00
chenchun
fd0edd93ea feat: 优化rbac结构 2024-09-24 11:16:19 +08:00
chenchun
6359696bde chorm: 合并pr:https://gitee.com/ccnetcore/Yi/pulls/44/files 2024-09-24 10:24:38 +08:00
橙子
1fee392989 !45 update Yi.RuoYi.Vue3/src/views/system/user/index.vue.
Merge pull request !45 from ゞ↘絟℡℃ツ/N/A
2024-09-24 02:18:08 +00:00
橙子
dfdced9644 !46 update Yi.RuoYi.Vue3/src/views/code/field/components/TableList.vue.
Merge pull request !46 from ゞ↘絟℡℃ツ/N/A
2024-09-24 02:17:29 +00:00
ゞ↘絟℡℃ツ
e50c1c374a update Yi.RuoYi.Vue3/src/views/code/field/components/TableList.vue.
增加简单分页

Signed-off-by: ゞ↘絟℡℃ツ <137586129@qq.com>
2024-09-19 02:12:46 +00:00
ゞ↘絟℡℃ツ
dbcd051aae update Yi.RuoYi.Vue3/src/views/system/user/index.vue.
修复 用户信息编辑框, 状态单选框, 因缺少 :label="dict.value", 导致的,  无法选择单选框问题

Signed-off-by: ゞ↘絟℡℃ツ <137586129@qq.com>
2024-09-19 02:02:04 +00:00
橙子
96571bb999 !43 update Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Operlog/OperLogGlobalAttribute.cs.
Merge pull request !43 from tyjctl/N/A
2024-09-18 14:21:04 +00:00
橙子
0620f6b6e3 Merge remote-tracking branch 'origin/abp' into abp 2024-09-18 22:17:55 +08:00
橙子
ae163167b6 feat: 兼容nuget 2024-09-18 22:17:45 +08:00
tyjctl
ba0bb32b5f update Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Operlog/OperLogGlobalAttribute.cs.
OperLog保存请求参数

Signed-off-by: tyjctl <419999127@qq.com>
2024-09-18 13:41:38 +00:00
橙子
b15e789b0b !42 使用linux自带命令获取内存信息,解决在docker容器内无法监控内存信息
Merge pull request !42 from Bi8bo/abp
2024-09-18 13:40:15 +00:00
橙子
8c7afa2e7a feat: 补充缺少文件 2024-09-18 21:38:22 +08:00
Bi8bo
87e30b9edf 修复在docker 容器内无法获取内存相关信息的问题 2024-09-18 09:51:02 +08:00
Bi8bo
887ebe6f2f 修复系统监控模块 cpu核心数的bug,调整接口响应模型结构 2024-09-14 14:12:35 +08:00
橙子
099581dddc update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2024-09-09 06:14:48 +00:00
橙子
3e84890765 style: 修改readme样式 2024-09-07 15:12:05 +08:00
橙子
d2fb0791d9 style: 新增readme 说明 2024-09-07 15:09:36 +08:00
橙子
a2f22007cf chorm: 新增发布文件 2024-09-07 14:41:15 +08:00
橙子
d4dd531ac4 Merge branch 'refs/heads/pure-dev' into abp 2024-09-07 13:49:43 +08:00
橙子
8374c81860 feat: 完成ruoyi、pure、yi、bbs 三位一体 2024-09-07 13:49:25 +08:00
橙子
579f60e789 feat: 菜单种子数据 2024-09-07 13:43:28 +08:00
橙子
40b5f33c4e feat: 完成菜单接入 2024-09-07 13:43:00 +08:00
橙子
978a7fab4c feat: 完成ruoyi、pure菜单兼容 2024-09-07 02:17:07 +08:00
橙子
f7790c46d2 Merge branch 'refs/heads/pure-dev' into abp 2024-09-06 22:06:26 +08:00
chenchun
9fc5b521e5 feat: 新增pure菜单路由 2024-09-06 18:23:11 +08:00
橙子
775e31c5e9 Merge branch 'refs/heads/pure-dev' into abp 2024-09-05 23:13:18 +08:00
橙子
3339e30014 feat: 整体pure,核心功能对接完成 2024-09-05 23:10:40 +08:00
chenchun
4ed44a2a8f feat:新增个人中心api 2024-09-05 21:44:10 +08:00
橙子
6134e76030 feat: 完成在线用户、登录日志、操作日志页面 2024-09-04 23:31:42 +08:00
chenchun
e1ea210fe9 fix: 合并修复构建错误 2024-09-04 16:35:21 +08:00
橙子
d9022a0383 !33 添加前端无感刷新功能,并将token相关改为localstage存储
Merge pull request !33 from daxiongok/master
2024-09-04 08:33:00 +00:00
橙子
0b0c1405ea !40 新增支持abp实体IHasConcurrencyStamp接口,并发更新ConcurrencyStamp
Merge pull request !40 from Bi8bo/Fix-ConcurrencyStampProp-invalid
2024-09-04 08:29:58 +00:00
chenchun
e393e1f525 feat:新增岗位管理 2024-09-04 16:24:26 +08:00
橙子
ad78cb1bcd fix: 修复登录验证码样式问题 2024-09-04 00:17:49 +08:00
橙子
e886614641 feat: 完成用户管理、角色管理、菜单管理、部门管理 2024-09-02 23:26:41 +08:00
chenchun
bc83362b35 feat:新增菜单、部门页面 2024-09-02 18:16:07 +08:00
chenchun
b648f09f16 feat:完善接口定义 2024-09-02 17:16:25 +08:00
Bi8bo
eb8d1626ea 并发修改失败修改为异常抛出 2024-09-02 16:06:20 +08:00
Bi8bo
db94cd32d5 单实体更新支持abp IHasConcurrencyStamp接口,乐观锁更新 2024-09-02 15:01:49 +08:00
橙子
71fd5a13fc feat: 完成pure角色页面对接 2024-09-01 21:34:36 +08:00
橙子
67c7ef37e6 feat: 新增支持furion规范化接口格式 2024-09-01 03:06:03 +08:00
橙子
2e22f4ea67 !38 审计日志报错
Merge pull request !38 from faith/abp
2024-08-31 15:28:30 +00:00
橙子
8be36f088b feat: 完成用户页面查询 2024-08-31 22:01:55 +08:00
Administrator
b985c2c784 修改审计日志bug,表达式里只能有具体值 2024-08-31 20:24:26 +08:00
橙子
e39d381f08 Merge branch 'refs/heads/abp' into pure 2024-08-31 19:08:38 +08:00
橙子
7694c7f97b !36 解决Sqlsugar Select()映射时如果嵌套对象,实体访问修饰符为非public的属性无法绑定值
Merge pull request !36 from Bi8bo/fix-sqlsugar-select-valuebind
2024-08-31 10:51:22 +00:00
橙子
eadb5eb216 !34 修复CPU系统使用率、当前空闲率
Merge pull request !34 from GitHubList/abp
2024-08-31 10:47:28 +00:00
橙子
cf5c46b2ce feat: 完成用户页面查询 2024-08-31 12:55:04 +08:00
chenchun
6e9dd669ba feat:完善用户表单页面对接 2024-08-30 17:36:33 +08:00
chenchun
60ef93b510 feat:完善对应菜单 2024-08-30 16:08:20 +08:00
bi8bo
e3aada0fff 替换Sqlsugar默认序列化器,解决.Select()映射嵌套/匿名类时,实体的非公有访问器 值无法绑定,如Id(protect属性) 2024-08-30 14:41:45 +08:00
橙子
bbe1a44788 feat: 完成登录页面接入pure 2024-08-29 22:59:16 +08:00
chenchun
bfe0f346c8 fix:修复软删除问题 2024-08-29 10:26:07 +08:00
GitHubList
8f10146d39 修复CPU系统使用率、当前空闲率 2024-08-28 00:03:15 +08:00
chenchun
5f402488d4 feat:登录页面改造 2024-08-23 18:26:26 +08:00
chenchun
07c48479af chorm: 搭建前端 2024-08-23 17:00:18 +08:00
chenchun
4bc2cebd60 feat:新增pure-admin前端 2024-08-23 14:31:00 +08:00
daxiongok
dc242420f8 feat:添加列表排序支持和默认排序
Signed-off-by: daxiongok <571115139@qq.com>
2024-08-18 10:48:54 +08:00
daxiongok
0656e3f536 feat:默认时间倒序
Signed-off-by: daxiongok <571115139@qq.com>
2024-08-18 10:20:23 +08:00
daxiongok
cfffcda068 Merge branch 'master' of https://gitee.com/tirisfalcn/Yi.git 2024-08-18 10:06:50 +08:00
daxiongok
187885fdb9 fix:未引用方法问题
Signed-off-by: daxiongok <571115139@qq.com>
2024-08-18 10:05:26 +08:00
daxiongok
f67b60dd82 update Yi.RuoYi.Vue3/src/utils/request.js.
Signed-off-by: daxiongok <12421064+tirisfalcn@user.noreply.gitee.com>
2024-08-17 15:08:17 +00:00
daxiongok
92a2421a9b feat:新增前端token无感刷新功能
fix:前端权限码太多时,cookie太大请求异常问题。改为localstage存储token

Signed-off-by: daxiongok <571115139@qq.com>
2024-08-17 22:53:19 +08:00
chenchun
556d32729a chorm: 构建 2024-08-16 19:07:08 +08:00
chenchun
4a3bd18bac fix: 修复新手任务 2024-08-16 18:57:17 +08:00
chenchun
de8f23bf2f fix: 修复更新昵称任务 2024-08-16 18:42:48 +08:00
chenchun
3691a74d7e feat: 上线新手任务功能 2024-08-16 18:33:10 +08:00
chenchun
2aba4eccee feat: 新增新手任务 2024-08-16 17:57:58 +08:00
chenchun
3e6d02eccc Merge branch 'refs/heads/abp-dev' into abp 2024-08-16 15:32:26 +08:00
chenchun
add3437bcf fix: 修复每周任务过期时间计算问题 2024-08-16 15:31:49 +08:00
橙子
2cf244058b fix:修复点赞主题通知问题 2024-08-15 21:53:28 +08:00
橙子
971f137a21 fix;修复链接跳转 2024-08-15 21:43:15 +08:00
橙子
b1a245c2a2 Merge branch 'refs/heads/abp-dev' into abp 2024-08-15 21:39:29 +08:00
橙子
e8f957f344 feat: 上线任务系统 2024-08-15 21:38:32 +08:00
chenchun
74d43ca974 fix: 修复任务过期时间判断问题 2024-08-15 11:54:15 +08:00
橙子
9af98089f2 feat: 新增请求访问统计功能 2024-08-14 22:23:54 +08:00
chenchun
b619204c5e feat:完善任务界面 2024-08-14 18:31:37 +08:00
chenchun
27051aa01d feat: 新增请求访问统计功能 2024-08-14 12:50:28 +08:00
橙子
23ffd23694 feat: 新增前端任务界面,切图崽 2024-08-13 23:04:17 +08:00
chenchun
96b9cad2f8 feat: 完成任务体系搭建 2024-08-13 16:45:56 +08:00
chenchun
35ebce6a85 feat: 新增任务需求枚举 2024-08-13 15:33:03 +08:00
橙子
9530350d06 feat: 新增任务接口路由 2024-08-12 23:23:29 +08:00
橙子
c122863e45 fix: 修复等级排序问题 2024-08-12 20:05:42 +08:00
橙子
b4de38fbb9 feat:合并 2024-08-12 19:43:30 +08:00
chenchun
0c1ad1f4e5 Merge remote-tracking branch 'origin/abp' into abp 2024-08-12 18:19:53 +08:00
橙子
e2a675054c !29 update Yi.RuoYi.Vue3/src/views/system/dept/index.vue.
Merge pull request !29 from songjianjack/N/A
2024-08-12 10:15:37 +00:00
chenchun
6095f2174f feat: 新增任务系统应用服务 2024-08-12 17:43:24 +08:00
songjianjack
0ad49e9b9d update Yi.RuoYi.Vue3/src/views/system/dept/index.vue.
解决新增部门无法选择上级部门

Signed-off-by: songjianjack <1400053039@qq.com>
2024-08-12 09:38:04 +00:00
chenchun
b4751ea87a feat: 完成任务系统的领域服务 2024-08-12 17:16:30 +08:00
橙子
d46d6a58ab feat: 搭建任务框架 2024-08-11 23:23:38 +08:00
橙子
dee6ea1663 fix: 修改排行榜外链问题 2024-08-10 17:50:00 +08:00
橙子
74988a80bf feat: 上线财富排行榜 2024-08-10 17:44:42 +08:00
橙子
24b011ef93 feat: 添加注册人数分析,优化bbs聊天回车优化 2024-08-10 13:03:29 +08:00
橙子
1c7486a7bc feat: 新增bbs排行榜功能 2024-08-09 22:39:27 +08:00
chenchun
b30e2f0cc0 fix: 修复等级bug 2024-08-09 10:50:18 +08:00
橙子
07d82e508e feat: 优化首页样式 2024-08-09 00:39:39 +08:00
橙子
29f9cb6b4a fix:修复rbac启动问题 2024-08-08 00:15:27 +08:00
chenchun
b4e29d4776 Merge remote-tracking branch 'origin/abp' into abp 2024-08-07 15:53:05 +08:00
Xwen
a4aff25008 feat:首页消息下拉框滚动显示 2024-08-07 14:13:52 +08:00
chenchun
940dbca248 feat: 添加忽略文件 2024-08-07 11:38:57 +08:00
chenchun
4097244d5b style: 修复消息样式 2024-08-07 11:12:01 +08:00
chenchun
bb6e9b9e3f feat: 修改存储放入localStorage 2024-08-07 10:16:35 +08:00
chenchun
1d1f43afe3 feat:添加ip2region.db 2024-08-07 10:12:09 +08:00
橙子
5a4d00a788 feat: 补充前端 2024-08-07 00:03:07 +08:00
橙子
578d410b77 feat: 优化,改造通知模块 2024-08-07 00:01:44 +08:00
橙子
84b11ae6a8 feat: 新增bat流水线 2024-08-04 22:29:11 +08:00
橙子
923972c543 style:添加工作单元说明 2024-08-03 22:31:30 +08:00
橙子
62708830b1 fix: 还原测试 2024-08-03 11:47:32 +08:00
橙子
a55b633d84 style: 修改注释 2024-08-02 22:37:21 +08:00
橙子
634c88e337 !28 解决表字段隔离时,启动租户异常
Merge pull request !28 from herryz/abp
2024-08-02 14:29:47 +00:00
橙子
afa27a3f53 !25 update Yi.Doc.Md/01.框架快速开始教程/00.快速上手/01.依赖关系.md.
Merge pull request !25 from gydihl/N/A
2024-08-02 13:05:02 +00:00
橙子
277126e9df !26 update Yi.Doc.Md/02.框架功能模块教程/08.Crud增删改查.md.
Merge pull request !26 from gydihl/N/A
2024-08-02 12:08:24 +00:00
zhouhr
c72fb7c05e 解决表字段隔离时,启动租户异常 2024-08-02 17:48:12 +08:00
chenchun
396d4b456b style:调整config样式 2024-07-29 15:44:19 +08:00
chenchun
594708c18f Merge branch 'abp-dev' of https://gitee.com/ccnetcore/Yi into abp-dev
# Conflicts:
#	Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs
2024-07-29 15:03:30 +08:00
chenchun
8159f90cc8 feat: 完善bbs配置信息 2024-07-29 14:59:43 +08:00
橙子
2eaa5f5bb6 feat: 完善多租户md 2024-07-28 23:40:29 +08:00
chenchun
8b890a9271 feat: 完成saas多租户测试 2024-07-28 00:25:00 +08:00
chenchun
df1a4d7149 Merge remote-tracking branch 'origin/abp' into abp 2024-07-27 17:05:08 +08:00
chenchun
12c181a5aa fix: 修复table校验 2024-07-27 17:04:30 +08:00
橙子
480606eaf5 style: 构建head 2024-07-26 00:05:53 +08:00
橙子
54f125a2f5 feat: 事件立即执行 2024-07-25 23:57:55 +08:00
橙子
e04edf4a4e feat: 设置发布事件立即执行 2024-07-25 22:34:40 +08:00
chenchun
0a54ba9cae fix: 修复前端人员性别sex显示错误 2024-07-25 20:07:45 +08:00
橙子
a074cdefa5 feat: 优化ai聊天输出 2024-07-22 23:59:21 +08:00
橙子
0382d4f114 fix: 修复个人聊天无显示问题 2024-07-21 23:44:13 +08:00
橙子
60ab339d79 feat: 优化前端样式,新增markdown支持 2024-07-21 23:13:27 +08:00
gydihl
26a52ee451 update Yi.Doc.Md/02.框架功能模块教程/08.Crud增删改查.md.
Signed-off-by: gydihl <dihl0103@163.com>
2024-07-21 14:51:28 +00:00
gydihl
79bd539a02 update Yi.Doc.Md/01.框架快速开始教程/00.快速上手/01.依赖关系.md.
Signed-off-by: gydihl <dihl0103@163.com>
2024-07-21 13:24:43 +00:00
橙子
047000fb1d feat: 上线ai聊天室 2024-07-21 20:40:20 +08:00
橙子
616e06d262 chorm: 构建 2024-07-21 17:57:50 +08:00
橙子
d9e91bcbf5 feat:聊天新增ai 2024-07-21 13:37:56 +08:00
chenchun
a0478279df feat: 新增openai对接接口 2024-07-19 18:17:36 +08:00
chenchun
58d1b62250 style: 添加微信群 2024-07-18 17:40:59 +08:00
chenchun
27c76a62f1 style: 更新5群 2024-07-18 17:39:44 +08:00
chenchun
7f7640d326 feat: 更新abp版本 2024-07-17 14:06:07 +08:00
chenchun
d0412af18f fix: 修复sqlsugar删除领域事件不触发问题 2024-07-17 12:27:01 +08:00
橙子
1e577527b3 Merge branch 'abp-dev' of https://gitee.com/ccnetcore/Yi into abp-dev 2024-07-07 00:59:53 +08:00
橙子
38bfc87fc1 feat: 完善sass多租户,支持不同数据库类型 2024-07-07 00:59:34 +08:00
橙子
1c09722d4f !21 update Yi.RuoYi.Vue3/src/layout/components/Sidebar/SidebarItem.vue.
Merge pull request !21 from tyjctl/N/A
2024-07-05 09:42:10 +00:00
橙子
38e936fa35 !22 update Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/System/UserService.cs.
Merge pull request !22 from tyjctl/N/A
2024-07-05 09:41:46 +00:00
橙子
d034063bab !23 update Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuDataSeed.cs.
Merge pull request !23 from tyjctl/N/A
2024-07-05 09:41:18 +00:00
chenchun
ebbe4465b3 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-07-05 17:40:19 +08:00
chenchun
38c39d4cb9 Merge branch 'abp-dev' into abp 2024-07-05 17:40:15 +08:00
chenchun
8bf01451a8 fix: 修复银行汇率问题 2024-07-05 17:40:02 +08:00
tyjctl
1b180ed60c update Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuDataSeed.cs.
种子数据菜单补重置密码

Signed-off-by: tyjctl <419999127@qq.com>
2024-07-05 02:17:13 +00:00
tyjctl
0aa532ffa4 update Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/System/UserService.cs.
前后端权限不匹配,自建用户没法修改用户信息

Signed-off-by: tyjctl <419999127@qq.com>
2024-07-05 02:07:21 +00:00
橙子
e5d6d319fd Merge branch 'abp-dev' into abp 2024-07-03 09:18:39 +08:00
橙子
b49ae9c034 style: 删除多余注释 2024-07-03 09:18:33 +08:00
橙子
996401eb62 Merge branch 'abp-dev' into abp 2024-06-28 00:14:34 +08:00
橙子
426c67631a feat: 完成配置模块 2024-06-28 00:14:15 +08:00
橙子
7fa4a5f363 Merge branch 'abp-dev' into abp 2024-06-27 22:40:17 +08:00
橙子
1843b9c44f feat: 完善配置模块 2024-06-27 22:39:09 +08:00
chenchun
fcea4c63a7 feat: 新增配置管理 2024-06-27 18:37:49 +08:00
chenchun
d5eead48cf Merge branch 'abp-dev' into abp 2024-06-27 17:06:42 +08:00
chenchun
389ce08dad feat: 完善银行汇率 2024-06-27 17:06:30 +08:00
chenchun
7946894d33 Merge branch 'abp-dev' into abp 2024-06-26 12:48:46 +08:00
chenchun
7955a9747b feat: 优化银行异步操作 2024-06-26 12:48:38 +08:00
chenchun
ca200c81b3 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-06-26 12:46:51 +08:00
chenchun
b30662d2b4 fix: 修复银行汇率问题 2024-06-26 12:46:39 +08:00
tyjctl
1c84757d1d update Yi.RuoYi.Vue3/src/layout/components/Sidebar/SidebarItem.vue.
修复菜单折叠后的三级菜单显示位置错误问题

Signed-off-by: tyjctl <419999127@qq.com>
2024-06-21 04:03:42 +00:00
橙子
5db4fea3b5 !16 update Yi.Abp.Net8/framework/Yi.Framework.Core/Helper/MimeHelper.cs. 拼写错误。
Merge pull request !16 from zsmygitee/N/A
2024-06-18 08:23:50 +00:00
橙子
3bcc8d3eba !18 update Yi.RuoYi.Vue3/src/components/DictTag/index.vue.
Merge pull request !18 from tyjctl/N/A
2024-06-18 08:23:05 +00:00
橙子
cc9a015111 !19 update Yi.RuoYi.Vue3/src/layout/components/IframeToggle/index.vue.
Merge pull request !19 from tyjctl/N/A
2024-06-18 08:22:19 +00:00
tyjctl
08de00f640 update Yi.RuoYi.Vue3/src/layout/components/IframeToggle/index.vue.
vue3 transition-group 不支持mode属性,消除vue warn

Signed-off-by: tyjctl <419999127@qq.com>
2024-06-14 10:29:46 +00:00
tyjctl
1c5be59105 update Yi.RuoYi.Vue3/src/components/DictTag/index.vue.
修复EL-tag组件误传值导致的vue warn

Signed-off-by: tyjctl <419999127@qq.com>
2024-06-14 10:08:41 +00:00
chenchun
5b109e91d1 fix: 更换银行模块源及修复钱钱小数 2024-06-13 15:56:58 +08:00
橙子
14db420cbe feat: 添加db作用域模式 2024-06-11 22:34:36 +08:00
zsmygitee
db08e993df update Yi.Abp.Net8/framework/Yi.Framework.Core/Helper/MimeHelper.cs. 拼写错误。
后缀名拼写错误。

Signed-off-by: zsmygitee <274725822@qq.com>
2024-06-11 06:56:02 +00:00
橙子
26dbc8d00d fix: 修复前端添加模块命令显示错误问题 2024-06-09 02:04:23 +08:00
橙子
a903b5e36c fix: 修复https调用http问题 2024-06-09 01:10:33 +08:00
橙子
0789ebf9a9 feat: 正式发布前端 2024-06-09 00:46:42 +08:00
橙子
198ce36fea fix: 修复命名错误 2024-06-09 00:41:52 +08:00
橙子
40a89c9374 chrom: 配置跨域 2024-06-09 00:39:57 +08:00
橙子
f267d820bf feat: 完成yi.tool.web爬虫 2024-06-09 00:29:53 +08:00
橙子
f44a099469 Merge branch 'abp-dev' into abp 2024-06-08 22:03:51 +08:00
橙子
419b25f38d feat: 完成yi.abp.tool 0.8.0版本 2024-06-08 21:56:59 +08:00
橙子
c23ff654ed feat: 完成add-module功能 2024-06-08 21:51:45 +08:00
橙子
b69267d94f feat: 发布yi.abp.tool前端 2024-06-08 00:13:29 +08:00
橙子
1ddcde1684 feat: 添加前端配套工具 2024-06-05 23:23:33 +08:00
橙子
33abda8fb3 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-06-05 20:34:24 +08:00
橙子
39a9416427 feat: 发布0.7版本yi-abp-tool 2024-06-05 20:28:53 +08:00
chenchun
9cc5d76888 feat: 工具升级 2024-06-05 18:38:43 +08:00
橙子
19983283f2 feat: yi-abp准备支持add 2024-06-05 00:33:54 +08:00
橙子
75ac150908 Merge branch 'abp-dev' of https://gitee.com/ccnetcore/Yi into abp-dev 2024-06-04 23:39:33 +08:00
chenchun
66a7cba068 Merge branch 'abp-dev' into abp 2024-06-04 12:11:42 +08:00
chenchun
d71cea6fea chore: 构建最新稳定版sqlsugar 2024-06-04 12:11:13 +08:00
橙子
27dbdad9b2 build: 更新模块模板 2024-06-03 22:35:14 +08:00
橙子
863507ade1 feat: 添加start启动页面 2024-06-03 22:21:02 +08:00
橙子
4660ae212c feat: 前端添加工具入口 2024-06-02 23:11:42 +08:00
橙子
44114c0d19 chorm: 构建0.5.0版本 2024-06-02 18:00:22 +08:00
橙子
565cd3da5c chorm: 构建0.4.0 yi.abp.tool 2024-06-02 17:46:36 +08:00
橙子
c55711c1eb Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-06-02 17:21:25 +08:00
橙子
5df066999b feat: 完成abp-tool搭建 2024-06-02 17:20:38 +08:00
橙子
d9c9db332c feat: 完成yi-abp模块生成 2024-06-02 14:12:37 +08:00
橙子
bca3ce1e5f feat: 完成abp-tool的接口调用 2024-06-02 13:27:41 +08:00
橙子
6121e62cc9 !15 update Yi.RuoYi.Vue3/src/views/system/menu/index.vue.
Merge pull request !15 from tyjctl/N/A
2024-06-02 05:11:37 +00:00
橙子
cbc34ade78 feat:搭建yi-abp tool框架 2024-06-02 13:09:25 +08:00
橙子
daaa3513ae feat: 新增yi-abp工具 2024-06-02 00:38:35 +08:00
橙子
0d6b62c8e7 feat: 新增yi-abp nuget脚手架,待正式版上传 2024-06-01 21:45:20 +08:00
橙子
a2d9326826 test:添加线程db单元测试 2024-05-29 23:42:56 +08:00
tyjctl
c847af3df1 update Yi.RuoYi.Vue3/src/views/system/menu/index.vue.
删除多余的点击事件,修复图标选择框点击后闪烁的异常

Signed-off-by: tyjctl <419999127@qq.com>
2024-05-29 10:39:46 +00:00
橙子
ef220a5b36 feat: 新增消息通知模块 2024-05-23 23:40:55 +08:00
橙子
695989969d fix: 修复bbs点赞数异常问题 2024-05-22 22:16:44 +08:00
橙子
3429de9eb6 style: 修改聚合跟类命名 2024-05-22 14:35:08 +08:00
橙子
f2e3c76539 refactor: 重构多租户模块,优化上线 2024-05-18 03:06:53 +08:00
橙子
1ca1c280f6 !12 处理vue warn
Merge pull request !12 from tyjctl/abp
2024-05-17 10:11:41 +00:00
橙子
d73fdaf7ad !14 update Yi.RuoYi.Vue3/src/views/system/tenant/index.vue.
Merge pull request !14 from tyjctl/N/A
2024-05-17 10:10:39 +00:00
tyjctl
071c541a4b update Yi.RuoYi.Vue3/src/views/system/tenant/index.vue.
Signed-off-by: tyjctl <419999127@qq.com>
2024-05-17 04:00:20 +00:00
陈淳
0b8467c0b0 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-05-16 11:43:35 +08:00
陈淳
41e202fe7b doc: 更新文档 2024-05-16 11:43:24 +08:00
橙子
269d0c00c5 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-05-04 02:53:49 +08:00
橙子
146a7093f7 fix: 修复岗位dtl问题 2024-05-04 02:53:23 +08:00
橙子
c9127c6d30 fix: 修复前端查询问题 2024-05-04 02:53:05 +08:00
陈淳
339c333679 Merge branch 'abp-dev' into abp 2024-04-29 18:18:04 +08:00
陈淳
a70ea536d4 chorm: 构建 2024-04-29 18:10:16 +08:00
陈淳
1a62c0154d Merge remote-tracking branch 'remotes/origin/abp-dev' into abp 2024-04-29 18:01:18 +08:00
陈淳
29ee0b5945 test: 完善单元测试 2024-04-29 17:50:51 +08:00
陈淳
68e627bb04 Merge branch 'abp-dev' into abp 2024-04-29 14:44:54 +08:00
陈淳
32aca8c6a8 chorm: 修改构建环境 2024-04-29 14:44:46 +08:00
陈淳
ef22651860 Merge branch 'abp-dev' into abp 2024-04-29 14:43:13 +08:00
陈淳
547c7d1b6d feat: 优化用户创建 2024-04-29 14:42:13 +08:00
陈淳
cabdd55cf5 feat: 用户account领域与user领域关系 2024-04-29 14:22:45 +08:00
陈淳
d7a4c4f82d Squashed commit of the following:
commit df5224cf12
Author: 陈淳 <454313500@qq.com>
Date:   Sun Apr 28 15:10:10 2024 +0800

    feat: 权限特性支持多标签
2024-04-28 15:10:47 +08:00
陈淳
df5224cf12 feat: 权限特性支持多标签 2024-04-28 15:10:10 +08:00
陈淳
a6625de5d5 chorm: 构建 2024-04-28 14:50:00 +08:00
陈淳
515919b048 chorm: 合并 2024-04-28 14:48:05 +08:00
陈淳
c21d1dd155 style: 添加信息打印 2024-04-28 14:47:20 +08:00
陈淳
643b284e27 Squashed commit of the following:
commit 368b4fcfd4
Author: 陈淳 <454313500@qq.com>
Date:   Sun Apr 28 11:45:13 2024 +0800

    feat: 完善禁止无权限用户登录

commit 8c343fb01f
Author: 陈淳 <454313500@qq.com>
Date:   Sun Apr 28 11:36:48 2024 +0800

    style: 修复股票api过期问题

commit ae30d4b2cb
Author: 陈淳 <454313500@qq.com>
Date:   Fri Apr 26 19:08:18 2024 +0800

    fix: 修复值对象查询导致问题,已同步sqlsugar更新

commit 4c12626b44
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 18:15:57 2024 +0800

    feat: 添加值对象

commit d389dcbedf
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 18:06:09 2024 +0800

    feat: 添加值对象

commit 58ff8f45cf
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 15:54:25 2024 +0800

    feat: 去除新增的缓存操作

commit 826271c84d
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 15:39:41 2024 +0800

    feat: 添加缓存crud
2024-04-28 11:45:56 +08:00
陈淳
368b4fcfd4 feat: 完善禁止无权限用户登录 2024-04-28 11:45:13 +08:00
陈淳
1f4f98b513 Squashed commit of the following:
commit 8c343fb01f
Author: 陈淳 <454313500@qq.com>
Date:   Sun Apr 28 11:36:48 2024 +0800

    style: 修复股票api过期问题

commit ae30d4b2cb
Author: 陈淳 <454313500@qq.com>
Date:   Fri Apr 26 19:08:18 2024 +0800

    fix: 修复值对象查询导致问题,已同步sqlsugar更新

commit 4c12626b44
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 18:15:57 2024 +0800

    feat: 添加值对象

commit d389dcbedf
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 18:06:09 2024 +0800

    feat: 添加值对象

commit 58ff8f45cf
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 15:54:25 2024 +0800

    feat: 去除新增的缓存操作

commit 826271c84d
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 15:39:41 2024 +0800

    feat: 添加缓存crud
2024-04-28 11:37:51 +08:00
陈淳
8c343fb01f style: 修复股票api过期问题 2024-04-28 11:36:48 +08:00
陈淳
777aa64153 Squashed commit of the following:
commit ae30d4b2cb
Author: 陈淳 <454313500@qq.com>
Date:   Fri Apr 26 19:08:18 2024 +0800

    fix: 修复值对象查询导致问题,已同步sqlsugar更新

commit 4c12626b44
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 18:15:57 2024 +0800

    feat: 添加值对象

commit d389dcbedf
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 18:06:09 2024 +0800

    feat: 添加值对象

commit 58ff8f45cf
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 15:54:25 2024 +0800

    feat: 去除新增的缓存操作

commit 826271c84d
Author: 陈淳 <454313500@qq.com>
Date:   Mon Apr 22 15:39:41 2024 +0800

    feat: 添加缓存crud
2024-04-26 19:09:11 +08:00
陈淳
ae30d4b2cb fix: 修复值对象查询导致问题,已同步sqlsugar更新 2024-04-26 19:08:18 +08:00
陈淳
4c12626b44 feat: 添加值对象 2024-04-22 18:15:57 +08:00
陈淳
d389dcbedf feat: 添加值对象 2024-04-22 18:06:09 +08:00
陈淳
58ff8f45cf feat: 去除新增的缓存操作 2024-04-22 15:54:25 +08:00
陈淳
826271c84d feat: 添加缓存crud 2024-04-22 15:39:41 +08:00
陈淳
3a158c8249 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-04-19 17:01:34 +08:00
陈淳
6b14f6fbea Merge branch 'abp-dev' of https://gitee.com/ccnetcore/Yi into abp-dev 2024-04-19 17:00:55 +08:00
陈淳
e92dd48bbf feat: 扩展动态api统一前缀 2024-04-19 17:00:50 +08:00
橙子
250937a099 Squashed commit of the following:
commit 53b594a36a
Author: 橙子 <454313500@qq.com>
Date:   Mon Apr 15 20:14:36 2024 +0800

    feat:升级前端element版本
2024-04-15 20:15:36 +08:00
橙子
53b594a36a feat:升级前端element版本 2024-04-15 20:14:36 +08:00
tyjctl
ea86ab667f Merge branch 'abp' of https://gitee.com/tyjctl/Yi into abp 2024-04-15 18:11:59 +08:00
tyjctl
8fc686bddf Merge branch 'abp' of https://gitee.com/tyjctl/Yi into abp 2024-04-15 18:11:44 +08:00
tyjctl
f60298a941 Merge branch 'abp' of https://gitee.com/tyjctl/Yi into abp 2024-04-15 18:05:57 +08:00
tyjctl
cb2674ebb6 Merge branch 'abp' of https://gitee.com/tyjctl/Yi into abp 2024-04-15 18:05:33 +08:00
tyjctl
3f92a0ccb4 Merge branch 'abp' of https://gitee.com/tyjctl/Yi into abp 2024-04-15 17:56:58 +08:00
陈淳
cb7f4db207 Merge branch 'abp' into abp-dev 2024-04-15 17:50:50 +08:00
陈淳
6bfcccfbb6 Merge branch 'abp' into abp-dev 2024-04-15 08:50:06 +08:00
橙子
9ef959ee46 !11 update Yi.RuoYi.Vue3/src/layout/components/TagsView/ScrollPane.vue.
Merge pull request !11 from tyjctl/N/A
2024-04-15 00:47:49 +00:00
橙子
c24ef3f6b5 !10 update Yi.RuoYi.Vue3/src/layout/components/Settings/index.vue.
Merge pull request !10 from tyjctl/N/A
2024-04-15 00:47:14 +00:00
橙子
86ea2ce863 !9 update Yi.RuoYi.Vue3/package.json.
Merge pull request !9 from tyjctl/N/A
2024-04-15 00:46:55 +00:00
陈淳
646531393f chorm: 调整launchsettign 2024-04-15 08:44:08 +08:00
tyjctl
29d4bebdca update Yi.RuoYi.Vue3/src/layout/components/TagsView/ScrollPane.vue.
处理element-plus版本升级导致的bug

Signed-off-by: tyjctl <419999127@qq.com>
2024-04-11 09:32:50 +00:00
tyjctl
ac69cbc0b4 update Yi.RuoYi.Vue3/src/layout/components/Settings/index.vue.
处理vite升级导致首页加载异常的bug

Signed-off-by: tyjctl <419999127@qq.com>
2024-04-11 09:30:42 +00:00
tyjctl
4e83663f90 update Yi.RuoYi.Vue3/package.json.
更新了项目依赖,本来是为了element-plus 2.6.3,顺带把vite版本也更新了下,测试没有bug,报警需要将vite.config.js改为 vite.config.mts。

Signed-off-by: tyjctl <419999127@qq.com>
2024-04-11 09:27:58 +00:00
橙子
0faa1aecad fix: 修复默认头像显示问题 2024-04-10 00:11:11 +08:00
橙子
8546c59f52 feat: 聊天室结合用户领域体系 2024-04-09 23:59:26 +08:00
陈淳
944bd8c956 feat: 完成聊天室领域与用户领域划分通讯 2024-04-09 17:45:12 +08:00
陈淳
641217085f feat: 完成后端消息推送用户信息 2024-04-08 18:57:59 +08:00
陈淳
586775c8ff fix: 修复注册自动跳转到登录页面问题 2024-04-08 14:23:22 +08:00
橙子
3f2f89768b fix: 修复定时器跳转问题 2024-04-07 17:27:49 +08:00
橙子
1087b0965d feat: 上线聊天室功能模块 2024-04-07 16:35:21 +08:00
橙子
6aedff75f1 feat: 完善聊天模块 2024-04-06 18:28:32 +08:00
橙子
43b4032bbb feat: 对接chathub用户列表 2024-04-04 19:28:18 +08:00
橙子
b57d56f317 feat: 搭建chathub模块 2024-04-04 14:00:32 +08:00
橙子
6404f1b786 Merge branch 'abp' into abp-dev 2024-04-03 21:55:39 +08:00
橙子
47f77a4dee !8 fix:https://gitee.com/ccnetcore/Yi/issues/I9DVOY
Merge pull request !8 from Xiaoli/abp
2024-04-03 13:53:24 +00:00
陈淳
4febaa68eb feat: 完成聊天室搭建 2024-04-03 16:39:06 +08:00
xiaolipro
f5c83cb770 fix:https://gitee.com/ccnetcore/Yi/issues/I9DVOY 2024-04-03 11:59:04 +08:00
橙子
3fc0b1020c feat: 完成前端菜单栏构建 2024-04-02 23:24:10 +08:00
陈淳
887ea275f6 feat: 聊天室前端布局 2024-04-02 18:41:41 +08:00
陈淳
4d10caecb9 feat: 构建 2024-04-02 13:52:44 +08:00
陈淳
3bfe4b6980 feat: 全面更新抽离版本号 2024-04-02 13:51:48 +08:00
陈淳
33bf294f71 feat: 合并解决方案 2024-04-01 14:30:07 +08:00
陈淳
11443beb22 feat: 添加配置管理模块 2024-04-01 14:29:33 +08:00
陈淳
c2c92ab196 fix: 修复重置密码问题 2024-03-26 17:12:30 +08:00
陈淳
d752c97aff feat: 添加模块初始化时间统计 2024-03-25 11:15:29 +08:00
陈淳
f53a6cf05b feat: 添加客户端代理层 2024-03-20 17:52:59 +08:00
陈淳
b6ec8cf6f0 fix: 修复利息变化记录问题 2024-03-18 14:24:39 +08:00
陈淳
38ad893a5c style: 升级全部包,abp 8.0.5 2024-03-18 09:51:02 +08:00
陈淳
dd2475e829 fix: 修复利息记录显示 2024-03-18 09:15:21 +08:00
橙子
f9a3514c1d style: 修改时间表达式 2024-03-16 18:04:09 +08:00
橙子
534b03ef5c feat: 添加利息趋势图 2024-03-16 17:57:17 +08:00
陈淳
822febba2e feat: 完成第三方利息汇率对接 2024-03-15 19:12:54 +08:00
陈淳
e989313b0d fix: 修复代码块样式问题 2024-03-15 09:37:50 +08:00
陈淳
b713793063 fix: 修复排序用法 2024-03-14 18:50:45 +08:00
陈淳
0327f040e9 fix: 修复银行卡排序问题 2024-03-14 18:41:47 +08:00
陈淳
e4f89e5a05 feat: 上线银行模块 2024-03-14 18:32:58 +08:00
橙子
069e411dc4 feat: 对接银行模块接口,即将上线功能 2024-03-14 00:29:01 +08:00
陈淳
9dc72ef3ee feat: 添加银行功能搭建 2024-03-13 18:01:38 +08:00
橙子
61d774817f feat: 新增银行系统前端 2024-03-12 23:01:10 +08:00
陈淳
af98ef56a1 chore: 增加限流限制上限 2024-03-11 17:29:38 +08:00
陈淳
4bb93a947e feat: 重构signalr,在线人数允许不用登录 2024-03-11 17:07:43 +08:00
陈淳
8857fb24f0 fix: 修复字典种子数据显示问题 2024-03-08 13:50:35 +08:00
陈淳
21fdb41b09 stlye: 添加数据库配置打印 2024-03-08 13:43:17 +08:00
陈淳
3b3c778a0f Merge branch 'abp-dev' of https://gitee.com/ccnetcore/Yi into abp-dev 2024-03-08 11:00:17 +08:00
陈淳
a63c986c02 style: 完善code-gen样式 2024-03-08 11:00:13 +08:00
橙子
2279fb3788 Merge branch 'abp-dev' of https://gitee.com/ccnetcore/Yi into abp-dev 2024-03-07 22:31:08 +08:00
橙子
f0ae259040 chore: 查缺补漏构建 2024-03-07 22:31:01 +08:00
陈淳
65f0445001 stlye: 添加备注 2024-03-07 11:44:27 +08:00
陈淳
a7a794c709 fix: 修复校验与效验拼写 2024-03-07 11:32:49 +08:00
陈淳
4ce9ee520a style: 完善完整logo 2024-03-06 18:46:33 +08:00
陈淳
70a65766c1 Merge branch 'abp-dev' of https://gitee.com/ccnetcore/Yi into abp-dev 2024-03-06 18:35:40 +08:00
陈淳
1ab0263347 style: 添加启动logo 2024-03-06 18:35:34 +08:00
橙子
c0f721d737 feat: 上线新登录页面 2024-03-04 23:06:52 +08:00
橙子
257197e1f1 chore: 修复构建文件 2024-03-04 23:02:17 +08:00
橙子
3f80307154 feat: 完成登录也优化 2024-03-04 22:54:43 +08:00
陈淳
14781da78e refactor: 手撸前端登录页面 2024-03-04 18:18:26 +08:00
橙子
d4e4a4a8b7 Merge branch 'abp-dev' of https://gitee.com/ccnetcore/Yi into abp-dev 2024-03-03 15:58:23 +08:00
橙子
aa5d3b9d90 feat: 优化bbs前端样式 2024-03-03 15:58:19 +08:00
陈淳
48003554b4 chore: 移除多余插件 2024-03-01 18:30:40 +08:00
陈淳
bcb9f094c9 feat: 新增代码样式及复制功能 2024-03-01 18:30:20 +08:00
陈淳
bbcfadbba4 style: 优化文章代码块样式 2024-02-29 19:07:48 +08:00
陈淳
0e7c6d6d1c fix: 修复无限转盘问题 2024-02-29 11:41:41 +08:00
陈淳
eaed0cac8a doc: 添加依赖关系文档 2024-02-28 15:44:48 +08:00
陈淳
d23492b9a8 feat: 优化友好提示 2024-02-27 17:15:08 +08:00
陈淳
6697649b97 feat: 新增全站历史统计功能 2024-02-27 13:43:56 +08:00
陈淳
5a2d9125d4 Merge branch 'abp-dev' into abp 2024-02-27 10:12:15 +08:00
陈淳
0b97823f92 fix: 修复大转盘停止转动问题 2024-02-27 10:12:07 +08:00
陈淳
f39514a623 Merge branch 'abp-dev' into abp 2024-02-27 10:00:48 +08:00
陈淳
0a247a9229 Merge branch 'abp-dev' of https://gitee.com/ccnetcore/Yi into abp-dev 2024-02-27 10:00:14 +08:00
陈淳
2fb831075e fix: 修复缓存字段公开问题 2024-02-27 10:00:07 +08:00
橙子
e0f8ac1eea feat:平衡概率 2024-02-26 22:58:42 +08:00
橙子
8ff472042c feat: 平衡概率 2024-02-26 22:49:12 +08:00
橙子
5f4ee6cc68 feat: 调整概率2 2024-02-26 22:28:48 +08:00
橙子
de48c64bc9 feat: 调整平衡概率 2024-02-26 22:28:38 +08:00
橙子
01aa699462 feat: 修改概率 2024-02-26 22:23:07 +08:00
橙子
801b280717 feat: 合并 2024-02-26 22:16:16 +08:00
橙子
96b4bb0ce6 feat: 跳转大转盘概率 2024-02-26 22:15:28 +08:00
陈淳
11b94f965c feat: 新增大转盘功能模块 2024-02-26 18:44:11 +08:00
陈淳
3532bf54e7 feat: 新增速率限制滑动限流 2024-02-26 13:42:37 +08:00
陈淳
a35ab95809 feat: 修复日志忽略问题 2024-02-23 17:08:30 +08:00
陈淳
36207ee29a feat: 修复大小写问题 2024-02-23 16:50:04 +08:00
陈淳
d7d6986927 feat: 修复解决方案大小写linux敏感问题 2024-02-23 16:37:46 +08:00
陈淳
db81a5358f test: 测试种子数据在linux下的编译 2024-02-23 16:30:11 +08:00
陈淳
9f4c87c555 feat: 完善前端登录跳转体验 2024-02-23 16:05:09 +08:00
陈淳
f77887e6a3 feat: 完成通知公告功能 2024-02-21 15:45:47 +08:00
陈淳
1907acd35d feat: 添加消息通知hub 2024-02-20 18:32:48 +08:00
陈淳
f7f8bad301 feat: 对接前端,完成通知公告 2024-02-20 15:34:29 +08:00
陈淳
d2ae803ecc feat: 添加前端动画切换效果 2024-02-19 18:32:44 +08:00
陈淳
5416ba1048 feat: 添加公告管理 2024-02-19 17:51:54 +08:00
陈淳
071ca9462a chore: 构建 2024-02-19 17:29:43 +08:00
陈淳
02fc86af4f feat: 新增代码生成器模板种子数据 2024-02-19 17:12:33 +08:00
陈淳
2dbfdc67c5 feat: 完善实体配置,可省略繁琐配置 2024-02-18 16:44:32 +08:00
陈淳
609c7c821f fix: 修复ExtraProperties忽略问题 2024-02-18 16:34:55 +08:00
陈淳
b239a4ff56 style: 完善注释提示 2024-02-18 15:32:00 +08:00
陈淳
7fb5cb72f5 feat:前端对接完成缓存模块 2024-02-18 15:29:35 +08:00
陈淳
798cb92f50 feat: 完成缓存监控模块 2024-02-18 15:02:23 +08:00
陈淳
9477ca0373 feat: 新增用户信息缓存管理 2024-02-18 11:41:43 +08:00
陈淳
efa87e0e1a feat: 新增兼容解决数据库开启了大小写不敏感问题 2024-02-18 09:52:11 +08:00
陈淳
26dd107f48 style: 修改rbac service结构 2024-02-18 09:35:35 +08:00
陈淳
4673398976 feat: 完善sql耗时Aop 2024-02-17 17:37:24 +08:00
陈淳
c72a990162 feat: 添加freeredis缓存模块 2024-02-17 16:59:57 +08:00
橙子
3f1f76b2e8 style: 修改codegen命名 2024-02-16 21:06:34 +08:00
橙子
6675376241 feat: 前后端联调代码生成接口 2024-02-16 17:16:54 +08:00
橙子
12ec7a0392 Merge branch 'abp' into abp-dev 2024-02-16 15:41:03 +08:00
橙子
1d9b0f771f chore:提交 2024-02-16 15:40:45 +08:00
橙子
f7ef896f48 feat: 添加代码生成器模块 2024-02-16 15:40:13 +08:00
橙子
da1d24bb5c chore: 构建版本 2024-02-12 20:29:43 +08:00
橙子
e30586d314 feat: 完成多租户模块基础搭建 2024-02-09 17:47:32 +08:00
橙子
58fceea247 feat: 完成前端切换功能 2024-02-09 16:52:17 +08:00
橙子
36f72c857d feat: 完成租户前端对接 2024-02-08 19:48:35 +08:00
橙子
39d472bdc8 feat: 完成db创建优化 2024-02-08 17:32:28 +08:00
橙子
64adfcceab feat: 添加租户初始化 2024-02-08 12:59:21 +08:00
橙子
419cadfe1d feat: 添加多租户界面及种子数据 2024-02-07 21:35:24 +08:00
橙子
44b13acc61 feat: 添加租户管理模块搭建 2024-02-06 15:25:17 +08:00
陈淳
13ae0e33c1 feat: 完成等级功能页面 2024-02-01 15:16:38 +08:00
陈淳
ff19cb68b9 fix: 修复审计日志判断当前用户为空的问题 2024-01-31 18:16:17 +08:00
陈淳
c50f1ffcb4 feat: 添加活动页面入口 2024-01-30 18:30:26 +08:00
陈淳
e17ba2889a feat: 优化注释导致页面空白的问题 2024-01-30 18:22:47 +08:00
陈淳
fdb4e46019 fix: 修复个人中心分页问题 2024-01-30 15:08:41 +08:00
陈淳
0be8a69eca fix: 修复缓存默认20分钟过期问题 2024-01-30 14:44:18 +08:00
陈淳
69a4de8e0e feat: 添加等级界面 2024-01-29 18:26:51 +08:00
陈淳
fd78b2e3c3 feat: 添加等级名称显示 2024-01-29 11:20:40 +08:00
橙子
6bc9f1c7fd fix: 修复个人中心显示问题 2024-01-28 14:33:21 +08:00
陈淳
861379b678 feat: 添加个人中心用户信息 2024-01-27 17:45:04 +08:00
陈淳
7969a75a19 feat: 完善实体追踪审计日志 2024-01-27 17:42:09 +08:00
陈淳
b6d35a88db feat: 优化前端用户限制组件 2024-01-27 10:55:12 +08:00
橙子
1087b5aebe chore: 同步 2024-01-25 20:39:05 +08:00
橙子
4a626503f7 chore: 构建 2024-01-25 20:38:35 +08:00
橙子
add74b0ad0 chore: 构建大小写问题 2024-01-25 20:32:01 +08:00
陈淳
10823b3c98 feat: 完善签到页面 2024-01-25 18:13:04 +08:00
陈淳
8e85a233a9 doc: 添加文档 2024-01-25 15:39:50 +08:00
陈淳
19d8912680 style: 修改token过期时间 2024-01-25 11:31:27 +08:00
陈淳
b5d8d43e72 chore: 构建 2024-01-25 10:26:10 +08:00
陈淳
98896f838b style: 完善测试描述 2024-01-25 10:20:46 +08:00
陈淳
3fa884f326 style: 添加扩展示例 2024-01-25 10:06:32 +08:00
橙子
633f8d66f2 style: 优化备注 2024-01-25 01:43:43 +08:00
橙子
6b96231087 refactor: 魔改工作单元体系 2024-01-25 01:43:00 +08:00
陈淳
e614935693 feat: 完成token刷新机制,支持多模式 2024-01-24 16:07:54 +08:00
陈淳
6b15aa9c8e stlyle: 添加jwt默认值 2024-01-24 11:29:59 +08:00
陈淳
c9e01e0782 feat: 后端完成双token刷新功能 2024-01-24 11:26:44 +08:00
橙子
c18334002c feat: 搭建双token
fix: 修复签到记录问题
2024-01-23 23:35:38 +08:00
陈淳
e0fa97f7a2 style: 优化面板输出,调整token过期时间 2024-01-23 17:49:49 +08:00
陈淳
e9b5147743 feat: 完成审计日志模块引入 2024-01-23 15:08:01 +08:00
陈淳
96ae77e5ab feat: 搭建完成审计日志模块 2024-01-23 11:52:49 +08:00
橙子
ba9ac0fa5d feat: 优化数据过滤结构 2024-01-22 20:06:39 +08:00
陈淳
f43f1e7be1 refactor: 重构优化db模块抽象 2024-01-22 18:30:01 +08:00
陈淳
88eba44f68 refactor:重构审计日志模块,完善用户数据权限 2024-01-22 13:58:21 +08:00
陈淳
fac6f04943 feat: swagger集成租户header 2024-01-22 11:12:50 +08:00
陈淳
56785f96a9 refactor: 跳转signlr的结构 2024-01-22 09:27:58 +08:00
橙子
2013aa5db8 feat: 完成多租户saas框架搭建 2024-01-21 18:11:04 +08:00
橙子
68c1d59638 feat: 搭建多租户框架 2024-01-21 00:26:21 +08:00
陈淳
3412ce64cb feat: 单元测试添加种子数据 2024-01-19 18:32:08 +08:00
陈淳
1c32534ba1 style: 忽略备份文件 2024-01-19 18:17:50 +08:00
陈淳
e509adfdab chore: 构建 2024-01-19 18:17:30 +08:00
陈淳
c42f3c329e style: 修改样式 2024-01-19 18:09:56 +08:00
陈淳
32ab379003 chore: 构建 2024-01-19 18:09:05 +08:00
陈淳
1d777f8704 feat: 添加单元测试web端 2024-01-19 18:08:11 +08:00
陈淳
226b4ce722 chore: 构建 2024-01-19 17:48:20 +08:00
陈淳
edcf7f52af feat: 优化单元测试 2024-01-19 17:48:03 +08:00
陈淳
7e895403a9 feat: 完成测试框架搭建 2024-01-19 17:45:11 +08:00
陈淳
d604e9c3f3 chore: 添加docker支持 2024-01-19 15:37:54 +08:00
陈淳
6debf25162 feat: 优化主题查询、财富排行榜显示、个人中心信息显示、首页主题显示 2024-01-19 10:43:34 +08:00
陈淳
a81873c148 feat: 表情包功能 2024-01-18 17:56:13 +08:00
陈淳
7475a683cc feat: 添加数据权限过滤 2024-01-18 16:28:09 +08:00
陈淳
666f5a10d3 fix: 修复头像组件内传值问题 2024-01-17 17:52:36 +08:00
陈淳
70a7840365 fix: 修复前端头像显示问题 2024-01-17 16:54:53 +08:00
陈淳
98a4a2158a feat: 新增个人页面跳转功能 2024-01-17 16:31:01 +08:00
陈淳
0d5c196f39 chore: 完成个人页面改造 2024-01-17 11:47:36 +08:00
陈淳
3d5aff3e29 feat: 添加个人中心界面 2024-01-16 18:49:30 +08:00
陈淳
d324ddff3f feat: 撸个人页面 2024-01-16 15:48:15 +08:00
陈淳
72b0135410 feat: 优化在线用户 2024-01-16 11:14:07 +08:00
陈淳
820400d77f fix: 修复连续签到问题 2024-01-16 09:13:14 +08:00
陈淳
ba2fa497b1 chore: 构建 2024-01-15 17:08:29 +08:00
陈淳
6bec254d49 feat: 前端优化 2024-01-15 17:03:38 +08:00
陈淳
71aabe9fe4 feat: 优化评论换行字符 2024-01-15 16:42:54 +08:00
陈淳
f461a1978e chore: 构建 2024-01-15 15:55:08 +08:00
陈淳
bbc5287551 feat: 完善财富排行榜功能 2024-01-15 15:47:36 +08:00
陈淳
71108b6ba8 feat: 优化钱钱系统显示 2024-01-15 15:44:55 +08:00
陈淳
56760a0aac fix: 修复演示环境重置开关 2024-01-15 15:32:08 +08:00
陈淳
a06c8c00b3 feat: 新增显示签到记录 2024-01-15 15:28:32 +08:00
陈淳
40195ea993 feat: 完成在线人数store改造 2024-01-15 12:08:31 +08:00
橙子
e64b12097a fix: 修复在线问题 2024-01-15 00:25:25 +08:00
陈淳
cf793c198f fix: 修复在线问题 2024-01-13 17:38:04 +08:00
陈淳
f1a87ef529 feat: 添加签到功能 2024-01-13 17:20:57 +08:00
陈淳
4e5f51a4c8 feat: 优化job操作 2024-01-13 16:44:39 +08:00
陈淳
36e9938011 feat: 添加定时任务及演示模块的更新 2024-01-13 16:17:48 +08:00
陈淳
cf4e5aae47 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-12 17:18:45 +08:00
陈淳
e71936063d feat: 初步搭建任务调度管理实现 2024-01-12 17:18:39 +08:00
Xwen
ae5f63b1ed feat:新增签到layout 2024-01-11 23:51:09 +08:00
橙子
4a0a0e0bb6 feat: 完善bbs用户信息 2024-01-11 22:11:38 +08:00
橙子
c80ecf958c feat: 新增签到功能 2024-01-11 22:06:15 +08:00
陈淳
5a65a2e49f feat:搭建积分领域 2024-01-11 18:51:53 +08:00
陈淳
3ee8419802 chore: 优化启动脚本 2024-01-11 10:29:31 +08:00
陈淳
90a5a14d30 chore: 构建 2024-01-11 10:24:43 +08:00
陈淳
6ae73e6c2b chore: 构建 2024-01-11 10:23:42 +08:00
陈淳
e394726eef feat:添加用户排序 2024-01-11 10:20:39 +08:00
陈淳
c3f74b8dc2 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-11 10:08:49 +08:00
陈淳
00f4d3eaf3 feat: 优化电话号码效验 2024-01-11 10:08:44 +08:00
Xwen
ad55441bf6 postMessage数据转换 2024-01-10 23:24:12 +08:00
Xwen
0287e0481c feat:发送数据去掉JSON.stringfy 2024-01-10 23:19:31 +08:00
Xwen
93e4ab88fb Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-10 23:14:32 +08:00
Xwen
1267cf9845 feat:测试 2024-01-10 23:14:20 +08:00
橙子
c588936c7e Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-10 23:07:18 +08:00
橙子
1ca8c80af1 feat: 添加token返回 2024-01-10 23:07:07 +08:00
Xwen
08b696fd9b perf:改为返回的是token对象 2024-01-10 23:05:52 +08:00
Xwen
ef53885bd2 perf:优化第三方登录传参 2024-01-10 22:58:18 +08:00
Xwen
d27dd0e318 perf:loginSuccess传入合适的参数 2024-01-10 22:57:27 +08:00
Xwen
ada31888f4 perf:拿到第三方token,loginSuccess更换参数 2024-01-10 22:55:36 +08:00
Xwen
41455cd47f perf:导出loginSuccess方法 2024-01-10 22:51:05 +08:00
Xwen
b7903910de perf:完善第三方登录后逻辑 2024-01-10 22:45:55 +08:00
Xwen
36af5f06b5 feat:登录接窗口返回的token 2024-01-10 22:12:03 +08:00
Xwen
6bec250f6c feat:授权成功后也关闭弹窗 2024-01-10 22:07:29 +08:00
Xwen
ce667a9f9e feat:重复绑定根据状态码关闭窗口 2024-01-10 22:01:23 +08:00
陈淳
2c8d579668 feat: 添加sample示例 2024-01-10 17:26:40 +08:00
陈淳
a3f7c1e867 feat: 完善日志记录分类 2024-01-10 15:03:26 +08:00
陈淳
3f2b0319fa chore: 添加脚手架 2024-01-10 09:42:07 +08:00
陈淳
4394039f29 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-10 09:12:54 +08:00
陈淳
2b870358e9 feat: 优化主题置顶显示,同时添加模板 2024-01-10 09:12:30 +08:00
Xwen
fab126ddfd feat:测试 2024-01-09 23:32:54 +08:00
Xwen
ad7c851fdc postMessage传参对象处理 2024-01-09 23:26:18 +08:00
Xwen
bf8ce2e845 perf:更新gitee绑定URL 2024-01-09 23:18:43 +08:00
Xwen
d81f09bf28 perf:修改gitee地址 2024-01-09 23:11:20 +08:00
Xwen
50d381cab9 feat:gitee绑定使用postMessage通信 2024-01-09 23:00:53 +08:00
Xwen
ec38f939d5 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-09 22:39:59 +08:00
Xwen
a66f010af9 feat:第三方授权解除绑定对接 2024-01-09 22:39:47 +08:00
橙子
2325c83455 fix: 修复第三方登录实现问题 2024-01-09 22:09:22 +08:00
Xwen
9d826c7063 perf:优化首页交互 2024-01-09 21:46:09 +08:00
Xwen
bf6155b1bd feat:测试 2024-01-09 20:46:55 +08:00
陈淳
8c122b7e09 feat: 优化定时任务体验 2024-01-09 16:59:20 +08:00
Xwen
5357c813e4 fix:修复刷新首页长连接不建立的问题 2024-01-09 00:17:58 +08:00
Xwen
84503d9a81 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-08 23:52:49 +08:00
Xwen
6642f97231 feat:测试 2024-01-08 23:52:36 +08:00
橙子
b5c3f930f5 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-08 23:51:13 +08:00
橙子
ba8412faa7 feat: 去除多余参数 2024-01-08 23:46:45 +08:00
Xwen
30c09eec47 feat:测试 2024-01-08 23:31:24 +08:00
Xwen
6b32608fa8 feat:测试 2024-01-08 23:25:01 +08:00
Xwen
888c29373b feat:测试第三方授权 2024-01-08 23:18:40 +08:00
Xwen
785b685e8d perf:区分第三方授权参数 2024-01-08 23:11:07 +08:00
Xwen
10a2593979 feat:新增账号设置模块和引入表格组件 2024-01-08 23:02:35 +08:00
Xwen
a0fd35bf5e perf:统一第三方授权页面 2024-01-08 21:41:23 +08:00
Xwen
1466c4e6cd perf:授权路由更改 2024-01-08 21:32:52 +08:00
Xwen
944acd90a6 perf:调整signalR连接为登录就建立 2024-01-08 21:28:05 +08:00
Xwen
7101238eae perf:板块文章页置顶接口添加id传参 2024-01-08 21:05:24 +08:00
陈淳
8d0deaebba feat: 优化第三方登录结构 2024-01-08 11:17:05 +08:00
Xwen
ecb4240d8d perf:优化文章卡片 2024-01-07 22:31:52 +08:00
Xwen
1898068f6b perf:统一用户信息组件的数据来源 2024-01-07 21:19:54 +08:00
Xwen
d0b64b6521 fix:解决文章标题过长显示不友好的问题 2024-01-07 21:09:15 +08:00
Xwen
684a83b7c2 fix:修复板块界面重渲染问题 2024-01-07 20:55:51 +08:00
Xwen
2eb45768c6 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-07 20:51:32 +08:00
Xwen
5bf95f8e75 feat:新增用户悬浮卡片 2024-01-07 20:51:20 +08:00
橙子
766a1a6c00 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2024-01-07 08:02:00 +00:00
橙子
e32ae8027d update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2024-01-07 08:01:00 +00:00
橙子
7b6a6e6e73 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2024-01-07 08:00:20 +00:00
橙子
4ba41c8ae7 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2024-01-07 07:56:55 +00:00
橙子
6c92e29b3b doc: 完善文档 2024-01-07 15:52:24 +08:00
橙子
299b358c8f update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2024-01-07 07:46:18 +00:00
橙子
fcf481d7f3 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-07 13:34:57 +08:00
橙子
add374f0a7 feat: 新增Oauth鉴权模块,支持qq登录、gitee登录 2024-01-07 13:34:50 +08:00
Xwen
dba380ff24 feat:授权成功后暂时不关闭弹窗 2024-01-07 10:12:50 +08:00
Xwen
5ea1bd4896 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-07 00:27:56 +08:00
Xwen
e553192e59 feat:新增QQ登录弹窗 2024-01-07 00:27:44 +08:00
Xwen
d506754e63 feat:板块页文章置顶样式更改 2024-01-06 16:41:57 +08:00
Xwen
deec60d1a9 feat:不缓存推送值 2024-01-06 14:23:51 +08:00
Xwen
6214e10f01 feat:登出的时候断开连接 2024-01-06 14:17:28 +08:00
Xwen
ebad623032 feat:对接推送在线人数 2024-01-06 12:45:14 +08:00
Xwen
0bcc604757 perf:修改ElMessage的type错误类型写成了danger 2024-01-06 11:06:41 +08:00
Xwen
cc51a4870c perf:去掉用户分析padding 2024-01-06 11:00:24 +08:00
橙子
b52e432ab7 chore: 回滚,准备手写鉴权 2024-01-05 23:26:47 +08:00
橙子
371f5d9d98 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-05 23:05:21 +08:00
橙子
093b5a7a7b test: 测试qq回调 2024-01-05 23:05:13 +08:00
橙子
a1199a52af update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2024-01-05 06:09:25 +00:00
橙子
073a2d5487 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2024-01-05 06:08:05 +00:00
橙子
3313689799 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2024-01-05 06:07:31 +00:00
陈淳
5bc2abb0df feat:完善dto更新 2024-01-05 10:54:07 +08:00
陈淳
0bc5d865b0 fix: 修复添加排序 2024-01-05 10:50:20 +08:00
陈淳
8fa19b3190 fix: 修复文章导入方式 2024-01-05 10:47:36 +08:00
陈淳
72d1dcd75c chore: 构建 2024-01-05 10:36:07 +08:00
陈淳
d3c989036a chore: 构建 2024-01-05 10:28:01 +08:00
陈淳
6253fed3bb style; 优化提取样式 2024-01-05 10:24:58 +08:00
陈淳
cb07b04664 fix: 修复编码兼容问题 2024-01-05 10:17:13 +08:00
陈淳
1126419e2e chore: 构建 2024-01-05 09:46:29 +08:00
陈淳
52db51ce10 style: 添加日志查看 2024-01-05 09:44:34 +08:00
陈淳
791ec9132a chore: 构建修改编码 2024-01-05 09:25:02 +08:00
陈淳
e6ba4f63f7 chore: 构建 2024-01-05 08:57:25 +08:00
橙子
310e6749b8 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-05 00:04:48 +08:00
橙子
2218d261d2 fix: 修复导入 2024-01-05 00:04:34 +08:00
Xwen
c186d564cc perf:导入文章默认type更改 2024-01-04 23:18:49 +08:00
Xwen
cd995c74bd feat:暂时关闭长连接 2024-01-04 23:11:36 +08:00
Xwen
da49ac3b4a Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-04 23:05:34 +08:00
Xwen
7115f95e45 feat:对通首页在线人数分析模块 2024-01-04 23:05:20 +08:00
橙子
425218908e feat: 优化开发配置 2024-01-04 22:31:19 +08:00
Xwen
e666aff9eb chore:添加ws代理 2024-01-04 21:46:19 +08:00
Xwen
cdb6df4a8f feat:引入长连接 2024-01-04 21:37:35 +08:00
Xwen
7ca101e5dd Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-04 21:04:53 +08:00
Xwen
60a36ee5f0 perf:文章页tab切换根据状态禁用 2024-01-04 21:04:44 +08:00
橙子
aa8eb5d389 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-04 20:58:53 +08:00
橙子
599d33b822 feat: 新增用户昨天新增数量 2024-01-04 20:58:45 +08:00
Xwen
b82dc187c1 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-04 20:58:11 +08:00
Xwen
5f861aa389 feat:主题板块面包屑为中文展示 2024-01-04 20:58:00 +08:00
橙子
b691ce19f7 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-04 20:54:07 +08:00
橙子
961e3445ce feat: 添加在线用户及注册人数的分析接口 2024-01-04 20:54:01 +08:00
Xwen
6e72b8d76e feat:导入丢出错误信息 2024-01-04 20:47:08 +08:00
Xwen
216c5317e1 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-04 20:41:08 +08:00
Xwen
ad3174b207 perf:支持上传多篇文章 2024-01-04 20:40:57 +08:00
橙子
b2949bae6c Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-04 20:37:02 +08:00
橙子
461ea6c54d feat: 主题返回板块关系 2024-01-04 20:36:54 +08:00
Xwen
0446431f2f perf:统一处理删除接口 2024-01-04 19:59:38 +08:00
Xwen
7928424931 feat:导入文章成功跳转到封面 2024-01-04 19:41:55 +08:00
陈淳
8cb2b4a496 feat: 完成导入功能 2024-01-04 10:42:20 +08:00
Xwen
84e4deecd6 fix:修复仓库logo在小屏错位的问题 2024-01-04 09:01:21 +08:00
Xwen
0b8c296ef5 fix:修复上传类型选择的显隐 2024-01-04 08:56:52 +08:00
Xwen
cba119e116 feat:新增github入口 2024-01-03 23:39:36 +08:00
Xwen
b199b24b23 feat:对通导入文章接口 2024-01-03 23:32:32 +08:00
陈淳
9070585701 style: 优化结构 2024-01-03 12:33:39 +08:00
陈淳
9254b11f8d Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-03 12:29:02 +08:00
陈淳
b96fe12aeb feat:rbac接入文件导出功能 2024-01-03 12:28:46 +08:00
Xwen
a78c2d805d feat:logo、默认头像更换 2024-01-03 10:48:28 +08:00
陈淳
ffaa3153b3 style: 添加头像 2024-01-03 10:25:38 +08:00
橙子
937f9e1711 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-02 23:35:34 +08:00
橙子
e3108f7382 feat: 完成excel导出操作 2024-01-02 23:26:05 +08:00
Xwen
abd7074e1d perf:优化上传图像 2024-01-02 21:09:07 +08:00
Xwen
31d0f867cb perf:优化滚动条样式 2024-01-02 21:05:20 +08:00
Xwen
eb19fb783f feat:新增全局初始化样式 2024-01-02 21:02:35 +08:00
Xwen
c376f7e97c feat:首页联系我们新增跳转 2024-01-02 20:49:55 +08:00
Xwen
153a0b9354 feat:新增gitee入口 2024-01-02 20:40:14 +08:00
Xwen
b6e8239e25 perf:枚举类型替换为英文 2024-01-02 20:14:10 +08:00
Xwen
ddc3579409 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-02 19:27:07 +08:00
陈淳
0aac42e19b Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2024-01-02 18:32:44 +08:00
陈淳
f66f250936 feat:准备添加excel操作 2024-01-02 18:32:38 +08:00
橙子
faa2a97b5e style: 修改文档 2024-01-01 11:52:40 +08:00
橙子
4acd6a3c06 style: 修改样式 2024-01-01 11:44:01 +08:00
橙子
726a87b644 feat: 修改用户名效验 2024-01-01 11:36:19 +08:00
橙子
54716e9144 feat: 添加logo 2024-01-01 11:31:20 +08:00
橙子
d51e682110 feat: 添加swagger文档,优化枚举操作 2023-12-30 16:10:30 +08:00
橙子
a4570b7b2f feat:完成导入功能 2023-12-30 02:42:12 +08:00
陈淳
faf28d40c6 feat: 搭建文章导入功能正在适配 2023-12-29 18:19:35 +08:00
陈淳
225fec8ebf Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-29 13:49:20 +08:00
陈淳
8f6d84f3ad style;完善注释 2023-12-29 13:49:06 +08:00
Xwen
6270e4b101 fix:修复token过期带来的问题 2023-12-29 09:18:18 +08:00
Xwen
5489442ebd feat:新增在线选择相关逻辑 2023-12-28 22:46:39 +08:00
陈淳
469ec71074 feat: 完成bbs头像功能 2023-12-28 20:24:49 +08:00
陈淳
470c908453 feat: 完成审计日志模块搭建 2023-12-28 15:23:00 +08:00
陈淳
a18e71dc9b Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-28 11:05:22 +08:00
陈淳
fc9590cb7a chore: 构建 2023-12-28 11:04:45 +08:00
Xwen
803b49083e feat:新增悬浮卡片组件 2023-12-27 23:55:59 +08:00
Xwen
4867a0df2b feat:新增加载动画 2023-12-27 22:41:57 +08:00
陈淳
f539ab39e7 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-27 19:00:51 +08:00
陈淳
8ef2ff43b0 feat: 搭建审计日志模块 2023-12-27 18:59:26 +08:00
Xwen
21bce5ec23 perf:axios新增是否请求完毕字段并修复骨架屏出现的时机 2023-12-27 12:48:51 +08:00
陈淳
d86ee7a028 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-27 11:53:50 +08:00
陈淳
8ca8f291a1 chore: 构建 2023-12-27 11:53:44 +08:00
Xwen
47929c9d37 feat:首页接入主题 2023-12-26 23:18:27 +08:00
Xwen
29fa839b24 feat:文章页接入骨架屏 2023-12-26 22:49:29 +08:00
Xwen
15d31dbcbf feat:新增骨架屏组件以及接入首页的骨架屏 2023-12-26 22:46:42 +08:00
Xwen
124f1151db perf:等级显示优化 2023-12-26 21:26:41 +08:00
Xwen
360054dda6 feat:token改为localStorage存储 2023-12-26 21:20:35 +08:00
陈淳
fb5bcac2d7 chore: 构建 2023-12-26 10:17:21 +08:00
陈淳
c9c97e8a4e feat: 完善置顶主题 2023-12-26 10:15:48 +08:00
陈淳
e12ff6508c fix: 修复联表问题 2023-12-26 09:43:25 +08:00
Xwen
1fc6a7a1c6 feat:对接推荐主题 2023-12-25 23:37:36 +08:00
Xwen
f4eb31570e perf:优化infoCard组件样式 2023-12-25 23:06:19 +08:00
Xwen
a3809b3fc7 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-25 22:50:13 +08:00
Xwen
5c6bbd2793 feat:接入推荐好友 2023-12-25 22:50:04 +08:00
橙子
b3dae901a0 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-25 22:48:31 +08:00
橙子
34903cf870 feat: 添加用户等级与用户限制 2023-12-25 22:47:46 +08:00
Xwen
57d4189f02 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-25 22:27:26 +08:00
Xwen
0aee86a885 feat:接入积分排行 2023-12-25 22:27:15 +08:00
橙子
09b3e6ee74 fix: 修复查询问题 2023-12-25 21:43:09 +08:00
橙子
547b8b0f91 fix: 修复头像字段 2023-12-25 21:41:37 +08:00
陈淳
006679ce5d feat: 添加积分排行榜预留 2023-12-25 17:52:20 +08:00
陈淳
b0b0b0d8d1 feat: 添加社区分析模块 2023-12-25 17:49:30 +08:00
Xwen
6934fe03ce perf:优化更换头像交互 2023-12-24 21:51:28 +08:00
Xwen
4d15d81c7e fix:修复文章头像显示的bug 2023-12-24 21:26:04 +08:00
Xwen
15d9c272e0 perf:优化header高度 2023-12-24 20:58:18 +08:00
Xwen
149ebc0cf3 perf:登录兼容移动端 2023-12-24 20:44:40 +08:00
Xwen
5d40397fa3 perf:登录样式调整 2023-12-24 20:14:09 +08:00
Xwen
038e0bea86 feat:新增联系我们 2023-12-24 20:05:34 +08:00
Xwen
3b73121c29 feat:放开注册 2023-12-24 19:14:09 +08:00
Xwen
eb74bebf9c feat:增加登录底部信息栏 2023-12-24 19:13:30 +08:00
Xwen
47b5bf3dc9 perf:关闭注册入口 2023-12-24 16:23:32 +08:00
Xwen
bf5848b5f5 perf:个人中心交互优化 2023-12-24 16:16:56 +08:00
Xwen
69cfb63d03 perf:优化样式 2023-12-24 16:07:13 +08:00
Xwen
f391afaef8 fix:解决权限不一致导致的显示问题 2023-12-24 15:22:00 +08:00
Xwen
4e7465c08f perf:完善注册校验并在注册成功后跳转到登录 2023-12-24 15:07:47 +08:00
橙子
491891a001 feat: 优化评论结构的获取 2023-12-24 13:16:18 +08:00
橙子
9f19c608e7 fix: 修复返回字段 2023-12-24 12:17:20 +08:00
橙子
64efe9def2 fix: 修复评论问题 2023-12-24 11:56:44 +08:00
橙子
3272117564 feat:: 完善权限添加 2023-12-24 11:45:43 +08:00
Xwen
706df9ab78 feat:隐藏注册入口并开放新注册路由 2023-12-23 22:23:33 +08:00
Xwen
a89281f98b feat:注册入口开放 2023-12-23 22:16:00 +08:00
橙子
74cebb37a8 doc:添加cicd文档模块 2023-12-23 21:14:56 +08:00
Xwen
04fb38757c perf:优化权限 2023-12-23 19:05:51 +08:00
Xwen
58d90cc699 perf:优化文案 2023-12-23 18:48:26 +08:00
Xwen
2ba9272043 perf:优化用户限制显示 2023-12-23 18:47:28 +08:00
Xwen
e98f24279a perf:板块主题增加标识 2023-12-23 15:28:58 +08:00
Xwen
004cf1d5c0 feat:个人信息组件新增等级限制展示 2023-12-23 15:02:49 +08:00
橙子
935f5aa529 feat: 添加置顶用户信息 2023-12-22 23:32:21 +08:00
Xwen
35e8ed0944 feat:发布主题按钮新增未登录提示登录 2023-12-22 23:12:47 +08:00
Xwen
3dc6bfe6ee fix:修复验证码报错刷新问题 2023-12-22 22:25:37 +08:00
Xwen
556e9f52c8 perf:完善文章主题权限 2023-12-22 21:49:38 +08:00
陈淳
4e2292f48f feat: 删除多余的db 2023-12-22 19:24:43 +08:00
陈淳
61beac9ef2 feat: 新增数据库定时备份功能 2023-12-22 18:57:04 +08:00
陈淳
8139a9585d fix: 修复发授令牌问题 2023-12-22 18:11:14 +08:00
陈淳
906409921f feat: 默认角色修改为defalut角色 2023-12-22 17:37:22 +08:00
陈淳
f6fcf7b1b2 fix: 修复评论错误情况 2023-12-22 17:19:18 +08:00
陈淳
8501af7d16 feat: 完成评论的用户信息 2023-12-22 16:46:39 +08:00
陈淳
0a2c42c27f feat:完善bbs用户信息 2023-12-22 16:05:35 +08:00
陈淳
4ace93bff3 feat: 添加bbs等级及用户限制功能 2023-12-22 15:51:18 +08:00
陈淳
c5cfa2f143 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-22 11:45:01 +08:00
陈淳
06fecf813a featL 完善主题信息 2023-12-22 11:42:41 +08:00
Xwen
2a172b0c0b feat:添加文章页评论权限 2023-12-22 00:21:13 +08:00
Xwen
1f74334c92 perf:加宽文章列表 2023-12-22 00:00:23 +08:00
Xwen
522b18ff7d feat:完成文章模块权限、抽取权限逻辑、修复超管权限 2023-12-21 23:59:25 +08:00
Xwen
732cd3798b fix:修复板块权限 2023-12-21 23:37:42 +08:00
陈淳
024ced4b3e feat: 完善操作日志 2023-12-21 16:55:47 +08:00
陈淳
65c6e90f68 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-21 16:44:37 +08:00
陈淳
5a3afb9951 fix: 修复mysql连接占用问题 2023-12-21 16:43:42 +08:00
Xwen
89ef5f3df4 perf:样式调整 2023-12-21 13:43:26 +08:00
Xwen
d5b470ec24 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-21 12:56:16 +08:00
Xwen
af67149851 perf:完善样式 2023-12-21 12:56:06 +08:00
陈淳
0cb6a505d1 style;添加忽略文件 2023-12-21 12:43:18 +08:00
陈淳
7173d854d8 style: 修改日志 2023-12-21 11:20:45 +08:00
陈淳
defc67c51d Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-21 08:57:17 +08:00
Xwen
0391ed0fa3 feat:隐藏注册入口 2023-12-20 23:52:15 +08:00
Xwen
6540da0112 perf:完善注册逻辑 2023-12-20 23:50:28 +08:00
Xwen
9fcfbb6688 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-20 23:30:05 +08:00
Xwen
44b3a4e4f7 perf:发布权限处理 2023-12-20 23:29:55 +08:00
橙子
65d1042643 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-20 23:23:23 +08:00
橙子
528f83ac87 feat: 构建 2023-12-20 23:23:15 +08:00
Xwen
7f399d6854 feat:登录接入验证码功能 2023-12-20 22:51:24 +08:00
橙子
2df46b0bf5 feat: 添加注册功能 2023-12-20 22:06:43 +08:00
Xwen
e9af19e3dc Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-20 21:52:54 +08:00
Xwen
64cdcea6b9 perf:统一layout宽度 2023-12-20 21:52:42 +08:00
橙子
ca60d4eb86 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-20 21:43:26 +08:00
橙子
edcba7a35a feat: 完善验证、注册开关 2023-12-20 21:43:16 +08:00
Xwen
8f81888784 perf:首页调用主题接口更换 2023-12-20 21:14:55 +08:00
Xwen
06ced2d544 perrf:登录界面优化 2023-12-20 21:05:16 +08:00
橙子
22d25fd67e Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-20 21:01:43 +08:00
橙子
7163184423 feat: 添加用户状态效验及验证码 2023-12-20 21:01:35 +08:00
Xwen
0ab4d76d0f perf:优化登录注册样式 2023-12-19 23:05:26 +08:00
Xwen
55e30df5ec perf:完善登录注册 2023-12-19 23:00:43 +08:00
橙子
01a49a8b65 feat: 完美升级abp8.0正式版本 2023-12-19 21:00:10 +08:00
橙子
6f65ad5255 feat: 完善离线问题 2023-12-19 16:52:50 +08:00
橙子
7766a7b239 feat: 添加前端显示顺序 2023-12-19 13:39:01 +08:00
橙子
4e8c2cd1b8 feat: 完善各个模块的权限 2023-12-19 13:05:03 +08:00
橙子
9f6f7b8977 feat: 添加权限效验 2023-12-19 13:00:14 +08:00
橙子
0a1095bfc6 feat: 完善获取用户权限的扩展 2023-12-19 12:40:49 +08:00
橙子
3a8b205e8c Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-19 12:28:56 +08:00
橙子
d6f4dd0418 fix: 修复排序问题 2023-12-19 12:28:53 +08:00
Xwen
205f2e3526 refactor:重构登录页面 2023-12-19 00:21:25 +08:00
Xwen
af60e61cc7 feat:新增首页背景资源 2023-12-18 23:19:17 +08:00
橙子
e84a9ae114 feat: 完成板块的排序功能 2023-12-18 23:17:09 +08:00
橙子
c49e89605c feat: 添加首页置顶接口 2023-12-18 23:15:13 +08:00
陈淳
141dc6d80f feat: 添加短信 2023-12-18 16:33:25 +08:00
橙子
eed9534309 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2023-12-18 02:58:26 +00:00
Xwen
72307cd89f feat:文章页新增面包屑 2023-12-17 11:57:46 +08:00
Xwen
0d5e993042 perf:优化未登陆时的跳转路由体验 2023-12-16 22:46:10 +08:00
橙子
6fd7baa10f doc: 完善文档 2023-12-16 21:27:40 +08:00
橙子
d146652ab4 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-16 21:26:09 +08:00
橙子
afc1d55b52 feat: 完成软删除功能 2023-12-16 21:25:36 +08:00
Xwen
b7f977c09c Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-16 17:47:52 +08:00
Xwen
7141918e27 perf:首页Echarts图x轴赋值 2023-12-16 17:47:44 +08:00
橙子
a77deecb2e fix: 修复文章置顶内容 2023-12-16 15:31:14 +08:00
橙子
f32b539e45 doc: 完善文档 2023-12-16 15:26:27 +08:00
橙子
3422dff72c fix: 修复删除及文件上传 2023-12-16 15:08:43 +08:00
橙子
6fc7028507 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-16 15:02:59 +08:00
橙子
6f72141616 feat:完成文件上传功能 2023-12-16 15:02:57 +08:00
Xwen
96639524e5 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-16 14:51:39 +08:00
Xwen
aa519f764f feat:对接评论接口 2023-12-16 14:51:30 +08:00
橙子
6188786d12 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-16 14:36:18 +08:00
橙子
2a6c754123 feat: 完善文章目录排序 2023-12-16 14:36:12 +08:00
Xwen
a5c980626b Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-16 14:33:23 +08:00
Xwen
a304515f90 feat:去除登录默认账号密码 2023-12-16 14:33:11 +08:00
橙子
9ee905c033 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-16 14:18:58 +08:00
橙子
3527c45556 doc: 文档完善 2023-12-16 14:18:53 +08:00
Xwen
0c45311bf3 feat:暂时隐藏注册入口 2023-12-16 14:17:37 +08:00
Xwen
ced7f26809 feat:添加请求401提示 2023-12-16 14:16:40 +08:00
橙子
e14c973a74 feat: 添加超级用户默认密码 2023-12-16 14:10:11 +08:00
Xwen
a3703d9025 feat:对接首页字典接口 2023-12-16 14:00:36 +08:00
橙子
4c0375ac2c doc: 同步文档 2023-12-16 13:58:17 +08:00
橙子
1604a5a666 doc: 添加文档 2023-12-16 13:56:35 +08:00
橙子
ac9c87a70f doc: 修改结构 2023-12-16 13:54:17 +08:00
橙子
156ce300f6 doc: 提交readme文档 2023-12-16 13:53:23 +08:00
橙子
01051ad675 doc: 添加文档 2023-12-16 13:37:43 +08:00
橙子
329760e39d feat: 点赞功能添加权限 2023-12-16 11:45:53 +08:00
橙子
26bdcad0b3 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-16 11:41:05 +08:00
橙子
e563a79278 fix: 修复评论错误问题 2023-12-16 11:40:46 +08:00
Xwen
7b70371ffa perf:更改头部头像 2023-12-16 11:28:04 +08:00
Xwen
15dc3f469f perf:优化吸顶效果 2023-12-16 11:17:28 +08:00
Xwen
49c5a7289c fix:修复评论的一系列问题 2023-12-16 11:15:28 +08:00
Xwen
3d451824f3 perf:优化全局搜索 2023-12-16 11:00:13 +08:00
Xwen
8ba41e9e19 fix:修复全站搜索的bug 2023-12-16 10:37:30 +08:00
Xwen
3a2d8846bc fix:修复用户登录和切换访客登录的问题 2023-12-16 10:03:29 +08:00
橙子
a03a7162dd chore:banner添加种子数据 2023-12-15 23:44:35 +08:00
橙子
5a546cbbd0 chore: 添加忽略 2023-12-15 19:25:40 +08:00
陈淳
dc09ac078a Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp
# Conflicts:
#	.gitignore
#	Yi.Abp.Net8/src/Yi.Abp.Web/Logs/log-20231214.txt
2023-12-15 18:28:01 +08:00
陈淳
743d169a75 feat:添加文档 2023-12-15 18:27:22 +08:00
Xwen
d210760e08 feat:接入pinia持久化存储 2023-12-15 12:47:03 +08:00
Xwen
ebc58ccd00 feat:测试 2023-12-15 01:16:43 +08:00
Xwen
65d66876a8 feat:测试 2023-12-15 01:10:58 +08:00
Xwen
e96e99fe0c feat:测试 2023-12-15 01:02:37 +08:00
Xwen
2cca25450e feat:测试 2023-12-15 00:56:23 +08:00
Xwen
3d4368544f fix:修复vite打包小图片丢失的坑 2023-12-15 00:48:17 +08:00
Xwen
849b8d0322 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-15 00:24:08 +08:00
Xwen
f7b597ab6b chore:修改vite打包转编码限制大小为1kb 2023-12-15 00:23:58 +08:00
橙子
964523c84c Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-15 00:11:25 +08:00
橙子
ba97bd3eb5 feat: 添加文件模块 2023-12-15 00:11:08 +08:00
Xwen
7d9e6f3a23 fix:修复头像没有默认值的bug 2023-12-14 23:47:39 +08:00
Xwen
212606f638 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-14 23:29:49 +08:00
Xwen
8ad5f28e99 feat:去除路由守卫以及测试 2023-12-14 23:29:36 +08:00
橙子
f8ee7bc015 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-14 22:58:21 +08:00
橙子
36785f46f2 feat:提交bbs种子数据 2023-12-14 22:57:01 +08:00
Xwen
088a76b3cc chore:修改pro下的env名称环境变量 2023-12-14 22:24:40 +08:00
橙子
38b854ed90 feat: 添加bbs种子数据 2023-12-14 21:55:52 +08:00
橙子
db11e1731b feat: 添加bbs菜单种子数据 2023-12-14 21:52:56 +08:00
Xwen
a84ff4a0f8 perf:修改添加子文章传参parentId 2023-12-14 17:57:07 +08:00
Xwen
3cf0fabe15 feat:新增导航栏吸顶效果 2023-12-14 17:05:39 +08:00
陈淳
ff405f0aef Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-14 16:48:30 +08:00
陈淳
1a3282eb8a feat: 同步 2023-12-14 16:48:27 +08:00
Xwen
3f40358e2d Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-14 16:26:03 +08:00
Xwen
2ca35a2924 perf:优化header样式 2023-12-14 16:25:38 +08:00
陈淳
5490893756 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-14 15:10:00 +08:00
陈淳
4b9bbd37e3 feat: 保存数据 2023-12-14 15:09:54 +08:00
Xwen
120ff6c5a1 perf:添加端口 2023-12-14 14:59:00 +08:00
Xwen
e9aa584c27 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-14 14:47:35 +08:00
Xwen
e1211521ff chore:替换成远程api 2023-12-14 14:47:18 +08:00
陈淳
13d49bc9fb feat: 完成主题接口 2023-12-14 14:38:46 +08:00
陈淳
cebd5b6c71 feat: 添加种子数据 2023-12-14 14:20:49 +08:00
陈淳
ca9add7d93 feat: 添加测试控制器 2023-12-14 14:15:56 +08:00
陈淳
6cc079aac7 chore:构架 2023-12-14 10:15:23 +08:00
陈淳
d8d1b10de7 chore: 构建目录 2023-12-14 10:12:24 +08:00
陈淳
d4c3756f75 chore: 构建重命名 2023-12-14 10:05:32 +08:00
陈淳
99b1deea3c Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-14 10:04:48 +08:00
陈淳
c6f734277f feat:提交lock 2023-12-14 10:04:38 +08:00
橙子
65a0f1df9b fix: 修复linux下验证码问题 2023-12-13 23:49:44 +08:00
Xwen
18ea3f5c58 perf:首页访问统计图优化 2023-12-13 17:58:38 +08:00
Xwen
a110a69d7f Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-13 16:47:45 +08:00
Xwen
c61f187e1a feat:请求方法全部换成新的request类,并且引入useEcharts hook 2023-12-13 16:47:37 +08:00
陈淳
2e65ffd332 feat: 同步 2023-12-13 16:33:55 +08:00
陈淳
7697acc8aa fix: 修复点赞权限问题 2023-12-13 16:33:42 +08:00
陈淳
31338846e3 feat: 修复当前用户数据 2023-12-13 16:29:58 +08:00
陈淳
db669c8ad4 feat: 修复兼容问题 2023-12-13 16:16:36 +08:00
陈淳
6d5b3b0b17 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-13 13:00:47 +08:00
陈淳
0bea3caae7 chore: 使用.net8构建 2023-12-13 12:24:58 +08:00
橙子
f0c8b477eb chore: 添加构建 2023-12-12 23:15:51 +08:00
Xwen
58f6e94f90 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-12 18:10:17 +08:00
Xwen
5efe05af24 feat:首页接口对接 2023-12-12 18:10:04 +08:00
陈淳
6773279d3e fix: 修复接口格式 2023-12-12 18:09:58 +08:00
陈淳
3461ae1fdf feat: 添加bbs首页接口 2023-12-12 17:56:11 +08:00
陈淳
45b86761f6 Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-12 17:16:37 +08:00
陈淳
ac7a1acee3 feat: 完成日志模块 2023-12-12 17:16:28 +08:00
Xwen
41ec4907da Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-12 15:26:15 +08:00
Xwen
cccdec584e feat:登录页更改 2023-12-12 15:26:06 +08:00
Xwen
472da835bd Merge branch 'abp' of https://gitee.com/ccnetcore/Yi into abp 2023-12-12 15:23:28 +08:00
橙子
30de46b840 feat:重构请求模块-大更新 2023-12-12 15:23:18 +08:00
陈淳
8921b319c8 feat: 添加日志组件 2023-12-12 14:33:32 +08:00
橙子
aa49398c29 feat: 添加abp的后台管理 2023-12-11 22:14:13 +08:00
橙子
27a2849619 feat: 完成swagger分组功能 2023-12-11 21:14:12 +08:00
陈淳
9d583e2e5c feat: 完成swagger模块自动分组功能 2023-12-11 18:44:39 +08:00
陈淳
01825ad87f feat: 实现自动分组功能 2023-12-11 18:43:36 +08:00
陈淳
769a6a9c63 chore: 构建稳定版本 2023-12-11 09:55:12 +08:00
陈淳
098d4bc85f feat: 添加配置多环境文件 2023-11-30 16:45:34 +08:00
陈淳
26f7d67c50 fix: 修复审计日志更新问题 2023-11-27 10:11:44 +08:00
陈淳
42d2525b46 fix: 修复审计日志赋值问题 2023-11-27 10:00:53 +08:00
陈淳
d9305c7620 feat:构建还原 2023-11-22 11:10:12 +08:00
陈淳
185d87c24e feat: 优化excel操作 2023-11-16 12:43:52 +08:00
陈淳
a4080490bd feat: 添加excel模块搭建 2023-11-15 19:12:24 +08:00
陈淳
714bcbdbb1 doc: 添加文档 2023-11-09 17:36:49 +08:00
陈淳
9158a38496 fix: 修复登录无权限问题 2023-11-09 08:49:59 +08:00
陈淳
1f1f7f167f style: 修改配置文件 2023-11-08 17:20:26 +08:00
陈淳
9453cc1c3b Merge branch 'furion' of https://gitee.com/ccnetcore/Yi into furion 2023-11-07 10:51:09 +08:00
陈淳
33a03d8119 feat: 完善缓存监控模块 2023-11-07 10:31:53 +08:00
橙子
2292fd1df6 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2023-10-30 00:48:27 +00:00
橙子
18ac428a95 fix: 修复角色分配菜单404问题 2023-10-25 15:52:28 +08:00
橙子
f0d0c304d6 fix: 删除多余的种子数据 2023-10-19 21:47:10 +08:00
陈淳
7f041c96fb fix: 修复静态资源问题 2023-10-18 12:35:28 +08:00
陈淳
53ca11f85b fix: 修复图片打包问题 2023-10-18 12:33:12 +08:00
陈淳
a9f2a0c2ac feat: app添加默认头像 2023-10-18 12:20:43 +08:00
陈淳
181e2b21bb test: 添加bbs cicd 2023-10-18 11:49:31 +08:00
陈淳
04bc6b4cb8 fix: 修复app时间显示问题 2023-10-18 11:36:04 +08:00
陈淳
6058a1741b Merge branch 'furion' of https://gitee.com/ccnetcore/Yi into furion 2023-10-16 15:55:38 +08:00
陈淳
455f11af34 test: 测试vue3 cicd 2023-10-16 15:55:28 +08:00
橙子
0b8848d63f feat: 完善app首页应用 2023-10-08 23:50:53 +08:00
橙子
1b7d6d09a8 Merge branch 'furion' of https://gitee.com/ccnetcore/Yi into furion 2023-10-08 22:59:29 +08:00
橙子
c9592446c8 feat: 完善前端 2023-10-08 22:59:22 +08:00
橙子
f2d2055f72 style: 完善readme
Signed-off-by: 橙子 <454313500@qq.com>
2023-10-08 10:33:46 +00:00
橙子
21ce0789ef style: 完善readme
Signed-off-by: 橙子 <454313500@qq.com>
2023-10-08 10:32:45 +00:00
橙子
794a8fc6aa update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2023-10-08 10:31:48 +00:00
橙子
408ef4a7df update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2023-10-08 10:28:00 +00:00
橙子
ab9b357c9b style: 修改readme
Signed-off-by: 橙子 <454313500@qq.com>
2023-10-08 10:18:59 +00:00
橙子
68d072cd60 style: 优化分组 2023-10-07 19:28:42 +08:00
橙子
aae1d37505 stlye: 构建前端 2023-10-07 17:54:27 +08:00
橙子
e927f2ff78 style: 完善配置文件 2023-10-07 17:52:29 +08:00
橙子
c271f3005a feat: 数据库迁移 2023-10-07 17:51:05 +08:00
橙子
ca5697fb9c feat: 搭建移动端前端框架 2023-10-07 01:31:56 +08:00
橙子
9150101498 test: 测试cicd 2023-10-05 16:23:43 +08:00
橙子
6d0e6d0d16 chore: 构建cicd 2023-10-05 15:54:42 +08:00
橙子
c4236937b7 chore: 添加jenkins构建脚本 2023-10-05 15:26:33 +08:00
橙子
c1c0774572 style: 修改报错信息中文样式 2023-10-04 23:16:07 +08:00
橙子
fcb0ea9574 feat: 完成web to code及code to web功能 2023-09-28 12:59:25 +08:00
陈淳
f095fde5a7 feat: webfrist基本流程已完成 2023-09-27 18:01:10 +08:00
橙子
8bc2db1e6e feat: 完成数据表及数据字段管理 2023-09-26 22:56:21 +08:00
陈淳
7cbc15ea85 feat: 完成webfirst 数据表管理前端模块 2023-09-26 18:01:41 +08:00
陈淳
c2a9c670c4 feat: 完成界面基础搭建 2023-09-26 09:21:27 +08:00
橙子
4e5bdf6847 style: 添加webfirst种子数据 2023-09-26 00:38:10 +08:00
陈淳
0aa6443a20 fix:修复菜单排序问题 2023-09-25 18:16:20 +08:00
橙子
04278f553e feat: 添加webfirst前端路由 2023-09-24 23:41:26 +08:00
橙子
349a041d71 feat: 完成code to web模块 2023-09-24 00:42:09 +08:00
陈淳
58bf5062bf style: 修改配置样式 2023-09-22 10:49:15 +08:00
陈淳
878f24ecae style: 更改注册问题 2023-09-22 10:47:54 +08:00
陈淳
a15a374fb0 feat: 添加webfirst字段生成器 2023-09-22 10:25:05 +08:00
陈淳
8a90f9d089 style: 简化结构 2023-09-21 19:59:38 +08:00
陈淳
3007267951 feat: 准备构建数据库领域服务 2023-09-21 19:57:02 +08:00
陈淳
710bb97cd3 feat: 完善webfirst模板及表模块 2023-09-21 19:55:55 +08:00
橙子
18eb3a7fbf feat: 完善搭建生成器 2023-09-21 00:04:55 +08:00
橙子
1d499b7052 feat: 添加webfirst 字段模块 2023-09-19 23:48:37 +08:00
橙子
36b28d83ed Merge branch 'furion' of https://gitee.com/ccnetcore/Yi into furion 2023-09-18 23:31:44 +08:00
橙子
04fc03ccf5 feat:扩展webfirst 2023-09-18 23:31:36 +08:00
陈淳
ffb5898ea1 fix: 修复时间问题 2023-09-18 10:36:22 +08:00
chenchun
2c2eb0cb8d fix: 修复linux时间周问题 2023-09-17 10:50:02 +08:00
chenchun
15dd8a60d7 fix: 修复访问日志问题,添加easy.tools 2023-09-17 09:52:20 +08:00
橙子
65a0a6fb92 feat: 添加模块控制器分组功能 2023-09-15 23:56:59 +08:00
陈淳
a0b35f4233 feat: 同步 2023-09-15 18:05:59 +08:00
陈淳
a271bc25c6 style: 完善日期显示 2023-09-15 15:21:05 +08:00
陈淳
c988ed7988 feat: 添加访问统计模块 2023-09-15 15:05:14 +08:00
橙子
c2ca0b1f29 feat: 添加微信应用模块,支持微信支付及微信小程序对接(功能产品已上线验证) 2023-09-03 11:22:19 +08:00
橙子
efee87e4c5 Merge branch 'furion' of https://gitee.com/ccnetcore/Yi into furion 2023-08-13 21:27:55 +08:00
橙子
98a990d9ea feat: 添加api访问日志 2023-08-13 21:27:50 +08:00
陈淳
3a61df42ea feat: 完善aop插入审计日志 2023-08-08 10:35:09 +08:00
陈淳
d62baa0e51 fix:修复重置密码为空的问题 2023-07-19 01:24:27 +08:00
陈淳
dfe8806344 feat:完善时间格式转换 2023-07-13 16:04:15 +08:00
陈淳
f1e95b960a feat:添加模板 2023-07-05 15:51:16 +08:00
陈淳
7d0fa7f5d1 Update Login.vue 2023-06-28 16:27:13 +08:00
陈淳
174f247a8e style:添加config种子数据 2023-06-28 16:01:26 +08:00
橙子
9cc41e8558 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2023-06-12 08:48:29 +00:00
陈淳
1fe8b9c5c9 feat:搭建webfirst模块 2023-06-10 13:53:00 +08:00
橙子
496861587d refactor:优化角色授权查询 2023-05-24 20:54:26 +08:00
陈淳
93764fc5b5 feat:完善角色授权用户功能 2023-05-24 12:29:20 +08:00
陈淳
22fab8dee0 feat:添加角色授权用户 2023-05-23 19:29:56 +08:00
陈淳
dcbd729944 feat:完成数据权限功能 2023-05-22 13:03:09 +08:00
陈淳
327a7b2a48 feat:完成后端数据权限过滤 2023-05-22 12:57:27 +08:00
橙子
ad6bd8f39b feat:添加数据权限搭建,准备完成数据权限过滤 2023-05-21 21:43:11 +08:00
橙子
95a91a10b3 feat:完善用户查询部门过滤 2023-05-21 13:16:04 +08:00
橙子
b50f2b4c7e update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2023-05-20 09:44:34 +00:00
陈淳
a1e0dac85c feat:完善前端友好提示功能 2023-05-20 17:20:52 +08:00
橙子
027f6dd538 Update README.md 2023-04-30 19:14:19 +08:00
陈淳
94f902f788 feat:完成job页面+接口功能,还差job状态更新 2023-04-25 13:30:54 +08:00
陈淳
bc5aaff9c9 feat:合并 2023-04-25 10:39:41 +08:00
陈淳
770e8d7310 feat;完成接口对接 2023-04-25 10:38:51 +08:00
陈淳
6a881e4613 feat:完善job dto 2023-04-25 09:19:17 +08:00
橙子
0f36672783 feat:添加执行一次接口 2023-04-24 21:08:12 +08:00
橙子
7d5a7e0fe8 feat:完成job后端接口 2023-04-23 23:46:20 +08:00
橙子
6977e233bb fix:修复时间映射问题 2023-04-23 23:23:31 +08:00
橙子
dbcb27e41a feat:完成job定时任务功能模块 2023-04-23 21:42:03 +08:00
橙子
4b5b4464f4 1 2023-04-23 20:47:26 +08:00
橙子
4b6241e0b0 feat:添加任务调度基础功能 2023-04-22 19:13:29 +08:00
橙子
17fb60c481 feat:添加日志记录+完善定时任务 2023-04-22 18:03:13 +08:00
橙子
51575b9f2d feat:添加任务调度,系统每天12点、0点重置一次 2023-04-21 23:44:14 +08:00
橙子
c943c1fc74 fix:完成非空问题修复 2023-04-20 23:08:21 +08:00
橙子
b55a45baa2 feat:完成codefirst与种子数据,发现非空类型问题,等待紧急修复 2023-04-20 22:36:32 +08:00
橙子
ae5db16d67 fix:修复菜单排序问题 2023-04-19 22:54:33 +08:00
橙子
8f143be4b0 feat:上线服务监控功能 2023-04-19 22:38:46 +08:00
陈淳
9ebafff392 feat:准备服务监控 2023-04-19 19:40:47 +08:00
陈淳
e904c3df69 Revert "1"
This reverts commit 8ed1c958af.
2023-04-19 18:08:38 +08:00
陈淳
8ed1c958af 1 2023-04-19 18:07:57 +08:00
陈淳
a93e65df0a feat:添加登录事件 2023-04-19 18:06:40 +08:00
陈淳
2fd861025a feat:添加种子数据 2023-04-19 16:35:47 +08:00
陈淳
654c7d650a feat:完善缓存相关 2023-04-19 13:39:55 +08:00
陈淳
cb75196455 feat:添加缓存监控页面 2023-04-19 11:19:36 +08:00
橙子
dd2b584c3d feat:添加长连接,强制下线功能 2023-04-18 21:29:44 +08:00
橙子
85d1cbff34 feat:添加令牌效验 2023-04-18 20:29:53 +08:00
陈淳
92d9c532c2 chore:优化构建结构 2023-04-18 14:46:59 +08:00
橙子
24bc61396e feat:完成furion改造 2023-04-16 14:30:56 +08:00
橙子
1655870d4d feat:全基础流程跑通 2023-04-15 22:44:33 +08:00
陈淳
9b1a978cb5 chore:完成目录改造 2023-04-15 18:03:11 +08:00
陈淳
fb27fb8aa4 chore:目录重构 2023-04-15 17:35:22 +08:00
陈淳
a612af4f68 chore:去除对于 2023-04-15 17:34:28 +08:00
陈淳
eb8e076732 chore:修改目录 2023-04-15 17:33:42 +08:00
陈淳
0401e97ed3 feat:完成异常处理 2023-04-15 14:36:48 +08:00
陈淳
c4f25b7a41 style: 修改大小写问题 2023-04-15 14:01:50 +08:00
橙子
ef5b628b31 feat:完成内部核心模块替换改造成furion 2023-04-15 12:25:47 +08:00
橙子
543c13d94b feat:让程序能够跑起来 2023-04-15 12:19:02 +08:00
橙子
b9dad93c9d feat:furion rbac搭建 2023-04-13 21:12:06 +08:00
橙子
18696ec542 feat:框架基础设施搭建 2023-04-12 22:52:09 +08:00
橙子
5efdffcda8 feat:基于furion搭建 2023-04-12 22:30:42 +08:00
橙子
ccd39474c7 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2023-04-08 13:46:57 +00:00
陈淳
386ec5ade0 feat:完善图片模块 2023-04-06 11:47:36 +08:00
橙子
ee6b3b535c doc:更新文档 2023-04-05 22:42:23 +08:00
橙子
d5ee57f04d doc:添加readme 2023-04-05 22:13:30 +08:00
橙子
b6c70bad45 docs:完善文档 2023-04-05 16:08:06 +08:00
橙子
921d35367b feat:更新模块关系 2023-04-03 23:43:10 +08:00
橙子
253bd47c75 fix:修复换行问题 2023-04-03 22:55:49 +08:00
橙子
8fa10cd8c1 1 2023-04-02 22:11:30 +08:00
橙子
01e5b52500 chore:忽略wwwroot 2023-04-02 19:31:39 +08:00
橙子
9c921adc5b feat:完善模块化+缩略图模块 2023-04-02 19:29:44 +08:00
橙子
b90962943a fix:修复请求问题 2023-04-02 00:17:07 +08:00
陈淳
ad4fc6ea9b 1 2023-04-01 18:16:41 +08:00
陈淳
62310ab863 feat:使用缩略图 2023-04-01 10:05:16 +08:00
陈淳
ef7b8cd98f Merge branch 'framework' of https://gitee.com/ccnetcore/Yi into framework 2023-03-31 16:56:34 +08:00
陈淳
5e128ebf04 fix:完善注册 2023-03-31 16:56:28 +08:00
橙子
b324d98125 feat:完成注册功能 2023-03-30 22:09:36 +08:00
陈淳
8329728b81 fix:修复线上bug 2023-03-30 18:06:57 +08:00
陈淳
ba220e9d55 fix:long类型修复 2023-03-30 13:42:57 +08:00
陈淳
6b2ef71296 feat:完善注册功能 2023-03-30 11:49:39 +08:00
橙子
bcf7802f94 feat:完成注册功能 2023-03-29 23:20:54 +08:00
橙子
769e2cb897 feat:区分配置文件 2023-03-29 22:39:20 +08:00
橙子
d55caf2278 Delete Yi.DataBaseTool.zip 2023-03-29 22:04:45 +08:00
橙子
69ca6677e9 feat:添加配置 2023-03-29 22:03:18 +08:00
陈淳
3d94626ff1 feat:添加短信 2023-03-29 19:30:48 +08:00
橙子
5458819ef5 feat: 添加注册功能 2023-03-28 22:23:00 +08:00
陈淳
2ff8aef1bf feat:修改使用mysql 2023-03-28 14:09:41 +08:00
橙子
16556ddb84 fix:修复bug 2023-03-27 23:15:04 +08:00
陈淳
aef6fe9229 feat:修复bug 2023-03-27 19:36:21 +08:00
橙子
e5460ae3cc feat:完成权限相关、全局配置、优化细节 2023-03-26 16:22:49 +08:00
橙子
b6f4cbfb4f feat:完成仅自己可见功能 2023-03-26 01:28:48 +08:00
橙子
c83fcb7f26 feat:完成底部 2023-03-24 22:39:35 +08:00
陈淳
ab0d126c49 style:优化样式 2023-03-24 18:49:39 +08:00
陈淳
fd3142bc19 feat:完善评论功能 2023-03-24 17:33:05 +08:00
陈淳
af80d8e89b Merge branch 'framework' of https://gitee.com/ccnetcore/Yi into framework
# Conflicts:
#	Yi.Framework.Net6/src/project/bbs/Yi.BBS.Application.Contracts/Forum/Dtos/Comment/CommentGetListOutputDto.cs
2023-03-24 17:15:46 +08:00
陈淳
c98eefe3ec perf:优化批量dto 2023-03-24 17:13:25 +08:00
橙子
84ec0a7e1c feat: 完成评论功能 2023-03-23 23:12:26 +08:00
陈淳
4babe3e05d feat:完成评论功能搭建 2023-03-23 18:15:30 +08:00
橙子
8213f6f8d7 feat:完成评论功能 2023-03-23 00:08:55 +08:00
陈淳
30329ea4db feat;添加评论 2023-03-22 19:49:20 +08:00
橙子
4b856c4905 feat:完成登录页面+各种细节 2023-03-21 23:05:42 +08:00
橙子
418f4a4785 feat:添加点赞功能 2023-03-21 00:16:24 +08:00
橙子
2d31aeecd1 feat:完成点赞功能 2023-03-20 23:43:49 +08:00
陈淳
b3b3ca3fe4 feat: 完成banner展示模块 2023-03-20 19:46:47 +08:00
陈淳
5a4ac549f6 style: 修改目录 2023-03-20 18:59:34 +08:00
橙子
f4cdeb3dc5 refactor: 重构异常处理 2023-03-19 23:44:38 +08:00
橙子
7b01d4722f feat:完善结构 2023-03-19 23:18:17 +08:00
橙子
019c73ceca feat:完善discuss主题相关功能及界面 2023-03-19 23:12:27 +08:00
橙子
10fef4e2d9 feat:添加个人中心 2023-03-19 00:42:18 +08:00
橙子
c613b185da feat:添加登录页面,完善文章目录 2023-03-18 01:34:07 +08:00
橙子
1bb7ce6805 feat:完善 2023-03-17 00:30:26 +08:00
橙子
9b3d8b5a06 Merge branch 'framework' of https://gitee.com/ccnetcore/Yi into framework 2023-03-16 21:35:07 +08:00
橙子
5f603e6652 feat:完成登录功能 2023-03-16 21:34:52 +08:00
陈淳
a20bd6933b style:添加登录样式 2023-03-16 20:26:29 +08:00
陈淳
13ea3ae9b3 feat:添加素材 2023-03-16 19:46:21 +08:00
陈淳
a73920f4c3 feat:搭建登录页面 2023-03-15 13:53:34 +08:00
陈淳
543d54f844 perf:优化文章内容处理 2023-03-15 13:38:05 +08:00
陈淳
4bd374e747 style:修改子文章样式 2023-03-15 09:55:08 +08:00
橙子
295cf5e066 feat: 添加子文章crud 2023-03-14 22:58:35 +08:00
陈淳
2824e1325d feat: 完成头像组件封装 2023-03-14 16:32:47 +08:00
陈淳
cd9e27bcf3 perf: 改用sqlsugar db上下文对象 2023-03-14 09:22:20 +08:00
橙子
9600e450af feat: 添加头像信息封装 2023-03-13 23:24:10 +08:00
陈淳
8e56667760 feat: 完成子文章的操作 2023-03-12 19:49:08 +08:00
陈淳
1eac218910 feat: 添加log配置 2023-03-12 14:13:39 +08:00
橙子
27962cd25f feat: 完善文章编辑功能 2023-03-12 01:50:11 +08:00
橙子
3de32945f2 feat: 添加文章页面 2023-03-11 17:00:36 +08:00
橙子
9593b68d33 feat: 修复雪花id问题 2023-03-11 15:02:50 +08:00
橙子
9166fc50aa feat: 完成字典模块改造,前端完成首页界面 2023-03-11 01:16:28 +08:00
橙子
fb5342594f Merge branch 'framework' of https://gitee.com/ccnetcore/Yi into framework 2023-03-10 22:02:27 +08:00
橙子
733ff867e9 feat: 完善基础页面 2023-03-10 22:02:19 +08:00
陈淳
d3f9b43b12 refactor: 删除注入代码 2023-03-09 08:45:07 +08:00
陈淳
30ab479315 feat:添加编辑框 2023-03-07 18:44:39 +08:00
橙子
9d3559cddb feat: 添加文章页面 2023-03-07 00:02:48 +08:00
橙子
6d3edff5b6 feat:添加头像 2023-03-05 23:48:07 +08:00
橙子
619471369d Merge branch 'framework' of https://gitee.com/ccnetcore/Yi into framework 2023-03-05 20:30:53 +08:00
橙子
2d328234a1 faet: 添加bbs vue3前端 2023-03-05 20:30:44 +08:00
陈淳
06acfe1ee3 feat:添加日志模块 2023-03-04 18:53:33 +08:00
橙子
a55cba4c1f feat: 完成首页界面搭建 2023-03-03 23:56:37 +08:00
橙子
61f8a07753 feat: 添加bbs前端搭建 2023-03-03 21:58:58 +08:00
橙子
e0da9e1a87 fix: 完善修复种子数据 2023-03-03 21:26:18 +08:00
陈淳
3ba3ea6317 fix: 修复种子数据问题,等待完善 2023-03-03 18:26:24 +08:00
陈淳
834e40d6f2 feat: 完善种子数据功能 2023-03-03 18:12:44 +08:00
陈淳
f93cccd849 feat: 添加sqlsugar上下文对象、及审计日志 2023-03-02 11:05:38 +08:00
陈淳
0127b43374 feat: 添加多租户模块 2023-03-02 10:19:18 +08:00
陈淳
5cea38e95c perf: 优化全部模块程序集 2023-03-02 09:40:46 +08:00
陈淳
964b8aa5f6 feat: 添加多租户搭建 2023-02-28 15:44:40 +08:00
陈淳
33616de6c8 fix: 修复currenuser为空问题 2023-02-27 08:52:45 +08:00
橙子
6bf490f7da Merge branch 'framework' of https://gitee.com/ccnetcore/Yi into framework 2023-02-26 13:17:44 +08:00
橙子
3e31f7783f feat: 添加vue3bbs前端 2023-02-26 13:17:19 +08:00
陈淳
05f5122c0b fix: 修复头像更新覆盖问题 2023-02-23 14:38:31 +08:00
陈淳
93de208ac0 feat: 前端添加完善头像功能 2023-02-23 14:37:33 +08:00
陈淳
272466bbbf feat: 完成文件模块开发 2023-02-23 14:15:24 +08:00
陈淳
8639372513 feat: 完成合并 2023-02-22 19:21:21 +08:00
陈淳
49acf0c7c9 feat: 完成操作日志模块+添加文件模块 2023-02-22 17:30:20 +08:00
陈淳
232cbad5bd fix: 修复引入问题 2023-02-22 17:14:30 +08:00
陈淳
aa2f9d4f50 Merge branch 'framework' of https://gitee.com/ccnetcore/Yi into framework 2023-02-22 17:03:50 +08:00
陈淳
99aa7d3361 refactor: 抽象操作日志模块 2023-02-22 16:49:24 +08:00
橙子
72decd970a fix: 修复操作日志前端显示问题 2023-02-21 21:15:05 +08:00
陈淳
fa4e0b3752 perf: 优化操作日志方式 2023-02-21 19:55:05 +08:00
陈淳
6615229003 feat: 添加操作日志搭建 2023-02-21 19:37:48 +08:00
陈淳
24300e6e50 feat: 优化权限使用方式 2023-02-21 18:56:51 +08:00
橙子
f8445ab2e4 feat: 完成登录日志记录功能 2023-02-20 21:10:06 +08:00
陈淳
9645decf59 fix: 修复角色选择菜单问题 2023-02-20 19:55:52 +08:00
陈淳
f34c33b0d8 feat: 添加登录role鉴权令牌 2023-02-20 11:36:45 +08:00
陈淳
5cd20b1e22 refactor: 重构当前用户模块 2023-02-20 11:31:40 +08:00
橙子
d65c565127 refactor: 重构markdown 2023-02-20 00:24:57 +08:00
橙子
2f654a1772 feat: 添加bbs前端 2023-02-19 23:50:42 +08:00
橙子
380f728de2 feat: 添加用户、角色状态修改 2023-02-19 22:18:04 +08:00
橙子
dffdaa8d68 feat: 添加事件总线 2023-02-19 20:57:31 +08:00
橙子
1f33204697 feat: 完成查询动态条件筛选,做一个快乐的crud boy 2023-02-19 17:18:52 +08:00
橙子
0566606bfb feat: 代码生成工具5分钟完成参数设置 2023-02-19 17:04:17 +08:00
橙子
e6f95d0cd8 feat: 完善各个模块功能 2023-02-19 16:49:11 +08:00
橙子
8eda2cd814 refactor: 基础设施 2023-02-19 11:34:15 +08:00
橙子
961634981a Merge branch 'framework' of https://gitee.com/ccnetcore/Yi into framework 2023-02-16 23:07:49 +08:00
橙子
50aadb574d Update SqlsugarExtensions.cs 2023-02-16 23:07:33 +08:00
小希
a114457c6f 多查 对bool类型做处理 2023-02-15 15:33:30 +08:00
小希
9274d88c76 优化多查 2023-02-15 15:03:01 +08:00
小希
97bf39f031 优化(多查)查询功能 2023-02-14 19:01:38 +08:00
chenchun
158cab9f9b feat: 添加用户、角色功能 2023-02-12 18:43:11 +08:00
chenchun
bc42efe703 feat: rbac查询页面 2023-02-11 15:56:54 +08:00
橙子
e2e1d2ad78 feat: 添加岗位子查询 2023-02-10 21:07:08 +08:00
橙子
772f2695e7 Merge branch 'framework' of https://gitee.com/ccnetcore/Yi into framework 2023-02-10 19:49:31 +08:00
橙子
5df1144cd0 feat: 部门查询 2023-02-10 19:49:28 +08:00
陈淳
943a7344f6 aspnetcore模块转移 2023-02-09 19:11:56 +08:00
陈淳
5867559502 日志统一采用微软 2023-02-07 10:50:37 +08:00
橙子
fdd1eda9ec 简化对象映射Mapper,简化自定义仓储 2023-02-06 23:08:12 +08:00
橙子
1d7c17e253 更新crud 2023-02-05 22:59:22 +08:00
橙子
95484877a3 完成字典、字典类型管理相关 2023-02-05 15:17:11 +08:00
橙子
b01d242cbc 完成验证码及登录功能 2023-02-04 18:06:42 +08:00
橙子
cfd25b0a8d Merge branch 'framework' of https://gitee.com/ccnetcore/Yi into framework 2023-02-04 10:04:52 +08:00
橙子
2f08c07c20 删除前端 2023-02-04 10:04:48 +08:00
陈淳
fd5e02c1f4 删除前端 2023-02-02 17:21:10 +08:00
陈淳
a549edb174 更改启动接口 2023-02-01 16:58:29 +08:00
橙子
1c8f20440c 完善更新功能 2023-01-31 20:09:54 +08:00
陈淳
5fb09c1c4a 完善登录 2023-01-31 18:08:27 +08:00
橙子
b7260ed982 添加登录 2023-01-30 20:07:09 +08:00
橙子
aec0150a26 添加用户领域 2023-01-30 19:08:50 +08:00
陈淳
5c5dfcac89 添加用户实体 2023-01-30 18:14:44 +08:00
陈淳
32b9611eb5 修改大小写问题 2023-01-30 14:44:24 +08:00
橙子
12881db9ef Update YiBBSApplicationModule.cs 2023-01-29 21:18:22 +08:00
橙子
bb8508abbd 添加rabc项目模块 2023-01-29 21:13:20 +08:00
橙子
d6565bd2d9 添加bbs模块 2023-01-29 20:56:11 +08:00
橙子
b4633efcba Update Program.cs 2023-01-28 20:43:18 +08:00
橙子
0a003359ea 更改逻辑删除问题 2023-01-27 16:21:35 +08:00
橙子
c7e74774de 添加聚合根 2023-01-26 22:38:37 +08:00
橙子
dfefd0452d 完善DDD领域驱动设计 2023-01-26 21:00:01 +08:00
橙子
38d69c9e6f 添加评论模块 2023-01-26 11:25:04 +08:00
橙子
ac26df6827 完善主题内容 2023-01-25 22:27:19 +08:00
橙子
99787950a8 开始业务模块 2023-01-25 17:48:48 +08:00
橙子
80723496d0 更改项目目录 2023-01-24 21:02:39 +08:00
橙子
ec440f13b1 完成模板模块动态支持命名空间 2023-01-24 20:46:00 +08:00
橙子
8a9c7e54e2 添加bbs模块 2023-01-24 20:28:33 +08:00
橙子
67ca25cec4 完成模板生成功能 2023-01-24 20:20:32 +08:00
橙子
4ca7b2e023 完成种子数据模块,完成服务替换模块 2023-01-24 13:46:22 +08:00
橙子
aea8b55e82 更新种子数据扩展,留个坑 2023-01-23 19:33:10 +08:00
橙子
55a4b0ad1b Update appsettings.json 2023-01-22 23:21:07 +08:00
橙子
f4124db320 好的,已经修复完成 2023-01-21 23:15:43 +08:00
橙子
e23e5a292d 完成模板模块,但配置类有问题 2023-01-21 22:40:10 +08:00
橙子
1f702c20ae 添加代码生成模块 2023-01-21 18:09:21 +08:00
橙子
9b1b915925 完成逻辑删除 2023-01-21 16:56:39 +08:00
橙子
11bfefcd04 完成逻辑删除功能 2023-01-21 16:10:46 +08:00
橙子
fceefac0ee 非常优雅的完成了数据模块 2023-01-20 20:03:25 +08:00
橙子
98375f8629 实现sqlsugar过滤器 2023-01-20 17:04:23 +08:00
橙子
d4e0cf7e18 升级sqlsguar版本 2023-01-20 15:29:55 +08:00
橙子
62af066234 添加抽象种子数据 2023-01-20 15:29:21 +08:00
橙子
00d368080b 添加过滤器模块及种子数据 2023-01-20 15:28:36 +08:00
橙子
e43b0d1522 添加全局using功能 2023-01-19 18:19:22 +08:00
橙子
400b14cd75 完善授权与认证模块 2023-01-19 17:58:46 +08:00
橙子
f88655e214 添加授权鉴权模块 2023-01-19 15:35:50 +08:00
橙子
fc74a000a6 添加jwt认证模块 2023-01-18 19:42:13 +08:00
橙子
eb1a86e5b2 完成工作单元 2023-01-18 00:34:14 +08:00
橙子
2fa3570f85 完成工作单元模块 2023-01-17 23:33:14 +08:00
橙子
da2cf2acc5 完成错误中间件,统一返回结果 2023-01-17 22:47:15 +08:00
橙子
f68ffefaa9 BFS+倒置遍历完成模块化依赖功能 2023-01-17 17:50:15 +08:00
橙子
617fbdf8f7 完成excel模块、wechat模块 2023-01-16 23:24:59 +08:00
橙子
034abb06ad 添加excel模块 2023-01-16 23:05:01 +08:00
橙子
46b176fc59 启动时间测试 2023-01-16 21:10:00 +08:00
橙子
506686b11e 完善autofac模块 2023-01-16 20:55:36 +08:00
橙子
1314cf1c19 全流程跑通啦~~框架完成基本功能增删改查 2023-01-15 17:32:27 +08:00
橙子
f1e314fa13 DDD 应用层完善 2023-01-15 14:32:43 +08:00
橙子
3bce7de015 同步命名空间 2023-01-15 09:47:56 +08:00
橙子
1bd035e1ca 更改目录结构,分层基本已经完善
This reverts commit c905489ea5.
2023-01-14 18:46:34 +08:00
橙子
3a9ad5adb8 Revert "更改abp.vnext"
This reverts commit c905489ea5.
2023-01-14 18:16:16 +08:00
橙子
022d5bbd7d Update .gitignore 2023-01-14 14:49:48 +08:00
陈淳
c905489ea5 更改abp.vnext 2023-01-13 18:03:08 +08:00
陈淳
65377d9236 更改自动api 2023-01-13 13:40:54 +08:00
陈淳
8ead6c59c0 完善ddd模块及错误异常中间件 2023-01-12 18:30:57 +08:00
陈淳
ea4e8856c2 添加SqlSugarCoreNoDrive 2023-01-12 16:53:39 +08:00
陈淳
318cfb5fe2 修改各层关系
领域层不能依赖sqlsugar层
sqlsugar层依赖领域层
2023-01-12 15:25:46 +08:00
陈淳
7706126479 添加模块规则 2023-01-12 14:58:16 +08:00
陈淳
ba84d0ead3 添加缓存模块 2023-01-11 18:16:58 +08:00
陈淳
5604c6ece5 删除测试用例 2023-01-11 16:41:34 +08:00
陈淳
140f2970c4 添加模块化功能+动态api 2023-01-11 15:05:31 +08:00
陈淳
b2ac98d25e 框架搭建 2023-01-11 11:10:59 +08:00
陈淳
1ed37897d5 还原部门页面 2023-01-06 11:42:47 +08:00
陈淳
29df3d658b 模板重新生成可空类型 2023-01-06 11:12:47 +08:00
陈淳
576397a042 修改可空类型 2023-01-06 10:15:37 +08:00
橙子
b7c9b84449 更改null操作 2023-01-05 20:32:58 +08:00
陈淳
efbf799218 采购订单添加物料功能 2023-01-05 19:21:48 +08:00
橙子
7d578ce363 创建采购订单接口 2023-01-04 20:50:10 +08:00
陈淳
e03e584684 采购订单搭建 2023-01-04 18:16:56 +08:00
陈淳
e8e6b928cf 完善单位定义界面 2023-01-04 16:47:24 +08:00
陈淳
5f6d29a3f8 自动生成定义管理通用代码 2023-01-04 15:46:29 +08:00
陈淳
a27d83a5e3 Update README.md 2023-01-04 14:09:03 +08:00
陈淳
ef1154d6f3 更新说明 2023-01-04 13:44:35 +08:00
陈淳
ae2400fd0b Merge branch 'sqlsugar-dev' into sqlsugar 2023-01-04 13:40:58 +08:00
陈淳
fbcd004b7e 添加各个木块代码生成 2023-01-04 13:40:30 +08:00
橙子
cb307f95ce update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2023-01-04 05:39:00 +00:00
橙子
7838cd1a6a Update Yi.Framework.Template.csproj 2023-01-03 21:03:29 +08:00
橙子
03dcb7d860 完善代码生成器自动生成目录 2023-01-03 21:03:07 +08:00
橙子
62c5470efe 添加代码生成器模块service实现 2023-01-03 20:06:16 +08:00
陈淳
53b4674da4 Create ProgramTemplateProvider.cs 2023-01-03 18:14:18 +08:00
陈淳
ff2cf68b08 添加模板生成代码 2023-01-03 18:05:57 +08:00
陈淳
8b55373794 更新文件helper 2023-01-03 16:03:11 +08:00
橙子
dba67d7127 添加供应商定义模块 2023-01-02 23:32:40 +08:00
橙子
762c455b53 删除多余文件 2023-01-02 21:18:38 +08:00
chenchun
714d1a36c4 添加供应商 2023-01-02 17:27:12 +08:00
chenchun
0e0ddbbd99 Update README.md 2023-01-02 15:09:59 +08:00
chenchun
497f8cfd1f 添加erp模块 2023-01-02 15:08:04 +08:00
chenchun
1ff709e6f8 优化分层结构,添加常量 2023-01-02 14:29:16 +08:00
chenchun
ea35871aba 使用sqlsugar内置工作单元 2023-01-02 13:59:05 +08:00
chenchun
0e78857645 添加自动映射 2023-01-02 00:09:30 +08:00
chenchun
5d7d115910 添加dto模式的demo测试 2023-01-01 23:51:05 +08:00
chenchun
b9384afd5d 爆肝,重构框架,你懂得 2023-01-01 23:06:11 +08:00
陈淳
dbe020dc94 添加工作单元测试 2022-12-29 09:53:45 +08:00
陈淳
9673aa7690 Merge branch 'sqlsugar' into sqlsugar-dev 2022-12-29 09:08:43 +08:00
黎明
ec06d30d59 添加工作单元 2022-12-26 14:19:12 +08:00
橙子
356d2e592b Update README.md 2022-12-20 15:32:59 +08:00
橙子
521c2e7ca6 Update README.md 2022-12-18 23:17:23 +08:00
陈淳
c4014c9333 更新单元测试 2022-12-16 16:00:36 +08:00
陈淳
2908a8d8a9 测试兼容中间件方式测验 2022-12-14 23:27:54 +08:00
陈淳
c964b98240 添加xunit单元测试 2022-12-14 00:14:22 +08:00
陈淳
f7c74b5c96 Quartz更改,使用内置注册 2022-12-13 23:12:10 +08:00
陈淳
d34c9818b4 更改mit协议 2022-12-13 23:01:23 +08:00
陈淳
6414c93116 Update README.md 2022-12-09 10:58:42 +08:00
陈淳
5a12c4a3ce Update README.md 2022-12-06 23:41:41 +08:00
陈淳
97a6ee39e5 Update README.md 2022-12-05 23:18:10 +08:00
陈淳
44db5ab150 添加评论功能 2022-12-01 16:06:53 +08:00
陈淳
e9bcd29e36 评论建表 2022-12-01 13:38:06 +08:00
橙子
a2ca897fca 社区板块添加点赞功能 2022-11-29 23:03:10 +08:00
陈淳
9a34e63d5f 点赞功能接口开发 2022-11-29 18:47:26 +08:00
陈淳
e501b894c3 job异常处理 2022-11-29 12:49:36 +08:00
陈淳
d97ef84b7e 删除hangfire(不支持毫秒级别)
This reverts commit 49a9eb5460.
2022-11-29 12:34:45 +08:00
陈淳
0f2dc4d3ba Merge branch 'sqlsugar-dev' of https://gitee.com/ccnetcore/Yi into sqlsugar-dev 2022-11-29 12:31:28 +08:00
橙子
49a9eb5460 hangfire测试 2022-11-27 15:05:27 +08:00
陈淳
7e7780a754 Update README.md 2022-11-21 11:20:24 +08:00
陈淳
d0770970f0 Merge branch 'sqlsugar-dev' of https://gitee.com/ccnetcore/Yi into sqlsugar-dev 2022-11-20 23:36:02 +08:00
陈淳
d5a10a5817 Update README.md 2022-11-19 18:18:03 +08:00
橙子
7b63d8b2ba Update README.md 2022-11-16 19:49:48 +08:00
陈淳
c544de8909 Update README.md 2022-11-14 17:04:39 +08:00
橙子
89da2ab50f 菜单权限管控 2022-11-13 22:52:03 +08:00
陈淳
a1a6b5967b Update README.md 2022-11-12 16:58:58 +08:00
陈淳
53ffb1b565 Update README.md 2022-11-11 08:54:11 +08:00
陈淳
6efecd123f Update README.md 2022-11-09 08:53:48 +08:00
陈淳
1ec5349a96 1108 2022-11-08 21:02:50 +08:00
陈淳
187abcd10c 编码转换 2022-11-07 21:45:29 +08:00
陈淳
d6ca4429d5 添加属性依赖注入、添加自定义日志扩展 2022-11-07 01:31:37 +08:00
陈淳
86e869ff16 注释 2022-11-06 21:38:55 +08:00
陈淳
dc58f9397f saas分库,仓储+公共库+业务库+动态配置连接串框架搭建 2022-11-06 20:22:32 +08:00
陈淳
97b4ab2f15 数据权限功能、用户信息缓存 2022-11-04 23:23:54 +08:00
陈淳
23a9d02aba 修复sqlserver codefirst的问题 2022-11-02 16:36:08 +08:00
陈淳
32ed6c3e97 准备接入Saas多租户 2022-11-02 11:06:41 +08:00
陈淳
102556dd2a 准备接入多租户 2022-11-02 08:48:01 +08:00
陈淳
2df3f7c56d 删除测试文件 2022-10-29 10:33:51 +08:00
陈淳
d6fd02ec19 修复路由切换问题 2022-10-29 10:33:08 +08:00
陈淳
c901b4bc06 时间单位精确到秒 2022-10-28 17:38:14 +08:00
陈淳
e19c89ccd9 修复jwt配置文件问题 2022-10-28 17:22:02 +08:00
陈淳
a667f1a65e 验证码缓存接入 2022-10-28 14:25:59 +08:00
陈淳
9f5829876c 登录验证码 2022-10-28 14:10:11 +08:00
陈淳
189d7c4719 缓存接入 2022-10-27 20:54:05 +08:00
陈淳
dfe877c438 缓存测试 2022-10-26 20:08:16 +08:00
陈淳
3a634d7888 配置文件更改 2022-10-26 20:01:18 +08:00
陈淳
fd9f3d04d9 商品首页完善 2022-10-25 10:59:51 +08:00
陈淳
ac70fc37f6 商品子页面完善 2022-10-25 09:47:30 +08:00
橙子
c29aeeee41 缓存搭建 2022-10-24 22:31:53 +08:00
橙子
51c13c7b52 角色 权限code完善 2022-10-24 21:22:03 +08:00
橙子
fec8c0fe53 Merge branch 'sqlsugar-dev' of https://gitee.com/ccnetcore/Yi into sqlsugar-dev 2022-10-23 22:29:44 +08:00
橙子
5da2143212 10/23更新 2022-10-23 22:29:35 +08:00
陈淳
30158ac145 spu、skus数据测试 2022-10-20 18:11:54 +08:00
陈淳
ff7eecee55 10/20更新 2022-10-20 16:33:29 +08:00
陈淳
0755a4026a 修复codefirst 2022-10-19 19:10:48 +08:00
陈淳
9aaf363584 10/19更新 2022-10-19 14:34:53 +08:00
陈淳
0a27cd7403 商城模块 2022-10-18 19:27:58 +08:00
陈淳
ab8cdd88b9 添加codeFirst功能 2022-10-18 18:01:16 +08:00
陈淳
dab4a092d9 sql日志打印输出配置 2022-10-18 09:01:16 +08:00
陈淳
9d365dbf1e 改造null 2022-10-17 18:08:16 +08:00
橙子
16d25fb60d 添加缩略图同步功能 2022-10-17 01:10:31 +08:00
橙子
50d43a2fc5 完善推荐页显示 2022-10-16 22:51:53 +08:00
橙子
6d99539730 修复列表展示问题 2022-10-16 16:09:45 +08:00
橙子
cf43dc8e70 修复上传问题 2022-10-16 15:54:49 +08:00
橙子
95c506c638 修复菜单排序问题 2022-10-16 13:43:23 +08:00
橙子
464b768c55 Revert "文章标题默认值"
This reverts commit 00ca4cc5bd.
2022-10-16 13:18:07 +08:00
橙子
00ca4cc5bd 文章标题默认值 2022-10-16 13:16:40 +08:00
橙子
bfb81ef60d 10/16更新 2022-10-16 13:15:43 +08:00
陈淳
420701bf23 文章管理、前端api、视图代码模板生成 2022-10-14 18:08:45 +08:00
橙子
88073aaa20 样式优化 2022-10-14 02:18:25 +08:00
橙子
8456320884 头像上传功能、性别选择 2022-10-13 23:55:21 +08:00
陈淳
3555b08fe8 修改数据 2022-10-13 14:47:45 +08:00
陈淳
55ad046e96 文件种子数据 2022-10-13 14:46:30 +08:00
陈淳
ea4ddb68f3 修复页面加载不出的问题 2022-10-13 14:04:48 +08:00
陈淳
edde5f8a88 前端登录逻辑对接 2022-10-13 11:05:43 +08:00
陈淳
de28fd4ca4 登录前后端联调对接 2022-10-12 19:00:26 +08:00
陈淳
dd7bbb138a 文件上传功能优化 2022-10-12 14:43:35 +08:00
陈淳
4a54eb56a7 完善登录页面 2022-10-12 14:20:03 +08:00
陈淳
24cda70cbc 登录页面搭建 2022-10-11 18:18:19 +08:00
陈淳
a0c869d0a1 前端联调接口 2022-10-11 16:48:25 +08:00
橙子
58f85992b0 设置及发表图文页面 2022-10-10 00:02:13 +08:00
陈淳
f11f5e1ca4 Update components.d.ts 2022-10-09 17:36:12 +08:00
陈淳
0672698ba7 添加特性自动依赖注入 2022-10-09 17:32:44 +08:00
陈淳
cf37f7c950 完善我的页面 2022-10-09 13:30:42 +08:00
陈淳
c7d64554ad 升级httphelper 2022-10-09 09:54:41 +08:00
橙子
039021532e 我的页面 2022-10-09 01:10:30 +08:00
橙子
e39ae170c3 tab与添加主页 2022-10-09 00:14:17 +08:00
橙子
8a44fe9d1c 推荐页面优化 2022-10-08 23:05:19 +08:00
橙子
70649653fb vant搭建 2022-10-05 23:54:53 +08:00
橙子
db1f241c33 Update TestController.cs 2022-10-04 15:22:34 +08:00
橙子
c9ed317e62 修复在线用户重连问题 2022-10-03 22:56:36 +08:00
橙子
afde26a7ae Update README.md 2022-10-03 18:51:51 +08:00
橙子
1a2d9ba2b2 强制退出功能 2022-10-03 18:27:37 +08:00
橙子
3943536485 实时在线用户功能 2022-10-03 17:04:59 +08:00
橙子
e963a4051f 添加登录日志功能 2022-10-02 14:02:21 +08:00
橙子
2b02194a18 修改sql日志打印 2022-10-02 11:49:19 +08:00
橙子
dd1aec3b60 操作日志功能完善 2022-10-01 23:53:43 +08:00
橙子
0b05d4d186 操作类型完善修改 2022-10-01 15:26:30 +08:00
橙子
8f0327604f 添加日志管理动态多级菜单 2022-10-01 15:04:35 +08:00
陈淳
40dddb3316 获取请求参数扩展 2022-09-29 18:01:19 +08:00
陈淳
be7ea64c5a 操作日志特性、操作日志全局过滤器搭建 2022-09-29 17:02:34 +08:00
陈淳
8eef0e410e 更新 2022-09-29 16:14:50 +08:00
陈淳
63f0b20fd6 通用数据导入功能 2022-09-29 10:03:21 +08:00
陈淳
87a685b823 通用数据控制器 2022-09-28 18:05:49 +08:00
陈淳
4796a494de 数据导入功能 2022-09-28 16:54:53 +08:00
陈淳
a329ff3796 注释 2022-09-27 19:31:34 +08:00
陈淳
00ab65e720 数据导出 2022-09-27 19:30:11 +08:00
陈淳
4997e25cdc 数据模板导入、数据导出 2022-09-27 19:27:17 +08:00
陈淳
6ce05984d5 权限code过滤器 2022-09-27 16:22:34 +08:00
陈淳
26e08774b0 更换背景图片 2022-09-26 16:15:51 +08:00
橙子
83ce9fb4c4 修复部署问题 2022-09-26 00:27:55 +08:00
橙子
ac946f4903 Update .env.staging 2022-09-25 20:54:33 +08:00
橙子
d6480db609 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2022-09-25 12:51:52 +00:00
橙子
9f9c191240 readme 2022-09-25 20:50:51 +08:00
橙子
cb781aa4ad Update README.md 2022-09-25 20:47:07 +08:00
橙子
6a31e88855 swagger跳转 2022-09-25 20:41:55 +08:00
橙子
f862e5ea1b 用户去重判定 2022-09-25 20:04:04 +08:00
橙子
b8de3e9867 前端修改 2022-09-25 19:56:14 +08:00
橙子
1959160681 重置部门选择 2022-09-25 19:07:42 +08:00
橙子
b665ec5717 部门种子数据 2022-09-25 18:58:17 +08:00
橙子
8ef2c12be1 添加字典初始化 2022-09-25 18:06:07 +08:00
橙子
d85e7f0bcb Merge branch 'sqlsugar-dev' of https://gitee.com/ccnetcore/Yi into sqlsugar-dev 2022-09-24 20:28:57 +08:00
陈淳
544d65c7d0 Update README.md 2022-09-23 18:55:12 +08:00
陈淳
1bd5fc389a 字典样式类型及样式class设置 2022-09-23 18:53:59 +08:00
陈淳
9149d6de9a 配置管理增删改查 2022-09-23 18:46:37 +08:00
陈淳
261d9fcd79 Update README.md 2022-09-23 16:03:32 +08:00
橙子
5ecac4223d Update README.md 2022-09-22 19:42:17 +08:00
陈淳
215c21ad8a Update README.md 2022-09-21 19:01:30 +08:00
陈淳
5772de888c 岗位、部门种子数据 2022-09-20 20:57:01 +08:00
陈淳
55979e90dc 菜单角色种子 2022-09-20 15:11:55 +08:00
陈淳
5785f5beea 数据库种子初始化搭建 2022-09-19 17:25:43 +08:00
陈淳
e8bb256a8d 添加种子数据基础 2022-09-19 14:24:13 +08:00
chenchun
729a563545 添加模块 2022-09-18 17:50:38 +08:00
chenchun
1b38ed5c78 Update README.md 2022-09-18 17:49:17 +08:00
chenchun
483aea5c4f 数据权限功能 2022-09-18 17:22:47 +08:00
chenchun
a64d493a29 添加验证码 2022-09-18 16:46:31 +08:00
陈淳
2a8d436267 添加验证码 2022-09-17 18:09:18 +08:00
陈淳
7905f82d65 验证码 2022-09-16 20:01:01 +08:00
陈淳
dcf82d041a 验证码 2022-09-16 19:57:56 +08:00
陈淳
9618bd891f 添加用户性别字段 2022-09-16 19:18:24 +08:00
陈淳
c63f9de5c5 数据权限更新页面 2022-09-16 19:04:40 +08:00
陈淳
0e6113f0a6 数据权限 2022-09-16 18:57:32 +08:00
陈淳
71cf85f535 数据权限查询 2022-09-15 19:45:51 +08:00
陈淳
2a4f646181 数据权限 2022-09-15 19:05:57 +08:00
陈淳
0cc326836c 数据范围枚举 2022-09-15 18:59:01 +08:00
陈淳
52b8bc8909 上下文对象获取用户id扩展 2022-09-15 18:44:12 +08:00
陈淳
844a7b455c 鉴权 2022-09-15 18:40:24 +08:00
陈淳
489a0b6fb8 配置文件热重载功能 2022-09-15 17:09:30 +08:00
陈淳
e535133eca 个人中心信息更新、重置cc密码 2022-09-14 20:35:45 +08:00
陈淳
ea2be7609c 修复状态问题、用户中心页面查询及修改 2022-09-14 19:53:53 +08:00
陈淳
011d9d639b 用户部门查询 2022-09-13 19:39:16 +08:00
陈淳
e78e9d8e55 用户列表部门岗位角色信息 2022-09-13 19:04:41 +08:00
陈淳
89762cad78 路由构建充血模型 2022-09-13 18:15:01 +08:00
陈淳
4788562241 用户界面部门角色岗位选择 2022-09-13 17:59:35 +08:00
陈淳
5b1ad450d3 部门管理:增删改查、用户部门显示 2022-09-13 17:50:20 +08:00
陈淳
7b6d8671cf 岗位管理:增删改查功能 2022-09-13 17:05:53 +08:00
chenchun
01631860f4 菜单完善 2022-09-11 22:05:56 +08:00
chenchun
c65e76bbc3 树形构造器修改 2022-09-11 16:49:40 +08:00
chenchun
ef35e1cfd9 接口名称简化 2022-09-11 15:55:08 +08:00
chenchun
1d535b5d61 角色添加、角色编辑关联菜单功能 2022-09-11 15:39:55 +08:00
chenchun
004cb20132 添加角色关联菜单功能 2022-09-11 14:52:54 +08:00
chenchun
909bdf60e7 重置密码功能 2022-09-11 13:16:24 +08:00
chenchun
0cd3bea6bd 用户信息添加修改 2022-09-11 12:39:22 +08:00
chenchun
d001a0de15 用户编辑界面 2022-09-11 02:39:33 +08:00
chenchun
0dca7acee6 简单基类控制器封装 2022-09-10 20:49:46 +08:00
chenchun
b5ad7a1721 字典页面与字典信息页面完成增删改查 2022-09-10 20:25:39 +08:00
chenchun
9f23b911c1 字典信息表查询删除接口 2022-09-10 20:05:45 +08:00
chenchun
1db8bb4d13 字典类型查询 2022-09-10 14:02:41 +08:00
chenchun
eebafda9e5 db查询对象简化 2022-09-10 13:36:01 +08:00
陈淳
0fb57a0a2c 菜单类型接口 2022-09-09 19:34:20 +08:00
陈淳
d4c55620f1 菜单到前端路由转换 2022-09-09 19:22:14 +08:00
陈淳
ef26567850 添加目录、菜单、控件 2022-09-09 18:15:10 +08:00
陈淳
c15c43dba4 用户角色菜单数据对应 2022-09-09 16:52:32 +08:00
陈淳
5d738d99fe 分页参数时间范围处理 2022-09-09 15:53:11 +08:00
陈淳
43120b0017 测试 2022-09-08 18:24:51 +08:00
陈淳
23dc82f042 vue动态路由测试 2022-09-08 18:18:34 +08:00
陈淳
49330536c7 vue3.x-ruoyi前端 2022-09-07 18:30:43 +08:00
陈淳
781fa7ea1b ruoyi对接
登录接口、用户信息接口、用户管理接口等
2022-09-07 18:22:15 +08:00
橙子
bf17312a5f 9/06更新 2022-09-06 23:32:17 +08:00
陈淳
e4da8d4f15 对接ruoyi接口
用户、角色、菜单查询部分
2022-09-06 19:32:32 +08:00
陈淳
cc26bd09e6 Merge branch 'sqlsugar-dev' into sqlsugar 2022-09-04 18:47:51 +08:00
陈淳
9dc1c5c9e9 添加实时通信 2022-09-04 18:47:39 +08:00
陈淳
442ae94ad5 Merge branch 'sqlsugar-dev' into sqlsugar 2022-08-13 18:12:12 +08:00
陈淳
43820f71a3 Update README.md 2022-08-13 18:11:19 +08:00
陈淳
63920e034a 单例redis、rabbitmq更新、任务调度更新 2022-08-13 18:10:11 +08:00
陈淳
cddc47305f Update README.md 2022-07-13 10:34:29 +08:00
陈淳
583bebd10c Merge branch 'sqlsugar-dev' into sqlsugar 2022-07-13 10:33:08 +08:00
陈淳
7fe9a6c900 项目引用更新 2022-07-13 10:32:43 +08:00
chenchun
670e457dc6 Merge branch 'sqlsugar-dev' into sqlsugar 2022-06-22 14:07:21 +08:00
chenchun
300d8224ec 升级excel操作 2022-06-22 14:07:09 +08:00
橙子
924f5320bb Merge branch 'sqlsugar-dev' of https://gitee.com/ccnetcore/Yi into sqlsugar-dev 2022-06-04 14:41:08 +08:00
橙子
dd09fb2283 Update README.md 2022-06-04 14:40:59 +08:00
chenchun
3e18af626b Update README.md 2022-05-29 16:56:46 +08:00
chenchun
89dd5b79d6 Merge branch 'sqlsugar-dev' into sqlsugar 2022-05-29 16:56:11 +08:00
chenchun
356f71f13e 添加高级保存及查询排序方式 2022-05-29 16:56:02 +08:00
橙子
2f5d71a299 Merge branch 'sqlsugar-dev' into sqlsugar 2022-05-28 10:32:50 +08:00
橙子
b581c12edb 实体更改使用newjson 2022-05-28 10:32:12 +08:00
橙子
d4d6aeb0b4 Update README.md 2022-05-25 23:18:31 +08:00
橙子
77114e6cfc Merge branch 'sqlsugar-dev' into sqlsugar 2022-05-22 20:58:26 +08:00
橙子
e14a078440 修复了前端用户信息更新存储的bug 2022-05-22 20:58:17 +08:00
橙子
3b38a0d628 完善界面 2022-05-19 23:29:37 +08:00
橙子
927d8cb6c9 Update README.md 2022-05-14 17:51:09 +08:00
橙子
eb8ea2f549 Update README.md 2022-05-14 17:46:52 +08:00
橙子
208c93bc8f 添加微信支付模块 2022-05-14 17:45:17 +08:00
4143 changed files with 297528 additions and 27797 deletions

63
.gitattributes vendored
View File

@@ -1,63 +0,0 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

145
.gitignore vendored
View File

@@ -1,20 +1,7 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
WebFirst/SoEasyPlatform.exe
WebFirst/excel
WebFirst/wwwroot
WebFirst/SoEasyPlatform.exe
WebFirst/appsettings.Development.json
WebFirst/appsettings.json
WebFirst/SoEasyPlatform.pdb
WebFirst/SoEasyPlatform.Views.pdb
WebFirst/web.config
WebFirst/WebFirst.exe
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
@@ -30,21 +17,16 @@ WebFirst/WebFirst.exe
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[L]og/
# Visual Studio 2015/2017 cache/options directory
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
@@ -58,28 +40,18 @@ TestResult.xml
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
# DNX
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*_i.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
@@ -89,7 +61,6 @@ StyleCopReport.xml
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
@@ -118,9 +89,6 @@ ipch/
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
@@ -141,14 +109,6 @@ _TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
@@ -180,7 +140,7 @@ publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
@@ -193,12 +153,12 @@ PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
**/packages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
@@ -215,13 +175,12 @@ AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
!*.[Cc]ache/
# Others
ClientBin/
@@ -229,15 +188,11 @@ ClientBin/
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
@@ -252,20 +207,15 @@ _UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- Backup*.rdl
# Microsoft Fakes
FakesAssemblies/
@@ -275,7 +225,6 @@ FakesAssemblies/
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
@@ -283,9 +232,6 @@ node_modules/
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
@@ -305,48 +251,33 @@ paket-files/
.idea/
*.sln.iml
# CodeRush personal settings
.cr/personal
# BookStore
src/Acme.BookStore.Web/Logs/*
src/Acme.BookStore.Web.Host/Logs/*
src/Acme.BookStore.AuthServer/Logs/*
src/Acme.BookStore.HttpApi.Host/Logs/*
src/Acme.BookStore.HttpApi.HostWithIds/Logs/*
src/Acme.BookStore.DbMigrator/Logs/*
src/Acme.BookStore.Blazor.Server/Logs/*
src/Acme.BookStore.Blazor.Server.Tiered/Logs/*
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Use abp install-libs to restore.
**/wwwroot/libs/*
public
dist
dist - 副本
.vscode
/Yi.Abp.Net8/src/Yi.Abp.Web/appsettings.Development.json
/Yi.Abp.Net8/src/Yi.Abp.Web/appsettings.Production.json
/Yi.Abp.Net8/test/Yi.Abp.Test/appsettings.Development.json
/Yi.Abp.Net8/test/Yi.Abp.Test/appsettings.Production.json
/Yi.Abp.Net8/tool/Yi.Abp.Tool.Web/appsettings.Development.json
database_backup
/Yi.Abp.Net8/src/Yi.Abp.Web/appsettings.Staging.json
/Yi.Abp.Net8/src/Yi.Abp.Web/logs/
/Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
package-lock.json
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
appsettings.Development.json
.claude
components.d.ts

214
LICENSE
View File

@@ -1,201 +1,21 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
MIT License
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Copyright (c) 2023 橙子
1. Definitions.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

37
README-Docker.md Normal file
View File

@@ -0,0 +1,37 @@
# 🍉Docker 构建说明
## 🍊后端
执行目录Yi\Yi.Abp.Net8
#### 🍊启动
D:/code/csharp/source/Yi/Yi.Bbs.Vue3/yi-bbs.conf 为我的配置文件,内部带了默认的配置文件,根据自己配置进行更改
//不带配置文件
docker run -d --name yi.admin -p 19001:19001 jiftcc/yi.admin:1.0.0
//带配置文件
docker run -d --name yi.admin -p 19001:19001 -v D:/code/csharp/source/Yi/Yi.Abp.Net8/src/Yi.Abp.Web/appsettings.json:/app/appsettings.json jiftcc/yi.admin:1.0.0
#### 🍊完整代码编译
docker build -t jiftcc/yi.admin:1.0.0 -f Dockerfile .
#### 🍊快速产物编译
docker build -t jiftcc/yi.admin:1.0.0 -f DockerfileFast .
****
## 🍇前端
执行目录Yi\Yi.Bbs.Vue3
#### 🍇启动
D:/code/csharp/source/Yi/Yi.Bbs.Vue3/yi-bbs.conf 为我的conf配置目录默认反向代理到ccnetcore.com根据自己后端地址进行修改配置
docker run -d --name yi.bbs -p 18001:18001 -v D:/code/csharp/source/Yi/Yi.Bbs.Vue3/yi-bbs.conf:/etc/nginx/conf.d/yi-bbs.conf jiftcc/yi.bbs:1.0.0
#### 🍇完整代码编译
docker build -t jiftcc/yi.bbs:1.0.0 -f Dockerfile .
#### 🍇快速产物编译
docker build -t jiftcc/yi.bbs:1.0.0 -f DockerfileFast .

225
README-en.md Normal file
View File

@@ -0,0 +1,225 @@
<h1 align="center"><img align="left" height="150px" src="https://ccnetcore.com/prod-api/wwwroot/logo.png"> Yi-Framework</h1>
<h4 align="center">A .NET 8 Web open-source Asp.NetCore framework focused on user experience.</h4>
<h5 align="center">Supports Native/Abp.vNext/Furion/Ruoyi/Pure</h5>
<h2 align="center">A comprehensive solution that ultimately becomes a wheel</h2>
[![star](https://gitee.com/ccnetcore/yi/badge/star.svg?theme=dark)](https://gitee.com/ccnetcore/Yi)
[![fork](https://gitee.com/ccnetcore/yi/badge/fork.svg?theme=dark)](https://gitee.com/ccnetcore/Yi)
[![license](https://img.shields.io/badge/license-MIT-yellow)](https://gitee.com/ccnetcore/Yi)
English | [简体中文](README.md)
****
## 🍍 Introduction:
YiFramework is a DDD (Domain-Driven Design) backend open-source framework based on .Net8, Abp.vNext, and SqlSugar.
Who says ABP is complex? Who says DDD is difficult?`Breaking conventions, simplifying complexity.`,Newcomer-friendly and one of the best approaches for project extensions.
Modular design allows for the independent inclusion or exclusion of components based on business needs. It is an all-encompassing framework where you may gain unique insights.
A Comprehensive Solution, Ultimately Just Another Wheel.
(Frequent updates, feel free to watch for continuous updates.)
— This is not just a program; it is also a work of art, focused on artistic development!
> Core Features: Simple and easy to use, the framework is not referenced in a packaged form, but is provided directly with the project alongside the source code. It offers maximum freedom and complies with the MIT license, allowing for unrestricted modifications (please indicate the source).
**Branch Directory**
- Branch **Abp**: Based on the Abp.vNext branch, DDD (Domain-Driven Design) simplifies the essence of development, providing support for multiple frontends from one backend.
- Yi.Abp.Net8Backend
- Yi.Bbs.Vue3Bbs Community - Frontend
- Yi.Doc.Md: Open Source Documentation Tutorial
- Yi.Pure.Vue3Pure TS Backend Frontend
- Yi.RuoYi.Vue3RuoYi JS Backend Frontend
****
## 🍉 docker
Full contentREADME-Docker.md
backend`docker run -d --name yi.admin -p 19001:19001 jiftcc/yi.admin:last`
bbs frontend`docker run -d --name yi.bbs -p 18001:18001 -v /home/Yi/Yi.Bbs.Vue3/yi-bbs.conf:/etc/nginx/conf.d/yi-bbs.conf jiftcc/yi.bbs:last`
> In addition, we provide Docker build operation, and we hope that you can build your own image through this method
****
## 🍊 Official website and demo link
Let's get straight to the point and provide the link.
YiCommunity official website URL.(Bbs)[ccnetcore.com](https://ccnetcore.com) (Now live, welcome to join!)
Rbachttps://ccnetcore.com:1000 (userName cc\password 123456)
Purehttps://ccnetcore.com:1001 userNamecc\password 123456
## 🍏 Support:
- [x] Fully supports monolithic application architecture
- [x] Fully supports distributed application architecture
- [x] Fully supports microservices architecture
****
## 🍇 Explosive Detail Yi Framework Tutorial Navigation:
1. [Framework Quick Start Guide](https://ccnetcore.com/article/aaa00329-7f35-d3fe-d258-3a0f8380b742)(Completed)
2. [Framework Functionality Module Tutorials](https://ccnetcore.com/article/8c464ab3-8ba5-2761-a4b0-3a0f83a9f312)(Completed)
3. [Practical Development Exercises](https://ccnetcore.com/article/e89c9593-f337-ada7-d108-3a0f83ae48e6)(Completed)
4. [Chengzi Ops CI/CD Tutorial](https://ccnetcore.com/article/6b80ed42-50cd-db15-c073-3a0fa8f7fd77)(Completed)
5. [Version Update Log](https://ccnetcore.com/article/e9e69a38-ce1e-06f5-7944-3a0fdc942ef3)(Completed)
****
## 🍓 Its philosophy:
Who says ABP is complicated? Who says DDD is difficult? Break the norm, simplify complexity, and serve as one of the best ways for newcomers and project second development.
> For every hundred people, there are a hundred different interpretations of DDD. The YiFramework may not strict adherence to DDD principles, but it is built on the shoulders of giants, distilled from numerous projects to craft a best practice.
Effortlessly achieve rapid development; typically, simplicity and elegance are hard to reconcile. The YiFramework does not solely pursue extreme decoupling but considers user experience and ease of use.
A user-oriented rapid development backend framework.
> Once you truly get hands-on, you'll understand this: extreme simplicity is also a form of elegance.
****
## 🍍 Features
- A user-oriented backend framework that is easy to use, suitable for small, medium, and enterprise-level projects.
- The project comes with the source code directly embedded, without packaging, making it ideal for secondary development and modification.
- Includes a large number of reusable modules for common scenarios.
- Elegantly supports distributed and microservices architectures.
- And more…
## 🥭 Core Technologies
#### Backend
C# Asp.NetCore 8.0
- [x] Dynamic API: Abp.vNext
- [x] Authentication and Authorization: Jwt
- [x] Logging: Serilog
- [x] Modularization: Abp.vNext
- [x] Dependency Injection: Autofac
- [x] Object Mapping: Mapster
- [x] ORM: SqlsugarCore
- [x] Multi-tenancy: Abp.vNext
- [x] Background Tasks: Quartz.Net
- [x] Local Caching: Abp.vNext
- [x] Distributed Caching: Abp.vNext
- [x] Event Bus: Abp.vNext
#### Frontend
js Vue3
- [x] Asynchronous Requests: axios
- [x] Charts: echarts
- [x] UI: element-plus
- [x] State Management: pinia
- [x] Routing: vue-router
- [x] Bundling: vite
#### DevOps
- [x] Deployment: nginx
- [x] CICD: gitlab+Jenkins
- [x] Docker: harbor
#### 🍉 Demo
<table>
<tr>
<td><img src="readme/101.png"/></td>
<td><img src="readme/102.png"/></td>
</tr>
<tr>
<td><img src="readme/103.png"/></td>
<td><img src="readme/104.png"/></td>
</tr>
</table>
<table>
<tr>
<td><img src="readme/201.png"/></td>
<td><img src="readme/202.png"/></td>
</tr>
<tr>
<td><img src="readme/203.png"/></td>
<td><img src="readme/204.png"/></td>
</tr>
<tr>
<td><img src="readme/205.png"/></td>
<td><img src="readme/206.png"/></td>
</tr>
</table>
<table>
<tr>
<td><img src="readme/1.png"/></td>
<td><img src="readme/2.png"/></td>
</tr>
<tr>
<td><img src="readme/3.png"/></td>
<td><img src="readme/4.png"/></td>
</tr>
<tr>
<td><img src="readme/3.png"/></td>
<td><img src="readme/4.png"/></td>
</tr>
<tr>
<td><img src="readme/5.png"/></td>
<td><img src="readme/6.png"/></td>
</tr>
<tr>
<td><img src="readme/7.png"/></td>
<td><img src="readme/8.png"/></td>
</tr>
<tr>
<td><img src="readme/9.png"/></td>
<td><img src="readme/10.png"/></td>
</tr>
<tr>
<td><img src="readme/11.png"/></td>
<td><img src="readme/12.png"/></td>
</tr>
</table>
## 🌶 Thank you
[橙子]https://ccnetcore.com
[XWen]https://gitee.com/on-wensil
[朝夕教育]https://www.zhaoxiedu.net
[Sqlsugar老杰哥]https://www.donet5.com/Home/Doc
[车神]微信公众号搜索Dotnet技术进阶
[RuYiAdmin如意老兄]https://gitee.com/pang-mingjun/RuYiAdmin
[ZrAdminNetCore字母老哥]https://gitee.com/izory/ZrAdminNetCore
[Admin.NET]https://gitee.com/zuohuaijun/Admin.NET
[Furion百小僧]https://furion.baiqian.ltd/
****
## 🌽 Contact Us:
Author's QQ`454313500`
QQ group chat官方一群Full、官方二群Full、官方三群`786308927`Full、官方四群:`498310311`Full、官方五群:`981136525`New
WeChat Group Chat官方微信一群Full、官方微信二群
WeChat Community: Add the author's WeChat chengzilaoge520 橙子老哥520,Note: Join the group.
Contact the author, everyone here is a consultant.
Official website message area[ccnetcore.com](https://ccnetcore.com)
****
## 🍄 FQA:
Visit the official website to view the message board.
[the message board](https://ccnetcore.com/discuss/1641030787056930818)

366
README.md
View File

@@ -1,227 +1,285 @@
<h1 align="center"><img align="left" height="100px" src="https://user-images.githubusercontent.com/68722157/138828506-f58b7c57-5e10-4178-8f7d-5d5e12050113.png"> Yi框架</h1>
<h4 align="center">一套与SqlSugar一样爽的.Net6低代码开源框架</h4>
<h1 align="center"><img align="left" height="150px" src="https://ccnetcore.com/prod-api/wwwroot/logo.png"> Yi框架</h1>
<h4 align="center">一套以用户体验出发的.Net8 Web开源框架</h4>
<h5 align="center">支持Abp.vNext 版本原生版本、Furion版本前端接入Ruoyi/Pure Vue</h5>
<h2 align="center">集大成者,终究轮子</h2>
[![star](https://gitee.com/ccnetcore/yi/badge/star.svg?theme=dark)](https://gitee.com/ccnetcore/Yi)
[![fork](https://gitee.com/ccnetcore/yi/badge/fork.svg?theme=dark)](https://gitee.com/ccnetcore/Yi)
[![license](https://img.shields.io/badge/license-MIT-yellow)](https://gitee.com/ccnetcore/Yi)
本项目 CDN 加速及安全防护由 Tencent EdgeOne 赞助
[亚洲最佳CDN、边缘和安全解决方案 - Tencent EdgeOne](https://edgeone.ai/zh?from=github)
<img src="readme/edgeone.png"/>
[English](README-en.md) | 简体中文
![sdk](https://img.shields.io/badge/sdk-6.0.1-d.svg)![License MIT](https://img.shields.io/badge/license-Apache-blue.svg?style=flat-square)
****
### 简介:
**中文:意框架**(和他的名字一样“简易”)
## 🍍 简介:
YiFramework是一个基于.Net8+Abp.vNext+SqlSugar的DDD领域驱动设计后端开源框架
正在持续更进业务模块
谁说Abp复杂谁说DDD难`打破常规,化繁为简`,新人入门,项目二开,最佳方式之一
**中文:意框架**和他的名字一样“简易”同时接入Java的Ruoyi Vue3.0前端)
模块化,可根据业务自行引用或抛弃,集大成者,大而全乎,也许你能从中学习到一些独特见解
**英文YiFramework**
Yi框架-一套与SqlSugar一样爽的.Net6低代码开源框架。
Yi框架-一套与SqlSugar一样爽的.Net8开源框架。
与Sqlsugar理念一致以用户体验出发。
架构干净整洁、无业务代码、采用微软风格原生框架封装、WebFrist开发。
适合.Net6学习、Sqlsugar学习 、项目二次开发。
全生态拥抱AI接入AI100%代码经过AI洗礼
集大成者,终究轮子
Yi框架最新版本标签`v1.1.6`,具体版本可以查看标签迭代
项目与Sqlsugar同步更新但这作者老杰哥代码天天爆肝到凌晨两点我们也尽量会跟上他的脚步。更新频繁所以可watching持续关注。
更新频繁可watching持续关注。
————这不仅仅是一个程序,更是一个艺术品,面向艺术的开发!
**分支**
> 核心特点简单好用框架不以打包形式引用而是直接以项目附带源码给出自由度拉满遵循Mit协议允许随意修改请注明来源即可
本项目由EFCore版本历经3年不断迭代至Sqlsugar版本现EFcore版本已弃用目前sqlsugar不带任何业务之后会更新业务功能
**分支目录:**
**SqlSugar**:.Net6 DDD领域驱动设计 简单分层微服务架构
- 分支**Abp**: 基于Abp.vNext分支DDD领域驱动设计,回归开发本质,极度简单,一个后台支持以下多个前端
**ec**:EFcore完整电商项目
- Yi.Abp.Net8后端
- Yi.Bbs.Vue3Bbs社区 前端
- Yi.Doc.Md: 开源文档教程
- Yi.Pure.Vue3Pure ts后台前端
- Yi.RuoYi.Vue3RuoYi js后台前端
****
## 🍉 docker 一键启动
完整内容在README-Docker.md
后端:`docker run -d --name yi.admin -p 19001:19001 jiftcc/yi.admin:last`
bbs前端`docker run -d --name yi.bbs -p 18001:18001 -v /home/Yi/Yi.Bbs.Vue3/yi-bbs.conf:/etc/nginx/conf.d/yi-bbs.conf jiftcc/yi.bbs:last`
> 另外我们提供docker的build操作我们更希望你能通过此种方式二开构建属于自己的镜像
****
### 演示地址:
## 🍊 官网及演示地址:
废话少说直接上地址**请不要**更改里面的数据
废话少说直接上地址
API服务~~[yi.ccnetcore.com](http://yi.ccnetcore.com) 管理员账号admin 、 123~~
Yi社区官网网址Bbs社区正式[ccnetcore.com](https://ccnetcore.com) (已上线,欢迎加入)
网关地址:~~[gate.ccnetcore.com/swagger](http://gate.ccnetcore.com/swagger)~~
Rbac后台演示地址https://data.ccnetcore.com:1000 用户cc、密码123456
WebFirst开发所有代码生成器已经配置完成无需任何操作数据库及任何代码只需要网页表格上点点点即可
Pure后台演示地址https://data.ccnetcore.com:1001 用户cc、密码123456
[https://www.donet5.com/Doc/11](https://www.donet5.com/Doc/11)
谁能把持的住Sqlsugar作者自己都依赖成瘾的东西呢这是继DbFirst、CodeFirst下一代的划时代产品无脑爽
![image](https://s1.ax1x.com/2022/04/12/Lnm5Yq.png)
(首次添加实体后,生成代码记得修改对应的路径哦~~
### 支持:
## 🍏 支持:
- [x] 完全支持单体应用架构
- [x] 完全支持分布式应用架构
- [x] 完全支持微服务架构
- [ ] 即将支持网格服务架构我们将在后续版本加入dapr
****
### 软件架构:
**架构**:后端.NET6(Asp.NetCore 6)、WebFirst代码生成器~~与.NET5(Asp.NetCore 5)、前端Vue2.0~~
## 🍇 详细到爆炸的Yi框架教程导航
**关系型数据库**mysql、sql server、sqlite、oracle(正在兼容中)
0. [社区导航大全](https://ccnetcore.com/article/aaa00329-7f35-d3fe-d258-3a0f8380b742/fb8c871b-41fc-21bc-474f-3a154498f42b)
**操作系统**Windows、Linux
**身份验证**JWT、IdentityServer4
**组件**~~EFcore~~SqlSugar、Autofac、Castle、Swagger、Log4Net、Redis、RabbitMq、ES、Quartz.net、~~T4~~
**分布式**CAP、Lock
**微服务**Consul、Ocelot、IdentityService、Apollo、Docker、Jenkins、Nginx、K8s、ELK、Polly
**封装**Json处理模块滑动验证码模块base64图片处理模块异常捕捉模块、邮件处理模块、linq封装模块、随机数模块、统一接口模块、基于策略的jwt验证、过滤器、数据库连接、跨域、初始化种子数据、Base32、Console输出、日期处理、文件传输、html筛选、http请求、ip过滤、md5加密、Rsa加密、序列化、雪花算法、字符串处理、编码处理、地址处理、xml处理、心跳检查。。。
1. [框架快速开始教程](https://ccnetcore.com/article/aaa00329-7f35-d3fe-d258-3a0f8380b742)(已完成)
2. [框架功能模块教程](https://ccnetcore.com/article/8c464ab3-8ba5-2761-a4b0-3a0f83a9f312)(已完成)
3. [实战演练开发教程](https://ccnetcore.com/article/e89c9593-f337-ada7-d108-3a0f83ae48e6)(已完成)
4. [橙子运维CICD教程](https://ccnetcore.com/article/6b80ed42-50cd-db15-c073-3a0fa8f7fd77)(已完成)
5. [版本更新日志](https://ccnetcore.com/article/e9e69a38-ce1e-06f5-7944-3a0fdc942ef3)(已完成)
****
### 支持模块:
## 🍓 它的理念:
谁说Abp复杂谁说DDD难打破常规化繁为简新人入门项目二开最佳方式之一
大致如图:
> 一百个人就有一百种DDDYi框架不一定是极度严格的DDD而是站在巨人的肩膀上经过极多项目的提炼摸索出一种最佳实践
![image](https://user-images.githubusercontent.com/68722157/142923071-2fa524eb-e833-4143-a926-51566e56e889.png)
![image](https://user-images.githubusercontent.com/68722157/142923150-ebe1b538-c3fc-42dd-bea8-83e10e0f819a.png)
![image](https://user-images.githubusercontent.com/68722157/142923529-e4fbb2f6-def1-4702-b9da-5adbd22f0a2f.png)
(删除线代表已实现功能还未迁移过来)
- [x] 支持大致`DDD领域驱动设计`进行分层,支持微服务扩展
- [x] 支持采用`异步`开发awit/async
- [x] 支持数据库主从`读写分离`
- [x] 支持功能替换,无需改动代码,只需配置`json文件`进行装配即可
- [x] ~~-支持采用DbFirst开发方式使用`T4模板代码生成器`自动映射模型一键生成Service及IService所有代码~~
- [x] 支持WebFirst无需改动代码自动生成全套代码与数据库只需点点点
- [x] ~~-支持`用户-角色-菜单-接口`以及vue2.0前端全部逻辑代码,下载无需修改直接使用~~
- [x] 支持`Aop封装`FilterAop、IocAop、LogAop、SqlAop
- [x] 支持`Log4Net日志`记录自动生成至bin目录下的logs文件夹
- [x] 支持`DbSeed数据库种子数据`接入
- [x] 支持主流`数据库随意切换`Mysql/Sqlite/Sqlserver/Oracle
- [x] 支持上海杰哥官方`SqlSugar ORM`封装
- [x] 支持新版`SwaggerWebAPI`jwt身份认证接入
- [x] 支持`Cors`跨域
- [x] 支持`AutoFac`自动映射依赖注入
- [x] 支持`consul`服务器注册与发现
- [x] 支持`健康检查`
- [x] 支持`RabbitMQ`消息队列
- [x] 支持`Redis`多级缓存
- [x] 支持`Ocelot`网关路由、服务聚合、服务发现、认证、鉴权、限流、熔断、缓存、Header头传递
- [x] 支持`Apollo`全局配置中心;
- [x] 支持`docker`镜像制作
- [x] ~~-支持页面`静态化处理`,将动态页面生成静态页面~~
- [x] 支持`Quartz.net`任务调度,实现任意接口被调度
- [x] 支持`ELK`log4net+kafka+es+logstach+kibana
- [x] 支持`IdentityService4`授权中心
- [x] 支持`Es`分词查询
- [x] 支持多级`缓存`
- [x] 支持`CAP`分布式事务mysql+rabbitMq
- [x] 支持`Docker+k8s`部署
- [x] 支持`Jenkins+CI/CD`
- [x] 支持`AutoMapper`模块映射
- [ ] 支持`微信支付`(没账号)
- [x] 支持`单表多租户`常用功能
- [x] 支持`逻辑删除`常用功能
- [x] 支持`操作日志`常用功能
- [x] 支持`自动分表`
- [x] 支持 太多了忘了
优雅的进行快速开发通常简单程度与优雅程度不可兼得Yi框架并不一昧的追求极致的解耦会站在用户使用角度上在使用难易度进行考虑衡量
> 一个面向用户的快速开发后端框架
在真正的使用过,你会明白这一点,极致的简单,也是优雅的一种体现。
****
## 🍍 特点
- 面向用户的后端框架,使用简单,适合小型、中型、企业级项目
- 项目直接内置源码,不打包,非常适合进行二开改造
- 内置包含大量通用场景模块
- 优雅支持分布式及微服务架构
- 等等
## 🍍 基础设施简介
以下全部功能可直接使用:
- [Abp.vNext官网](https://docs.abp.io/zh-Hans/abp/latest/)
- [SqlSugar官网](https://www.donet5.com/home/doc)
## 🍅 内置模块简介
- Rbac权限管理系统已上线支持pure、ruoyi前端
- Bbs论坛社区系统已上线
> 重复的东西,无需再写一遍,这也是优雅的体现之一
****
### 目录结构:
## 🥭 核心技术
#### 后端
C# Asp.NetCore 8.0
- [x] 动态ApiAbp.vNext
- [x] 鉴权授权Jwt
- [x] 日志Serilog
- [x] 模块化Abp.vNext
- [x] 依赖注入Autofac
- [x] 对象映射Mapster
- [x] ORM: SqlsugarCore
- [x] 多租户Abp.vNext
- [x] 后台任务Quartz.Net
- [x] 本地缓存Abp.vNext
- [x] 分布式缓存Abp.vNext
- [x] 事件总线Abp.vNext
![image](https://s1.ax1x.com/2022/04/09/LCTleH.png)
![image](https://s1.ax1x.com/2022/04/24/L4qlSs.png)
![image](https://s1.ax1x.com/2022/04/24/L4q1ln.png)
#### 前端
js Vue3
- [x] 异步请求axios
- [x] 图表echarts
- [x] uielement-plus
- [x] 存储pinia
- [x] 路由vue-router
- [x] 打包vite
我们大致依照DDD领域驱动设计分层
#### 运维
- [x] 部署nginx
- [x] CICDgitlab+Jenkins
- [x] Dockerharbor
分层如此清晰什么还感觉太复杂了用户只需关注Api、Service其他都是轮子啊
~~- BackGround后台进程目前可以无视等待更新~~
- Client客户端测试、客户端
- Domain领域层Dto、服务接口层、模型层、仓储层、服务层
- Infrastructure基础实例层(通用工具层、核心层、定时任务Job、国际化、Web扩展层)
- MicroServiceInstance服务层微服务
****
### 安装教程:
## 🍌 业务支持模块:
我们将在之后更新教程手册!
#### 🍒 RABC权限管理系统持续更新
采用ruoyi前端
- 用户管理
- 角色管理
- 菜单管理
- 部门管理
- 岗位管理
- 字典管理
- 参数管理
- 用户在线
- 操作日志
- 登录日志
- 定时任务
- 缓存列表
- 服务监控
1. 下载全部源码默认使用sqlite数据库已经生成
2. 直接点击sln文件运行即可没有其他依赖
#### 🍐 BBS社区论坛系统持续更新
采用vue3前端
- 文章功能
- 板块功能
- 主题功能
- 个人中心
- 授权中心
- 权限管理
****
### 使用说明:
#### 🍉 演示截图:
<table>
<tr>
<td><img src="readme/101.png"/></td>
<td><img src="readme/102.png"/></td>
</tr>
<tr>
<td><img src="readme/103.png"/></td>
<td><img src="readme/104.png"/></td>
</tr>
</table>
1. 导入使用仓库中的WebFirst数据库
2. 使用WebFirst添加实体、同步实体、修改模板生成路径并生成方案
<table>
<tr>
<td><img src="readme/201.png"/></td>
<td><img src="readme/202.png"/></td>
</tr>
<tr>
<td><img src="readme/203.png"/></td>
<td><img src="readme/204.png"/></td>
</tr>
<tr>
<td><img src="readme/205.png"/></td>
<td><img src="readme/206.png"/></td>
</tr>
</table>
没了,恭喜你已经成功完成了项目,并且已经具备大部分通用场景业务
是不是一个字?爽!
到此为止,你无需写任何一个代码!
**爽点**
<table>
<tr>
<td><img src="readme/1.png"/></td>
<td><img src="readme/2.png"/></td>
</tr>
<tr>
<td><img src="readme/3.png"/></td>
<td><img src="readme/4.png"/></td>
</tr>
<tr>
<td><img src="readme/3.png"/></td>
<td><img src="readme/4.png"/></td>
</tr>
<tr>
<td><img src="readme/5.png"/></td>
<td><img src="readme/6.png"/></td>
</tr>
<tr>
<td><img src="readme/7.png"/></td>
<td><img src="readme/8.png"/></td>
</tr>
<tr>
<td><img src="readme/9.png"/></td>
<td><img src="readme/10.png"/></td>
</tr>
<tr>
<td><img src="readme/11.png"/></td>
<td><img src="readme/12.png"/></td>
</tr>
</table>
新人,看这里,项目下载之后直接可以启动,无任何依赖,之后你可以查看`Test控制器`,迫不及待的快来爽一爽!
我们将使用说明转移至我们的官方论坛中,正在制作中,尽情期待!
****
### 感谢:
**大力支持** Eleven神、Sqlsugar上海杰哥、Gerry、哲学的老张
## 🌶 感谢:
[橙子]https://ccnetcore.com
[lzw]https://github.com/yeslode
[XWen]https://gitee.com/on-wensil
[朝夕教育]https://www.zhaoxiedu.net
[Sqlsugar]https://www.donet5.com/Home/Doc
[Sqlsugar老杰哥]https://www.donet5.com/Home/Doc
[RuYiAdmin]https://gitee.com/pang-mingjun/RuYiAdmin
[车神]微信公众号搜索Dotnet技术进阶
[ZrAdminNetCore]https://gitee.com/izory/ZrAdminNetCore
[RuYiAdmin如意老兄]https://gitee.com/pang-mingjun/RuYiAdmin
[ZrAdminNetCore字母老哥]https://gitee.com/izory/ZrAdminNetCore
[Admin.NET]https://gitee.com/zuohuaijun/Admin.NET
[Furion百小僧]https://furion.baiqian.ltd/
****
### 联系我们:
## 🌽 联系我们:
作者QQ`454313500`2029年之前作者24小时在线时刻保持活跃更新。
QQ交流群官方一群已满、官方二群已满、官方三群`786308927`加作者QQ后同意
QQ交流群官方一群已满、官方二群已满、官方三群`786308927`已满)、官方四群:`498310311`(已满)、官方五群:`981136525`
微信交流群:官方微信一群(已满)、官方微信二群(已满)、官方微信三群
微信交流群:加作者微信 chengzilaoge520 橙子老哥520备注拉群
联系作者,这里人人都是顾问
官方网址:正在建设
官方网址留言区:[ccnetcore.com](https://ccnetcore.com)
****
### FQA:
## 🍄 FQA:
问1为什么不采用EFcore
前往官网查看留言区
答1别问问就是Sqlsugar和本框架一样爽
问2以后会持续更新下去吗
答2一定会的我们的标题是 一个和Sqlsugar一样爽的.Net6开源框架 只要Sqlsugar在我们将一直更新下去。
问3这个框架的针对人群是哪些人适合所有人吗
答3并不是适合所有人应该算适合需要有一定基础的开发人员当然如果你是大神你完全可以将这个框架二次开发
问4花如此多的精力制作这个框架是为了什么是为了赚钱吗和目前主流的abp等框架比又有什么意义呢
答4我们与Sqlsugar作者理念一致我们是从用户角度出发框架是为用户服务与ABP复杂上手理念完全是相反的。
问5为何不出版一个详细的说明书呢
答5暂时不会了之后可能会代码都是基于Asp.NetCore框架适用于新手不用造轮子整个框架较为简单阅读源码后基本能自定义改造使用了过难也已经封装完毕别忘了其意义是为了开发更加简易建议添加作者好友这里人人都是顾问。
我大抵要厌倦了负重前行。
[留言区](https://ccnetcore.com/discuss/1641030787056930818)

Binary file not shown.

View File

@@ -0,0 +1,11 @@
{
"permissions": {
"allow": [
"Bash(dotnet build \"E:\\code\\github\\Yi\\Yi.Abp.Net8\\module\\ai-hub\\Yi.Framework.AiHub.Application\\Yi.Framework.AiHub.Application.csproj\" --no-restore)",
"Read(//e/code/github/Yi/Yi.Ai.Vue3/**)",
"Bash(dotnet build:*)"
],
"deny": [],
"ask": []
}
}

33
Yi.Abp.Net8/.dockerignore Normal file
View File

@@ -0,0 +1,33 @@
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md
!**/.gitignore
!.git/HEAD
!.git/config
!.git/packed-refs
!.git/refs/heads/**
appsettings.Development.json
appsettings.Production.json
appsettings.Staging.json

129
Yi.Abp.Net8/CLAUDE.md Normal file
View File

@@ -0,0 +1,129 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Overview
Yi.Abp.Net8 is a modular, multi-tenant SaaS platform built on ABP Framework 8.3.4 with .NET 8.0. It uses **SqlSugar** (not EF Core) as the ORM and follows Domain-Driven Design (DDD) principles. The platform includes AI/ML features (chat, models, agents, token tracking), RBAC, forum, messaging, and digital collectibles modules.
## Architecture
### Solution Structure
```
Yi.Abp.Net8/
├── src/ # Main application host
│ └── Yi.Abp.Web/ # ASP.NET Core 8.0 Web Host (port 19001)
├── framework/ # Framework layer (shared infrastructure)
│ ├── Yi.Framework.Core # Core utilities, JSON handling
│ ├── Yi.Framework.SqlSugarCore # SqlSugar ORM abstraction (v5.1.4.197-preview22)
│ ├── Yi.Framework.SqlSugarCore.Abstractions # Repository interfaces
│ ├── Yi.Framework.AspNetCore # ASP.NET Core extensions
│ ├── Yi.Framework.AspNetCore.Authentication.OAuth # QQ, Gitee OAuth
│ ├── Yi.Framework.Ddd.Application # DDD application base classes
│ ├── Yi.Framework.BackgroundWorkers.Hangfire # Job scheduling
│ ├── Yi.Framework.Caching.FreeRedis # Redis caching
│ └── Yi.Framework.SemanticKernel # AI/ML integration
├── module/ # Business modules (each follows 5-layer DDD pattern)
│ ├── ai-hub/ # AI services (chat, models, sessions, agents)
│ ├── rbac/ # Role-Based Access Control (core auth/authz)
│ ├── bbs/ # Forum/community
│ ├── chat-hub/ # Real-time messaging
│ ├── audit-logging/ # Audit trail tracking
│ ├── code-gen/ # Code generation
│ ├── tenant-management/ # Multi-tenancy support
│ ├── digital-collectibles/ # NFT/digital assets
│ └── ai-stock/ # AI-powered stock analysis
├── test/ # Unit tests (xUnit + NSubstitute + Shouldly)
├── client/ # HTTP API clients
└── tool/ # Development utilities
```
### Module Structure (DDD Layers)
Each module follows this pattern:
```
module/[feature]/
├── [Feature].Domain.Shared/ # Constants, enums, shared DTOs
├── [Feature].Domain/ # Entities, aggregates, domain services
├── [Feature].Application.Contracts/ # Service interfaces, DTOs
├── [Feature].Application/ # Application services (implementations)
└── [Feature].SqlSugarCore/ # Repository implementations, DbContext
```
**Dependency Flow:** Application → Domain + Application.Contracts → Domain.Shared → Framework
### Module Registration
All modules are registered in `src/Yi.Abp.Web/YiAbpWebModule.cs`. When adding a new module:
1. Add `DependsOn` attribute in `YiAbpWebModule`
2. Add conventional controller in `PreConfigureServices`:
```csharp
options.ConventionalControllers.Create(typeof(YiFramework[Feature]ApplicationModule).Assembly,
option => option.RemoteServiceName = "[service-name]");
```
### API Routing
All API routes use the unified prefix: `/api/app/{service-name}/{controller}/{action}`
Registered service names:
- `default` - Main application services
- `rbac` - Authentication, authorization, user/role management
- `ai-hub` - AI chat, models, sessions, agents
- `bbs` - Forum posts and comments
- `chat-hub` - Real-time messaging
- `tenant-management` - Multi-tenant configuration
- `code-gen` - Code generation utilities
- `digital-collectibles` - NFT/digital assets
- `ai-stock` - Stock analysis
## Database
**ORM:** SqlSugar (NOT Entity Framework Core)
**Configuration** (`appsettings.json`):
```json
"DbConnOptions": {
"Url": "DataSource=yi-abp-dev.db",
"DbType": "Sqlite", // Sqlite, Mysql, Sqlserver, Oracle, PostgreSQL
"EnabledCodeFirst": true, // Auto-create tables
"EnabledDbSeed": true, // Auto-seed data
"EnabledSaasMultiTenancy": true
}
```
**Multi-tenancy:** Tenant isolation via `HeaderTenantResolveContributor` (NOT cookie-based). Tenant is resolved from `__tenant` header.
## Key Technologies
| Component | Technology |
|-----------|-----------|
| Framework | ABP 8.3.4 |
| .NET Version | .NET 8.0 |
| ORM | SqlSugar 5.1.4.197-preview22 |
| Authentication | JWT Bearer + Refresh Tokens |
| OAuth | QQ, Gitee |
| Caching | FreeRedis (optional) |
| Background Jobs | Hangfire (in-memory or Redis) |
| Logging | Serilog (daily rolling files) |
| Testing | xUnit + NSubstitute + Shouldly |
| Container | Autofac |
## Important Notes
- **JSON Serialization:** Uses Microsoft's `System.Text.Json`, NOT Newtonsoft.Json. Date format handled via `DatetimeJsonConverter`.
- **Multi-tenancy:** Tenant resolved from `__tenant` header, NOT cookies.
- **Rate Limiting:** Disabled in development, enabled in production (1000 req/60s sliding window).
- **Swagger:** Available at `/swagger` in development.
- **Hangfire Dashboard:** Available at `/hangfire` (requires JWT authorization).
- **Background Workers:** Disabled in development (`AbpBackgroundWorkerOptions.IsEnabled = false`).
## Development Workflow
1. **Branch:** Main branch is `abp`, current development branch is `ai-hub`.
2. **Commit Convention:** Chinese descriptive messages with prefixes (`feat:`, `fix:`, `style:`).
3. **Testing:** Run `dotnet test` before committing.
4. **Building:** Use `dotnet build --no-restore` for faster builds after initial restore.

22
Yi.Abp.Net8/Dockerfile Normal file
View File

@@ -0,0 +1,22 @@
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER root
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
WORKDIR /app
EXPOSE 19001
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /main
COPY . .
WORKDIR "/main/src/Yi.Abp.Web"
RUN dotnet restore "Yi.Abp.Web.csproj"
FROM build AS publish
WORKDIR "/main/src/Yi.Abp.Web"
RUN dotnet publish "Yi.Abp.Web.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Yi.Abp.Web.dll"]

View File

@@ -0,0 +1,11 @@
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER root
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
WORKDIR /app
EXPOSE 19001
FROM base AS final
WORKDIR /app
COPY ["./publish","."]
ENTRYPOINT ["dotnet", "Yi.Abp.Web.dll"]

596
Yi.Abp.Net8/Yi.Abp.sln Normal file
View File

@@ -0,0 +1,596 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.7.34202.233
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Web", "src\Yi.Abp.Web\Yi.Abp.Web.csproj", "{15913E44-DA92-44B9-9AC5-E9457EA34BF5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.SqlSugarCore", "framework\Yi.Framework.SqlSugarCore\Yi.Framework.SqlSugarCore.csproj", "{DC431ECC-C75D-4B01-8B79-4861948179BB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B782C78B-6C17-49E6-A237-3383BA720766}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{0D10EEF2-FBAE-4C72-B816-A52823FC299B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "framework", "framework", "{77B949E9-530E-45A5-9657-20F7D5C6875C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "module", "module", "{2317227D-7796-4E7B-BEDB-7CD1CAE7B853}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.SqlSugarCore", "src\Yi.Abp.SqlSugarCore\Yi.Abp.SqlSugarCore.csproj", "{9A7BBA40-28D6-4900-9E1D-D627A516EE72}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Application", "src\Yi.Abp.Application\Yi.Abp.Application.csproj", "{746DBBD6-23E8-4D5D-9D23-E2902BE338BD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Application.Contracts", "src\Yi.Abp.Application.Contracts\Yi.Abp.Application.Contracts.csproj", "{51EEBF59-3D37-4681-981D-56F8D8F8968D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Domain", "src\Yi.Abp.Domain\Yi.Abp.Domain.csproj", "{7B15C198-538A-44ED-A6AA-3A0FEAA1D2BD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Domain.Shared", "src\Yi.Abp.Domain.Shared\Yi.Abp.Domain.Shared.csproj", "{F4D5A496-BFBE-470B-A05B-CB5823B47E72}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6A5375C6-1D55-4E93-9B19-736F1C68CBC3}"
ProjectSection(SolutionItems) = preProject
common.props = common.props
end.sh = end.sh
logo.png = logo.png
start.sh = start.sh
tool.bat = tool.bat
usings.props = usings.props
version.props = version.props
publish.bat = publish.bat
publish_Demo.bat = publish_Demo.bat
Dockerfile = Dockerfile
DockerfileFast = DockerfileFast
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.SqlSugarCore.Abstractions", "framework\Yi.Framework.SqlSugarCore.Abstractions\Yi.Framework.SqlSugarCore.Abstractions.csproj", "{FD6D6860-3753-4747-8A26-977E4A3001F9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Core", "framework\Yi.Framework.Core\Yi.Framework.Core.csproj", "{ECE874D4-F882-4EF4-84A6-A842D9B8FBC5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Mapster", "framework\Yi.Framework.Mapster\Yi.Framework.Mapster.csproj", "{1995A019-C8AE-467E-B427-ED57D6CBF44F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.AspNetCore", "framework\Yi.Framework.AspNetCore\Yi.Framework.AspNetCore.csproj", "{F5011C0D-209B-4A98-BBE3-68157503EEF8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Ddd.Application.Contracts", "framework\Yi.Framework.Ddd.Application.Contracts\Yi.Framework.Ddd.Application.Contracts.csproj", "{0A8296A3-C11F-4F13-8E49-6BC8188D4804}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Ddd.Application", "framework\Yi.Framework.Ddd.Application\Yi.Framework.Ddd.Application.csproj", "{F0141C17-0EBD-4261-98D5-1C5B7BC1DFEE}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rbac", "rbac", "{9CC7A457-1236-40BA-B47B-E7B710A3F061}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Rbac.Application.Contracts", "module\rbac\Yi.Framework.Rbac.Application.Contracts\Yi.Framework.Rbac.Application.Contracts.csproj", "{1C360956-8CD8-407E-B87F-D0BD57068EB9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Rbac.Application", "module\rbac\Yi.Framework.Rbac.Application\Yi.Framework.Rbac.Application.csproj", "{4F02B08D-5FE2-460D-BCA5-DA565151AE30}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Rbac.Domain", "module\rbac\Yi.Framework.Rbac.Domain\Yi.Framework.Rbac.Domain.csproj", "{C04D3F71-1557-46D0-B810-97B1FBB6AB73}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Rbac.Domain.Shared", "module\rbac\Yi.Framework.Rbac.Domain.Shared\Yi.Framework.Rbac.Domain.Shared.csproj", "{A2BB899D-4F9A-4184-81BD-94B938E2AB03}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Rbac.SqlSugarCore", "module\rbac\Yi.Framework.Rbac.SqlSugarCore\Yi.Framework.Rbac.SqlSugarCore.csproj", "{4503A2F9-139D-4CBC-AF11-689C34F0D77B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bbs", "bbs", "{E902A945-4F41-4E96-A0DA-9F66CDA22261}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Bbs.Domain.Shared", "module\bbs\Yi.Framework.Bbs.Domain.Shared\Yi.Framework.Bbs.Domain.Shared.csproj", "{EB9349E2-256D-41EB-A345-21635A1361B3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Bbs.Domain", "module\bbs\Yi.Framework.Bbs.Domain\Yi.Framework.Bbs.Domain.csproj", "{4EABBC84-BCED-46C1-8CF1-62A7B8081ED7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Bbs.Application.Contracts", "module\bbs\Yi.Framework.Bbs.Application.Contracts\Yi.Framework.Bbs.Application.Contracts.csproj", "{7E569FD9-B1AB-4848-8AB7-FD9EFA1DBA20}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Bbs.Application", "module\bbs\Yi.Framework.Bbs.Application\Yi.Framework.Bbs.Application.csproj", "{AD4EE9E6-F4A3-4139-AF05-71388167DE5B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Bbs.SqlSugarCore", "module\bbs\Yi.Framework.Bbs.SqlSugarCore\Yi.Framework.Bbs.SqlSugarCore.csproj", "{6C86BA71-9F87-4E2C-B467-2950D77DCDFA}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "audit-logging", "audit-logging", "{73CCF2C4-B9FD-44AB-8D4B-0A421805B094}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.AuditLogging.SqlSugarCore", "module\audit-logging\Yi.Framework.AuditLogging.SqlSugarCore\Yi.Framework.AuditLogging.SqlSugarCore.csproj", "{48806510-8E18-4E1E-9BAF-5B97E88C5FC3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.AspNetCore.Authentication.OAuth", "framework\Yi.Framework.AspNetCore.Authentication.OAuth\Yi.Framework.AspNetCore.Authentication.OAuth.csproj", "{791AC2FA-50D3-4408-8D68-31DA72F608BE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Test", "test\Yi.Abp.Test\Yi.Abp.Test.csproj", "{68627BC2-F049-4C69-AD17-81DF9478E8CE}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tenant-management", "tenant-management", "{499A8C71-7892-42D0-A77E-48756E1EFF16}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.TenantManagement.SqlSugarCore", "module\tenant-management\Yi.Framework.TenantManagement.SqlSugarCore\Yi.Framework.TenantManagement.SqlSugarCore.csproj", "{FA5BBAA1-08DC-472F-BB2C-5314E59D1556}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.TenantManagement.Domain", "module\tenant-management\Yi.Framework.TenantManagement.Domain\Yi.Framework.TenantManagement.Domain.csproj", "{54D8E2BC-591C-4344-A58E-874D49C00B41}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.AuditLogging.Domain", "module\audit-logging\Yi.Framework.AuditLogging.Domain\Yi.Framework.AuditLogging.Domain.csproj", "{EFD13211-17B5-400A-B99A-9F6F4E520C1E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.AuditLogging.Domain.Shared", "module\audit-logging\Yi.Framework.AuditLogging.Domain.Shared\Yi.Framework.AuditLogging.Domain.Shared.csproj", "{9C8C3C53-3DCE-4516-867E-228858E61B26}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.TenantManagement.Application", "module\tenant-management\Yi.Framework.TenantManagement.Application\Yi.Framework.TenantManagement.Application.csproj", "{17816837-E53B-486B-B796-53C601FE6CD9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.TenantManagement.Application.Contracts", "module\tenant-management\Yi.Framework.TenantManagement.Application.Contracts\Yi.Framework.TenantManagement.Application.Contracts.csproj", "{FA735055-CBDD-4EFD-B84B-85810DA1425E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "code-gen", "code-gen", "{4FFE7212-21F2-476D-B628-3C65E6C5075E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.CodeGen.Application", "module\code-gen\Yi.Framework.CodeGen.Application\Yi.Framework.CodeGen.Application.csproj", "{97EC40D7-DBFA-467A-98CB-221AF27B14F2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.CodeGen.Application.Contracts", "module\code-gen\Yi.Framework.CodeGen.Application.Contracts\Yi.Framework.CodeGen.Application.Contracts.csproj", "{882BC563-2F75-4B95-AC96-F4BF23F5E69D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.CodeGen.Domain", "module\code-gen\Yi.Framework.CodeGen.Domain\Yi.Framework.CodeGen.Domain.csproj", "{85CB8517-2B80-42D8-B954-081079AC9BA0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.CodeGen.Domain.Shared", "module\code-gen\Yi.Framework.CodeGen.Domain.Shared\Yi.Framework.CodeGen.Domain.Shared.csproj", "{EEFF0F05-2709-4151-A8CE-667935CEAE0B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Caching.FreeRedis", "framework\Yi.Framework.Caching.FreeRedis\Yi.Framework.Caching.FreeRedis.csproj", "{862BB0EF-3D4E-44FF-AB15-0EB74CE553D3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.CodeGen.SqlSugarCore", "module\code-gen\Yi.Framework.CodeGen.SqlSugarCore\Yi.Framework.CodeGen.SqlSugarCore.csproj", "{FB09ACC2-A27D-4D87-8D85-1435FDED4D04}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "client", "client", "{8B27846A-043D-4F2F-8140-5CEC9D1863B5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.HttpApi.Client", "client\Yi.Abp.HttpApi.Client\Yi.Abp.HttpApi.Client.csproj", "{6B554DCC-3A81-4624-9141-4E39365ADA35}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Client.Console", "client\Yi.Abp.Client.Console\Yi.Abp.Client.Console.csproj", "{2D23B44A-DFA3-4C36-8516-4F5AE442403C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Client.WebApi", "client\Yi.Abp.Client.WebApi\Yi.Abp.Client.WebApi.csproj", "{00E49781-C6A0-491C-86A1-46F685C90915}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "setting-management", "setting-management", "{8C68059E-F3B1-4D28-A1C9-A5830F53E5D3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.SettingManagement.Domain", "module\setting-management\Yi.Framework.SettingManagement.Domain\Yi.Framework.SettingManagement.Domain.csproj", "{6FEE0EB3-EAD2-47F8-B6FC-3D0FD3CCABFF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.SettingManagement.SqlSugarCore", "module\setting-management\Yi.Framework.SettingManagement.SqlSugarCore\Yi.Framework.SettingManagement.SqlSugarCore.csproj", "{495C4643-39D4-46E7-BDC8-237589627BE4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "chat-hub", "chat-hub", "{D8CDDE99-3684-4EED-A5E5-87F2AF4C78AB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.ChatHub.Application.Contracts", "module\chat-hub\Yi.Framework.ChatHub.Application.Contracts\Yi.Framework.ChatHub.Application.Contracts.csproj", "{65D4D033-5504-44B9-B152-0172ACD64CE6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.ChatHub.Domain.Shared", "module\chat-hub\Yi.Framework.ChatHub.Domain.Shared\Yi.Framework.ChatHub.Domain.Shared.csproj", "{DEEC0B15-190C-4464-B469-C45C6563C592}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.ChatHub.SqlSugarCore", "module\chat-hub\Yi.Framework.ChatHub.SqlSugarCore\Yi.Framework.ChatHub.SqlSugarCore.csproj", "{E476D266-8FB2-4D6B-AE2B-F0D279D4264E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.ChatHub.Domain", "module\chat-hub\Yi.Framework.ChatHub.Domain\Yi.Framework.ChatHub.Domain.csproj", "{C2DCA2FD-BFB4-4E76-967B-0AF8CC4F4D47}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.ChatHub.Application", "module\chat-hub\Yi.Framework.ChatHub.Application\Yi.Framework.ChatHub.Application.csproj", "{B7A1A8F3-CFA6-4ECF-A707-0F33FE0A6F1D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Rbac.Test", "test\Yi.Framework.Rbac.Test\Yi.Framework.Rbac.Test.csproj", "{9ECF0841-53BE-4FD8-95D1-A7223C7F3A07}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tool", "tool", "{084CBEEC-5D37-4716-B9C7-D80D6960DFF4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool", "tool\Yi.Abp.Tool\Yi.Abp.Tool.csproj", "{4FEBBDD9-E4F4-4BAF-8599-E2D57C08A74F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.Web", "tool\Yi.Abp.Tool.Web\Yi.Abp.Tool.Web.csproj", "{2CE51D4C-1EF9-462B-BA14-7EA01A7E4AF1}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.Application", "tool\Yi.Abp.Tool.Application\Yi.Abp.Tool.Application.csproj", "{776590BA-B900-4C8B-986A-5B721FA4B306}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.Application.Contracts", "tool\Yi.Abp.Tool.Application.Contracts\Yi.Abp.Tool.Application.Contracts.csproj", "{3A3AF1ED-FC7F-48CF-8ACE-9D50426B4675}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.Domain", "tool\Yi.Abp.Tool.Domain\Yi.Abp.Tool.Domain.csproj", "{68F73B7B-0F8A-41C1-8092-6D6FFAED32F8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.Domain.Shared", "tool\Yi.Abp.Tool.Domain.Shared\Yi.Abp.Tool.Domain.Shared.csproj", "{4AE84CDE-2A47-4D68-8E93-86193F72E4E8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.HttpApi.Client", "tool\Yi.Abp.Tool.HttpApi.Client\Yi.Abp.Tool.HttpApi.Client.csproj", "{C8F97775-D903-4365-A4FF-3DA97E318CD2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.SettingManagement.Application", "module\setting-management\Yi.Framework.SettingManagement.Application\Yi.Framework.SettingManagement.Application.csproj", "{2A31D7CB-BDCC-4253-BA73-273B6B5E1956}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "digital-collectibles", "digital-collectibles", "{B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.DigitalCollectibles.Application", "module\digital-collectibles\Yi.Framework.DigitalCollectibles.Application\Yi.Framework.DigitalCollectibles.Application.csproj", "{236B88D4-F018-4A5F-A506-7458F2308C70}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.DigitalCollectibles.Application.Contracts", "module\digital-collectibles\Yi.Framework.DigitalCollectibles.Application.Contracts\Yi.Framework.DigitalCollectibles.Application.Contracts.csproj", "{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.DigitalCollectibles.Domain", "module\digital-collectibles\Yi.Framework.DigitalCollectibles.Domain\Yi.Framework.DigitalCollectibles.Domain.csproj", "{9B5CAE1A-E062-4C9B-8121-E58FBF69309C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.DigitalCollectibles.Domain.Shared", "module\digital-collectibles\Yi.Framework.DigitalCollectibles.Domain.Shared\Yi.Framework.DigitalCollectibles.Domain.Shared.csproj", "{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.DigitalCollectibles.SqlSugarCore", "module\digital-collectibles\Yi.Framework.DigitalCollectibles.SqlSugarCore\Yi.Framework.DigitalCollectibles.SqlSugarCore.csproj", "{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.WeChat.MiniProgram", "framework\Yi.Framework.WeChat.MiniProgram\Yi.Framework.WeChat.MiniProgram.csproj", "{81CEA2ED-917B-41D8-BE0D-39A785B050C0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.BackgroundWorkers.Hangfire", "framework\Yi.Framework.BackgroundWorkers.Hangfire\Yi.Framework.BackgroundWorkers.Hangfire.csproj", "{862CA181-BEE6-4870-82D2-B662E527ED8C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ai-stock", "ai-stock", "{DB46873F-981A-43D8-91B0-D464CCB65943}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.Application", "module\ai-stock\Yi.Framework.Stock.Application\Yi.Framework.Stock.Application.csproj", "{B79CE23C-10F8-48A5-A039-5940A188CF5A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.Application.Contracts", "module\ai-stock\Yi.Framework.Stock.Application.Contracts\Yi.Framework.Stock.Application.Contracts.csproj", "{846B781A-B77E-4F86-A31F-0B5B57AB0775}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.Domain", "module\ai-stock\Yi.Framework.Stock.Domain\Yi.Framework.Stock.Domain.csproj", "{162821E4-8FE0-4A68-B3C0-49BD6596446F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.Domain.Shared", "module\ai-stock\Yi.Framework.Stock.Domain.Shared\Yi.Framework.Stock.Domain.Shared.csproj", "{10273544-715D-4BB3-893C-6F010D947BDD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.SqlSugarCore", "module\ai-stock\Yi.Framework.Stock.SqlSugarCore\Yi.Framework.Stock.SqlSugarCore.csproj", "{5F49318F-E6C7-4194-BAE0-83D4FB8D1983}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ai-hub", "ai-hub", "{7AD5DBAE-44F9-474B-8F7B-837EDE908934}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.AiHub.Application", "module\ai-hub\Yi.Framework.AiHub.Application\Yi.Framework.AiHub.Application.csproj", "{1AD10DD2-535E-4EAB-A8A4-EC3FCA206895}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.AiHub.Application.Contracts", "module\ai-hub\Yi.Framework.AiHub.Application.Contracts\Yi.Framework.AiHub.Application.Contracts.csproj", "{123D1C81-D667-4060-8E85-FFE7FB4584AD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.AiHub.Domain", "module\ai-hub\Yi.Framework.AiHub.Domain\Yi.Framework.AiHub.Domain.csproj", "{8EB4C8BB-6B21-4811-9FAB-B98FA5CA754D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.AiHub.Domain.Shared", "module\ai-hub\Yi.Framework.AiHub.Domain.Shared\Yi.Framework.AiHub.Domain.Shared.csproj", "{5FC6CA90-D5B4-433E-9B2C-94330FFB4C48}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.AiHub.SqlSugarCore", "module\ai-hub\Yi.Framework.AiHub.SqlSugarCore\Yi.Framework.AiHub.SqlSugarCore.csproj", "{8698C812-4DDC-4E80-BCD6-24C5D56AEDB1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{15913E44-DA92-44B9-9AC5-E9457EA34BF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{15913E44-DA92-44B9-9AC5-E9457EA34BF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{15913E44-DA92-44B9-9AC5-E9457EA34BF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{15913E44-DA92-44B9-9AC5-E9457EA34BF5}.Release|Any CPU.Build.0 = Release|Any CPU
{DC431ECC-C75D-4B01-8B79-4861948179BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DC431ECC-C75D-4B01-8B79-4861948179BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DC431ECC-C75D-4B01-8B79-4861948179BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DC431ECC-C75D-4B01-8B79-4861948179BB}.Release|Any CPU.Build.0 = Release|Any CPU
{9A7BBA40-28D6-4900-9E1D-D627A516EE72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9A7BBA40-28D6-4900-9E1D-D627A516EE72}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9A7BBA40-28D6-4900-9E1D-D627A516EE72}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9A7BBA40-28D6-4900-9E1D-D627A516EE72}.Release|Any CPU.Build.0 = Release|Any CPU
{746DBBD6-23E8-4D5D-9D23-E2902BE338BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{746DBBD6-23E8-4D5D-9D23-E2902BE338BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{746DBBD6-23E8-4D5D-9D23-E2902BE338BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{746DBBD6-23E8-4D5D-9D23-E2902BE338BD}.Release|Any CPU.Build.0 = Release|Any CPU
{51EEBF59-3D37-4681-981D-56F8D8F8968D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{51EEBF59-3D37-4681-981D-56F8D8F8968D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{51EEBF59-3D37-4681-981D-56F8D8F8968D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{51EEBF59-3D37-4681-981D-56F8D8F8968D}.Release|Any CPU.Build.0 = Release|Any CPU
{7B15C198-538A-44ED-A6AA-3A0FEAA1D2BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B15C198-538A-44ED-A6AA-3A0FEAA1D2BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B15C198-538A-44ED-A6AA-3A0FEAA1D2BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B15C198-538A-44ED-A6AA-3A0FEAA1D2BD}.Release|Any CPU.Build.0 = Release|Any CPU
{F4D5A496-BFBE-470B-A05B-CB5823B47E72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F4D5A496-BFBE-470B-A05B-CB5823B47E72}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F4D5A496-BFBE-470B-A05B-CB5823B47E72}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F4D5A496-BFBE-470B-A05B-CB5823B47E72}.Release|Any CPU.Build.0 = Release|Any CPU
{FD6D6860-3753-4747-8A26-977E4A3001F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD6D6860-3753-4747-8A26-977E4A3001F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD6D6860-3753-4747-8A26-977E4A3001F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD6D6860-3753-4747-8A26-977E4A3001F9}.Release|Any CPU.Build.0 = Release|Any CPU
{ECE874D4-F882-4EF4-84A6-A842D9B8FBC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ECE874D4-F882-4EF4-84A6-A842D9B8FBC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ECE874D4-F882-4EF4-84A6-A842D9B8FBC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ECE874D4-F882-4EF4-84A6-A842D9B8FBC5}.Release|Any CPU.Build.0 = Release|Any CPU
{1995A019-C8AE-467E-B427-ED57D6CBF44F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1995A019-C8AE-467E-B427-ED57D6CBF44F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1995A019-C8AE-467E-B427-ED57D6CBF44F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1995A019-C8AE-467E-B427-ED57D6CBF44F}.Release|Any CPU.Build.0 = Release|Any CPU
{F5011C0D-209B-4A98-BBE3-68157503EEF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F5011C0D-209B-4A98-BBE3-68157503EEF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F5011C0D-209B-4A98-BBE3-68157503EEF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F5011C0D-209B-4A98-BBE3-68157503EEF8}.Release|Any CPU.Build.0 = Release|Any CPU
{0A8296A3-C11F-4F13-8E49-6BC8188D4804}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0A8296A3-C11F-4F13-8E49-6BC8188D4804}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0A8296A3-C11F-4F13-8E49-6BC8188D4804}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A8296A3-C11F-4F13-8E49-6BC8188D4804}.Release|Any CPU.Build.0 = Release|Any CPU
{F0141C17-0EBD-4261-98D5-1C5B7BC1DFEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F0141C17-0EBD-4261-98D5-1C5B7BC1DFEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F0141C17-0EBD-4261-98D5-1C5B7BC1DFEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F0141C17-0EBD-4261-98D5-1C5B7BC1DFEE}.Release|Any CPU.Build.0 = Release|Any CPU
{1C360956-8CD8-407E-B87F-D0BD57068EB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1C360956-8CD8-407E-B87F-D0BD57068EB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1C360956-8CD8-407E-B87F-D0BD57068EB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1C360956-8CD8-407E-B87F-D0BD57068EB9}.Release|Any CPU.Build.0 = Release|Any CPU
{4F02B08D-5FE2-460D-BCA5-DA565151AE30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4F02B08D-5FE2-460D-BCA5-DA565151AE30}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4F02B08D-5FE2-460D-BCA5-DA565151AE30}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4F02B08D-5FE2-460D-BCA5-DA565151AE30}.Release|Any CPU.Build.0 = Release|Any CPU
{C04D3F71-1557-46D0-B810-97B1FBB6AB73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C04D3F71-1557-46D0-B810-97B1FBB6AB73}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C04D3F71-1557-46D0-B810-97B1FBB6AB73}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C04D3F71-1557-46D0-B810-97B1FBB6AB73}.Release|Any CPU.Build.0 = Release|Any CPU
{A2BB899D-4F9A-4184-81BD-94B938E2AB03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A2BB899D-4F9A-4184-81BD-94B938E2AB03}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A2BB899D-4F9A-4184-81BD-94B938E2AB03}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A2BB899D-4F9A-4184-81BD-94B938E2AB03}.Release|Any CPU.Build.0 = Release|Any CPU
{4503A2F9-139D-4CBC-AF11-689C34F0D77B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4503A2F9-139D-4CBC-AF11-689C34F0D77B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4503A2F9-139D-4CBC-AF11-689C34F0D77B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4503A2F9-139D-4CBC-AF11-689C34F0D77B}.Release|Any CPU.Build.0 = Release|Any CPU
{EB9349E2-256D-41EB-A345-21635A1361B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EB9349E2-256D-41EB-A345-21635A1361B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EB9349E2-256D-41EB-A345-21635A1361B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EB9349E2-256D-41EB-A345-21635A1361B3}.Release|Any CPU.Build.0 = Release|Any CPU
{4EABBC84-BCED-46C1-8CF1-62A7B8081ED7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4EABBC84-BCED-46C1-8CF1-62A7B8081ED7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4EABBC84-BCED-46C1-8CF1-62A7B8081ED7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4EABBC84-BCED-46C1-8CF1-62A7B8081ED7}.Release|Any CPU.Build.0 = Release|Any CPU
{7E569FD9-B1AB-4848-8AB7-FD9EFA1DBA20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7E569FD9-B1AB-4848-8AB7-FD9EFA1DBA20}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7E569FD9-B1AB-4848-8AB7-FD9EFA1DBA20}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7E569FD9-B1AB-4848-8AB7-FD9EFA1DBA20}.Release|Any CPU.Build.0 = Release|Any CPU
{AD4EE9E6-F4A3-4139-AF05-71388167DE5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AD4EE9E6-F4A3-4139-AF05-71388167DE5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AD4EE9E6-F4A3-4139-AF05-71388167DE5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AD4EE9E6-F4A3-4139-AF05-71388167DE5B}.Release|Any CPU.Build.0 = Release|Any CPU
{6C86BA71-9F87-4E2C-B467-2950D77DCDFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6C86BA71-9F87-4E2C-B467-2950D77DCDFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C86BA71-9F87-4E2C-B467-2950D77DCDFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6C86BA71-9F87-4E2C-B467-2950D77DCDFA}.Release|Any CPU.Build.0 = Release|Any CPU
{48806510-8E18-4E1E-9BAF-5B97E88C5FC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{48806510-8E18-4E1E-9BAF-5B97E88C5FC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48806510-8E18-4E1E-9BAF-5B97E88C5FC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{48806510-8E18-4E1E-9BAF-5B97E88C5FC3}.Release|Any CPU.Build.0 = Release|Any CPU
{791AC2FA-50D3-4408-8D68-31DA72F608BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{791AC2FA-50D3-4408-8D68-31DA72F608BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{791AC2FA-50D3-4408-8D68-31DA72F608BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{791AC2FA-50D3-4408-8D68-31DA72F608BE}.Release|Any CPU.Build.0 = Release|Any CPU
{68627BC2-F049-4C69-AD17-81DF9478E8CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68627BC2-F049-4C69-AD17-81DF9478E8CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{68627BC2-F049-4C69-AD17-81DF9478E8CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{68627BC2-F049-4C69-AD17-81DF9478E8CE}.Release|Any CPU.Build.0 = Release|Any CPU
{FA5BBAA1-08DC-472F-BB2C-5314E59D1556}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FA5BBAA1-08DC-472F-BB2C-5314E59D1556}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FA5BBAA1-08DC-472F-BB2C-5314E59D1556}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FA5BBAA1-08DC-472F-BB2C-5314E59D1556}.Release|Any CPU.Build.0 = Release|Any CPU
{54D8E2BC-591C-4344-A58E-874D49C00B41}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{54D8E2BC-591C-4344-A58E-874D49C00B41}.Debug|Any CPU.Build.0 = Debug|Any CPU
{54D8E2BC-591C-4344-A58E-874D49C00B41}.Release|Any CPU.ActiveCfg = Release|Any CPU
{54D8E2BC-591C-4344-A58E-874D49C00B41}.Release|Any CPU.Build.0 = Release|Any CPU
{EFD13211-17B5-400A-B99A-9F6F4E520C1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EFD13211-17B5-400A-B99A-9F6F4E520C1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EFD13211-17B5-400A-B99A-9F6F4E520C1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EFD13211-17B5-400A-B99A-9F6F4E520C1E}.Release|Any CPU.Build.0 = Release|Any CPU
{9C8C3C53-3DCE-4516-867E-228858E61B26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9C8C3C53-3DCE-4516-867E-228858E61B26}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9C8C3C53-3DCE-4516-867E-228858E61B26}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9C8C3C53-3DCE-4516-867E-228858E61B26}.Release|Any CPU.Build.0 = Release|Any CPU
{17816837-E53B-486B-B796-53C601FE6CD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{17816837-E53B-486B-B796-53C601FE6CD9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{17816837-E53B-486B-B796-53C601FE6CD9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{17816837-E53B-486B-B796-53C601FE6CD9}.Release|Any CPU.Build.0 = Release|Any CPU
{FA735055-CBDD-4EFD-B84B-85810DA1425E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FA735055-CBDD-4EFD-B84B-85810DA1425E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FA735055-CBDD-4EFD-B84B-85810DA1425E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FA735055-CBDD-4EFD-B84B-85810DA1425E}.Release|Any CPU.Build.0 = Release|Any CPU
{97EC40D7-DBFA-467A-98CB-221AF27B14F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{97EC40D7-DBFA-467A-98CB-221AF27B14F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{97EC40D7-DBFA-467A-98CB-221AF27B14F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{97EC40D7-DBFA-467A-98CB-221AF27B14F2}.Release|Any CPU.Build.0 = Release|Any CPU
{882BC563-2F75-4B95-AC96-F4BF23F5E69D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{882BC563-2F75-4B95-AC96-F4BF23F5E69D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{882BC563-2F75-4B95-AC96-F4BF23F5E69D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{882BC563-2F75-4B95-AC96-F4BF23F5E69D}.Release|Any CPU.Build.0 = Release|Any CPU
{85CB8517-2B80-42D8-B954-081079AC9BA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{85CB8517-2B80-42D8-B954-081079AC9BA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{85CB8517-2B80-42D8-B954-081079AC9BA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{85CB8517-2B80-42D8-B954-081079AC9BA0}.Release|Any CPU.Build.0 = Release|Any CPU
{EEFF0F05-2709-4151-A8CE-667935CEAE0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EEFF0F05-2709-4151-A8CE-667935CEAE0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EEFF0F05-2709-4151-A8CE-667935CEAE0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EEFF0F05-2709-4151-A8CE-667935CEAE0B}.Release|Any CPU.Build.0 = Release|Any CPU
{862BB0EF-3D4E-44FF-AB15-0EB74CE553D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{862BB0EF-3D4E-44FF-AB15-0EB74CE553D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{862BB0EF-3D4E-44FF-AB15-0EB74CE553D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{862BB0EF-3D4E-44FF-AB15-0EB74CE553D3}.Release|Any CPU.Build.0 = Release|Any CPU
{FB09ACC2-A27D-4D87-8D85-1435FDED4D04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FB09ACC2-A27D-4D87-8D85-1435FDED4D04}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FB09ACC2-A27D-4D87-8D85-1435FDED4D04}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FB09ACC2-A27D-4D87-8D85-1435FDED4D04}.Release|Any CPU.Build.0 = Release|Any CPU
{6B554DCC-3A81-4624-9141-4E39365ADA35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6B554DCC-3A81-4624-9141-4E39365ADA35}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6B554DCC-3A81-4624-9141-4E39365ADA35}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6B554DCC-3A81-4624-9141-4E39365ADA35}.Release|Any CPU.Build.0 = Release|Any CPU
{2D23B44A-DFA3-4C36-8516-4F5AE442403C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2D23B44A-DFA3-4C36-8516-4F5AE442403C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2D23B44A-DFA3-4C36-8516-4F5AE442403C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2D23B44A-DFA3-4C36-8516-4F5AE442403C}.Release|Any CPU.Build.0 = Release|Any CPU
{00E49781-C6A0-491C-86A1-46F685C90915}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{00E49781-C6A0-491C-86A1-46F685C90915}.Debug|Any CPU.Build.0 = Debug|Any CPU
{00E49781-C6A0-491C-86A1-46F685C90915}.Release|Any CPU.ActiveCfg = Release|Any CPU
{00E49781-C6A0-491C-86A1-46F685C90915}.Release|Any CPU.Build.0 = Release|Any CPU
{6FEE0EB3-EAD2-47F8-B6FC-3D0FD3CCABFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6FEE0EB3-EAD2-47F8-B6FC-3D0FD3CCABFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6FEE0EB3-EAD2-47F8-B6FC-3D0FD3CCABFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6FEE0EB3-EAD2-47F8-B6FC-3D0FD3CCABFF}.Release|Any CPU.Build.0 = Release|Any CPU
{495C4643-39D4-46E7-BDC8-237589627BE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{495C4643-39D4-46E7-BDC8-237589627BE4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{495C4643-39D4-46E7-BDC8-237589627BE4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{495C4643-39D4-46E7-BDC8-237589627BE4}.Release|Any CPU.Build.0 = Release|Any CPU
{65D4D033-5504-44B9-B152-0172ACD64CE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{65D4D033-5504-44B9-B152-0172ACD64CE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{65D4D033-5504-44B9-B152-0172ACD64CE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{65D4D033-5504-44B9-B152-0172ACD64CE6}.Release|Any CPU.Build.0 = Release|Any CPU
{DEEC0B15-190C-4464-B469-C45C6563C592}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DEEC0B15-190C-4464-B469-C45C6563C592}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DEEC0B15-190C-4464-B469-C45C6563C592}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DEEC0B15-190C-4464-B469-C45C6563C592}.Release|Any CPU.Build.0 = Release|Any CPU
{E476D266-8FB2-4D6B-AE2B-F0D279D4264E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E476D266-8FB2-4D6B-AE2B-F0D279D4264E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E476D266-8FB2-4D6B-AE2B-F0D279D4264E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E476D266-8FB2-4D6B-AE2B-F0D279D4264E}.Release|Any CPU.Build.0 = Release|Any CPU
{C2DCA2FD-BFB4-4E76-967B-0AF8CC4F4D47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C2DCA2FD-BFB4-4E76-967B-0AF8CC4F4D47}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C2DCA2FD-BFB4-4E76-967B-0AF8CC4F4D47}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C2DCA2FD-BFB4-4E76-967B-0AF8CC4F4D47}.Release|Any CPU.Build.0 = Release|Any CPU
{B7A1A8F3-CFA6-4ECF-A707-0F33FE0A6F1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B7A1A8F3-CFA6-4ECF-A707-0F33FE0A6F1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B7A1A8F3-CFA6-4ECF-A707-0F33FE0A6F1D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B7A1A8F3-CFA6-4ECF-A707-0F33FE0A6F1D}.Release|Any CPU.Build.0 = Release|Any CPU
{9ECF0841-53BE-4FD8-95D1-A7223C7F3A07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9ECF0841-53BE-4FD8-95D1-A7223C7F3A07}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9ECF0841-53BE-4FD8-95D1-A7223C7F3A07}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9ECF0841-53BE-4FD8-95D1-A7223C7F3A07}.Release|Any CPU.Build.0 = Release|Any CPU
{4FEBBDD9-E4F4-4BAF-8599-E2D57C08A74F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4FEBBDD9-E4F4-4BAF-8599-E2D57C08A74F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4FEBBDD9-E4F4-4BAF-8599-E2D57C08A74F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4FEBBDD9-E4F4-4BAF-8599-E2D57C08A74F}.Release|Any CPU.Build.0 = Release|Any CPU
{2CE51D4C-1EF9-462B-BA14-7EA01A7E4AF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2CE51D4C-1EF9-462B-BA14-7EA01A7E4AF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2CE51D4C-1EF9-462B-BA14-7EA01A7E4AF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2CE51D4C-1EF9-462B-BA14-7EA01A7E4AF1}.Release|Any CPU.Build.0 = Release|Any CPU
{776590BA-B900-4C8B-986A-5B721FA4B306}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{776590BA-B900-4C8B-986A-5B721FA4B306}.Debug|Any CPU.Build.0 = Debug|Any CPU
{776590BA-B900-4C8B-986A-5B721FA4B306}.Release|Any CPU.ActiveCfg = Release|Any CPU
{776590BA-B900-4C8B-986A-5B721FA4B306}.Release|Any CPU.Build.0 = Release|Any CPU
{3A3AF1ED-FC7F-48CF-8ACE-9D50426B4675}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3A3AF1ED-FC7F-48CF-8ACE-9D50426B4675}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3A3AF1ED-FC7F-48CF-8ACE-9D50426B4675}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3A3AF1ED-FC7F-48CF-8ACE-9D50426B4675}.Release|Any CPU.Build.0 = Release|Any CPU
{68F73B7B-0F8A-41C1-8092-6D6FFAED32F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68F73B7B-0F8A-41C1-8092-6D6FFAED32F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{68F73B7B-0F8A-41C1-8092-6D6FFAED32F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{68F73B7B-0F8A-41C1-8092-6D6FFAED32F8}.Release|Any CPU.Build.0 = Release|Any CPU
{4AE84CDE-2A47-4D68-8E93-86193F72E4E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4AE84CDE-2A47-4D68-8E93-86193F72E4E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4AE84CDE-2A47-4D68-8E93-86193F72E4E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4AE84CDE-2A47-4D68-8E93-86193F72E4E8}.Release|Any CPU.Build.0 = Release|Any CPU
{C8F97775-D903-4365-A4FF-3DA97E318CD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C8F97775-D903-4365-A4FF-3DA97E318CD2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C8F97775-D903-4365-A4FF-3DA97E318CD2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C8F97775-D903-4365-A4FF-3DA97E318CD2}.Release|Any CPU.Build.0 = Release|Any CPU
{2A31D7CB-BDCC-4253-BA73-273B6B5E1956}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2A31D7CB-BDCC-4253-BA73-273B6B5E1956}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2A31D7CB-BDCC-4253-BA73-273B6B5E1956}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2A31D7CB-BDCC-4253-BA73-273B6B5E1956}.Release|Any CPU.Build.0 = Release|Any CPU
{236B88D4-F018-4A5F-A506-7458F2308C70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{236B88D4-F018-4A5F-A506-7458F2308C70}.Debug|Any CPU.Build.0 = Debug|Any CPU
{236B88D4-F018-4A5F-A506-7458F2308C70}.Release|Any CPU.ActiveCfg = Release|Any CPU
{236B88D4-F018-4A5F-A506-7458F2308C70}.Release|Any CPU.Build.0 = Release|Any CPU
{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B}.Release|Any CPU.Build.0 = Release|Any CPU
{9B5CAE1A-E062-4C9B-8121-E58FBF69309C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9B5CAE1A-E062-4C9B-8121-E58FBF69309C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9B5CAE1A-E062-4C9B-8121-E58FBF69309C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9B5CAE1A-E062-4C9B-8121-E58FBF69309C}.Release|Any CPU.Build.0 = Release|Any CPU
{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061}.Release|Any CPU.Build.0 = Release|Any CPU
{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F}.Release|Any CPU.Build.0 = Release|Any CPU
{81CEA2ED-917B-41D8-BE0D-39A785B050C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{81CEA2ED-917B-41D8-BE0D-39A785B050C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{81CEA2ED-917B-41D8-BE0D-39A785B050C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{81CEA2ED-917B-41D8-BE0D-39A785B050C0}.Release|Any CPU.Build.0 = Release|Any CPU
{862CA181-BEE6-4870-82D2-B662E527ED8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{862CA181-BEE6-4870-82D2-B662E527ED8C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{862CA181-BEE6-4870-82D2-B662E527ED8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{862CA181-BEE6-4870-82D2-B662E527ED8C}.Release|Any CPU.Build.0 = Release|Any CPU
{B79CE23C-10F8-48A5-A039-5940A188CF5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B79CE23C-10F8-48A5-A039-5940A188CF5A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B79CE23C-10F8-48A5-A039-5940A188CF5A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B79CE23C-10F8-48A5-A039-5940A188CF5A}.Release|Any CPU.Build.0 = Release|Any CPU
{846B781A-B77E-4F86-A31F-0B5B57AB0775}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{846B781A-B77E-4F86-A31F-0B5B57AB0775}.Debug|Any CPU.Build.0 = Debug|Any CPU
{846B781A-B77E-4F86-A31F-0B5B57AB0775}.Release|Any CPU.ActiveCfg = Release|Any CPU
{846B781A-B77E-4F86-A31F-0B5B57AB0775}.Release|Any CPU.Build.0 = Release|Any CPU
{162821E4-8FE0-4A68-B3C0-49BD6596446F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{162821E4-8FE0-4A68-B3C0-49BD6596446F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{162821E4-8FE0-4A68-B3C0-49BD6596446F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{162821E4-8FE0-4A68-B3C0-49BD6596446F}.Release|Any CPU.Build.0 = Release|Any CPU
{10273544-715D-4BB3-893C-6F010D947BDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{10273544-715D-4BB3-893C-6F010D947BDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{10273544-715D-4BB3-893C-6F010D947BDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{10273544-715D-4BB3-893C-6F010D947BDD}.Release|Any CPU.Build.0 = Release|Any CPU
{5F49318F-E6C7-4194-BAE0-83D4FB8D1983}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5F49318F-E6C7-4194-BAE0-83D4FB8D1983}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5F49318F-E6C7-4194-BAE0-83D4FB8D1983}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5F49318F-E6C7-4194-BAE0-83D4FB8D1983}.Release|Any CPU.Build.0 = Release|Any CPU
{1AD10DD2-535E-4EAB-A8A4-EC3FCA206895}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1AD10DD2-535E-4EAB-A8A4-EC3FCA206895}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1AD10DD2-535E-4EAB-A8A4-EC3FCA206895}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1AD10DD2-535E-4EAB-A8A4-EC3FCA206895}.Release|Any CPU.Build.0 = Release|Any CPU
{123D1C81-D667-4060-8E85-FFE7FB4584AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{123D1C81-D667-4060-8E85-FFE7FB4584AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{123D1C81-D667-4060-8E85-FFE7FB4584AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{123D1C81-D667-4060-8E85-FFE7FB4584AD}.Release|Any CPU.Build.0 = Release|Any CPU
{8EB4C8BB-6B21-4811-9FAB-B98FA5CA754D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8EB4C8BB-6B21-4811-9FAB-B98FA5CA754D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8EB4C8BB-6B21-4811-9FAB-B98FA5CA754D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8EB4C8BB-6B21-4811-9FAB-B98FA5CA754D}.Release|Any CPU.Build.0 = Release|Any CPU
{5FC6CA90-D5B4-433E-9B2C-94330FFB4C48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5FC6CA90-D5B4-433E-9B2C-94330FFB4C48}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5FC6CA90-D5B4-433E-9B2C-94330FFB4C48}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5FC6CA90-D5B4-433E-9B2C-94330FFB4C48}.Release|Any CPU.Build.0 = Release|Any CPU
{8698C812-4DDC-4E80-BCD6-24C5D56AEDB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8698C812-4DDC-4E80-BCD6-24C5D56AEDB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8698C812-4DDC-4E80-BCD6-24C5D56AEDB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8698C812-4DDC-4E80-BCD6-24C5D56AEDB1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{15913E44-DA92-44B9-9AC5-E9457EA34BF5} = {B782C78B-6C17-49E6-A237-3383BA720766}
{DC431ECC-C75D-4B01-8B79-4861948179BB} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{9A7BBA40-28D6-4900-9E1D-D627A516EE72} = {B782C78B-6C17-49E6-A237-3383BA720766}
{746DBBD6-23E8-4D5D-9D23-E2902BE338BD} = {B782C78B-6C17-49E6-A237-3383BA720766}
{51EEBF59-3D37-4681-981D-56F8D8F8968D} = {B782C78B-6C17-49E6-A237-3383BA720766}
{7B15C198-538A-44ED-A6AA-3A0FEAA1D2BD} = {B782C78B-6C17-49E6-A237-3383BA720766}
{F4D5A496-BFBE-470B-A05B-CB5823B47E72} = {B782C78B-6C17-49E6-A237-3383BA720766}
{FD6D6860-3753-4747-8A26-977E4A3001F9} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{ECE874D4-F882-4EF4-84A6-A842D9B8FBC5} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{1995A019-C8AE-467E-B427-ED57D6CBF44F} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{F5011C0D-209B-4A98-BBE3-68157503EEF8} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{0A8296A3-C11F-4F13-8E49-6BC8188D4804} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{F0141C17-0EBD-4261-98D5-1C5B7BC1DFEE} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{9CC7A457-1236-40BA-B47B-E7B710A3F061} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{1C360956-8CD8-407E-B87F-D0BD57068EB9} = {9CC7A457-1236-40BA-B47B-E7B710A3F061}
{4F02B08D-5FE2-460D-BCA5-DA565151AE30} = {9CC7A457-1236-40BA-B47B-E7B710A3F061}
{C04D3F71-1557-46D0-B810-97B1FBB6AB73} = {9CC7A457-1236-40BA-B47B-E7B710A3F061}
{A2BB899D-4F9A-4184-81BD-94B938E2AB03} = {9CC7A457-1236-40BA-B47B-E7B710A3F061}
{4503A2F9-139D-4CBC-AF11-689C34F0D77B} = {9CC7A457-1236-40BA-B47B-E7B710A3F061}
{E902A945-4F41-4E96-A0DA-9F66CDA22261} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{EB9349E2-256D-41EB-A345-21635A1361B3} = {E902A945-4F41-4E96-A0DA-9F66CDA22261}
{4EABBC84-BCED-46C1-8CF1-62A7B8081ED7} = {E902A945-4F41-4E96-A0DA-9F66CDA22261}
{7E569FD9-B1AB-4848-8AB7-FD9EFA1DBA20} = {E902A945-4F41-4E96-A0DA-9F66CDA22261}
{AD4EE9E6-F4A3-4139-AF05-71388167DE5B} = {E902A945-4F41-4E96-A0DA-9F66CDA22261}
{6C86BA71-9F87-4E2C-B467-2950D77DCDFA} = {E902A945-4F41-4E96-A0DA-9F66CDA22261}
{73CCF2C4-B9FD-44AB-8D4B-0A421805B094} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{48806510-8E18-4E1E-9BAF-5B97E88C5FC3} = {73CCF2C4-B9FD-44AB-8D4B-0A421805B094}
{791AC2FA-50D3-4408-8D68-31DA72F608BE} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{68627BC2-F049-4C69-AD17-81DF9478E8CE} = {0D10EEF2-FBAE-4C72-B816-A52823FC299B}
{499A8C71-7892-42D0-A77E-48756E1EFF16} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{FA5BBAA1-08DC-472F-BB2C-5314E59D1556} = {499A8C71-7892-42D0-A77E-48756E1EFF16}
{54D8E2BC-591C-4344-A58E-874D49C00B41} = {499A8C71-7892-42D0-A77E-48756E1EFF16}
{EFD13211-17B5-400A-B99A-9F6F4E520C1E} = {73CCF2C4-B9FD-44AB-8D4B-0A421805B094}
{9C8C3C53-3DCE-4516-867E-228858E61B26} = {73CCF2C4-B9FD-44AB-8D4B-0A421805B094}
{17816837-E53B-486B-B796-53C601FE6CD9} = {499A8C71-7892-42D0-A77E-48756E1EFF16}
{FA735055-CBDD-4EFD-B84B-85810DA1425E} = {499A8C71-7892-42D0-A77E-48756E1EFF16}
{4FFE7212-21F2-476D-B628-3C65E6C5075E} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{97EC40D7-DBFA-467A-98CB-221AF27B14F2} = {4FFE7212-21F2-476D-B628-3C65E6C5075E}
{882BC563-2F75-4B95-AC96-F4BF23F5E69D} = {4FFE7212-21F2-476D-B628-3C65E6C5075E}
{85CB8517-2B80-42D8-B954-081079AC9BA0} = {4FFE7212-21F2-476D-B628-3C65E6C5075E}
{EEFF0F05-2709-4151-A8CE-667935CEAE0B} = {4FFE7212-21F2-476D-B628-3C65E6C5075E}
{862BB0EF-3D4E-44FF-AB15-0EB74CE553D3} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{FB09ACC2-A27D-4D87-8D85-1435FDED4D04} = {4FFE7212-21F2-476D-B628-3C65E6C5075E}
{6B554DCC-3A81-4624-9141-4E39365ADA35} = {8B27846A-043D-4F2F-8140-5CEC9D1863B5}
{2D23B44A-DFA3-4C36-8516-4F5AE442403C} = {8B27846A-043D-4F2F-8140-5CEC9D1863B5}
{00E49781-C6A0-491C-86A1-46F685C90915} = {8B27846A-043D-4F2F-8140-5CEC9D1863B5}
{8C68059E-F3B1-4D28-A1C9-A5830F53E5D3} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{6FEE0EB3-EAD2-47F8-B6FC-3D0FD3CCABFF} = {8C68059E-F3B1-4D28-A1C9-A5830F53E5D3}
{495C4643-39D4-46E7-BDC8-237589627BE4} = {8C68059E-F3B1-4D28-A1C9-A5830F53E5D3}
{D8CDDE99-3684-4EED-A5E5-87F2AF4C78AB} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{65D4D033-5504-44B9-B152-0172ACD64CE6} = {D8CDDE99-3684-4EED-A5E5-87F2AF4C78AB}
{DEEC0B15-190C-4464-B469-C45C6563C592} = {D8CDDE99-3684-4EED-A5E5-87F2AF4C78AB}
{E476D266-8FB2-4D6B-AE2B-F0D279D4264E} = {D8CDDE99-3684-4EED-A5E5-87F2AF4C78AB}
{C2DCA2FD-BFB4-4E76-967B-0AF8CC4F4D47} = {D8CDDE99-3684-4EED-A5E5-87F2AF4C78AB}
{B7A1A8F3-CFA6-4ECF-A707-0F33FE0A6F1D} = {D8CDDE99-3684-4EED-A5E5-87F2AF4C78AB}
{9ECF0841-53BE-4FD8-95D1-A7223C7F3A07} = {0D10EEF2-FBAE-4C72-B816-A52823FC299B}
{4FEBBDD9-E4F4-4BAF-8599-E2D57C08A74F} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4}
{2CE51D4C-1EF9-462B-BA14-7EA01A7E4AF1} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4}
{776590BA-B900-4C8B-986A-5B721FA4B306} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4}
{3A3AF1ED-FC7F-48CF-8ACE-9D50426B4675} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4}
{68F73B7B-0F8A-41C1-8092-6D6FFAED32F8} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4}
{4AE84CDE-2A47-4D68-8E93-86193F72E4E8} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4}
{C8F97775-D903-4365-A4FF-3DA97E318CD2} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4}
{2A31D7CB-BDCC-4253-BA73-273B6B5E1956} = {8C68059E-F3B1-4D28-A1C9-A5830F53E5D3}
{B8F76A6B-2EEB-4E64-9F26-D84584E16B9C} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{236B88D4-F018-4A5F-A506-7458F2308C70} = {B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}
{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B} = {B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}
{9B5CAE1A-E062-4C9B-8121-E58FBF69309C} = {B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}
{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061} = {B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}
{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F} = {B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}
{81CEA2ED-917B-41D8-BE0D-39A785B050C0} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{862CA181-BEE6-4870-82D2-B662E527ED8C} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{DB46873F-981A-43D8-91B0-D464CCB65943} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{B79CE23C-10F8-48A5-A039-5940A188CF5A} = {DB46873F-981A-43D8-91B0-D464CCB65943}
{846B781A-B77E-4F86-A31F-0B5B57AB0775} = {DB46873F-981A-43D8-91B0-D464CCB65943}
{162821E4-8FE0-4A68-B3C0-49BD6596446F} = {DB46873F-981A-43D8-91B0-D464CCB65943}
{10273544-715D-4BB3-893C-6F010D947BDD} = {DB46873F-981A-43D8-91B0-D464CCB65943}
{5F49318F-E6C7-4194-BAE0-83D4FB8D1983} = {DB46873F-981A-43D8-91B0-D464CCB65943}
{7AD5DBAE-44F9-474B-8F7B-837EDE908934} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{1AD10DD2-535E-4EAB-A8A4-EC3FCA206895} = {7AD5DBAE-44F9-474B-8F7B-837EDE908934}
{123D1C81-D667-4060-8E85-FFE7FB4584AD} = {7AD5DBAE-44F9-474B-8F7B-837EDE908934}
{8EB4C8BB-6B21-4811-9FAB-B98FA5CA754D} = {7AD5DBAE-44F9-474B-8F7B-837EDE908934}
{5FC6CA90-D5B4-433E-9B2C-94330FFB4C48} = {7AD5DBAE-44F9-474B-8F7B-837EDE908934}
{8698C812-4DDC-4E80-BCD6-24C5D56AEDB1} = {7AD5DBAE-44F9-474B-8F7B-837EDE908934}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {23D6FBC9-C970-4641-BC1E-2AEA59F51C18}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,33 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Yi.Abp.Client.Console;
using Yi.Framework.Rbac.Application.Contracts.IServices;
try
{
IHost host = Host.CreateDefaultBuilder()
.ConfigureServices(async (host, service) =>
{
await service.AddApplicationAsync<YiAbpClientConsoleModule>();
})
.UseAutofac()
.Build();
//控制台直接调用
var account = host.Services.GetRequiredService<IAccountService>();
//获取验证码
var data1 = await account.GetCaptchaImageAsync();
//登录
var data2 = await account.PostLoginAsync(new Yi.Framework.Rbac.Application.Contracts.Dtos.Account.LoginInputVo { UserName = "cc", Password = "123456", Code = string.Empty, Uuid = string.Empty });
host.Run();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}

View File

@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Volo.Abp.Autofac" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Yi.Abp.HttpApi.Client\Yi.Abp.HttpApi.Client.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Modularity;
using Yi.Abp.HttpApi.Client;
namespace Yi.Abp.Client.Console
{
[DependsOn(typeof(YiAbpHttpApiClientModule))]
public class YiAbpClientConsoleModule:AbpModule
{
}
}

View File

@@ -0,0 +1,37 @@
using Microsoft.AspNetCore.Mvc;
using Yi.Framework.Rbac.Application.Contracts.Dtos.Account;
using Yi.Framework.Rbac.Application.Contracts.IServices;
namespace Yi.Abp.Client.WebApi.Controllers
{
[ApiController]
[Route("[controller]")]
public class AccountController : ControllerBase
{
private readonly ILogger<AccountController> _logger;
private IAccountService _accountService;
public AccountController(ILogger<AccountController> logger, IAccountService accountService)
{
_logger = logger;
_accountService = accountService;
}
[HttpPost("my-login")]
public async Task<IActionResult> Login(LoginInputVo input)
{
await _accountService.PostLoginAsync(input);
return Ok();
}
[HttpGet("my-captcha-image")]
public async Task<IActionResult> CaptchaImageAsync()
{
var output = await _accountService.GetCaptchaImageAsync();
return Ok(output);
}
}
}

View File

@@ -0,0 +1,28 @@
using Autofac.Core;
using Yi.Abp.Client.WebApi;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Host.UseAutofac();
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
await builder.Services.AddApplicationAsync<YiAbpClientWebApiModule>();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

View File

@@ -0,0 +1,41 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:35597",
"sslPort": 44322
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5002",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7108;http://localhost:5002",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Yi.Abp.HttpApi.Client\Yi.Abp.HttpApi.Client.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,6 @@
@Yi.Abp.Client.WebApi_HostAddress = http://localhost:5002
GET {{Yi.Abp.Client.WebApi_HostAddress}}/weatherforecast/
Accept: application/json
###

View File

@@ -0,0 +1,10 @@
using Volo.Abp.Modularity;
using Yi.Abp.HttpApi.Client;
namespace Yi.Abp.Client.WebApi
{
[DependsOn(typeof(YiAbpHttpApiClientModule))]
public class YiAbpClientWebApiModule:AbpModule
{
}
}

View File

@@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Volo.Abp.Http.Client" Version="$(AbpVersion)" />
<PackageReference Include="Volo.Abp.Autofac" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Yi.Abp.Application.Contracts\Yi.Abp.Application.Contracts.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,32 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Autofac;
using Volo.Abp.Http.Client;
using Volo.Abp.Modularity;
using Yi.Framework.Rbac.Application.Contracts;
namespace Yi.Abp.HttpApi.Client
{
[DependsOn(typeof(AbpHttpClientModule),
typeof(AbpAutofacModule),
typeof(YiFrameworkRbacApplicationContractsModule))]
public class YiAbpHttpApiClientModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
//创建动态客户端代理
context.Services.AddHttpClientProxies(
typeof(YiFrameworkRbacApplicationContractsModule).Assembly
);
Configure<AbpRemoteServiceOptions>(options =>
{
options.RemoteServices.Default =
new RemoteServiceConfiguration("http://localhost:19001");
});
}
}
}

40
Yi.Abp.Net8/common.props Normal file
View File

@@ -0,0 +1,40 @@
<Project>
<Import Project="usings.props" />
<Import Project="version.props" />
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<PropertyGroup>
<SatelliteResourceLanguages>en;zh-CN</SatelliteResourceLanguages>
<LangVersion>latest</LangVersion>
<Version>1.0.0</Version>
<NoWarn>$(NoWarn);CS1591;CS8618;CS1998;CS8604;CS8620;CS8600;CS8602</NoWarn>
<AbpProjectType>app</AbpProjectType>
<PublishDocumentationFiles>true</PublishDocumentationFiles>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
<Target Name="NoWarnOnRazorViewImportedTypeConflicts" BeforeTargets="RazorCoreCompile">
<PropertyGroup>
<NoWarn>$(NoWarn);0436</NoWarn>
</PropertyGroup>
</Target>
<ItemGroup>
<Content Remove="$(UserProfile)\.nuget\packages\*\*\contentFiles\any\*\*.abppkg*.json" />
</ItemGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>

3
Yi.Abp.Net8/end.sh Normal file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
kill -9 $(lsof -t -i:19001)
echo "Yi-进程已关闭"

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.AspNetCore.Authentication.OAuth
{
public class AuthenticationConstants
{
public const string OpenId = "urn:openid";
public const string AccessToken = "urn:access_token";
public const string Name = "urn:name";
}
}

View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.OAuth;
namespace Yi.Framework.AspNetCore.Authentication.OAuth
{
public class AuthenticationOAuthOptions:OAuthOptions
{
public string RedirectUri { get; set; }
}
}

View File

@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.AspNetCore.Authentication.OAuth.Gitee;
namespace Yi.Framework.AspNetCore.Authentication.OAuth
{
public class AuthticationErrCodeModel
{
public string error { get; set; }
public string error_description { get; set; }
public static void VerifyErrResponse(string content)
{
var model = Newtonsoft.Json.JsonConvert.DeserializeObject<AuthticationErrCodeModel>(content);
if (model.error != null)
{
throw new Exception($"第三方授权返回错误,错误码:【{model.error}】,错误详情:【{model.error_description}】");
}
}
}
}

View File

@@ -0,0 +1,19 @@
/*
* Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
* See https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers
* for more information concerning the license and the contributors participating to this project.
*/
namespace Yi.Framework.AspNetCore.Authentication.OAuth.Gitee;
/// <summary>
/// Contains constants specific to the <see cref="GiteeAuthenticationHandler"/>.
/// </summary>
public static class GiteeAuthenticationConstants
{
public static class Claims
{
public const string Url = "urn:gitee:url";
public const string AvatarUrl = "urn:gitee:avatarUrl";
}
}

View File

@@ -0,0 +1,53 @@
/*
* Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
* See https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers
* for more information concerning the license and the contributors participating to this project.
*/
namespace Yi.Framework.AspNetCore.Authentication.OAuth.Gitee;
/// <summary>
/// Default values used by the Gitee authentication middleware.
/// </summary>
public static class GiteeAuthenticationDefaults
{
/// <summary>
/// Default value for <see cref="AuthenticationScheme.Name"/>.
/// </summary>
public const string AuthenticationScheme = "Gitee";
/// <summary>
/// Default value for <see cref="AuthenticationScheme.DisplayName"/>.
/// </summary>
public static readonly string DisplayName = "Gitee";
/// <summary>
/// Default value for <see cref="AuthenticationSchemeOptions.ClaimsIssuer"/>.
/// </summary>
public static readonly string Issuer = "Gitee";
/// <summary>
/// Default value for <see cref="RemoteAuthenticationOptions.CallbackPath"/>.
/// </summary>
public static readonly string CallbackPath = "/signin-gitee";
/// <summary>
/// Default value for <see cref="OAuthOptions.AuthorizationEndpoint"/>.
/// </summary>
public static readonly string AuthorizationEndpoint = "https://gitee.com/oauth/authorize";
/// <summary>
/// Default value for <see cref="OAuthOptions.TokenEndpoint"/>.
/// </summary>
public static readonly string TokenEndpoint = "https://gitee.com/oauth/token";
/// <summary>
/// Default value for <see cref="OAuthOptions.UserInformationEndpoint"/>.
/// </summary>
public static readonly string UserInformationEndpoint = "https://gitee.com/api/v5/user";
/// <summary>
/// Default value for <see cref="GiteeAuthenticationOptions.UserEmailsEndpoint"/>.
/// </summary>
public static readonly string UserEmailsEndpoint = "https://gitee.com/api/v5/emails";
}

View File

@@ -0,0 +1,75 @@
/*
* Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
* See https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers
* for more information concerning the license and the contributors participating to this project.
*/
using JetBrains.Annotations;
using Microsoft.AspNetCore.Authentication;
namespace Yi.Framework.AspNetCore.Authentication.OAuth.Gitee;
/// <summary>
/// Extension methods to add Gitee authentication capabilities to an HTTP application pipeline.
/// </summary>
public static class GiteeAuthenticationExtensions
{
/// <summary>
/// Adds <see cref="GiteeAuthenticationHandler"/> to the specified
/// <see cref="AuthenticationBuilder"/>, which enables Gitee authentication capabilities.
/// </summary>
/// <param name="builder">The authentication builder.</param>
/// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
public static AuthenticationBuilder AddGitee([NotNull] this AuthenticationBuilder builder)
{
return builder.AddGitee(GiteeAuthenticationDefaults.AuthenticationScheme, options => { });
}
/// <summary>
/// Adds <see cref="GiteeAuthenticationHandler"/> to the specified
/// <see cref="AuthenticationBuilder"/>, which enables Gitee authentication capabilities.
/// </summary>
/// <param name="builder">The authentication builder.</param>
/// <param name="configuration">The delegate used to configure the OpenID 2.0 options.</param>
/// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
public static AuthenticationBuilder AddGitee(
[NotNull] this AuthenticationBuilder builder,
[NotNull] Action<GiteeAuthenticationOptions> configuration)
{
return builder.AddGitee(GiteeAuthenticationDefaults.AuthenticationScheme, configuration);
}
/// <summary>
/// Adds <see cref="GiteeAuthenticationHandler"/> to the specified
/// <see cref="AuthenticationBuilder"/>, which enables Gitee authentication capabilities.
/// </summary>
/// <param name="builder">The authentication builder.</param>
/// <param name="scheme">The authentication scheme associated with this instance.</param>
/// <param name="configuration">The delegate used to configure the Gitee options.</param>
/// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
public static AuthenticationBuilder AddGitee(
[NotNull] this AuthenticationBuilder builder,
[NotNull] string scheme,
[NotNull] Action<GiteeAuthenticationOptions> configuration)
{
return builder.AddGitee(scheme, GiteeAuthenticationDefaults.DisplayName, configuration);
}
/// <summary>
/// Adds <see cref="GiteeAuthenticationHandler"/> to the specified
/// <see cref="AuthenticationBuilder"/>, which enables Gitee authentication capabilities.
/// </summary>
/// <param name="builder">The authentication builder.</param>
/// <param name="scheme">The authentication scheme associated with this instance.</param>
/// <param name="caption">The optional display name associated with this instance.</param>
/// <param name="configuration">The delegate used to configure the Gitee options.</param>
/// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
public static AuthenticationBuilder AddGitee(
[NotNull] this AuthenticationBuilder builder,
[NotNull] string scheme,
[CanBeNull] string caption,
[NotNull] Action<GiteeAuthenticationOptions> configuration)
{
return builder.AddScheme<GiteeAuthenticationOptions, GiteeAuthenticationHandler>(scheme, caption, configuration);
}
}

View File

@@ -0,0 +1,49 @@
using System.Security.Claims;
using System.Text.Encodings.Web;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using static Yi.Framework.AspNetCore.Authentication.OAuth.Gitee.GiteeAuthenticationConstants;
namespace Yi.Framework.AspNetCore.Authentication.OAuth.Gitee
{
public class GiteeAuthenticationHandler : OauthAuthenticationHandler<GiteeAuthenticationOptions>
{
public GiteeAuthenticationHandler(IOptionsMonitor<GiteeAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, IHttpClientFactory httpClientFactory) : base(options, logger, encoder, httpClientFactory)
{
}
public override string AuthenticationSchemeNmae => GiteeAuthenticationDefaults.AuthenticationScheme;
protected override async Task<List<Claim>> GetAuthTicketAsync(string code)
{
//获取 accessToken
var tokenQueryKv = new List<KeyValuePair<string, string?>>()
{
new KeyValuePair<string, string?>("grant_type","authorization_code"),
new KeyValuePair<string, string?>("client_id",Options.ClientId),
new KeyValuePair<string, string?>("client_secret",Options.ClientSecret),
new KeyValuePair<string, string?>("redirect_uri",Options.RedirectUri),
new KeyValuePair<string, string?>("code",code)
};
var tokenModel = await SendHttpRequestAsync<GiteeAuthticationcationTokenResponse>(GiteeAuthenticationDefaults.TokenEndpoint, tokenQueryKv,HttpMethod.Post);
//获取 userInfo
var userInfoQueryKv = new List<KeyValuePair<string, string?>>()
{
new KeyValuePair<string, string?>("access_token",tokenModel.access_token),
};
var userInfoMdoel = await SendHttpRequestAsync<GiteeAuthticationcationUserInfoResponse>(GiteeAuthenticationDefaults.UserInformationEndpoint, userInfoQueryKv);
List<Claim> claims = new List<Claim>()
{
new Claim(Claims.AvatarUrl, userInfoMdoel.avatar_url),
new Claim(Claims.Url, userInfoMdoel.url),
new Claim(AuthenticationConstants.OpenId,userInfoMdoel.id.ToString()),
new Claim(AuthenticationConstants.Name, userInfoMdoel.name),
new Claim(AuthenticationConstants.AccessToken, tokenModel.access_token)
};
return claims;
}
}
}

View File

@@ -0,0 +1,44 @@
/*
* Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
* See https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers
* for more information concerning the license and the contributors participating to this project.
*/
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication;
using static Yi.Framework.AspNetCore.Authentication.OAuth.Gitee.GiteeAuthenticationConstants;
namespace Yi.Framework.AspNetCore.Authentication.OAuth.Gitee;
/// <summary>
/// Defines a set of options used by <see cref="GiteeAuthenticationHandler"/>.
/// </summary>
public class GiteeAuthenticationOptions : AuthenticationOAuthOptions
{
public GiteeAuthenticationOptions()
{
ClaimsIssuer = GiteeAuthenticationDefaults.Issuer;
CallbackPath = GiteeAuthenticationDefaults.CallbackPath;
AuthorizationEndpoint = GiteeAuthenticationDefaults.AuthorizationEndpoint;
TokenEndpoint = GiteeAuthenticationDefaults.TokenEndpoint;
UserInformationEndpoint = GiteeAuthenticationDefaults.UserInformationEndpoint;
UserEmailsEndpoint = GiteeAuthenticationDefaults.UserEmailsEndpoint;
Scope.Add("user_info");
Scope.Add("emails");
ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
ClaimActions.MapJsonKey(ClaimTypes.Name, "login");
ClaimActions.MapJsonKey(ClaimTypes.Email, "email");
ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
ClaimActions.MapJsonKey(Claims.Url, "url");
}
/// <summary>
/// Gets or sets the address of the endpoint exposing
/// the email addresses associated with the logged in user.
/// </summary>
public string UserEmailsEndpoint { get; set; }
}

View File

@@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.AspNetCore.Authentication.OAuth.Gitee
{
public class GiteeAuthticationcationTokenResponse
{
public string access_token { get; set; }
public string token_type { get; set; }
public int expires_in { get; set; }
public string refresh_token { get; set; }
public string scope { get; set; }
public long created_at { get; set; }
}
public class GiteeAuthticationcationOpenIdResponse
{
public string client_id { get; set; }
public string openid { get; set; }
}
public class GiteeAuthticationcationUserInfoResponse
{
/// <summary>
/// 也可以等于openId
/// </summary>
public int id { get; set; }
public string login { get; set; }
public string name { get; set; }
public string avatar_url { get; set; }
public string url { get; set; }
public string html_url { get; set; }
public string remark { get; set; }
public string followers_url { get; set; }
public string following_url { get; set; }
public string gists_url { get; set; }
public string starred_url { get; set; }
public string subscriptions_url { get; set; }
public string organizations_url { get; set; }
public string repos_url { get; set; }
public string events_url { get; set; }
public string received_events_url { get; set; }
public string type { get; set; }
public string blog { get; set; }
public string weibo { get; set; }
public string bio { get; set; }
public int public_repos { get; set; }
public int public_gists { get; set; }
public int followers { get; set; }
public int following { get; set; }
public int stared { get; set; }
public int watched { get; set; }
public DateTime created_at { get; set; }
public DateTime updated_at { get; set; }
public string email { get; set; }
}
}

View File

@@ -0,0 +1,96 @@
using System.Security.Claims;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace Yi.Framework.AspNetCore.Authentication.OAuth
{
public abstract class OauthAuthenticationHandler<TOptions> : AuthenticationHandler<TOptions> where TOptions : AuthenticationSchemeOptions, new()
{
public abstract string AuthenticationSchemeNmae { get; }
private AuthenticationScheme _scheme;
public OauthAuthenticationHandler(IOptionsMonitor<TOptions> options, ILoggerFactory logger, UrlEncoder encoder, IHttpClientFactory httpClientFactory) : base(options, logger, encoder)
{
HttpClientFactory = httpClientFactory;
HttpClient = HttpClientFactory.CreateClient();
}
protected IHttpClientFactory HttpClientFactory { get; }
protected HttpClient HttpClient { get; }
/// <summary>
/// 生成认证票据
/// </summary>
/// <returns></returns>
private AuthenticationTicket TicketConver(List<Claim> claims)
{
var claimsIdentity = new ClaimsIdentity(claims.ToArray(), AuthenticationSchemeNmae);
var principal = new ClaimsPrincipal(claimsIdentity);
return new AuthenticationTicket(principal, AuthenticationSchemeNmae);
}
protected async Task<HttpModel> SendHttpRequestAsync<HttpModel>(string url, IEnumerable<KeyValuePair<string, string?>> query, HttpMethod? httpMethod = null)
{
httpMethod = httpMethod ?? HttpMethod.Get;
var queryUrl = QueryHelpers.AddQueryString(url, query);
HttpResponseMessage response = null;
if (httpMethod == HttpMethod.Get)
{
response = await HttpClient.GetAsync(queryUrl);
}
else if (httpMethod == HttpMethod.Post)
{
response = await HttpClient.PostAsync(queryUrl, null);
}
var content = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception($"授权服务器请求错误,请求地址:{queryUrl},错误信息:{content}");
}
VerifyErrResponse(content);
var model = Newtonsoft.Json.JsonConvert.DeserializeObject<HttpModel>(content);
return model!;
}
protected virtual void VerifyErrResponse(string content)
{
AuthticationErrCodeModel.VerifyErrResponse(content);
}
protected abstract Task<List<Claim>> GetAuthTicketAsync(string code);
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
if (!Context.Request.Query.ContainsKey("code"))
{
return AuthenticateResult.Fail("回调未包含code参数");
}
var code = Context.Request.Query["code"].ToString();
List<Claim> authTicket = null;
try
{
authTicket = await GetAuthTicketAsync(code);
}
catch (Exception ex)
{
return AuthenticateResult.Fail(ex.Message ?? "未知错误");
}
//成功
var result = AuthenticateResult.Success(TicketConver(authTicket));
return result;
}
}
}

View File

@@ -0,0 +1,23 @@
/*
* Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
* See https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers
* for more information concerning the license and the contributors participating to this project.
*/
namespace Yi.Framework.AspNetCore.Authentication.OAuth.QQ;
/// <summary>
/// Contains constants specific to the <see cref="QQAuthenticationHandler"/>.
/// </summary>
public static class QQAuthenticationConstants
{
public static class Claims
{
public const string AvatarFullUrl = "urn:qq:avatar_full";
public const string AvatarUrl = "urn:qq:avatar";
public const string PictureFullUrl = "urn:qq:picture_full";
public const string PictureMediumUrl = "urn:qq:picture_medium";
public const string PictureUrl = "urn:qq:picture";
public const string UnionId = "urn:qq:unionid";
}
}

View File

@@ -0,0 +1,53 @@
/*
* Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
* See https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers
* for more information concerning the license and the contributors participating to this project.
*/
namespace Yi.Framework.AspNetCore.Authentication.OAuth.QQ;
/// <summary>
/// Default values for QQ authentication.
/// </summary>
public static class QQAuthenticationDefaults
{
/// <summary>
/// Default value for <see cref="AuthenticationScheme.Name"/>.
/// </summary>
public const string AuthenticationScheme = "QQ";
/// <summary>
/// Default value for <see cref="AuthenticationScheme.DisplayName"/>.
/// </summary>
public static readonly string DisplayName = "QQ";
/// <summary>
/// Default value for <see cref="AuthenticationSchemeOptions.ClaimsIssuer"/>.
/// </summary>
public static readonly string Issuer = "QQ";
/// <summary>
/// Default value for <see cref="RemoteAuthenticationOptions.CallbackPath"/>.
/// </summary>
public static readonly string CallbackPath = "/signin-qq";
/// <summary>
/// Default value for <see cref="OAuthOptions.AuthorizationEndpoint"/>.
/// </summary>
public static readonly string AuthorizationEndpoint = "https://graph.qq.com/oauth2.0/authorize";
/// <summary>
/// Default value for <see cref="OAuthOptions.TokenEndpoint"/>.
/// </summary>
public static readonly string TokenEndpoint = "https://graph.qq.com/oauth2.0/token";
/// <summary>
/// Default value for <see cref="QQAuthenticationOptions.UserIdentificationEndpoint"/>.
/// </summary>
public static readonly string UserIdentificationEndpoint = "https://graph.qq.com/oauth2.0/me";
/// <summary>
/// Default value for <see cref="OAuthOptions.UserInformationEndpoint"/>.
/// </summary>
public static readonly string UserInformationEndpoint = "https://graph.qq.com/user/get_user_info";
}

View File

@@ -0,0 +1,77 @@
/*
* Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
* See https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers
* for more information concerning the license and the contributors participating to this project.
*/
using JetBrains.Annotations;
using Microsoft.AspNetCore.Authentication;
using Microsoft.Extensions.DependencyInjection;
namespace Yi.Framework.AspNetCore.Authentication.OAuth.QQ;
/// <summary>
/// Extension methods to add QQ authentication capabilities to an HTTP application pipeline.
/// </summary>
public static class QQAuthenticationExtensions
{
/// <summary>
/// Adds <see cref="QQAuthenticationHandler"/> to the specified
/// <see cref="AuthenticationBuilder"/>, which enables QQ authentication capabilities.
/// </summary>
/// <param name="builder">The authentication builder.</param>
/// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
public static AuthenticationBuilder AddQQ([NotNull] this AuthenticationBuilder builder)
{
return builder.AddQQ(QQAuthenticationDefaults.AuthenticationScheme, options => { });
}
/// <summary>
/// Adds <see cref="QQAuthenticationHandler"/> to the specified
/// <see cref="AuthenticationBuilder"/>, which enables QQ authentication capabilities.
/// </summary>
/// <param name="builder">The authentication builder.</param>
/// <param name="configuration">The delegate used to configure the OpenID 2.0 options.</param>
/// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
public static AuthenticationBuilder AddQQ(
[NotNull] this AuthenticationBuilder builder,
[NotNull] Action<QQAuthenticationOptions> configuration)
{
return builder.AddQQ(QQAuthenticationDefaults.AuthenticationScheme, configuration);
}
/// <summary>
/// Adds <see cref="QQAuthenticationHandler"/> to the specified
/// <see cref="AuthenticationBuilder"/>, which enables QQ authentication capabilities.
/// </summary>
/// <param name="builder">The authentication builder.</param>
/// <param name="scheme">The authentication scheme associated with this instance.</param>
/// <param name="configuration">The delegate used to configure the QQ options.</param>
/// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
public static AuthenticationBuilder AddQQ(
[NotNull] this AuthenticationBuilder builder,
[NotNull] string scheme,
[NotNull] Action<QQAuthenticationOptions> configuration)
{
return builder.AddQQ(scheme, QQAuthenticationDefaults.DisplayName, configuration);
}
/// <summary>
/// Adds <see cref="QQAuthenticationHandler"/> to the specified
/// <see cref="AuthenticationBuilder"/>, which enables QQ authentication capabilities.
/// </summary>
/// <param name="builder">The authentication builder.</param>
/// <param name="scheme">The authentication scheme associated with this instance.</param>
/// <param name="caption">The optional display name associated with this instance.</param>
/// <param name="configuration">The delegate used to configure the QQ options.</param>
/// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
public static AuthenticationBuilder AddQQ(
[NotNull] this AuthenticationBuilder builder,
[NotNull] string scheme,
[CanBeNull] string caption,
[NotNull] Action<QQAuthenticationOptions> configuration)
{
return builder.AddScheme<QQAuthenticationOptions, QQAuthenticationHandler>(scheme, caption, configuration);
}
}

View File

@@ -0,0 +1,64 @@
using System.Security.Claims;
using System.Text.Encodings.Web;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using static Yi.Framework.AspNetCore.Authentication.OAuth.QQ.QQAuthenticationConstants;
namespace Yi.Framework.AspNetCore.Authentication.OAuth.QQ
{
public class QQAuthenticationHandler : OauthAuthenticationHandler<QQAuthenticationOptions>
{
public QQAuthenticationHandler(IOptionsMonitor<QQAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, IHttpClientFactory httpClientFactory) : base(options, logger, encoder, httpClientFactory)
{
}
public override string AuthenticationSchemeNmae => QQAuthenticationDefaults.AuthenticationScheme;
protected override async Task<List<Claim>> GetAuthTicketAsync(string code)
{
//获取 accessToken
var tokenQueryKv = new List<KeyValuePair<string, string?>>()
{
new KeyValuePair<string, string?>("grant_type","authorization_code"),
new KeyValuePair<string, string?>("client_id",Options.ClientId),
new KeyValuePair<string, string?>("client_secret",Options.ClientSecret),
new KeyValuePair<string, string?>("redirect_uri",Options.RedirectUri),
new KeyValuePair<string, string?>("fmt","json"),
new KeyValuePair<string, string?>("need_openid","1"),
new KeyValuePair<string, string?>("code",code)
};
var tokenModel = await SendHttpRequestAsync<QQAuthticationcationTokenResponse>(QQAuthenticationDefaults.TokenEndpoint, tokenQueryKv);
//获取 userInfo
var userInfoQueryKv = new List<KeyValuePair<string, string?>>()
{
new KeyValuePair<string, string?>("access_token",tokenModel.access_token),
new KeyValuePair<string, string?>("oauth_consumer_key",Options.ClientId),
new KeyValuePair<string, string?>("openid",tokenModel.openid),
};
var userInfoMdoel = await SendHttpRequestAsync<QQAuthticationcationUserInfoResponse>(QQAuthenticationDefaults.UserInformationEndpoint, userInfoQueryKv);
List<Claim> claims = new List<Claim>()
{
new Claim(Claims.AvatarFullUrl, userInfoMdoel.figureurl_qq_2),
new Claim(Claims.AvatarUrl, userInfoMdoel.figureurl_qq_1),
new Claim(Claims.PictureFullUrl, userInfoMdoel.figureurl_2),
new Claim(Claims.PictureMediumUrl, userInfoMdoel.figureurl_qq_1),
new Claim(Claims.PictureUrl, userInfoMdoel.figureurl),
new Claim(AuthenticationConstants.OpenId, tokenModel.openid),
new Claim(AuthenticationConstants.Name, userInfoMdoel.nickname),
new Claim(AuthenticationConstants.AccessToken, tokenModel.access_token),
};
return claims;
}
}
}

View File

@@ -0,0 +1,49 @@
/*
* Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
* See https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers
* for more information concerning the license and the contributors participating to this project.
*/
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication;
using static Yi.Framework.AspNetCore.Authentication.OAuth.QQ.QQAuthenticationConstants;
namespace Yi.Framework.AspNetCore.Authentication.OAuth.QQ;
/// <summary>
/// Defines a set of options used by <see cref="QQAuthenticationHandler"/>.
/// </summary>
public class QQAuthenticationOptions : AuthenticationOAuthOptions
{
public QQAuthenticationOptions()
{
ClaimsIssuer = QQAuthenticationDefaults.Issuer;
CallbackPath = QQAuthenticationDefaults.CallbackPath;
AuthorizationEndpoint = QQAuthenticationDefaults.AuthorizationEndpoint;
TokenEndpoint = QQAuthenticationDefaults.TokenEndpoint;
UserIdentificationEndpoint = QQAuthenticationDefaults.UserIdentificationEndpoint;
UserInformationEndpoint = QQAuthenticationDefaults.UserInformationEndpoint;
Scope.Add("get_user_info");
ClaimActions.MapJsonKey(ClaimTypes.Name, "nickname");
ClaimActions.MapJsonKey(ClaimTypes.Gender, "gender");
ClaimActions.MapJsonKey(Claims.PictureUrl, "figureurl");
ClaimActions.MapJsonKey(Claims.PictureMediumUrl, "figureurl_1");
ClaimActions.MapJsonKey(Claims.PictureFullUrl, "figureurl_2");
ClaimActions.MapJsonKey(Claims.AvatarUrl, "figureurl_qq_1");
ClaimActions.MapJsonKey(Claims.AvatarFullUrl, "figureurl_qq_2");
}
/// <summary>
/// Gets or sets if the union Id (the primary key of an owner for different apps of the QQ platform) should be put into the user claims.
/// </summary>
public bool ApplyForUnionId { get; set; }
/// <summary>
/// Gets or sets the URL of the user identification endpoint (a.k.a. the "OpenID endpoint").
/// </summary>
public string UserIdentificationEndpoint { get; set; }
}

View File

@@ -0,0 +1,89 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.AspNetCore.Authentication.OAuth.QQ
{
public class QQAuthticationcationTokenResponse
{
public string access_token { get; set; }
public string expires_in { get; set; }
public string refresh_token { get; set; }
public string openid { get; set; }
}
public class QQAuthticationcationOpenIdResponse
{
public string client_id { get; set; }
public string openid { get; set; }
}
public class QQAuthticationcationUserInfoResponse
{
// 返回码
public int ret { get; set; }
// 如果ret<0会有相应的错误信息提示
// 返回数据全部用UTF-8编码
public string msg { get; set; }
// 判断是否有数据丢失
// 0或者不返回没有数据丢失可以缓存
// 1有部分数据丢失或错误不要缓存
public int is_lost { get; set; }
// 用户在QQ空间的昵称
public string nickname { get; set; }
// 大小为30x30像素的QQ空间头像URL
public string figureurl { get; set; }
// 大小为50x50像素的QQ空间头像URL
public string figureurl_1 { get; set; }
// 大小为100x100像素的QQ空间头像URL
public string figureurl_2 { get; set; }
// 大小为40x40像素的QQ头像URL
public string figureurl_qq_1 { get; set; }
// 大小为100x100像素的QQ头像URL
// 需要注意不是所有的用户都拥有QQ的100x100的头像但40x40像素则是一定会有
public string figureurl_qq_2 { get; set; }
// 性别。如果获取不到则默认返回"男"
public string gender { get; set; }
// 性别类型。默认返回2
public int gender_type { get; set; }
// 省
public string province { get; set; }
// 市
public string city { get; set; }
// 年
public int year { get; set; }
// 星座
public string constellation { get; set; }
// 标识用户是否为黄钻用户
public int is_yellow_vip { get; set; }
// 黄钻等级
public int yellow_vip_level { get; set; }
// 是否为年费黄钻用户
public int is_yellow_year_vip { get; set; }
}
}

View File

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Yi.Framework.AspNetCore\Yi.Framework.AspNetCore.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,20 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
using Yi.Framework.Core;
namespace Yi.Framework.AspNetCore.Authentication.OAuth
{
/// <summary>
/// 本模块轮子来自 AspNet.Security.OAuth.QQ;
/// </summary>
[DependsOn(typeof(YiFrameworkAspNetCoreModule))]
public class YiFrameworkAspNetCoreAuthenticationOAuthModule:AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var service = context.Services;
service.AddHttpClient();
}
}
}

View File

@@ -0,0 +1,64 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Yi.Framework.Core.Authentication;
namespace Yi.Framework.AspNetCore.Microsoft.AspNetCore.Authentication;
/// <summary>
/// 可刷新的鉴权提供者
/// </summary>
public class RefreshAuthenticationHandlerProvider : IRefreshAuthenticationHandlerProvider
{
private Dictionary<string, IAuthenticationHandler> _handlerMap =
new Dictionary<string, IAuthenticationHandler>((IEqualityComparer<string>)StringComparer.Ordinal);
/// <summary>Constructor.</summary>
/// <param name="schemes">The <see cref="T:Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider" />.</param>
public RefreshAuthenticationHandlerProvider(IAuthenticationSchemeProvider schemes)
{
this.Schemes = schemes;
}
/// <summary>
/// The <see cref="T:Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider" />.
/// </summary>
public IAuthenticationSchemeProvider Schemes { get; }
/// <summary>Returns the handler instance that will be used.</summary>
/// <param name="context">The context.</param>
/// <param name="authenticationScheme">The name of the authentication scheme being handled.</param>
/// <returns>The handler instance.</returns>
public async Task<IAuthenticationHandler?> GetHandlerAsync(
HttpContext context,
string authenticationScheme)
{
IAuthenticationHandler handlerAsync;
if (this._handlerMap.TryGetValue(authenticationScheme, out handlerAsync))
return handlerAsync;
AuthenticationScheme schemeAsync = await this.Schemes.GetSchemeAsync(authenticationScheme);
if (schemeAsync == null)
return (IAuthenticationHandler)null;
if ((context.RequestServices.GetService(schemeAsync.HandlerType) ??
ActivatorUtilities.CreateInstance(context.RequestServices, schemeAsync.HandlerType)) is
IAuthenticationHandler handler)
{
handlerAsync = handler;
await handler.InitializeAsync(schemeAsync, context);
this._handlerMap[authenticationScheme] = handler;
}
return handlerAsync;
}
/// <summary>
/// 刷新鉴权
/// </summary>
public void RefreshAuthentication()
{
_handlerMap = new Dictionary<string, IAuthenticationHandler>((IEqualityComparer<string>)StringComparer.Ordinal);
}
}

View File

@@ -0,0 +1,26 @@
using JetBrains.Annotations;
using Microsoft.AspNetCore.Builder;
using Yi.Framework.AspNetCore.Microsoft.AspNetCore.Middlewares;
namespace Yi.Framework.AspNetCore.Microsoft.AspNetCore.Builder
{
/// <summary>
/// 提供API信息处理的应用程序构建器扩展方法
/// </summary>
public static class ApiInfoBuilderExtensions
{
/// <summary>
/// 使用Yi框架的API信息处理中间件
/// </summary>
/// <param name="builder">应用程序构建器实例</param>
/// <returns>配置后的应用程序构建器实例</returns>
/// <exception cref="ArgumentNullException">当builder参数为null时抛出</exception>
public static IApplicationBuilder UseApiInfoHandling([NotNull] this IApplicationBuilder builder)
{
// 添加API信息处理中间件到请求管道
builder.UseMiddleware<ApiInfoMiddleware>();
return builder;
}
}
}

View File

@@ -0,0 +1,105 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc;
namespace Yi.Framework.AspNetCore.Microsoft.AspNetCore.Builder
{
/// <summary>
/// Swagger构建器扩展类
/// </summary>
public static class SwaggerBuilderExtensions
{
/// <summary>
/// 配置并使用Yi框架的Swagger中间件
/// </summary>
/// <param name="app">应用程序构建器</param>
/// <param name="swaggerConfigs">Swagger配置模型数组</param>
/// <returns>应用程序构建器</returns>
public static IApplicationBuilder UseYiSwagger(
this IApplicationBuilder app,
params SwaggerConfiguration[] swaggerConfigs)
{
if (app == null)
{
throw new ArgumentNullException(nameof(app));
}
var mvcOptions = app.ApplicationServices
.GetRequiredService<IOptions<AbpAspNetCoreMvcOptions>>()
.Value;
// 启用Swagger中间件
app.UseSwagger();
// 配置SwaggerUI
app.UseSwaggerUI(options =>
{
// 添加约定控制器的Swagger终结点
var conventionalSettings = mvcOptions.ConventionalControllers.ConventionalControllerSettings;
foreach (var setting in conventionalSettings)
{
options.SwaggerEndpoint(
$"/swagger/{setting.RemoteServiceName}/swagger.json",
setting.RemoteServiceName);
}
// 如果没有配置任何终结点,使用默认配置
if (!conventionalSettings.Any() && (swaggerConfigs == null || !swaggerConfigs.Any()))
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Yi.Framework");
return;
}
// 添加自定义Swagger配置的终结点
if (swaggerConfigs != null)
{
foreach (var config in swaggerConfigs)
{
options.SwaggerEndpoint(config.Url, config.Name);
}
}
});
return app;
}
}
/// <summary>
/// Swagger配置模型
/// </summary>
public class SwaggerConfiguration
{
private const string DefaultSwaggerUrl = "/swagger/v1/swagger.json";
/// <summary>
/// Swagger JSON文档的URL
/// </summary>
public string Url { get; }
/// <summary>
/// Swagger文档的显示名称
/// </summary>
public string Name { get; }
/// <summary>
/// 使用默认URL创建Swagger配置
/// </summary>
/// <param name="name">文档显示名称</param>
public SwaggerConfiguration(string name)
: this(DefaultSwaggerUrl, name)
{
}
/// <summary>
/// 创建自定义Swagger配置
/// </summary>
/// <param name="url">Swagger JSON文档URL</param>
/// <param name="name">文档显示名称</param>
public SwaggerConfiguration(string url, string name)
{
Url = url ?? throw new ArgumentNullException(nameof(url));
Name = name ?? throw new ArgumentNullException(nameof(name));
}
}
}

View File

@@ -0,0 +1,61 @@
using System.Diagnostics;
using Microsoft.AspNetCore.Http;
using Volo.Abp.DependencyInjection;
using Yi.Framework.Core.Extensions;
namespace Yi.Framework.AspNetCore.Microsoft.AspNetCore.Middlewares
{
/// <summary>
/// API响应信息处理中间件
/// 主要用于处理特定文件类型的响应头信息
/// </summary>
[DebuggerStepThrough]
public class ApiInfoMiddleware : IMiddleware, ITransientDependency
{
/// <summary>
/// 处理HTTP请求的中间件方法
/// </summary>
/// <param name="context">HTTP上下文</param>
/// <param name="next">请求处理委托</param>
/// <returns>异步任务</returns>
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
// 在响应开始时处理文件下载相关的响应头
context.Response.OnStarting(() =>
{
HandleFileDownloadResponse(context);
return Task.CompletedTask;
});
// 继续处理管道中的下一个中间件
await next(context);
}
/// <summary>
/// 处理文件下载响应的响应头信息
/// </summary>
/// <param name="context">HTTP上下文</param>
private static void HandleFileDownloadResponse(HttpContext context)
{
// 仅处理状态码为200的响应
if (context.Response.StatusCode != StatusCodes.Status200OK)
{
return;
}
var contentType = context.Response.Headers["Content-Type"].ToString();
var timestamp = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
// 处理Excel文件下载
if (contentType == "application/vnd.ms-excel")
{
context.FileAttachmentHandle($"{timestamp}.xlsx");
}
// 处理ZIP文件下载
else if (contentType == "application/x-zip-compressed")
{
context.FileAttachmentHandle($"{timestamp}.zip");
}
}
}
}

View File

@@ -0,0 +1,229 @@
using System.ComponentModel;
using System.Text;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.Conventions;
namespace Yi.Framework.AspNetCore.Microsoft.Extensions.DependencyInjection
{
/// <summary>
/// Swagger生成器扩展类
/// </summary>
public static class SwaggerAddExtensions
{
/// <summary>
/// 添加Yi框架的Swagger生成器服务
/// </summary>
/// <typeparam name="TProgram">程序入口类型</typeparam>
/// <param name="services">服务集合</param>
/// <param name="setupAction">自定义配置动作</param>
/// <returns>服务集合</returns>
public static IServiceCollection AddYiSwaggerGen<TProgram>(
this IServiceCollection services,
Action<SwaggerGenOptions>? setupAction = null)
{
// 获取MVC配置选项
var mvcOptions = services.GetPreConfigureActions<AbpAspNetCoreMvcOptions>().Configure();
// 获取并去重远程服务名称
var remoteServiceSettings = mvcOptions.ConventionalControllers
.ConventionalControllerSettings
.DistinctBy(x => x.RemoteServiceName);
services.AddAbpSwaggerGen(
options =>
{
// 应用外部配置
setupAction?.Invoke(options);
// 配置API文档分组
ConfigureApiGroups(options, remoteServiceSettings);
// 配置API文档过滤器
ConfigureApiFilter(options, remoteServiceSettings);
// 配置Schema ID生成规则
options.CustomSchemaIds(type => type.FullName);
// 包含XML注释文档
IncludeXmlComments<TProgram>(options);
// 配置JWT认证
ConfigureJwtAuthentication(options);
// 添加自定义过滤器
ConfigureCustomFilters(options);
}
);
return services;
}
/// <summary>
/// 配置API分组
/// </summary>
private static void ConfigureApiGroups(
SwaggerGenOptions options,
IEnumerable<ConventionalControllerSetting> settings)
{
foreach (var setting in settings.OrderBy(x => x.RemoteServiceName))
{
if (!options.SwaggerGeneratorOptions.SwaggerDocs.ContainsKey(setting.RemoteServiceName))
{
options.SwaggerDoc(setting.RemoteServiceName, new OpenApiInfo
{
Title = setting.RemoteServiceName,
Version = "v1"
});
}
}
}
/// <summary>
/// 配置API文档过滤器
/// </summary>
private static void ConfigureApiFilter(
SwaggerGenOptions options,
IEnumerable<ConventionalControllerSetting> settings)
{
options.DocInclusionPredicate((docName, apiDesc) =>
{
if (apiDesc.ActionDescriptor is ControllerActionDescriptor controllerDesc)
{
var matchedSetting = settings
.FirstOrDefault(x => x.Assembly == controllerDesc.ControllerTypeInfo.Assembly);
return matchedSetting?.RemoteServiceName == docName;
}
return false;
});
}
/// <summary>
/// 包含XML注释文档
/// </summary>
private static void IncludeXmlComments<TProgram>(SwaggerGenOptions options)
{
var basePath = Path.GetDirectoryName(typeof(TProgram).Assembly.Location);
if (basePath is not null)
{
foreach (var xmlFile in Directory.GetFiles(basePath, "*.xml"))
{
options.IncludeXmlComments(xmlFile, true);
}
}
}
/// <summary>
/// 配置JWT认证
/// </summary>
private static void ConfigureJwtAuthentication(SwaggerGenOptions options)
{
options.AddSecurityDefinition("JwtBearer", new OpenApiSecurityScheme
{
Description = "请在此输入JWT Token",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
Scheme = "bearer"
});
var scheme = new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "JwtBearer"
}
};
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
[scheme] = Array.Empty<string>()
});
}
/// <summary>
/// 配置自定义过滤器
/// </summary>
private static void ConfigureCustomFilters(SwaggerGenOptions options)
{
options.OperationFilter<TenantHeaderOperationFilter>();
options.SchemaFilter<EnumSchemaFilter>();
}
}
/// <summary>
/// Swagger文档枚举字段显示过滤器
/// </summary>
public class EnumSchemaFilter : ISchemaFilter
{
/// <summary>
/// 应用枚举架构过滤器
/// </summary>
/// <param name="schema">OpenAPI架构</param>
/// <param name="context">架构过滤器上下文</param>
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
if (!context.Type.IsEnum) return;
schema.Enum.Clear();
schema.Type = "string";
schema.Format = null;
var enumDescriptions = new StringBuilder();
foreach (var enumName in Enum.GetNames(context.Type))
{
var enumValue = (Enum)Enum.Parse(context.Type, enumName);
var description = GetEnumDescription(enumValue);
var enumIntValue = Convert.ToInt64(enumValue);
schema.Enum.Add(new OpenApiString(enumName));
enumDescriptions.AppendLine(
$"【枚举:{enumName}{(description is null ? string.Empty : $"({description})")}={enumIntValue}】");
}
schema.Description = enumDescriptions.ToString();
}
/// <summary>
/// 获取枚举描述特性值
/// </summary>
private static string? GetEnumDescription(Enum value)
{
var fieldInfo = value.GetType().GetField(value.ToString());
var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes.Length > 0 ? attributes[0].Description : null;
}
}
/// <summary>
/// 租户头部参数过滤器
/// </summary>
public class TenantHeaderOperationFilter : IOperationFilter
{
/// <summary>
/// 租户标识键名
/// </summary>
private const string TenantHeaderKey = "__tenant";
/// <summary>
/// 应用租户头部参数过滤器
/// </summary>
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
operation.Parameters ??= new List<OpenApiParameter>();
operation.Parameters.Add(new OpenApiParameter
{
Name = TenantHeaderKey,
In = ParameterLocation.Header,
Required = false,
AllowEmptyValue = true,
Description = "租户ID或租户名称留空表示默认租户"
});
}
}
}

View File

@@ -0,0 +1,137 @@
using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using System.Reflection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc.Conventions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Reflection;
namespace Yi.Framework.AspNetCore.Mvc
{
/// <summary>
/// 自定义路由构建器用于生成API路由规则
/// </summary>
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
[ExposeServices(typeof(IConventionalRouteBuilder))]
public class YiConventionalRouteBuilder : ConventionalRouteBuilder
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="options">ABP约定控制器配置选项</param>
public YiConventionalRouteBuilder(IOptions<AbpConventionalControllerOptions> options)
: base(options)
{
}
/// <summary>
/// 构建API路由
/// </summary>
/// <param name="rootPath">根路径</param>
/// <param name="controllerName">控制器名称</param>
/// <param name="action">Action模型</param>
/// <param name="httpMethod">HTTP方法</param>
/// <param name="configuration">控制器配置</param>
/// <returns>构建的路由URL</returns>
public override string Build(
string rootPath,
string controllerName,
ActionModel action,
string httpMethod,
[CanBeNull] ConventionalControllerSetting configuration)
{
// 获取API路由前缀
var apiRoutePrefix = GetApiRoutePrefix(action, configuration);
// 规范化控制器名称
var normalizedControllerName = NormalizeUrlControllerName(
rootPath,
controllerName,
action,
httpMethod,
configuration);
// 构建基础URL
var url = $"{rootPath}/{NormalizeControllerNameCase(normalizedControllerName, configuration)}";
// 处理ID参数路由
url = BuildIdParameterRoute(url, action, configuration);
// 处理Action名称路由
url = BuildActionNameRoute(url, rootPath, controllerName, action, httpMethod, configuration);
return url;
}
/// <summary>
/// 构建ID参数路由部分
/// </summary>
private string BuildIdParameterRoute(
string baseUrl,
ActionModel action,
ConventionalControllerSetting configuration)
{
var idParameter = action.Parameters.FirstOrDefault(p => p.ParameterName == "id");
if (idParameter == null)
{
return baseUrl;
}
// 处理原始类型ID
if (TypeHelper.IsPrimitiveExtended(idParameter.ParameterType, includeEnums: true))
{
return $"{baseUrl}/{{id}}";
}
// 处理复杂类型ID
var properties = idParameter.ParameterType
.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var property in properties)
{
baseUrl += $"/{{{NormalizeIdPropertyNameCase(property, configuration)}}}";
}
return baseUrl;
}
/// <summary>
/// 构建Action名称路由部分
/// </summary>
private string BuildActionNameRoute(
string baseUrl,
string rootPath,
string controllerName,
ActionModel action,
string httpMethod,
ConventionalControllerSetting configuration)
{
var actionNameInUrl = NormalizeUrlActionName(
rootPath,
controllerName,
action,
httpMethod,
configuration);
if (actionNameInUrl.IsNullOrEmpty())
{
return baseUrl;
}
baseUrl += $"/{NormalizeActionNameCase(actionNameInUrl, configuration)}";
// 处理次要ID参数
var secondaryIds = action.Parameters
.Where(p => p.ParameterName.EndsWith("Id", StringComparison.Ordinal))
.ToList();
if (secondaryIds.Count == 1)
{
baseUrl += $"/{{{NormalizeSecondaryIdNameCase(secondaryIds[0], configuration)}}}";
}
return baseUrl;
}
}
}

View File

@@ -0,0 +1,154 @@
using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ActionConstraints;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp;
using Volo.Abp.AspNetCore;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.Conventions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Reflection;
namespace Yi.Framework.AspNetCore.Mvc
{
/// <summary>
/// 自定义服务约定实现,用于处理API路由和HTTP方法约束
/// </summary>
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
[ExposeServices(typeof(IAbpServiceConvention))]
public class YiServiceConvention : AbpServiceConvention
{
/// <summary>
/// 初始化服务约定的新实例
/// </summary>
/// <param name="options">ABP AspNetCore MVC 配置选项</param>
/// <param name="conventionalRouteBuilder">约定路由构建器</param>
public YiServiceConvention(
IOptions<AbpAspNetCoreMvcOptions> options,
IConventionalRouteBuilder conventionalRouteBuilder)
: base(options, conventionalRouteBuilder)
{
}
/// <summary>
/// 配置选择器,处理路由和HTTP方法约束
/// </summary>
protected override void ConfigureSelector(
string rootPath,
string controllerName,
ActionModel action,
ConventionalControllerSetting? configuration)
{
// 移除空选择器
RemoveEmptySelectors(action.Selectors);
// 检查远程服务特性
var remoteServiceAttr = ReflectionHelper
.GetSingleAttributeOrDefault<RemoteServiceAttribute>(action.ActionMethod);
if (remoteServiceAttr != null && !remoteServiceAttr.IsEnabledFor(action.ActionMethod))
{
return;
}
// 根据选择器是否存在执行不同的配置
if (!action.Selectors.Any())
{
AddAbpServiceSelector(rootPath, controllerName, action, configuration);
}
else
{
NormalizeSelectorRoutes(rootPath, controllerName, action, configuration);
}
}
/// <summary>
/// 规范化选择器路由
/// </summary>
protected override void NormalizeSelectorRoutes(
string rootPath,
string controllerName,
ActionModel action,
ConventionalControllerSetting? configuration)
{
foreach (var selector in action.Selectors)
{
// 获取HTTP方法约束
var httpMethod = GetOrCreateHttpMethod(selector, action, configuration);
// 处理路由模板
ConfigureRouteTemplate(selector, rootPath, controllerName, action, httpMethod, configuration);
// 确保HTTP方法约束存在
EnsureHttpMethodConstraint(selector, httpMethod);
}
}
/// <summary>
/// 获取或创建HTTP方法
/// </summary>
private string GetOrCreateHttpMethod(
SelectorModel selector,
ActionModel action,
ConventionalControllerSetting? configuration)
{
return selector.ActionConstraints
.OfType<HttpMethodActionConstraint>()
.FirstOrDefault()?
.HttpMethods?
.FirstOrDefault()
?? SelectHttpMethod(action, configuration);
}
/// <summary>
/// 配置路由模板
/// </summary>
private void ConfigureRouteTemplate(
SelectorModel selector,
string rootPath,
string controllerName,
ActionModel action,
string httpMethod,
ConventionalControllerSetting? configuration)
{
if (selector.AttributeRouteModel == null)
{
selector.AttributeRouteModel = CreateAbpServiceAttributeRouteModel(
rootPath,
controllerName,
action,
httpMethod,
configuration);
}
else
{
NormalizeAttributeRouteTemplate(selector, rootPath);
}
}
/// <summary>
/// 规范化特性路由模板
/// </summary>
private void NormalizeAttributeRouteTemplate(SelectorModel selector, string rootPath)
{
var template = selector.AttributeRouteModel.Template;
if (!template.StartsWith("/"))
{
selector.AttributeRouteModel.Template = $"{rootPath}/{template}";
}
}
/// <summary>
/// 确保HTTP方法约束存在
/// </summary>
private void EnsureHttpMethodConstraint(SelectorModel selector, string httpMethod)
{
if (!selector.ActionConstraints.OfType<HttpMethodActionConstraint>().Any())
{
selector.ActionConstraints.Add(
new HttpMethodActionConstraint(new[] { httpMethod }));
}
}
}
}

View File

@@ -0,0 +1,58 @@
using System.Net;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Volo.Abp.AspNetCore.WebClientInfo;
namespace Yi.Framework.AspNetCore;
/// <summary>
/// 真实IP地址提供程序,支持代理服务器场景
/// </summary>
public class RealIpHttpContextWebClientInfoProvider : HttpContextWebClientInfoProvider
{
private const string XForwardedForHeader = "X-Forwarded-For";
/// <summary>
/// 初始化真实IP地址提供程序的新实例
/// </summary>
public RealIpHttpContextWebClientInfoProvider(
ILogger<HttpContextWebClientInfoProvider> logger,
IHttpContextAccessor httpContextAccessor)
: base(logger, httpContextAccessor)
{
}
/// <summary>
/// 获取客户端IP地址,优先从X-Forwarded-For头部获取
/// </summary>
/// <returns>客户端IP地址</returns>
protected override string? GetClientIpAddress()
{
try
{
var httpContext = HttpContextAccessor.HttpContext;
if (httpContext == null)
{
return null;
}
var headers = httpContext.Request?.Headers;
if (headers != null && headers.ContainsKey(XForwardedForHeader))
{
// 从X-Forwarded-For获取真实客户端IP
var forwardedIp = headers[XForwardedForHeader].FirstOrDefault();
if (!string.IsNullOrEmpty(forwardedIp))
{
httpContext.Connection.RemoteIpAddress = IPAddress.Parse(forwardedIp);
}
}
return httpContext.Connection?.RemoteIpAddress?.ToString();
}
catch (Exception ex)
{
Logger.LogWarning(ex, "获取客户端IP地址时发生异常");
return null;
}
}
}

View File

@@ -0,0 +1,55 @@
namespace Yi.Framework.AspNetCore
{
/// <summary>
/// 远程服务成功响应信息
/// </summary>
[Serializable]
public class RemoteServiceSuccessInfo
{
/// <summary>
/// 获取或设置响应代码
/// </summary>
public string? Code { get; private set; }
/// <summary>
/// 获取或设置响应消息
/// </summary>
public string? Message { get; private set; }
/// <summary>
/// 获取或设置详细信息
/// </summary>
public string? Details { get; private set; }
/// <summary>
/// 获取或设置响应数据
/// </summary>
public object? Data { get; private set; }
/// <summary>
/// 初始化远程服务成功响应信息的新实例
/// </summary>
public RemoteServiceSuccessInfo()
{
}
/// <summary>
/// 使用指定参数初始化远程服务成功响应信息的新实例
/// </summary>
/// <param name="message">响应消息</param>
/// <param name="details">详细信息</param>
/// <param name="code">响应代码</param>
/// <param name="data">响应数据</param>
public RemoteServiceSuccessInfo(
string message,
string? details = null,
string? code = null,
object? data = null)
{
Message = message;
Details = details;
Code = code;
Data = data;
}
}
}

View File

@@ -0,0 +1,46 @@
// MIT 许可证
//
// 版权 © 2020-present 百小僧, 百签科技(广东)有限公司 和所有贡献者
//
// 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,
// 包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,
// 以及再授权被配发了本软件的人如上的权利,须在下列条件下:
//
// 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。
//
// 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。
// 在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,
// 还是产生于、源于或有关于本软件以及本软件的使用或其它处置。
namespace Yi.Framework.AspNetCore.UnifyResult;
/// <summary>
/// 异常元数据
/// </summary>
public sealed class ExceptionMetadata
{
/// <summary>
/// 状态码
/// </summary>
public int StatusCode { get; internal set; }
/// <summary>
/// 错误码
/// </summary>
public object ErrorCode { get; internal set; }
/// <summary>
/// 错误码(没被复写过的 ErrorCode
/// </summary>
public object OriginErrorCode { get; internal set; }
/// <summary>
/// 错误对象(信息)
/// </summary>
public object Errors { get; internal set; }
/// <summary>
/// 额外数据
/// </summary>
public object Data { get; internal set; }
}

View File

@@ -0,0 +1,112 @@
// MIT 许可证
//
// 版权 © 2020-present 百小僧, 百签科技(广东)有限公司 和所有贡献者
//
// 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,
// 包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,
// 以及再授权被配发了本软件的人如上的权利,须在下列条件下:
//
// 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。
//
// 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。
// 在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,
// 还是产生于、源于或有关于本软件以及本软件的使用或其它处置。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Validation;
using Yi.Framework.Core.Extensions;
namespace Yi.Framework.AspNetCore.UnifyResult.Fiters;
/// <summary>
/// 友好异常拦截器
/// </summary>
public sealed class FriendlyExceptionFilter : IAsyncExceptionFilter
{
/// <summary>
/// 异常拦截
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task OnExceptionAsync(ExceptionContext context)
{
// 排除 WebSocket 请求处理
if (context.HttpContext.IsWebSocketRequest()) return;
// 如果异常在其他地方被标记了处理,那么这里不再处理
if (context.ExceptionHandled) return;
// 解析异常信息
var exceptionMetadata = GetExceptionMetadata(context);
var unifyResult = context.GetRequiredService<IUnifyResultProvider>();
// 执行规范化异常处理
context.Result = unifyResult.OnException(context, exceptionMetadata);
// 创建日志记录器
var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<FriendlyExceptionFilter>>();
var errorMsg = "";
if (exceptionMetadata.Errors != null) errorMsg = "\n" + JsonConvert.SerializeObject(exceptionMetadata.Errors);
// 记录拦截日常
logger.LogError(context.Exception, context.Exception.Message + errorMsg);
}
/// <summary>
/// 获取异常元数据
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public static ExceptionMetadata GetExceptionMetadata(ActionContext context)
{
object errorCode = default;
object originErrorCode = default;
object errors = default;
object data = default;
var statusCode = StatusCodes.Status500InternalServerError;
var isValidationException = false; // 判断是否是验证异常
var isFriendlyException = false;
// 判断是否是 ExceptionContext 或者 ActionExecutedContext
var exception = context is ExceptionContext exContext
? exContext.Exception
: context is ActionExecutedContext edContext
? edContext.Exception
: default;
if (exception is AbpValidationException validationException)
{
errors = validationException.ValidationErrors;
isValidationException = true;
}
// 判断是否是友好异常
if (exception is UserFriendlyException friendlyException)
{
var statusCode2 = 500;
int.TryParse(friendlyException.Code, out statusCode2);
isFriendlyException = true;
errorCode = friendlyException.Code;
originErrorCode = friendlyException.Code;
statusCode = statusCode2 == 0 ? 403 : statusCode2;
errors = friendlyException.Message;
data = friendlyException.Data;
}
return new ExceptionMetadata
{
StatusCode = statusCode,
ErrorCode = errorCode,
OriginErrorCode = originErrorCode,
Errors = errors,
Data = data
};
}
}

View File

@@ -0,0 +1,276 @@
using System.Collections;
using System.Reflection;
using System.Text.Encodings.Web;
using System.Text.Json;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.DependencyInjection;
using Yi.Framework.Core.Extensions;
namespace Yi.Framework.AspNetCore.UnifyResult.Fiters;
/// <summary>
/// 规范化结构(请求成功)过滤器
/// </summary>
public class SucceededUnifyResultFilter : IAsyncActionFilter, IOrderedFilter
{
/// <summary>
/// 过滤器排序
/// </summary>
private const int FilterOrder = 8888;
/// <summary>
/// 排序属性
/// </summary>
public int Order => FilterOrder;
/// <summary>
/// 处理规范化结果
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
// 执行 Action 并获取结果
var actionExecutedContext = await next();
// 排除 WebSocket 请求处理
if (actionExecutedContext.HttpContext.IsWebSocketRequest()) return;
// 处理已经含有状态码结果的 Result
if (actionExecutedContext.Result is IStatusCodeActionResult statusCodeResult &&
statusCodeResult.StatusCode != null)
{
// 小于 200 或者 大于 299 都不是成功值,直接跳过
if (statusCodeResult.StatusCode.Value < 200 || statusCodeResult.StatusCode.Value > 299)
{
// 处理规范化结果
if (!CheckStatusCodeNonUnify(context.HttpContext, out var unifyRes))
{
var httpContext = context.HttpContext;
var statusCode = statusCodeResult.StatusCode.Value;
// 解决刷新 Token 时间和 Token 时间相近问题
if (statusCodeResult.StatusCode.Value == StatusCodes.Status401Unauthorized
&& httpContext.Response.Headers.ContainsKey("access-token")
&& httpContext.Response.Headers.ContainsKey("x-access-token"))
{
httpContext.Response.StatusCode = statusCode = StatusCodes.Status403Forbidden;
}
// 如果 Response 已经完成输出,则禁止写入
if (httpContext.Response.HasStarted) return;
await unifyRes.OnResponseStatusCodes(httpContext, statusCode,
httpContext.RequestServices.GetService<IOptions<UnifyResultSettingsOptions>>()?.Value);
}
return;
}
}
// 如果出现异常,则不会进入该过滤器
if (actionExecutedContext.Exception != null) return;
// 获取控制器信息
var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
// 判断是否支持 MVC 规范化处理,检测配置而已
// if (!UnifyContext.CheckSupportMvcController(context.HttpContext, actionDescriptor, out _)) return;
// 判断是否跳过规范化处理检测NonUnifyAttribute而已
if (CheckSucceededNonUnify(actionDescriptor.MethodInfo))
{
return;
}
IUnifyResultProvider unifyResult = context.GetRequiredService<IUnifyResultProvider>();
// 处理 BadRequestObjectResult 类型规范化处理
if (actionExecutedContext.Result is BadRequestObjectResult badRequestObjectResult)
{
// 解析验证消息
var validationMetadata = GetValidationMetadata(badRequestObjectResult.Value);
var result = unifyResult.OnValidateFailed(context, validationMetadata);
if (result != null) actionExecutedContext.Result = result;
}
else
{
IActionResult result = default;
// 检查是否是有效的结果(可进行规范化的结果)
if (CheckVaildResult(actionExecutedContext.Result, out var data))
{
result = unifyResult.OnSucceeded(actionExecutedContext, data);
}
// 如果是不能规范化的结果类型,则跳过
if (result == null) return;
actionExecutedContext.Result = result;
}
}
/// <summary>
/// 获取验证错误信息
/// </summary>
/// <param name="errors"></param>
/// <returns></returns>
private static ValidationMetadata GetValidationMetadata(object errors)
{
ModelStateDictionary _modelState = null;
object validationResults = null;
(string message, string firstErrorMessage, string firstErrorProperty) = (default, default, default);
// 判断是否是集合类型
if (errors is IEnumerable && errors is not string)
{
// 如果是模型验证字典类型
if (errors is ModelStateDictionary modelState)
{
_modelState = modelState;
// 将验证错误信息转换成字典并序列化成 Json
validationResults = modelState.Where(u => modelState[u.Key].ValidationState == ModelValidationState.Invalid)
.ToDictionary(u => u.Key, u => modelState[u.Key].Errors.Select(c => c.ErrorMessage).ToArray());
}
// 如果是 ValidationProblemDetails 特殊类型
else if (errors is ValidationProblemDetails validation)
{
validationResults = validation.Errors
.ToDictionary(u => u.Key, u => u.Value.ToArray());
}
// 如果是字典类型
else if (errors is Dictionary<string, string[]> dicResults)
{
validationResults = dicResults;
}
message = JsonSerializer.Serialize(validationResults, new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true
});
firstErrorMessage = (validationResults as Dictionary<string, string[]>).First().Value[0];
firstErrorProperty = (validationResults as Dictionary<string, string[]>).First().Key;
}
// 其他类型
else
{
validationResults = firstErrorMessage = message = errors?.ToString();
}
return new ValidationMetadata
{
ValidationResult = validationResults,
Message = message,
ModelState = _modelState,
FirstErrorProperty = firstErrorProperty,
FirstErrorMessage = firstErrorMessage
};
}
/// <summary>
/// 检查是否是有效的结果(可进行规范化的结果)
/// </summary>
/// <param name="result"></param>
/// <param name="data"></param>
/// <returns></returns>
private bool CheckVaildResult(IActionResult result, out object data)
{
data = default;
// 排除以下结果,跳过规范化处理
var isDataResult = result switch
{
ViewResult => false,
PartialViewResult => false,
FileResult => false,
ChallengeResult => false,
SignInResult => false,
SignOutResult => false,
RedirectToPageResult => false,
RedirectToRouteResult => false,
RedirectResult => false,
RedirectToActionResult => false,
LocalRedirectResult => false,
ForbidResult => false,
ViewComponentResult => false,
PageResult => false,
NotFoundResult => false,
NotFoundObjectResult => false,
_ => true,
};
// 目前支持返回值 ActionResult
if (isDataResult) data = result switch
{
// 处理内容结果
ContentResult content => content.Content,
// 处理对象结果
ObjectResult obj => obj.Value,
// 处理 JSON 对象
JsonResult json => json.Value,
_ => null,
};
return isDataResult;
}
/// <summary>
/// 检查短路状态码(>=400是否进行规范化处理
/// </summary>
/// <param name="context"></param>
/// <param name="unifyResult"></param>
/// <returns>返回 true 跳过处理,否则进行规范化处理</returns>
internal static bool CheckStatusCodeNonUnify(HttpContext context, out IUnifyResultProvider unifyResult)
{
// 获取终点路由特性
var endpointFeature = context.Features.Get<IEndpointFeature>();
if (endpointFeature == null) return (unifyResult = null) == null;
// 判断是否跳过规范化处理
var isSkip = context.GetEndpoint()?.Metadata?.GetMetadata<NonUnifyAttribute>()!= null
|| endpointFeature?.Endpoint?.Metadata?.GetMetadata<NonUnifyAttribute>() != null
|| context.Request.Headers["accept"].ToString().Contains("odata.metadata=", StringComparison.OrdinalIgnoreCase)
|| context.Request.Headers["accept"].ToString().Contains("odata.streaming=", StringComparison.OrdinalIgnoreCase);
if (isSkip == true) unifyResult = null;
else
{
unifyResult = context.RequestServices.GetRequiredService<IUnifyResultProvider>();
}
return unifyResult == null || isSkip;
}
/// <summary>
/// 检查请求成功是否进行规范化处理
/// </summary>
/// <param name="method"></param>
/// <param name="isWebRequest"></param>
/// <returns>返回 true 跳过处理,否则进行规范化处理</returns>
private bool CheckSucceededNonUnify(MethodInfo method, bool isWebRequest = true)
{
// 判断是否跳过规范化处理
var isSkip = method.CustomAttributes.Any(x => typeof(NonUnifyAttribute).IsAssignableFrom(x.AttributeType) || typeof(ProducesResponseTypeAttribute).IsAssignableFrom(x.AttributeType) || typeof(IApiResponseMetadataProvider).IsAssignableFrom(x.AttributeType))
|| method.ReflectedType.IsDefined(typeof(NonUnifyAttribute), true)
|| method.DeclaringType.Assembly.GetName().Name.StartsWith("Microsoft.AspNetCore.OData");
if (!isWebRequest)
{
return isSkip;
}
return isSkip;
}
}

View File

@@ -0,0 +1,58 @@
// MIT 许可证
//
// 版权 © 2020-present 百小僧, 百签科技(广东)有限公司 和所有贡献者
//
// 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,
// 包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,
// 以及再授权被配发了本软件的人如上的权利,须在下列条件下:
//
// 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。
//
// 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。
// 在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,
// 还是产生于、源于或有关于本软件以及本软件的使用或其它处置。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace Yi.Framework.AspNetCore.UnifyResult;
/// <summary>
/// 规范化结果提供器
/// </summary>
public interface IUnifyResultProvider
{
/// <summary>
/// 异常返回值
/// </summary>
/// <param name="context"></param>
/// <param name="metadata"></param>
/// <returns></returns>
IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata);
/// <summary>
/// 成功返回值
/// </summary>
/// <param name="context"></param>
/// <param name="data"></param>
/// <returns></returns>
IActionResult OnSucceeded(ActionExecutedContext context, object data);
/// <summary>
/// 验证失败返回值
/// </summary>
/// <param name="context"></param>
/// <param name="metadata"></param>
/// <returns></returns>
IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata);
/// <summary>
/// 拦截返回状态码
/// </summary>
/// <param name="context"></param>
/// <param name="statusCode"></param>
/// <param name="unifyResultSettings"></param>
/// <returns></returns>
Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings = default);
}

View File

@@ -0,0 +1,23 @@
// MIT 许可证
//
// 版权 © 2020-present 百小僧, 百签科技(广东)有限公司 和所有贡献者
//
// 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,
// 包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,
// 以及再授权被配发了本软件的人如上的权利,须在下列条件下:
//
// 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。
//
// 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。
// 在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,
// 还是产生于、源于或有关于本软件以及本软件的使用或其它处置。
namespace Yi.Framework.AspNetCore.UnifyResult;
/// <summary>
/// 禁止规范化处理
/// </summary>
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public sealed class NonUnifyAttribute : Attribute
{
}

View File

@@ -0,0 +1,136 @@
// MIT 许可证
//
// 版权 © 2020-present 百小僧, 百签科技(广东)有限公司 和所有贡献者
//
// 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,
// 包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,
// 以及再授权被配发了本软件的人如上的权利,须在下列条件下:
//
// 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。
//
// 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。
// 在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,
// 还是产生于、源于或有关于本软件以及本软件的使用或其它处置。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Volo.Abp.DependencyInjection;
namespace Yi.Framework.AspNetCore.UnifyResult.Providers;
/// <summary>
/// RESTful 风格返回值
/// </summary>
[Dependency(TryRegister = true)]
[ExposeServices(typeof(IUnifyResultProvider))]
public class RESTfulResultProvider : IUnifyResultProvider,ITransientDependency
{
/// <summary>
/// 设置响应状态码
/// </summary>
/// <param name="context"></param>
/// <param name="statusCode"></param>
/// <param name="unifyResultSettings"></param>
public static void SetResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings)
{
if (unifyResultSettings == null) return;
// 篡改响应状态码
if (unifyResultSettings.AdaptStatusCodes != null && unifyResultSettings.AdaptStatusCodes.Length > 0)
{
var adaptStatusCode = unifyResultSettings.AdaptStatusCodes.FirstOrDefault(u => u[0] == statusCode);
if (adaptStatusCode != null && adaptStatusCode.Length > 0 && adaptStatusCode[0] > 0)
{
context.Response.StatusCode = adaptStatusCode[1];
return;
}
}
// 如果为 null则所有请求错误的状态码设置为 200
if (unifyResultSettings.Return200StatusCodes == null) context.Response.StatusCode = 200;
// 否则只有里面的才设置为 200
else if (unifyResultSettings.Return200StatusCodes.Contains(statusCode)) context.Response.StatusCode = 200;
else { }
}
/// <summary>
/// 异常返回值
/// </summary>
/// <param name="context"></param>
/// <param name="metadata"></param>
/// <returns></returns>
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
{
return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors));
}
/// <summary>
/// 成功返回值
/// </summary>
/// <param name="context"></param>
/// <param name="data"></param>
/// <returns></returns>
public IActionResult OnSucceeded(ActionExecutedContext context, object data)
{
return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data));
}
/// <summary>
/// 验证失败/业务异常返回值
/// </summary>
/// <param name="context"></param>
/// <param name="metadata"></param>
/// <returns></returns>
public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
{
return new JsonResult(RESTfulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, data: metadata.Data, errors: metadata.ValidationResult));
}
/// <summary>
/// 特定状态码返回值
/// </summary>
/// <param name="context"></param>
/// <param name="statusCode"></param>
/// <param name="unifyResultSettings"></param>
/// <returns></returns>
public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings)
{
// 设置响应状态码
SetResponseStatusCodes(context, statusCode, unifyResultSettings);
switch (statusCode)
{
// 处理 401 状态码
case StatusCodes.Status401Unauthorized:
await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "401 Unauthorized"));
break;
// 处理 403 状态码
case StatusCodes.Status403Forbidden:
await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "403 Forbidden"));
break;
default: break;
}
}
/// <summary>
/// 返回 RESTful 风格结果集
/// </summary>
/// <param name="statusCode"></param>
/// <param name="succeeded"></param>
/// <param name="data"></param>
/// <param name="errors"></param>
/// <returns></returns>
public static RESTfulResult<object> RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default)
{
return new RESTfulResult<object>
{
StatusCode = statusCode,
Succeeded = succeeded,
Data = data,
Errors = errors,
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
};
}
}

View File

@@ -0,0 +1,52 @@
// MIT 许可证
//
// 版权 © 2020-present 百小僧, 百签科技(广东)有限公司 和所有贡献者
//
// 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,
// 包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,
// 以及再授权被配发了本软件的人如上的权利,须在下列条件下:
//
// 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。
//
// 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。
// 在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,
// 还是产生于、源于或有关于本软件以及本软件的使用或其它处置。
namespace Yi.Framework.AspNetCore.UnifyResult;
/// <summary>
/// RESTful 风格结果集
/// </summary>
/// <typeparam name="T"></typeparam>
public class RESTfulResult<T>
{
/// <summary>
/// 状态码
/// </summary>
public int? StatusCode { get; set; }
/// <summary>
/// 数据
/// </summary>
public T Data { get; set; }
/// <summary>
/// 执行成功
/// </summary>
public bool Succeeded { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public object Errors { get; set; }
/// <summary>
/// 附加数据
/// </summary>
public object Extras { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public long Timestamp { get; set; }
}

View File

@@ -0,0 +1,31 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Swashbuckle.AspNetCore.SwaggerGen;
using Volo.Abp.AspNetCore.Mvc.ExceptionHandling;
using Volo.Abp.AspNetCore.Mvc.Response;
using Yi.Framework.AspNetCore.UnifyResult.Fiters;
namespace Yi.Framework.AspNetCore.UnifyResult;
/// <summary>
/// 规范化接口
/// 由于太多人反应想兼容一套类似furion的返回情况200状态码包一层更符合国内习惯既然如此不如直接搬过来
/// </summary>
public static class UnifyResultExtensions
{
public static IServiceCollection AddFurionUnifyResultApi(this IServiceCollection services)
{
//成功规范接口
services.AddTransient<SucceededUnifyResultFilter>();
//异常规范接口
services.AddTransient<FriendlyExceptionFilter>();
services.AddMvc(options =>
{
options.Filters.RemoveAll(x => (x as ServiceFilterAttribute)?.ServiceType == typeof(AbpExceptionFilter));
options.Filters.RemoveAll(x => (x as ServiceFilterAttribute)?.ServiceType == typeof(AbpNoContentActionFilter));
options.Filters.AddService<SucceededUnifyResultFilter>(99);
options.Filters.AddService<FriendlyExceptionFilter>(100);
});
return services;
}
}

View File

@@ -0,0 +1,50 @@
// MIT 许可证
//
// 版权 © 2020-present 百小僧, 百签科技(广东)有限公司 和所有贡献者
//
// 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,
// 包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,
// 以及再授权被配发了本软件的人如上的权利,须在下列条件下:
//
// 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。
//
// 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。
// 在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,
// 还是产生于、源于或有关于本软件以及本软件的使用或其它处置。
using Microsoft.Extensions.Configuration;
namespace Yi.Framework.AspNetCore.UnifyResult;
/// <summary>
/// 规范化配置选项
/// </summary>
public sealed class UnifyResultSettingsOptions
{
/// <summary>
/// 设置返回 200 状态码列表
/// <para>默认401403如果设置为 null则标识所有状态码都返回 200 </para>
/// </summary>
public int[] Return200StatusCodes { get; set; }
/// <summary>
/// 适配篡改Http 状态码(只支持短路状态码,比如 401403500 等)
/// </summary>
public int[][] AdaptStatusCodes { get; set; }
/// <summary>
/// 是否支持 MVC 控制台规范化处理
/// </summary>
public bool? SupportMvcController { get; set; }
/// <summary>
/// 选项后期配置
/// </summary>
/// <param name="options"></param>
/// <param name="configuration"></param>
public void PostConfigure(UnifyResultSettingsOptions options, IConfiguration configuration)
{
options.Return200StatusCodes ??= new[] { 401, 403 };
options.SupportMvcController ??= false;
}
}

View File

@@ -0,0 +1,69 @@
// MIT 许可证
//
// 版权 © 2020-present 百小僧, 百签科技(广东)有限公司 和所有贡献者
//
// 特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,
// 包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,
// 以及再授权被配发了本软件的人如上的权利,须在下列条件下:
//
// 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。
//
// 本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。
// 在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,
// 还是产生于、源于或有关于本软件以及本软件的使用或其它处置。
using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace Yi.Framework.AspNetCore.UnifyResult;
/// <summary>
/// 验证信息元数据
/// </summary>
public sealed class ValidationMetadata
{
/// <summary>
/// 验证结果
/// </summary>
/// <remarks>返回字典或字符串类型</remarks>
public object ValidationResult { get; internal set; }
/// <summary>
/// 异常消息
/// </summary>
public string Message { get; internal set; }
/// <summary>
/// 验证状态
/// </summary>
public ModelStateDictionary ModelState { get; internal set; }
/// <summary>
/// 错误码
/// </summary>
public object ErrorCode { get; internal set; }
/// <summary>
/// 错误码(没被复写过的 ErrorCode
/// </summary>
public object OriginErrorCode { get; internal set; }
/// <summary>
/// 状态码
/// </summary>
public int? StatusCode { get; internal set; }
/// <summary>
/// 首个错误属性
/// </summary>
public string FirstErrorProperty { get; internal set; }
/// <summary>
/// 首个错误消息
/// </summary>
public string FirstErrorMessage { get; internal set; }
/// <summary>
/// 额外数据
/// </summary>
public object Data { get; internal set; }
}

View File

@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<ItemGroup>
<Compile Remove="Cors\**" />
<EmbeddedResource Remove="Cors\**" />
<None Remove="Cors\**" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Json" Version="$(AbpVersion)" />
<PackageReference Include="Volo.Abp.Swashbuckle" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Yi.Framework.Core\Yi.Framework.Core.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,37 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.AspNetCore.WebClientInfo;
using Yi.Framework.AspNetCore.Microsoft.AspNetCore.Authentication;
using Yi.Framework.Core;
using Yi.Framework.Core.Authentication;
namespace Yi.Framework.AspNetCore
{
/// <summary>
/// Yi框架ASP.NET Core模块
/// </summary>
[DependsOn(typeof(YiFrameworkCoreModule))]
public class YiFrameworkAspNetCoreModule : AbpModule
{
/// <summary>
/// 配置服务后的处理
/// </summary>
public override void PostConfigureServices(ServiceConfigurationContext context)
{
var services = context.Services;
// 替换默认的WebClientInfoProvider为支持代理的实现
services.Replace(new ServiceDescriptor(
typeof(IWebClientInfoProvider),
typeof(RealIpHttpContextWebClientInfoProvider),
ServiceLifetime.Transient));
// 替换默认的AuthenticationHandlerProvider为支持刷新鉴权
services.Replace(new ServiceDescriptor(
typeof(IAuthenticationHandlerProvider),
typeof(RefreshAuthenticationHandlerProvider),
ServiceLifetime.Scoped));
}
}
}

View File

@@ -0,0 +1,77 @@
using Hangfire.Server;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
using Volo.Abp.Uow;
namespace Yi.Framework.BackgroundWorkers.Hangfire;
/// <summary>
/// Hangfire 工作单元过滤器
/// 用于管理后台任务的事务处理
/// </summary>
public sealed class UnitOfWorkHangfireFilter : IServerFilter, ISingletonDependency
{
private const string UnitOfWorkItemKey = "HangfireUnitOfWork";
private readonly IUnitOfWorkManager _unitOfWorkManager;
/// <summary>
/// 初始化工作单元过滤器
/// </summary>
/// <param name="unitOfWorkManager">工作单元管理器</param>
public UnitOfWorkHangfireFilter(IUnitOfWorkManager unitOfWorkManager)
{
_unitOfWorkManager = unitOfWorkManager;
}
/// <summary>
/// 任务执行前的处理
/// </summary>
/// <param name="context">执行上下文</param>
public void OnPerforming(PerformingContext context)
{
// 开启一个工作单元并存储到上下文中
var uow = _unitOfWorkManager.Begin();
context.Items.Add(UnitOfWorkItemKey, uow);
}
/// <summary>
/// 任务执行后的处理
/// </summary>
/// <param name="context">执行上下文</param>
public void OnPerformed(PerformedContext context)
{
AsyncHelper.RunSync(() => OnPerformedAsync(context));
}
/// <summary>
/// 任务执行后的异步处理
/// </summary>
/// <param name="context">执行上下文</param>
private async Task OnPerformedAsync(PerformedContext context)
{
if (!context.Items.TryGetValue(UnitOfWorkItemKey, out var obj) ||
obj is not IUnitOfWork uow)
{
return;
}
try
{
// 如果没有异常且工作单元未完成,则提交事务
if (context.Exception == null && !uow.IsCompleted)
{
await uow.CompleteAsync();
}
else
{
// 否则回滚事务
await uow.RollbackAsync();
}
}
finally
{
// 确保工作单元被释放
uow.Dispose();
}
}
}

View File

@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.BackgroundJobs.Hangfire" Version="$(AbpVersion)" />
<PackageReference Include="Volo.Abp.BackgroundWorkers.Hangfire" Version="$(AbpVersion)" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,91 @@
using System.Linq.Expressions;
using Hangfire;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.BackgroundJobs.Hangfire;
using Volo.Abp.BackgroundWorkers;
using Volo.Abp.BackgroundWorkers.Hangfire;
using Volo.Abp.DynamicProxy;
namespace Yi.Framework.BackgroundWorkers.Hangfire;
/// <summary>
/// Hangfire 后台任务模块
/// </summary>
[DependsOn(typeof(AbpBackgroundWorkersHangfireModule),
typeof(AbpBackgroundJobsHangfireModule))]
public sealed class YiFrameworkBackgroundWorkersHangfireModule : AbpModule
{
/// <summary>
/// 配置服务前的预处理
/// </summary>
/// <param name="context">服务配置上下文</param>
public override void PreConfigureServices(ServiceConfigurationContext context)
{
// 添加 Hangfire 后台任务约定注册器
context.Services.AddConventionalRegistrar(new YiHangfireConventionalRegistrar());
}
/// <summary>
/// 应用程序初始化
/// </summary>
/// <param name="context">应用程序初始化上下文</param>
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
if (!context.ServiceProvider.GetRequiredService<IOptions<AbpBackgroundWorkerOptions>>().Value.IsEnabled)
{
return;
}
// 获取后台任务管理器和所有 Hangfire 后台任务
var backgroundWorkerManager = context.ServiceProvider.GetRequiredService<IBackgroundWorkerManager>();
var workers = context.ServiceProvider.GetServices<IHangfireBackgroundWorker>();
// 获取配置
var configuration = context.ServiceProvider.GetRequiredService<IConfiguration>();
// 检查是否启用 Redis
var isRedisEnabled = configuration.GetValue<bool>("Redis:IsEnabled");
foreach (var worker in workers)
{
// 设置时区为本地时区(上海)
worker.TimeZone = TimeZoneInfo.Local;
if (isRedisEnabled)
{
// Redis 模式:使用 ABP 后台任务管理器
await backgroundWorkerManager.AddAsync(worker);
}
else
{
// 内存模式:直接使用 Hangfire
var unProxyWorker = ProxyHelper.UnProxy(worker);
// 添加或更新循环任务
RecurringJob.AddOrUpdate(
worker.RecurringJobId,
(Expression<Func<Task>>)(() =>
((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(default)),
worker.CronExpression,
new RecurringJobOptions
{
TimeZone = worker.TimeZone
});
}
}
}
/// <summary>
/// 应用程序初始化前的预处理
/// </summary>
/// <param name="context">应用程序初始化上下文</param>
public override void OnPreApplicationInitialization(ApplicationInitializationContext context)
{
// 添加工作单元过滤器
var services = context.ServiceProvider;
GlobalJobFilters.Filters.Add(services.GetRequiredService<UnitOfWorkHangfireFilter>());
}
}

View File

@@ -0,0 +1,34 @@
using Volo.Abp.BackgroundWorkers.Hangfire;
using Volo.Abp.DependencyInjection;
namespace Yi.Framework.BackgroundWorkers.Hangfire;
/// <summary>
/// Hangfire 后台任务约定注册器
/// </summary>
public sealed class YiHangfireConventionalRegistrar : DefaultConventionalRegistrar
{
/// <summary>
/// 检查类型是否禁用约定注册
/// </summary>
/// <param name="type">要检查的类型</param>
/// <returns>如果类型不是 IHangfireBackgroundWorker 或已被禁用则返回 true</returns>
protected override bool IsConventionalRegistrationDisabled(Type type)
{
return !typeof(IHangfireBackgroundWorker).IsAssignableFrom(type) ||
base.IsConventionalRegistrationDisabled(type);
}
/// <summary>
/// 获取要暴露的服务类型列表
/// </summary>
/// <param name="type">实现类型</param>
/// <returns>服务类型列表</returns>
protected override List<Type> GetExposedServiceTypes(Type type)
{
return new List<Type>
{
typeof(IHangfireBackgroundWorker)
};
}
}

View File

@@ -0,0 +1,148 @@
using Hangfire.Dashboard;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Users;
namespace Yi.Framework.BackgroundWorkers.Hangfire;
/// <summary>
/// Hangfire 仪表盘的令牌认证过滤器
/// </summary>
public sealed class YiTokenAuthorizationFilter : IDashboardAsyncAuthorizationFilter, ITransientDependency
{
private const string BearerPrefix = "Bearer ";
private const string TokenCookieKey = "Token";
private const string HtmlContentType = "text/html";
private readonly IServiceProvider _serviceProvider;
private string _requiredUsername = "cc";
private TimeSpan _tokenExpiration = TimeSpan.FromMinutes(10);
/// <summary>
/// 初始化令牌认证过滤器
/// </summary>
/// <param name="serviceProvider">服务提供者</param>
public YiTokenAuthorizationFilter(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
/// <summary>
/// 设置需要的用户名
/// </summary>
/// <param name="username">允许访问的用户名</param>
/// <returns>当前实例,支持链式调用</returns>
public YiTokenAuthorizationFilter SetRequiredUsername(string username)
{
_requiredUsername = username ?? throw new ArgumentNullException(nameof(username));
return this;
}
/// <summary>
/// 设置令牌过期时间
/// </summary>
/// <param name="expiration">过期时间间隔</param>
/// <returns>当前实例,支持链式调用</returns>
public YiTokenAuthorizationFilter SetTokenExpiration(TimeSpan expiration)
{
_tokenExpiration = expiration;
return this;
}
/// <summary>
/// 授权验证
/// </summary>
/// <param name="context">仪表盘上下文</param>
/// <returns>是否通过授权</returns>
public bool Authorize(DashboardContext context)
{
var httpContext = context.GetHttpContext();
var currentUser = _serviceProvider.GetRequiredService<ICurrentUser>();
if (!currentUser.IsAuthenticated)
{
SetChallengeResponse(httpContext);
return false;
}
// 如果验证通过,设置 cookie
var authorization = httpContext.Request.Headers.Authorization.ToString();
if (!string.IsNullOrWhiteSpace(authorization) && authorization.StartsWith(BearerPrefix))
{
var token = authorization[BearerPrefix.Length..];
SetTokenCookie(httpContext, token);
}
return currentUser.UserName == _requiredUsername;
}
/// <summary>
/// 设置认证挑战响应
/// 当用户未认证时返回一个包含令牌输入表单的HTML页面
/// </summary>
/// <param name="httpContext">HTTP 上下文</param>
private void SetChallengeResponse(HttpContext httpContext)
{
httpContext.Response.StatusCode = 401;
httpContext.Response.ContentType = HtmlContentType;
var html = @"
<html>
<head>
<title>Hangfire Dashboard Authorization</title>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
.container { max-width: 400px; margin: 0 auto; }
.form-group { margin-bottom: 15px; }
input[type='text'] { width: 100%; padding: 8px; }
button { background: #337ab7; color: white; border: none; padding: 10px 15px; cursor: pointer; }
button:hover { background: #286090; }
</style>
</head>
<body>
<div class='container'>
<h2>Authorization Required</h2>
<div class='form-group'>
<input type='text' id='token' placeholder='Enter your Bearer token...' />
</div>
<button onclick='authorize()'>Authorize</button>
</div>
<script>
function authorize() {
var token = document.getElementById('token').value;
if (token) {
document.cookie = 'Token=' + token + '; path=/';
window.location.reload();
}
}
</script>
</body>
</html>";
httpContext.Response.WriteAsync(html);
}
/// <summary>
/// 设置令牌 Cookie
/// </summary>
/// <param name="httpContext">HTTP 上下文</param>
/// <param name="token">令牌值</param>
private void SetTokenCookie(HttpContext httpContext, string token)
{
var cookieOptions = new CookieOptions
{
Expires = DateTimeOffset.Now.Add(_tokenExpiration),
HttpOnly = true,
Secure = httpContext.Request.IsHttps,
SameSite = SameSiteMode.Lax
};
httpContext.Response.Cookies.Append(TokenCookieKey, token, cookieOptions);
}
public Task<bool> AuthorizeAsync(DashboardContext context)
{
return Task.FromResult(Authorize(context));
}
}

View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FreeRedis;
namespace Yi.Framework.Caching.FreeRedis
{
/// <summary>
/// 便于转到定义
/// </summary>
public class FreeSqlOptions: ConnectionStringBuilder
{
}
}

View File

@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FreeRedis" Version="1.2.14" />
<PackageReference Include="FreeRedis.DistributedCache" Version="1.2.5" />
<PackageReference Include="Volo.Abp.Caching" Version="$(AbpVersion)" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Yi.Framework.Caching.FreeRedis
{
/// <summary>
/// 缓存键标准化处理器
/// 用于处理缓存键的格式化和多租户支持
/// </summary>
[Dependency(ReplaceServices = true)]
public class YiDistributedCacheKeyNormalizer : IDistributedCacheKeyNormalizer, ITransientDependency
{
private readonly ICurrentTenant _currentTenant;
private readonly AbpDistributedCacheOptions _distributedCacheOptions;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="currentTenant">当前租户服务</param>
/// <param name="distributedCacheOptions">分布式缓存配置选项</param>
public YiDistributedCacheKeyNormalizer(
ICurrentTenant currentTenant,
IOptions<AbpDistributedCacheOptions> distributedCacheOptions)
{
_currentTenant = currentTenant;
_distributedCacheOptions = distributedCacheOptions.Value;
}
/// <summary>
/// 标准化缓存键
/// </summary>
/// <param name="args">缓存键标准化参数</param>
/// <returns>标准化后的缓存键</returns>
public virtual string NormalizeKey(DistributedCacheKeyNormalizeArgs args)
{
// 添加全局缓存前缀
var normalizedKey = $"{_distributedCacheOptions.KeyPrefix}{args.Key}";
//todo 多租户支持已注释,如需启用取消注释即可
//if (!args.IgnoreMultiTenancy && _currentTenant.Id.HasValue)
//{
// normalizedKey = $"t:{_currentTenant.Id.Value},{normalizedKey}";
//}
return normalizedKey;
}
}
}

View File

@@ -0,0 +1,64 @@
using FreeRedis;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Caching;
namespace Yi.Framework.Caching.FreeRedis
{
/// <summary>
/// FreeRedis缓存模块
/// 提供基于FreeRedis的分布式缓存实现
/// </summary>
[DependsOn(typeof(AbpCachingModule))]
public class YiFrameworkCachingFreeRedisModule : AbpModule
{
private const string RedisEnabledKey = "Redis:IsEnabled";
private const string RedisConfigurationKey = "Redis:Configuration";
/// <summary>
/// 配置服务
/// </summary>
/// <param name="context">服务配置上下文</param>
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
// 检查Redis是否启用
if (!IsRedisEnabled(configuration))
{
return;
}
// 注册Redis服务
RegisterRedisServices(context, configuration);
}
/// <summary>
/// 检查Redis是否启用
/// </summary>
/// <param name="configuration">配置</param>
/// <returns>是否启用Redis</returns>
private static bool IsRedisEnabled(IConfiguration configuration)
{
var redisEnabled = configuration[RedisEnabledKey];
return redisEnabled.IsNullOrEmpty() || bool.Parse(redisEnabled);
}
/// <summary>
/// 注册Redis相关服务
/// </summary>
/// <param name="context">服务配置上下文</param>
/// <param name="configuration">配置</param>
private static void RegisterRedisServices(ServiceConfigurationContext context, IConfiguration configuration)
{
var redisConfiguration = configuration[RedisConfigurationKey];
var redisClient = new RedisClient(redisConfiguration);
context.Services.AddSingleton<IRedisClient>(redisClient);
context.Services.Replace(ServiceDescriptor.Singleton<IDistributedCache>(
new DistributedCache(redisClient)));
}
}
}

View File

@@ -0,0 +1,18 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
namespace Yi.Framework.Core.Authentication;
public static class AuthenticationExtensions
{
public static void RefreshAuthentication(this HttpContext context)
{
var currentAuthenticationHandler =
context.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
if (currentAuthenticationHandler is IRefreshAuthenticationHandlerProvider refreshAuthenticationHandler)
{
refreshAuthenticationHandler.RefreshAuthentication();
}
}
}

View File

@@ -0,0 +1,11 @@
using Microsoft.AspNetCore.Authentication;
namespace Yi.Framework.Core.Authentication;
public interface IRefreshAuthenticationHandlerProvider: IAuthenticationHandlerProvider
{
/// <summary>
/// 刷新鉴权
/// </summary>
void RefreshAuthentication();
}

View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Data
{
/// <summary>
/// 排序接口
/// </summary>
/// <remarks>
/// 实现此接口的实体类将支持排序功能
/// 通常用于列表数据的展示顺序控制
/// </remarks>
public interface IOrderNum
{
/// <summary>
/// 排序号
/// </summary>
/// <remarks>
/// 数字越小越靠前,默认为0
/// </remarks>
int OrderNum { get; set; }
}
}

View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Data
{
/// <summary>
/// 状态接口
/// </summary>
/// <remarks>
/// 实现此接口的实体类将支持启用/禁用状态管理
/// 用于控制数据记录的可用状态
/// </remarks>
public interface IState
{
/// <summary>
/// 状态标识
/// </summary>
/// <remarks>
/// true表示启用,false表示禁用
/// </remarks>
bool State { get; set; }
}
}

View File

@@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Enums
{
/// <summary>
/// 文件类型枚举
/// </summary>
/// <remarks>
/// 用于定义系统支持的文件类型分类
/// 主要用于文件上传和存储时的类型区分
/// </remarks>
public enum FileTypeEnum
{
/// <summary>
/// 普通文件
/// </summary>
file = 0,
/// <summary>
/// 图片文件
/// </summary>
image = 1,
/// <summary>
/// 缩略图文件
/// </summary>
thumbnail = 2,
/// <summary>
/// Excel文件
/// </summary>
excel = 3,
/// <summary>
/// 临时文件
/// </summary>
temp = 4
}
}

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Enums
{
/// <summary>
/// 排序方向枚举
/// </summary>
/// <remarks>
/// 用于定义数据查询时的排序方向
/// 常用于列表数据排序
/// </remarks>
public enum OrderByEnum
{
/// <summary>
/// 升序排列
/// </summary>
Asc = 0,
/// <summary>
/// 降序排列
/// </summary>
Desc = 1
}
}

View File

@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Enums
{
/// <summary>
/// 查询操作符枚举
/// </summary>
/// <remarks>
/// 定义查询条件中支持的操作符类型
/// 用于构建动态查询条件
/// </remarks>
public enum QueryOperatorEnum
{
/// <summary>
/// 等于
/// </summary>
Equal = 0,
/// <summary>
/// 模糊匹配
/// </summary>
Like = 1,
/// <summary>
/// 大于
/// </summary>
GreaterThan = 2,
/// <summary>
/// 大于或等于
/// </summary>
GreaterThanOrEqual = 3,
/// <summary>
/// 小于
/// </summary>
LessThan = 4,
/// <summary>
/// 小于或等于
/// </summary>
LessThanOrEqual = 5,
/// <summary>
/// 在指定集合中
/// </summary>
In = 6,
/// <summary>
/// 不在指定集合中
/// </summary>
NotIn = 7,
/// <summary>
/// 左侧模糊匹配
/// </summary>
LikeLeft = 8,
/// <summary>
/// 右侧模糊匹配
/// </summary>
LikeRight = 9,
/// <summary>
/// 不等于
/// </summary>
NoEqual = 10,
/// <summary>
/// 为null或空
/// </summary>
IsNullOrEmpty = 11,
/// <summary>
/// 不为null
/// </summary>
IsNot = 12,
/// <summary>
/// 不匹配
/// </summary>
NoLike = 13,
/// <summary>
/// 日期范围
/// </summary>
/// <remarks>
/// 使用"|"分隔起始和结束日期
/// </remarks>
DateRange = 14
}
}

View File

@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Enums
{
/// <summary>
/// API返回状态码枚举
/// </summary>
/// <remarks>
/// 定义API接口统一的返回状态码
/// 遵循HTTP状态码规范
/// </remarks>
public enum ResultCodeEnum
{
/// <summary>
/// 操作成功
/// </summary>
Success = 200,
/// <summary>
/// 未授权访问
/// </summary>
NoPermission = 401,
/// <summary>
/// 访问被拒绝
/// </summary>
Denied = 403,
/// <summary>
/// 操作失败
/// </summary>
NotSuccess = 500
}
}

View File

@@ -0,0 +1,134 @@
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Http;
namespace Yi.Framework.Core.Extensions
{
/// <summary>
/// HttpContext扩展方法类
/// </summary>
public static class HttpContextExtensions
{
/// <summary>
/// 设置内联文件下载响应头
/// </summary>
/// <param name="httpContext">HTTP上下文</param>
/// <param name="fileName">文件名</param>
public static void FileInlineHandle(this HttpContext httpContext, string fileName)
{
var encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.UTF8);
httpContext.Response.Headers.Add("Content-Disposition", $"inline;filename={encodeFilename}");
}
/// <summary>
/// 设置附件下载响应头
/// </summary>
/// <param name="httpContext">HTTP上下文</param>
/// <param name="fileName">文件名</param>
public static void FileAttachmentHandle(this HttpContext httpContext, string fileName)
{
var encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.UTF8);
httpContext.Response.Headers.Add("Content-Disposition", $"attachment;filename={encodeFilename}");
}
/// <summary>
/// 获取客户端首选语言
/// </summary>
/// <param name="httpContext">HTTP上下文</param>
/// <returns>语言代码,默认返回zh-CN</returns>
public static string GetLanguage(this HttpContext httpContext)
{
const string defaultLanguage = "zh-CN";
var acceptLanguage = httpContext.Request.Headers["Accept-Language"].FirstOrDefault();
return string.IsNullOrEmpty(acceptLanguage)
? defaultLanguage
: acceptLanguage.Split(',')[0];
}
/// <summary>
/// 判断是否为Ajax请求
/// </summary>
/// <param name="request">HTTP请求</param>
/// <returns>是否为Ajax请求</returns>
public static bool IsAjaxRequest(this HttpRequest request)
{
const string ajaxHeader = "XMLHttpRequest";
return ajaxHeader.Equals(request.Headers["X-Requested-With"],
StringComparison.OrdinalIgnoreCase);
}
/// <summary>
/// 获取客户端IP地址
/// </summary>
/// <param name="context">HTTP上下文</param>
/// <returns>客户端IP地址</returns>
public static string GetClientIp(this HttpContext context)
{
const string localhost = "127.0.0.1";
if (context == null) return string.Empty;
// 尝试获取X-Forwarded-For头
var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
// 如果没有代理头,则获取远程IP
if (string.IsNullOrEmpty(ip))
{
ip = context.Connection.RemoteIpAddress?.ToString();
}
// 处理特殊IP
if (string.IsNullOrEmpty(ip) || ip.Contains("::1"))
{
return localhost;
}
// 清理IPv6格式
ip = ip.Replace("::ffff:", localhost);
// 移除端口号
ip = Regex.Replace(ip, @":\d{1,5}$", "");
// 验证IP格式
var isValidIp = Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$") ||
Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?):\d{1,5}$");
return isValidIp ? ip : localhost;
}
/// <summary>
/// 获取User-Agent信息
/// </summary>
/// <param name="context">HTTP上下文</param>
/// <returns>User-Agent字符串</returns>
public static string GetUserAgent(this HttpContext context)
{
return context.Request.Headers["User-Agent"].ToString();
}
/// <summary>
/// 获取用户权限声明值
/// </summary>
/// <param name="context">HTTP上下文</param>
/// <param name="permissionsName">权限声明名称</param>
/// <returns>权限值数组</returns>
public static string[]? GetUserPermissions(this HttpContext context, string permissionsName)
{
return context.User.Claims
.Where(x => x.Type == permissionsName)
.Select(x => x.Value)
.ToArray();
}
/// <summary>
/// 判断是否为WebSocket请求
/// </summary>
/// <param name="context">HTTP上下文</param>
/// <returns>是否为WebSocket请求</returns>
public static bool IsWebSocketRequest(this HttpContext context)
{
return context.WebSockets.IsWebSocketRequest ||
context.Request.Path == "/ws";
}
}
}

View File

@@ -0,0 +1,94 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Helper
{
public static class AssemblyHelper
{
/// <summary>
/// 此处统一获取程序集,排除微软内部相关
/// </summary>
/// <returns></returns>
public static Assembly[] GetAllLoadAssembly()
{
return AppDomain.CurrentDomain.GetAssemblies();
}
public static List<Assembly> GetReferanceAssemblies(this AppDomain domain)
{
var list = new List<Assembly>();
domain.GetAssemblies().ToList().ForEach(i =>
{
GetReferanceAssemblies(i, list);
});
return list;
}
private static void GetReferanceAssemblies(Assembly assembly, List<Assembly> list)
{
assembly.GetReferencedAssemblies().ToList().ForEach(i =>
{
var ass = Assembly.Load(i);
if (!list.Contains(ass))
{
list.Add(ass);
GetReferanceAssemblies(ass, list);
}
});
}
public static List<Type> GetClass(string assemblyFile, string? className = null, string? spaceName = null)
{
Assembly assembly = Assembly.Load(assemblyFile);
return assembly.GetTypes().Where(m => m.IsClass
&& className == null ? true : m.Name == className
&& spaceName == null ? true : m.Namespace == spaceName
&& !m.Name.StartsWith("<>")
).ToList();
}
public static List<Type> GetClassByParentClass(string assemblyFile, Type type)
{
Assembly assembly = Assembly.Load(assemblyFile);
List<Type> resList = new List<Type>();
List<Type> typeList = assembly.GetTypes().Where(m => m.IsClass).ToList();
foreach (var t in typeList)
{
var data = t.BaseType;
if (data == type)
{
resList.Add(t);
}
}
return resList;
}
public static List<Type> GetClassByInterfaces(string assemblyFile, Type type)
{
Assembly assembly = Assembly.Load(assemblyFile);
List<Type> resList = new List<Type>();
List<Type> typeList = assembly.GetTypes().Where(m => m.IsClass).ToList();
foreach (var t in typeList)
{
var data = t.GetInterfaces();
if (data.Contains(type))
{
resList.Add(t);
}
}
return resList;
}
}
}

View File

@@ -1,7 +1,7 @@
using System;
using System.Text;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public sealed class Base32Helper
{
@@ -26,12 +26,12 @@ namespace Yi.Framework.Common.Helper
{
// get the last piece from the current byte, shift it to the right
// and increment the byte counter
index = (byte)(bytes[currentByte++] >> (hi - 5));
index = (byte)(bytes[currentByte++] >> hi - 5);
if (currentByte != bytes.Length)
{
// if we are not at the end, get the first piece from
// the next byte, clear it and shift it to the left
index = (byte)(((byte)(bytes[currentByte] << (16 - hi)) >> 3) | index);
index = (byte)((byte)(bytes[currentByte] << 16 - hi) >> 3 | index);
}
hi -= 3;
@@ -45,7 +45,7 @@ namespace Yi.Framework.Common.Helper
{
// simply get the stuff from the current byte
index = (byte)((byte)(bytes[currentByte] << (8 - hi)) >> 3);
index = (byte)((byte)(bytes[currentByte] << 8 - hi) >> 3);
hi += 5;
}
@@ -59,13 +59,13 @@ namespace Yi.Framework.Common.Helper
/// <summary>
/// Converts a Base32-k string into an array of bytes.
/// </summary>
/// <exception cref="System.ArgumentException">
/// <exception cref="ArgumentException">
/// Input string <paramref name="s">s</paramref> contains invalid Base32-k characters.
/// </exception>
public static byte[] FromBase32String(string str)
{
int numBytes = str.Length * 5 / 8;
byte[] bytes = new Byte[numBytes];
byte[] bytes = new byte[numBytes];
// all UPPERCASE chars
str = str.ToUpper();
@@ -80,7 +80,7 @@ namespace Yi.Framework.Common.Helper
return bytes;
}
bit_buffer = (ValidChars.IndexOf(str[0]) | ValidChars.IndexOf(str[1]) << 5);
bit_buffer = ValidChars.IndexOf(str[0]) | ValidChars.IndexOf(str[1]) << 5;
bits_in_buffer = 10;
currentCharIndex = 2;
for (int i = 0; i < bytes.Length; i++)

View File

@@ -0,0 +1,405 @@
using System.Runtime.InteropServices;
using Newtonsoft.Json;
namespace Yi.Framework.Core.Helper
{
public class ComputerHelper
{
/// <summary>
/// 将object转换为long若转换失败则返回0。不抛出异常。
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private static long ParseToLong( object obj)
{
try
{
return long.Parse(obj.ToString());
}
catch
{
return 0L;
}
}
/// <summary>
/// 将string转换为DateTime若转换失败则返回日期最小值。不抛出异常。
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private static DateTime ParseToDateTime( string str)
{
try
{
if (string.IsNullOrWhiteSpace(str))
{
return DateTime.MinValue;
}
if (str.Contains("-") || str.Contains("/"))
{
return DateTime.Parse(str);
}
else
{
int length = str.Length;
switch (length)
{
case 4:
return DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture);
case 6:
return DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture);
case 8:
return DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
case 10:
return DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture);
case 12:
return DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture);
case 14:
return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
default:
return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
}
}
}
catch
{
return DateTime.MinValue;
}
}
private static double ParseToDouble(object obj)
{
try
{
return double.Parse(obj.ToString());
}
catch
{
return 0;
}
}
/// <summary>
/// CPU使用情况
/// </summary>
/// <returns></returns>
public static CPUMetrics GetCPUMetrics()
{
CPUMetrics cpuMetrics = new CPUMetrics();
var cpudetail = GetCPUDetails();
cpuMetrics.CoreTotal = cpudetail.Cores;
cpuMetrics.LogicalProcessors =cpudetail.LogicalProcessors;
cpuMetrics.CPURate = Math.Ceiling(ParseToDouble(GetCPURate()));
cpuMetrics.FreeRate = 1 - cpuMetrics.CPURate;
return cpuMetrics;
}
/// <summary>
/// 内存使用情况
/// </summary>
/// <returns></returns>
public static MemoryMetrics GetMemoryMetrics()
{
try
{
MemoryMetricsClient client = new();
MemoryMetrics memoryMetrics = IsUnix() ? client.GetUnixMetrics() : client.GetWindowsMetrics();
memoryMetrics.FreeRam = Math.Round(memoryMetrics.Free / 1024, 2) + "GB";
memoryMetrics.UsedRam = Math.Round(memoryMetrics.Used / 1024, 2) + "GB";
memoryMetrics.TotalRAM = Math.Round(memoryMetrics.Total / 1024, 2) + "GB";
memoryMetrics.RAMRate = Math.Ceiling(100 * memoryMetrics.Used / memoryMetrics.Total).ToString() + "%";
return memoryMetrics;
}
catch (Exception ex)
{
Console.WriteLine("获取内存使用出错msg=" + ex.Message + "," + ex.StackTrace);
}
return new MemoryMetrics();
}
/// <summary>
/// 获取磁盘信息
/// </summary>
/// <returns></returns>
public static List<DiskInfo> GetDiskInfos()
{
List<DiskInfo> diskInfos = new();
if (IsUnix())
{
try
{
string output = ShellHelper.Bash("df -m / | awk '{print $2,$3,$4,$5,$6}'");
var arr = output.Split('\n', StringSplitOptions.RemoveEmptyEntries);
if (arr.Length == 0) return diskInfos;
var rootDisk = arr[1].Split(' ', (char)StringSplitOptions.RemoveEmptyEntries);
if (rootDisk == null || rootDisk.Length == 0)
{
return diskInfos;
}
DiskInfo diskInfo = new()
{
DiskName = "/",
TotalSize = long.Parse(rootDisk[0]) / 1024,
Used = long.Parse(rootDisk[1]) / 1024,
AvailableFreeSpace = long.Parse(rootDisk[2]) / 1024,
AvailablePercent = decimal.Parse(rootDisk[3].Replace("%", ""))
};
diskInfos.Add(diskInfo);
}
catch (Exception ex)
{
Console.WriteLine("获取磁盘信息出错了" + ex.Message);
}
}
else
{
var driv = DriveInfo.GetDrives();
foreach (var item in driv)
{
try
{
var obj = new DiskInfo()
{
DiskName = item.Name,
TypeName = item.DriveType.ToString(),
TotalSize = item.TotalSize / 1024 / 1024 / 1024,
AvailableFreeSpace = item.AvailableFreeSpace / 1024 / 1024 / 1024,
};
obj.Used = obj.TotalSize - obj.AvailableFreeSpace;
obj.AvailablePercent = decimal.Ceiling(obj.Used / (decimal)obj.TotalSize * 100);
diskInfos.Add(obj);
}
catch (Exception ex)
{
Console.WriteLine("获取磁盘信息出错了" + ex.Message);
continue;
}
}
}
return diskInfos;
}
public static bool IsUnix()
{
var isUnix = RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
return isUnix;
}
public static string GetCPURate()
{
string cpuRate;
if (IsUnix())
{
string output = ShellHelper.Bash("top -b -n1 | grep \"Cpu(s)\" | awk '{print $2 + $4}'");
cpuRate = output.Trim();
}
else
{
string output = ShellHelper.Cmd("wmic", "cpu get LoadPercentage");
cpuRate = output.Replace("LoadPercentage", string.Empty).Trim();
}
return cpuRate;
}
/// <summary>
/// 获取系统运行时间
/// </summary>
/// <returns></returns>
public static string GetRunTime()
{
string runTime = string.Empty;
try
{
if (IsUnix())
{
string output = ShellHelper.Bash("uptime -s").Trim();
runTime = DateTimeHelper.FormatTime(ParseToLong((DateTime.Now - ParseToDateTime(output)).TotalMilliseconds.ToString().Split('.')[0]));
}
else
{
string output = ShellHelper.Cmd("wmic", "OS get LastBootUpTime/Value");
string[] outputArr = output.Split('=', (char)StringSplitOptions.RemoveEmptyEntries);
if (outputArr.Length == 2)
{
runTime = DateTimeHelper.FormatTime(ParseToLong((DateTime.Now - ParseToDateTime( outputArr[1].Split('.')[0])).TotalMilliseconds.ToString().Split('.')[0]));
}
}
}
catch (Exception ex)
{
Console.WriteLine("获取runTime出错" + ex.Message);
}
return runTime;
}
public static CPUInfo GetCPUDetails()
{
int logicalProcessors = 0;
int cores = 0;
if (IsUnix())
{
string logicalOutput = ShellHelper.Bash("lscpu | grep '^CPU(s):' | awk '{print $2}'");
logicalProcessors = int.Parse(logicalOutput.Trim());
string coresOutput = ShellHelper.Bash("lscpu | grep 'Core(s) per socket:' | awk '{print $4}'");
string socketsOutput = ShellHelper.Bash("lscpu | grep 'Socket(s):' | awk '{print $2}'");
cores = int.Parse(coresOutput.Trim()) * int.Parse(socketsOutput.Trim());
}
else
{
string output = ShellHelper.Cmd("wmic", "cpu get NumberOfCores,NumberOfLogicalProcessors /format:csv");
var lines = output.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
if (lines.Length > 1)
{
var values = lines[1].Split(',');
cores = int.Parse(values[1].Trim());
logicalProcessors =int.Parse(values[2].Trim());
}
}
return new CPUInfo
{
LogicalProcessors = logicalProcessors,
Cores = cores
};
}
}
public class CPUInfo
{
public int LogicalProcessors { get; set; }
public int Cores { get; set; }
}
public class CPUMetrics
{
/// <summary>
/// 内核数
/// </summary>
public int CoreTotal { get; set; }
/// <summary>
/// 逻辑处理器数
/// </summary>
public int LogicalProcessors { get; set; }
/// <summary>
/// CPU使用率%
/// </summary>
public double CPURate { get; set; }
/// <summary>
/// CPU空闲率%
/// </summary>
public double FreeRate { get; set; }
}
/// <summary>
/// 内存信息
/// </summary>
public class MemoryMetrics
{
[JsonIgnore]
public double Total { get; set; }
[JsonIgnore]
public double Used { get; set; }
[JsonIgnore]
public double Free { get; set; }
public string UsedRam { get; set; }
/// <summary>
/// 总内存 GB
/// </summary>
public string TotalRAM { get; set; }
/// <summary>
/// 内存使用率 %
/// </summary>
public string RAMRate { get; set; }
/// <summary>
/// 空闲内存
/// </summary>
public string FreeRam { get; set; }
}
public class DiskInfo
{
/// <summary>
/// 磁盘名
/// </summary>
public string DiskName { get; set; }
public string TypeName { get; set; }
public long TotalFree { get; set; }
public long TotalSize { get; set; }
/// <summary>
/// 已使用
/// </summary>
public long Used { get; set; }
/// <summary>
/// 可使用
/// </summary>
public long AvailableFreeSpace { get; set; }
public decimal AvailablePercent { get; set; }
}
public class MemoryMetricsClient
{
#region
/// <summary>
/// windows系统获取内存信息
/// </summary>
/// <returns></returns>
public MemoryMetrics GetWindowsMetrics()
{
string output = ShellHelper.Cmd("wmic", "OS get FreePhysicalMemory,TotalVisibleMemorySize /Value");
var metrics = new MemoryMetrics();
var lines = output.Trim().Split('\n', (char)StringSplitOptions.RemoveEmptyEntries);
if (lines.Length <= 0) return metrics;
var freeMemoryParts = lines[0].Split('=', (char)StringSplitOptions.RemoveEmptyEntries);
var totalMemoryParts = lines[1].Split('=', (char)StringSplitOptions.RemoveEmptyEntries);
metrics.Total = Math.Round(double.Parse(totalMemoryParts[1]) / 1024, 0);
metrics.Free = Math.Round(double.Parse(freeMemoryParts[1]) / 1024, 0);//m
metrics.Used = metrics.Total - metrics.Free;
return metrics;
}
/// <summary>
/// Unix系统获取
/// </summary>
/// <returns></returns>
public MemoryMetrics GetUnixMetrics()
{
string output = ShellHelper.Bash(@"
# 从 /proc/meminfo 文件中提取总内存
total_mem=$(cat /proc/meminfo | grep -i ""MemTotal"" | awk '{print $2}')
# 从 /proc/meminfo 文件中提取剩余内存
free_mem=$(cat /proc/meminfo | grep -i ""MemFree"" | awk '{print $2}')
# 显示提取的信息
echo $total_mem $used_mem $free_mem
");
var metrics = new MemoryMetrics();
if (!string.IsNullOrWhiteSpace(output))
{
var memory = output.Split(' ', (char)StringSplitOptions.RemoveEmptyEntries);
if (memory.Length >= 2)
{
metrics.Total = Math.Round(double.Parse(memory[0]) / 1024, 0);
metrics.Free = Math.Round(double.Parse(memory[1])/ 1024, 0);//m
metrics.Used = metrics.Total - metrics.Free;
}
}
return metrics;
}
#endregion
}
}

View File

@@ -1,6 +1,6 @@
using System;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public static class ConsoleHelper
{

View File

@@ -1,6 +1,6 @@
using System;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class DateHelper
{
@@ -8,7 +8,7 @@ namespace Yi.Framework.Common.Helper
{
time = time.Substring(0, 10);
double timestamp = Convert.ToInt64(time);
System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
dateTime = dateTime.AddSeconds(timestamp).ToLocalTime();
return dateTime;
}

View File

@@ -0,0 +1,139 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Yi.Framework.Core.Helper
{
public class DateTimeHelper
{
/// <summary>
///
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetBeginTime(DateTime? dateTime, int days = 0)
{
if (dateTime == DateTime.MinValue || dateTime == null)
{
return DateTime.Now.AddDays(days);
}
return dateTime ?? DateTime.Now;
}
#region
/// <summary>
/// 时间戳转本地时间-时间戳精确到秒
/// </summary>
public static DateTime ToLocalTimeDateBySeconds(long unix)
{
var dto = DateTimeOffset.FromUnixTimeSeconds(unix);
return dto.ToLocalTime().DateTime;
}
/// <summary>
/// 时间转时间戳Unix-时间戳精确到秒
/// </summary>
public static long ToUnixTimestampBySeconds(DateTime dt)
{
DateTimeOffset dto = new DateTimeOffset(dt);
return dto.ToUnixTimeSeconds();
}
/// <summary>
/// 时间戳转本地时间-时间戳精确到毫秒
/// </summary>
public static DateTime ToLocalTimeDateByMilliseconds(long unix)
{
var dto = DateTimeOffset.FromUnixTimeMilliseconds(unix);
return dto.ToLocalTime().DateTime;
}
/// <summary>
/// 时间转时间戳Unix-时间戳精确到毫秒
/// </summary>
public static long ToUnixTimestampByMilliseconds(DateTime dt)
{
DateTimeOffset dto = new DateTimeOffset(dt);
return dto.ToUnixTimeMilliseconds();
}
#endregion
#region
/// <summary>
/// 毫秒转天时分秒
/// </summary>
/// <param name="ms"></param>
/// <returns></returns>
public static string FormatTime(long ms)
{
int ss = 1000;
int mi = ss * 60;
int hh = mi * 60;
int dd = hh * 24;
long day = ms / dd;
long hour = (ms - day * dd) / hh;
long minute = (ms - day * dd - hour * hh) / mi;
long second = (ms - day * dd - hour * hh - minute * mi) / ss;
long milliSecond = ms - day * dd - hour * hh - minute * mi - second * ss;
string sDay = day < 10 ? "0" + day : "" + day; //天
string sHour = hour < 10 ? "0" + hour : "" + hour;//小时
string sMinute = minute < 10 ? "0" + minute : "" + minute;//分钟
string sSecond = second < 10 ? "0" + second : "" + second;//秒
string sMilliSecond = milliSecond < 10 ? "0" + milliSecond : "" + milliSecond;//毫秒
sMilliSecond = milliSecond < 100 ? "0" + sMilliSecond : "" + sMilliSecond;
return string.Format("{0} 天 {1} 小时 {2} 分 {3} 秒", sDay, sHour, sMinute, sSecond);
}
#endregion
#region unix时间戳
/// <summary>
/// 获取unix时间戳
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static long GetUnixTimeStamp(DateTime dt)
{
long unixTime = ((DateTimeOffset)dt).ToUnixTimeMilliseconds();
return unixTime;
}
#endregion
#region
public static DateTime GetDayMinDate(DateTime dt)
{
DateTime min = new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0);
return min;
}
#endregion
#region
public static DateTime GetDayMaxDate(DateTime dt)
{
DateTime max = new DateTime(dt.Year, dt.Month, dt.Day, 23, 59, 59);
return max;
}
#endregion
#region
public static string FormatDateTime(DateTime? dt)
{
if (dt != null)
{
if (dt.Value.Year == DateTime.Now.Year)
{
return dt.Value.ToString("MM-dd HH:mm");
}
else
{
return dt.Value.ToString("yyyy-MM-dd HH:mm");
}
}
return string.Empty;
}
#endregion
}
}

View File

@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Helper
{
public class Compare<T, C> : IEqualityComparer<T>
{
private Func<T, C> _getField;
public Compare(Func<T, C> getfield)
{
_getField = getfield;
}
public bool Equals(T? x, T? y)
{
return EqualityComparer<C>.Default.Equals(_getField(x!), _getField(y!));
}
public int GetHashCode(T obj)
{
return EqualityComparer<C>.Default.GetHashCode(_getField(obj)!);
}
}
public static class DistinctHelper
{
/// <summary>
/// 自定义Distinct扩展方法
/// </summary>
/// <typeparam name="T">要去重的对象类</typeparam>
/// <typeparam name="C">自定义去重的字段类型</typeparam>
/// <param name="source">要去重的对象</param>
/// <param name="getfield">获取自定义去重字段的委托</param>
/// <returns></returns>
public static IEnumerable<T> DistinctNew<T, C>(this IEnumerable<T> source, Func<T, C> getfield)
{
return source.Distinct(new Compare<T, C>(getfield));
}
}
}

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Helper
{
public static class EnumHelper
{
public static New EnumToEnum<New>(this object oldEnum)
{
if (oldEnum is null)
{
throw new ArgumentNullException(nameof(oldEnum));
}
return (New)Enum.ToObject(typeof(New), oldEnum.GetHashCode());
}
public static TEnum StringToEnum<TEnum>(this string str)
{
return (TEnum)Enum.Parse(typeof(TEnum), str);
}
}
}

View File

@@ -0,0 +1,98 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Helper
{
public static class ExpressionHelper
{
/// <summary>
/// Expression表达式树lambda参数拼接组合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="first"></param>
/// <param name="second"></param>
/// <param name="merge"></param>
/// <returns></returns>
public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
{
var parameterMap = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);
var secondBody = LambdaParameteRebinder.ReplaceParameter(parameterMap, second.Body);
return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
}
/// <summary>
/// Expression表达式树lambda参数拼接--false
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> False<T>() => f => false;
/// <summary>
/// Expression表达式树lambda参数拼接-true
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> True<T>() => f => true;
/// <summary>
/// Expression表达式树lambda参数拼接--and
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="first"></param>
/// <param name="second"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) => first.Compose(second, Expression.And);
/// <summary>
/// Expression表达式树lambda参数拼接--or
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="first"></param>
/// <param name="second"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) => first.Compose(second, Expression.Or);
}
public class LambdaParameteRebinder : ExpressionVisitor
{
/// <summary>
/// 存放表达式树的参数的字典
/// </summary>
private readonly Dictionary<ParameterExpression, ParameterExpression> map;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="map"></param>
public LambdaParameteRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
{
this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
}
/// <summary>
/// 重载参数访问的方法,访问表达式树参数,如果字典中包含,则取出
/// </summary>
/// <param name="node">表达式树参数</param>
/// <returns></returns>
protected override Expression VisitParameter(ParameterExpression node)
{
if (map.TryGetValue(node, out ParameterExpression expression))
{
node = expression;
}
return base.VisitParameter(node);
}
public static Expression ReplaceParameter(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
{
return new LambdaParameteRebinder(map).Visit(exp);
}
}
}

View File

@@ -1,15 +1,18 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class FileHelper : IDisposable
{
private bool _alreadyDispose = false;
#region
public FileHelper()
{
@@ -125,7 +128,7 @@ namespace Yi.Framework.Common.Helper
FileStream f = File.Create(Path);
f.Close();
}
StreamWriter f2 = new StreamWriter(Path, false, System.Text.Encoding.GetEncoding("gb2312"));
StreamWriter f2 = new StreamWriter(Path, false, Encoding.GetEncoding("gb2312"));
f2.Write(Strings);
f2.Close();
f2.Dispose();
@@ -172,7 +175,7 @@ namespace Yi.Framework.Common.Helper
s = "不存在相应的目录";
else
{
StreamReader f2 = new StreamReader(Path, System.Text.Encoding.GetEncoding("gb2312"));
StreamReader f2 = new StreamReader(Path, Encoding.GetEncoding("gb2312"));
s = f2.ReadToEnd();
f2.Close();
f2.Dispose();
@@ -391,5 +394,97 @@ namespace Yi.Framework.Common.Helper
}
}
#endregion
/// <summary>
/// 获取目录下全部文件名
/// </summary>
/// <param name="path"></param>
/// <param name="pattern"></param>
/// <returns></returns>
public static List<string> GetAllFileNames(string path, string pattern = "*")
{
List<FileInfo> folder = new DirectoryInfo(path).GetFiles(pattern).ToList();
return folder.Select(x => x.Name).ToList();
}
/// <summary>
/// 文件内容替换
/// </summary>
public static string FileContentReplace(string path, string oldStr, string newStr)
{
var content = File.ReadAllText(path);
if (content.Contains(oldStr))
{
File.Delete(path);
File.WriteAllText(path, content.Replace(oldStr, newStr));
}
return path;
}
/// <summary>
/// 文件名称
/// </summary>
public static string FileNameReplace(string path, string oldStr, string newStr)
{
string fileName = Path.GetFileName(path);
if (!fileName.Contains(oldStr))
{
return path;
}
string? directoryName = Path.GetDirectoryName(path);
string newFileName = fileName.Replace(oldStr, newStr);
string newPath = Path.Combine(directoryName ?? "", newFileName);
File.Move(path, newPath);
return newPath;
}
/// <summary>
/// 目录名替换
/// </summary>
public static string DirectoryNameReplace(string path, string oldStr, string newStr)
{
string fileName = Path.GetFileName(path);
if (!fileName.Contains(oldStr))
{
return path;
}
string? directoryName = Path.GetDirectoryName(path);
string newFileName = fileName.Replace(oldStr, newStr);
string newPath = Path.Combine(directoryName ?? "", newFileName);
Directory.Move(path, newPath);
return newPath;
}
/// <summary>
/// 全部信息递归替换
/// </summary>
/// <param name="dirPath"></param>
/// <param name="oldStr"></param>
/// <param name="newStr"></param>
public static void AllInfoReplace(string dirPath, string oldStr, string newStr)
{
var path = DirectoryNameReplace(dirPath, oldStr, newStr);
var dirInfo = new DirectoryInfo(path);
var files = dirInfo.GetFiles();
var dirs = dirInfo.GetDirectories();
if (files.Length > 0)
{
foreach (var f in files)
{
FileContentReplace(f.FullName, oldStr, newStr);
FileNameReplace(f.FullName, oldStr, newStr);
}
}
if (dirs.Length > 0)
{
foreach (var d in dirs)
{
AllInfoReplace(d.FullName, oldStr, newStr);
}
}
}
}
}

View File

@@ -1,4 +1,4 @@
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public static class HtmlHelper
{

View File

@@ -0,0 +1,122 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Mime;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Helper
{
public static class HttpHelper
{
public static HttpClient Client { get; set; } = new HttpClient();
public static async Task<string> Get(string url)
{
return await Client.GetStringAsync(url);
}
public static async Task<Stream> GetIO(string url)
{
return await Client.GetStreamAsync(url);
}
public static async Task<string> Post(string url, object? item = null, Dictionary<string, string>? head = null)
{
using StringContent json = new(JsonSerializer.Serialize(item), Encoding.UTF8, MediaTypeNames.Application.Json);
if (head is not null)
{
foreach (var d in head)
{
json.Headers.Add(d.Key, d.Value);
}
}
var httpResponse = await Client.PostAsync(url, json);
httpResponse.EnsureSuccessStatusCode();
var content = httpResponse.Content;
return await content.ReadAsStringAsync();
}
// public static string HttpGet(string Url, string postDataStr="")
// {
//#pragma warning disable SYSLIB0014 // 类型或成员已过时
// HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
//#pragma warning restore SYSLIB0014 // 类型或成员已过时
// request.Method = "GET";
// request.ContentType = "text/html;charset=UTF-8";
// HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// Stream myResponseStream = response.GetResponseStream();
// StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
// string retString = myStreamReader.ReadToEnd();
// myStreamReader.Close();
// myResponseStream.Close();
// return retString;
// }
// public static bool HttpIOGet(string Url, string file, string postDataStr="")
// {
// HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
// request.Method = "GET";
// request.ContentType = "text/html;charset=UTF-8";
// HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// Stream myResponseStream = response.GetResponseStream();
// FileStream writer = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write);
// byte[] buffer = new byte[1024];
// int c;
// while ((c = myResponseStream.Read(buffer, 0, buffer.Length)) > 0)
// {
// writer.Write(buffer, 0, c);
// }
// writer.Close();
// myResponseStream.Close();
// return true;
// }
// public static string HttpPost(string Url, string postDataStr="")
// {
// CookieContainer cookie = new CookieContainer();
//#pragma warning disable SYSLIB0014 // 类型或成员已过时
// HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
//#pragma warning restore SYSLIB0014 // 类型或成员已过时
// request.Method = "POST";
// request.ContentType = "application/x-www-form-urlencoded";
// request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);
// request.CookieContainer = cookie;
// Stream myRequestStream = request.GetRequestStream();
// StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
// myStreamWriter.Write(postDataStr);
// myStreamWriter.Close();
// HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// response.Cookies = cookie.GetCookies(response.ResponseUri);
// Stream myResponseStream = response.GetResponseStream();
// StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
// string retString = myStreamReader.ReadToEnd();
// myStreamReader.Close();
// myResponseStream.Close();
// return retString;
// }
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Helper
{
public static class IdHelper
{
public static dynamic[] ToDynamicArray(this IEnumerable<long> ids)
{
return ids.Select(id => (dynamic)id).ToArray();
}
}
}

View File

@@ -3,7 +3,7 @@ using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class IpHelper
{
@@ -24,6 +24,11 @@ namespace Yi.Framework.Common.Helper
// 获取所有可用网卡IP信息
var ipCollection = nics?.Select(x => x.GetIPProperties())?.SelectMany(x => x.UnicastAddresses);
if (ipCollection is null)
{
return instanceIp;
}
foreach (var ipadd in ipCollection)
{
if (!IPAddress.IsLoopback(ipadd.Address) && ipadd.Address.AddressFamily == AddressFamily.InterNetwork)

View File

@@ -1,21 +1,27 @@
using System;
using System.Collections.Generic;
using System.Text.Json;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class JsonHelper
{
public static string ObjToStr<T>(T obj, string dateTimeFormat)
{
IsoDateTimeConverter timeConverter = new IsoDateTimeConverter()
{
DateTimeFormat = dateTimeFormat
};
return JsonConvert.SerializeObject(obj, Formatting.Indented, timeConverter);
}
public static string ObjToStr<T>(T obj)
{
return Newtonsoft.Json.JsonConvert.SerializeObject(obj);
return JsonConvert.SerializeObject(obj);
}
public static T StrToObj<T>(string str)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(str);
return JsonConvert.DeserializeObject<T>(str)!;
}
/// <summary>
/// 转换对象为JSON格式数据
@@ -25,13 +31,12 @@ namespace Yi.Framework.Common.Helper
/// <returns>字符格式的JSON数据</returns>
public static string GetJSON<T>(object obj)
{
string result = String.Empty;
string result = string.Empty;
try
{
JsonSerializer.Serialize("");
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =
new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, obj);
result = System.Text.Encoding.UTF8.GetString(ms.ToArray());
@@ -58,7 +63,7 @@ namespace Yi.Framework.Common.Helper
foreach (T city in vals)
{
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
using (MemoryStream ms = new MemoryStream())
{
s.WriteObject(ms, city);
st.Append(System.Text.Encoding.UTF8.GetString(ms.ToArray()));
@@ -80,12 +85,12 @@ namespace Yi.Framework.Common.Helper
public static T ParseFormByJson<T>(string jsonStr)
{
T obj = Activator.CreateInstance<T>();
using (System.IO.MemoryStream ms =
new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(jsonStr)))
using (MemoryStream ms =
new MemoryStream(System.Text.Encoding.UTF8.GetBytes(jsonStr)))
{
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =
new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
return (T)serializer.ReadObject(ms);
return (T)serializer.ReadObject(ms)!;
}
}
@@ -98,7 +103,7 @@ namespace Yi.Framework.Common.Helper
foreach (SendData city in vals)
{
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
using (MemoryStream ms = new MemoryStream())
{
s.WriteObject(ms, city);
st.Append(System.Text.Encoding.UTF8.GetString(ms.ToArray()));
@@ -121,7 +126,7 @@ namespace Yi.Framework.Common.Helper
{
char s = json[0];
char e = json[json.Length - 1];
return (s == '{' && e == '}') || (s == '[' && e == ']');
return s == '{' && e == '}' || s == '[' && e == ']';
}
}
return false;
@@ -285,10 +290,10 @@ namespace Yi.Framework.Common.Helper
{
if (cs.keyStart <= 0)
{
cs.keyStart = (c == '"' ? 3 : 2);
cs.keyStart = c == '"' ? 3 : 2;
return true;
}
else if ((cs.keyStart == 2 && c == '\'') || (cs.keyStart == 3 && c == '"'))
else if (cs.keyStart == 2 && c == '\'' || cs.keyStart == 3 && c == '"')
{
if (!cs.escapeChar)
{
@@ -305,10 +310,10 @@ namespace Yi.Framework.Common.Helper
{
if (cs.valueStart <= 0)
{
cs.valueStart = (c == '"' ? 3 : 2);
cs.valueStart = c == '"' ? 3 : 2;
return true;
}
else if ((cs.valueStart == 2 && c == '\'') || (cs.valueStart == 3 && c == '"'))
else if (cs.valueStart == 2 && c == '\'' || cs.valueStart == 3 && c == '"')
{
if (!cs.escapeChar)
{
@@ -445,14 +450,14 @@ namespace Yi.Framework.Common.Helper
{
return;
}
//示例 ["aa",{"bbbb":123,"fff","ddd"}]
//示例 ["aa",{"bbbb":123,"fff","Ddd"}]
switch (c)
{
case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}]
isError = jsonStart && state == 0;//重复开始错误 同时不是值处理。
break;
case '}':
isError = !jsonStart || (keyStart != 0 && state == 0);//重复结束错误 或者 提前结束{"aa"}。正常的有{}
isError = !jsonStart || keyStart != 0 && state == 0;//重复结束错误 或者 提前结束{"aa"}。正常的有{}
break;
case '[':
isError = arrayStart && state == 0;//重复开始错误
@@ -466,7 +471,7 @@ namespace Yi.Framework.Common.Helper
if (!isError)
{
//重复开始 [""",{"" "}]
isError = (state == 0 && keyStart == -1) || (state == 1 && valueStart == -1);
isError = state == 0 && keyStart == -1 || state == 1 && valueStart == -1;
}
if (!isError && arrayStart && !jsonStart && c == '\'')//['aa',{}]
{
@@ -482,7 +487,7 @@ namespace Yi.Framework.Common.Helper
{
if (jsonStart)
{
isError = state == 0 || (state == 1 && valueStart > 1);//重复出现。
isError = state == 0 || state == 1 && valueStart > 1;//重复出现。
}
else if (arrayStart)//["aa,] [,] [{},{}]
{
@@ -497,7 +502,7 @@ namespace Yi.Framework.Common.Helper
case '\t':
break;
default: //值开头。。
isError = (!jsonStart && !arrayStart) || (state == 0 && keyStart == -1) || (valueStart == -1 && state == 1);//
isError = !jsonStart && !arrayStart || state == 0 && keyStart == -1 || valueStart == -1 && state == 1;//
break;
}
//if (isError)

Some files were not shown because too many files have changed in this diff Show More