Compare commits

..

1112 Commits

Author SHA1 Message Date
橙子
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
2283 changed files with 158112 additions and 45649 deletions

136
.gitignore vendored
View File

@@ -1,14 +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
dist/
appsettings.Production.json
appsettings.Development.json
wwwroot
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
@@ -24,21 +17,16 @@ wwwroot
[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.*
@@ -52,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
@@ -83,7 +61,6 @@ StyleCopReport.xml
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
@@ -112,9 +89,6 @@ ipch/
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
@@ -135,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
@@ -174,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
@@ -187,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
@@ -209,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/
@@ -223,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/
@@ -246,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/
@@ -269,7 +225,6 @@ FakesAssemblies/
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
@@ -277,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
@@ -299,48 +251,28 @@ 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/*
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
# 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
package-lock.json

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2022 jacktang
Copyright (c) 2023 橙子
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

213
README-en.md Normal file
View File

@@ -0,0 +1,213 @@
<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
****
## 🍊 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)

314
README.md
View File

@@ -1,184 +1,127 @@
<h1 align="center"><img align="left" height="150px" src="https://user-images.githubusercontent.com/68722157/138828506-f58b7c57-5e10-4178-8f7d-5d5e12050113.png"> Yi框架</h1>
<h4 align="center">一套以用户体验出发的.Net6 Web开源框架</h4>
<h5 align="center">支持原生版本、Furion版本、Abp版本,前端后台接入Ruoyi Vue3.0</h5>
<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)
[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理念一致以用户体验出发。
适合.Net6学习、Sqlsugar学习 、项目二次开发。
适合.Net8学习、Sqlsugar学习 、项目二次开发。
集大成者,终究轮子
Yi框架最新版本标签`v3.0.0`,具体版本可以查看标签迭代
项目与Sqlsugar同步更新但这作者老杰哥代码天天爆肝到凌晨两点我们也尽量会跟上他的脚步。更新频繁所以可watching持续关注。
更新频繁可watching持续关注。
————这不仅仅是一个程序,更是一个艺术品,面向艺术的开发!
> 核心特点简单好用框架不以打包形式引用而是直接以项目附带源码给出自由度拉满遵循Mit协议允许随意修改请注明来源即可
**分支:**
**分支目录**
本项目由EFCore版本历经4年不断迭代至Sqlsugar版本现EFcore版本已弃用目前sqlsugar已带业务功能
- 分支**Abp**: 基于Abp.vNext分支DDD领域驱动设计,回归开发本质,极度简单,一个后台支持以下多个前端
- (推荐) **Furion**: 基于Furion分支回归开发本质极度简单用起来贼爽
- ~~**Framework**~~: 框架分支,所有东西都在这里
- ~~**SqlSugar**:.Net6 DDD领域驱动设计 简单分层微服务架构~~
- ~~**SqlSugar-Dev**为sqlsugar分支的实时开发版本~~
- ~~**abp**:基于abp.vnext项目~~
- Yi.Abp.Net8后端
- Yi.Bbs.Vue3Bbs社区 前端
- Yi.Doc.Md: 开源文档教程
- Yi.Pure.Vue3Pure ts后台前端
- Yi.RuoYi.Vue3RuoYi js后台前端
****
**目录:**
## 🍊 官网及演示地址:
Yi后端框架分为3个部分
废话少说直接上地址
- Infrastructure基础设施框架底层+sqlsugar+furion
- Module应用模块可选项例如缓存模块、微信模块、文件模块、日志模块等
- Application业务模块用于开发
Yi社区官网网址Bbs社区正式[ccnetcore.com](https://ccnetcore.com) (已上线,欢迎加入)
另外光说不练假把式我们不仅仅提供一个空白的框架还同时提供3个基于yi框架的业务模块没有听错目前为1个后端支持3个前端。各个模块关系解耦可单独使用其中的任意业务模块
Rbac后台演示地址https://ccnetcore.com:1000 用户cc、密码123456
- Yi.RuoYi.Vue3Ruoyi后台管理系统Rbac Vue3前端推荐
Pure后台演示地址https://ccnetcore.com:1001 用户cc、密码123456
- Yi.Furion.Net6.NET6后端推荐
- Yi.App.Vue3移动端App Vue3前端
- Yi.BBS.Vue3Web网页端BBS论坛 Vue3+Ts前端
后续我们持续更新各大应用模块及业务模块shop商场、erp进销存、mes工厂系统等
业务支持并扩展至各个领域,用于具体项目的二次开发极大复用后端代码及前端代码,以通用的部分+不通的部分快速二开
### 演示地址:
废话少说直接上地址,**请不要**更改里面的数据
官网网址:[ccnetcore.com](https://ccnetcore.com) (已上线,欢迎加入)
Bbs社区系统[ccnetcore.com](https://ccnetcore.com) (已上线,欢迎加入)
Rbac后台管理系统[yi.ccnetcore.com](http://yi.ccnetcore.com) (已上线)~~管理员账号cc 、 123456~~
App移动端系统[xxx](xxx)正在部署
网关地址:~~[gate.ccnetcore.com/swagger](http://gate.ccnetcore.com/swagger)~~(目前使用单体架构部署,无需网关)
### 支持:
## 🍏 支持:
- [x] 完全支持单体应用架构
- [x] 完全支持分布式应用架构
- [x] 完全支持微服务架构
****
### 详细到爆炸的Yi框架教程导航
## 🍇 详细到爆炸的Yi框架教程导航
1. [框架快速开始](https://ccnetcore.com/article/1641733850189139969)(已完成)
2. [框架模块教程](https://ccnetcore.com/article/1641733991574933505)(已完成)
3. [应用模块教程](https://ccnetcore.com/article/1641734073091231745)
4. [Yi.RBAC后台系统](https://ccnetcore.com/article/1641734171128893441)
5. [Yi.BBS社区系统](https://ccnetcore.com/article/1641734308475572225)
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)(已完成)
****
### 它的理念:
优雅的进行快速开发通常简单程度与优雅程度不可兼得Yi框架并不一昧的追求极致的解耦会站在用户使用角度上在使用难易度进行考虑衡量
## 🍓 它的理念:
谁说Abp复杂谁说DDD难打破常规化繁为简新人入门项目二开最佳方式之一
例如我们大部分功能紧密贴合Sqlsugar虽然缺少其他orm的替换性但在使用程度上降低的使用难度
> 一百个人就有一百种DDDYi框架不一定是极度严格的DDD而是站在巨人的肩膀上经过极多项目的提炼摸索出一种最佳实践
优雅的进行快速开发通常简单程度与优雅程度不可兼得Yi框架并不一昧的追求极致的解耦会站在用户使用角度上在使用难易度进行考虑衡量
> 一个面向用户的快速开发后端框架
在真正的使用,你会明白这一点,极致的简单,也是优雅的一种体现。
在真正的使用,你会明白这一点,极致的简单,也是优雅的一种体现。
****
### 特点:
- 面向用户的后端框架,使用简单,适合小型、企业级项目
- 项目内置源码,不打包
- 开箱即用
- 支持模块化
- 支持动态Api
- 支持属性注入
## 🍍 特点
- 面向用户的后端框架,使用简单,适合小型、中型、企业级项目
- 项目直接内置源码,不打包,非常适合进行二开改造
- 内置包含大量通用场景模块
- 优雅支持分布式及微服务架构
- 等等
### 基础设施简介
- Jwt鉴权
- 接口级别授权
- 对象映射
- O/RM
- 数据过滤
- 多租户
- 逻辑删除
- 审计日志
- 种子数据
- 工作单元
- 模块化
- 动态Api
- 属性注入
- 自动依赖注入
- 当前用户
- 仓储
- Crud
## 🍍 基础设施简介
以下全部功能可直接使用:
### 内置模块简介
- 后台任务
- 本地缓存
- 分布式缓存
- 事件总线
- 字典管理
- 文件管理
- 图片操作
- Excel操作
- 操作日志管理
- Sms短信
- 微信支付
- WebFirst代码生成
- [Abp.vNext官网](https://docs.abp.io/zh-Hans/abp/latest/)
### 业务项目
- RABC后台管理系统
- BBS社区系统
- APP移动端系统
- [SqlSugar官网](https://www.donet5.com/home/doc)
## 🍅 内置模块简介
- Rbac权限管理系统已上线支持pure、ruoyi前端
- Bbs论坛社区系统已上线
> 重复的东西,无需再写一遍,这也是优雅的体现之一
****
### 核心技术
## 🥭 核心技术
#### 后端
C# Asp.NetCore 6.0
- [x] 动态ApiCike.AutoApi
C# Asp.NetCore 8.0
- [x] 动态ApiAbp.vNext
- [x] 鉴权授权Jwt
- [x] 日志:Nlog
- [x] 模块化:StartupModules
- [x] 日志:Serilog
- [x] 模块化:Abp.vNext
- [x] 依赖注入Autofac
- [x] 对象映射Mapster
- [x] ORM:SqlsugarCore
- [x] 多租户Abp
- [x] ORM: SqlsugarCore
- [x] 多租户Abp.vNext
- [x] 后台任务Quartz.Net
- [x] 本地缓存:MemortCache
- [x] 分布式缓存:CSRedisCore
- [x] 事件总线:Cike.EventBus
- [x] 图像操作SixLabors.ImageSharp
- [x] Excle操作ExcelToObject.Npoi
- [x] 本地缓存:Abp.vNext
- [x] 分布式缓存:Abp.vNext
- [x] 事件总线:Abp.vNext
#### 前端
js Vue3.2
js Vue3
- [x] 异步请求axios
- [x] 图表echarts
- [x] uielement-plus
@@ -191,10 +134,11 @@ js Vue3.2
- [x] CICDgitlab+Jenkins
- [x] Dockerharbor
****
### 业务支持模块:
RABC权限管理系统正在更新
****
## 🍌 业务支持模块:
#### 🍒 RABC权限管理系统持续更新
采用ruoyi前端
- 用户管理
- 角色管理
@@ -209,80 +153,112 @@ RABC权限管理系统正在更新
- 定时任务
- 缓存列表
- 服务监控
- WebFirst代码生成工具
**演示截图:**
![输入图片说明](readme/1.png)
![输入图片说明](readme/2.png)
![输入图片说明](readme/3.png)
![输入图片说明](readme/4.png)
![输入图片说明](readme/5.png)
![输入图片说明](readme/6.png)
![输入图片说明](readme/7.png)
![输入图片说明](readme/8.png)
![输入图片说明](readme/9.png)
![输入图片说明](readme/10.png)
![输入图片说明](readme/1696760969217.jpg)
![输入图片说明](readme/1696761014270.jpg)
#### 🍐 BBS社区论坛系统持续更新
采用vue3前端
- 文章功能
- 板块功能
- 主题功能
- 个人中心
- 授权中心
- 权限管理
BBS论坛系统持续迭代
- 文章管理
- 评论管理
- 主题管理
- 板块管理
- 点赞管理
- 等等
#### 🍉 演示截图:
<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>
APP移动端系统持续迭代
- 动态查询
- 我的资料
<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>
ERP进销存系统持续迭代
- 供货商管理
- 等等
<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>
SHOP电商系统持续迭代
- SPU管理
- SKU管理
- 商品规格
- 商品分类
- 等等
****
### 感谢:
**大力支持** 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
[车神]微信公众号搜索Dotnet技术进阶
[RuYiAdmin如意老兄]https://gitee.com/pang-mingjun/RuYiAdmin
[ZrAdminNetCore字母老哥]https://gitee.com/izory/ZrAdminNetCore
[Admin.NET周哥]https://gitee.com/zuohuaijun/Admin.NET
[Admin.NET]https://gitee.com/zuohuaijun/Admin.NET
[Furion百小僧]https://furion.baiqian.ltd/
****
### 联系我们:
## 🌽 联系我们:
作者QQ`454313500`2029年之前作者24小时在线时刻保持活跃更新。
QQ交流群官方一群已满、官方二群已满、官方三群`786308927`基本已满)、官方四群:`498310311`(新群)
QQ交流群官方一群已满、官方二群已满、官方三群`786308927`(已满)、官方四群:`498310311`基本已满)、官方五群:`981136525`新群)
微信交流群:官方微信一群(已满)、官方微信二群
微信交流群:加作者微信 chengzilaoge520 橙子老哥520备注拉群
联系作者,这里人人都是顾问
官方网址留言区:[ccnetcore.com](https://ccnetcore.com)
****
### FQA:
## 🍄 FQA:
前往官网查看留言区

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

@@ -0,0 +1,30 @@
**/.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/**

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

@@ -0,0 +1,518 @@
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
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
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
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}
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");
});
}
}
}

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

@@ -0,0 +1,39 @@
<Project>
<Import Project="usings.props" />
<Import Project="version.props" />
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<PropertyGroup>
<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,16 @@
using JetBrains.Annotations;
using Microsoft.AspNetCore.Builder;
using Yi.Framework.AspNetCore.Microsoft.AspNetCore.Middlewares;
namespace Yi.Framework.AspNetCore.Microsoft.AspNetCore.Builder
{
public static class ApiInfoBuilderExtensions
{
public static IApplicationBuilder UseYiApiHandlinge([NotNull] this IApplicationBuilder app)
{
app.UseMiddleware<ApiInfoMiddleware>();
return app;
}
}
}

View File

@@ -0,0 +1,53 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc;
namespace Yi.Framework.AspNetCore.Microsoft.AspNetCore.Builder
{
public static class SwaggerBuilderExtensons
{
public static IApplicationBuilder UseYiSwagger(this IApplicationBuilder app, params SwaggerModel[] swaggerModels)
{
var mvcOptions = app.ApplicationServices.GetRequiredService<IOptions<AbpAspNetCoreMvcOptions>>().Value;
app.UseSwagger();
app.UseSwaggerUI(c =>
{
foreach (var setting in mvcOptions.ConventionalControllers.ConventionalControllerSettings)
{
c.SwaggerEndpoint($"/swagger/{setting.RemoteServiceName}/swagger.json", setting.RemoteServiceName);
}
if (mvcOptions.ConventionalControllers.ConventionalControllerSettings.Count==0&&swaggerModels.Length == 0)
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Yi.Framework");
}
else
{
foreach (var k in swaggerModels)
{
c.SwaggerEndpoint(k.Url, k.Name);
}
}
});
return app;
}
}
public class SwaggerModel
{
public SwaggerModel(string name)
{
this.Name = name;
this.Url = "/swagger/v1/swagger.json";
}
public SwaggerModel(string url, string name)
{
this.Url = url;
this.Name = name;
}
public string Url { get; set; }
public string Name { get; set; }
}
}

View File

@@ -0,0 +1,39 @@
using System.Diagnostics;
using System.Net.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Json;
using Yi.Framework.Core.Extensions;
using static System.Net.WebRequestMethods;
namespace Yi.Framework.AspNetCore.Microsoft.AspNetCore.Middlewares
{
[DebuggerStepThrough]
public class ApiInfoMiddleware : IMiddleware, ITransientDependency
{
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
context.Response.OnStarting([DebuggerStepThrough] () =>
{
if (context.Response.StatusCode == StatusCodes.Status200OK
&& context.Response.Headers["Content-Type"].ToString() == "application/vnd.ms-excel")
{
context.FileAttachmentHandle($"{DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss")}.xlsx");
}
if (context.Response.StatusCode == StatusCodes.Status200OK &&
context.Response.Headers["Content-Type"].ToString() == "application/x-zip-compressed")
{
context.FileAttachmentHandle($"{DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss")}.zip");
}
return Task.CompletedTask;
});
await next(context);
}
}
}

View File

@@ -0,0 +1,162 @@
using System.ComponentModel;
using System.Diagnostics;
using System.Text;
using System.Xml.Linq;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Options;
namespace Yi.Framework.AspNetCore.Microsoft.Extensions.DependencyInjection
{
public static class SwaggerAddExtensions
{
public static IServiceCollection AddYiSwaggerGen<Program>(this IServiceCollection services,
Action<SwaggerGenOptions>? action = null)
{
var mvcOptions = services.GetPreConfigureActions<AbpAspNetCoreMvcOptions>().Configure();
var mvcSettings =
mvcOptions.ConventionalControllers.ConventionalControllerSettings.DistinctBy(x => x.RemoteServiceName);
services.AddAbpSwaggerGen(
options =>
{
if (action is not null)
{
action.Invoke(options);
}
// 配置分组,还需要去重,支持重写,如果外部传入后,将以外部为准
foreach (var setting in mvcSettings.OrderBy(x => x.RemoteServiceName))
{
if (!options.SwaggerGeneratorOptions.SwaggerDocs.ContainsKey(setting.RemoteServiceName))
{
options.SwaggerDoc(setting.RemoteServiceName,
new OpenApiInfo { Title = setting.RemoteServiceName, Version = "v1" });
}
}
// 根据分组名称过滤 API 文档
options.DocInclusionPredicate((docName, apiDesc) =>
{
if (apiDesc.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
{
var settingOrNull = mvcSettings
.Where(x => x.Assembly == controllerActionDescriptor.ControllerTypeInfo.Assembly)
.FirstOrDefault();
if (settingOrNull is not null)
{
return docName == settingOrNull.RemoteServiceName;
}
}
return false;
});
options.CustomSchemaIds(type => type.FullName);
var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
if (basePath is not null)
{
foreach (var item in Directory.GetFiles(basePath, "*.xml"))
{
options.IncludeXmlComments(item, true);
}
}
options.AddSecurityDefinition("JwtBearer", new OpenApiSecurityScheme()
{
Description = "直接输入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] = new string[0]
});
options.OperationFilter<AddRequiredHeaderParameter>();
options.SchemaFilter<EnumSchemaFilter>();
}
);
return services;
}
}
/// <summary>
/// Swagger文档枚举字段显示枚举属性和枚举值,以及枚举描述
/// </summary>
public class EnumSchemaFilter : ISchemaFilter
{
/// <summary>
/// 实现接口
/// </summary>
/// <param name="model"></param>
/// <param name="context"></param>
public void Apply(OpenApiSchema model, SchemaFilterContext context)
{
if (context.Type.IsEnum)
{
model.Enum.Clear();
model.Type = "string";
model.Format = null;
StringBuilder stringBuilder = new StringBuilder();
Enum.GetNames(context.Type)
.ToList()
.ForEach(name =>
{
Enum e = (Enum)Enum.Parse(context.Type, name);
var descrptionOrNull = GetEnumDescription(e);
model.Enum.Add(new OpenApiString(name));
stringBuilder.Append(
$"【枚举:{name}{(descrptionOrNull is null ? string.Empty : $"({descrptionOrNull})")}={Convert.ToInt64(Enum.Parse(context.Type, name))}】<br />");
});
model.Description = stringBuilder.ToString();
}
}
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;
}
}
public class AddRequiredHeaderParameter : IOperationFilter
{
public static string HeaderKey { get; set; } = "__tenant";
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (operation.Parameters == null)
operation.Parameters = new List<OpenApiParameter>();
operation.Parameters.Add(new OpenApiParameter
{
Name = HeaderKey,
In = ParameterLocation.Header,
Required = false,
AllowEmptyValue = true,
Description = "租户id或者租户名称可空为默认租户"
});
}
}
}

View File

@@ -0,0 +1,73 @@
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
{
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
[ExposeServices(typeof(IConventionalRouteBuilder))]
public class YiConventionalRouteBuilder : ConventionalRouteBuilder
{
public YiConventionalRouteBuilder(IOptions<AbpConventionalControllerOptions> options) : base(options)
{
}
public override string Build(
string rootPath,
string controllerName,
ActionModel action,
string httpMethod,
[CanBeNull] ConventionalControllerSetting configuration)
{
var apiRoutePrefix = GetApiRoutePrefix(action, configuration);
var controllerNameInUrl =
NormalizeUrlControllerName(rootPath, controllerName, action, httpMethod, configuration);
var url = $"{rootPath}/{NormalizeControllerNameCase(controllerNameInUrl, configuration)}";
//Add {id} path if needed
var idParameterModel = action.Parameters.FirstOrDefault(p => p.ParameterName == "id");
if (idParameterModel != null)
{
if (TypeHelper.IsPrimitiveExtended(idParameterModel.ParameterType, includeEnums: true))
{
url += "/{id}";
}
else
{
var properties = idParameterModel
.ParameterType
.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var property in properties)
{
url += "/{" + NormalizeIdPropertyNameCase(property, configuration) + "}";
}
}
}
//Add action name if needed
var actionNameInUrl = NormalizeUrlActionName(rootPath, controllerName, action, httpMethod, configuration);
if (!actionNameInUrl.IsNullOrEmpty())
{
url += $"/{NormalizeActionNameCase(actionNameInUrl, configuration)}";
//Add secondary Id
var secondaryIds = action.Parameters
.Where(p => p.ParameterName.EndsWith("Id", StringComparison.Ordinal)).ToList();
if (secondaryIds.Count == 1)
{
url += $"/{{{NormalizeSecondaryIdNameCase(secondaryIds[0], configuration)}}}";
}
}
return url;
}
}
}

View File

@@ -0,0 +1,96 @@
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
{
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
[ExposeServices(typeof(IAbpServiceConvention))]
public class YiServiceConvention : AbpServiceConvention
{
public YiServiceConvention(IOptions<AbpAspNetCoreMvcOptions> options, IConventionalRouteBuilder conventionalRouteBuilder) : base(options, conventionalRouteBuilder)
{
}
protected override void ConfigureSelector(string rootPath, string controllerName, ActionModel action, ConventionalControllerSetting? configuration)
{
RemoveEmptySelectors(action.Selectors);
var remoteServiceAtt = ReflectionHelper.GetSingleAttributeOrDefault<RemoteServiceAttribute>(action.ActionMethod);
if (remoteServiceAtt != null && !remoteServiceAtt.IsEnabledFor(action.ActionMethod))
{
return;
}
if (!action.Selectors.Any())
{
AddAbpServiceSelector(rootPath, controllerName, action, configuration);
}
else
{
NormalizeSelectorRoutes(rootPath, controllerName, action, configuration);
}
}
protected override void AddAbpServiceSelector(string rootPath, string controllerName, ActionModel action, ConventionalControllerSetting? configuration)
{
base.AddAbpServiceSelector(rootPath, controllerName, action, configuration);
}
protected override void NormalizeSelectorRoutes(string rootPath, string controllerName, ActionModel action, ConventionalControllerSetting? configuration)
{
foreach (var selector in action.Selectors)
{
var httpMethod = selector.ActionConstraints
.OfType<HttpMethodActionConstraint>()
.FirstOrDefault()?
.HttpMethods?
.FirstOrDefault();
if (httpMethod == null)
{
httpMethod = SelectHttpMethod(action, configuration);
}
if (selector.AttributeRouteModel == null)
{
selector.AttributeRouteModel = CreateAbpServiceAttributeRouteModel(rootPath, controllerName, action, httpMethod, configuration);
}
else
{
var template = selector.AttributeRouteModel.Template;
if (!template.StartsWith("/"))
{
var route = $"{rootPath}/{template}";
selector.AttributeRouteModel.Template = route;
}
}
if (!selector.ActionConstraints.OfType<HttpMethodActionConstraint>().Any())
{
selector.ActionConstraints.Add(new HttpMethodActionConstraint(new[] { httpMethod }));
}
}
}
}
}

View File

@@ -0,0 +1,37 @@
using System.Net;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Volo.Abp.AspNetCore.WebClientInfo;
namespace Yi.Framework.AspNetCore;
public class RealIpHttpContextWebClientInfoProvider : HttpContextWebClientInfoProvider
{
public RealIpHttpContextWebClientInfoProvider(ILogger<HttpContextWebClientInfoProvider> logger,
IHttpContextAccessor httpContextAccessor) : base(logger, httpContextAccessor)
{
}
protected override string? GetClientIpAddress()
{
try
{
var httpContext = HttpContextAccessor.HttpContext;
var headers = httpContext?.Request?.Headers;
if (headers != null && headers.ContainsKey("X-Forwarded-For"))
{
httpContext.Connection.RemoteIpAddress =
IPAddress.Parse(headers["X-Forwarded-For"].FirstOrDefault());
}
return httpContext?.Connection?.RemoteIpAddress?.ToString();
}
catch (Exception ex)
{
Logger.LogException(ex, LogLevel.Warning);
return null;
}
}
}

View File

@@ -0,0 +1,49 @@
namespace Yi.Framework.AspNetCore
{
[Serializable]
public class RemoteServiceSuccessInfo
{
/// <summary>
/// Creates a new instance of <see cref="RemoteServiceSuccessInfo"/>.
/// </summary>
public RemoteServiceSuccessInfo()
{
}
/// <summary>
/// Creates a new instance of <see cref="RemoteServiceSuccessInfo"/>.
/// </summary>
/// <param name="code">Error code</param>
/// <param name="details">Error details</param>
/// <param name="message">Error message</param>
/// <param name="data">Error data</param>
public RemoteServiceSuccessInfo(string message, string? details = null, string? code = null, object? data = null)
{
Message = message;
Details = details;
Code = code;
Data = data;
}
/// <summary>
/// code.
/// </summary>
public string? Code { get; set; }
/// <summary>
/// message.
/// </summary>
public string? Message { get; set; }
/// <summary>
/// details.
/// </summary>
public string? Details { get; set; }
/// <summary>
/// data.
/// </summary>
public object? Data { get; set; }
}
}

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,106 @@
// 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 Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.DependencyInjection;
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);
IUnifyResultProvider unifyResult = context.GetRequiredService<IUnifyResultProvider>();
// 执行规范化异常处理
context.Result = unifyResult.OnException(context, exceptionMetadata);
// 创建日志记录器
var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<FriendlyExceptionFilter>>();
// 记录拦截日常
logger.LogError(context.Exception, context.Exception.Message);
}
/// <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 UserFriendlyException friendlyException)
{
int statusCode2 = 500;
int.TryParse(friendlyException.Code, out statusCode2);
isFriendlyException = true;
errorCode = friendlyException.Code;
originErrorCode = friendlyException.Code;
statusCode = statusCode2==0?403:statusCode2;
isValidationException = false;
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,29 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Swashbuckle.AspNetCore.SwaggerGen;
using Volo.Abp.AspNetCore.Mvc.ExceptionHandling;
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.AddService<SucceededUnifyResultFilter>(99);
options.Filters.AddService<FriendlyExceptionFilter>(100);
options.Filters.RemoveAll(x => (x as ServiceFilterAttribute)?.ServiceType == typeof(AbpExceptionFilter));
});
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,33 @@
using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json.Linq;
using Swashbuckle.AspNetCore.SwaggerGen;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.WebClientInfo;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity;
using Yi.Framework.AspNetCore.Mvc;
using Yi.Framework.Core;
namespace Yi.Framework.AspNetCore
{
[DependsOn(typeof(YiFrameworkCoreModule)
)]
public class YiFrameworkAspNetCoreModule : AbpModule
{
public override void PostConfigureServices(ServiceConfigurationContext context)
{
var services = context.Services;
services.Replace(new ServiceDescriptor(typeof(IWebClientInfoProvider),
typeof(RealIpHttpContextWebClientInfoProvider), ServiceLifetime.Transient));
}
}
}

View File

@@ -0,0 +1,45 @@
using Hangfire.Server;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
using Volo.Abp.Uow;
namespace Yi.Framework.BackgroundWorkers.Hangfire;
public class UnitOfWorkHangfireFilter : IServerFilter, ISingletonDependency
{
private const string CurrentJobUow = "HangfireUnitOfWork";
private readonly IUnitOfWorkManager _unitOfWorkManager;
public UnitOfWorkHangfireFilter(IUnitOfWorkManager unitOfWorkManager)
{
_unitOfWorkManager = unitOfWorkManager;
}
public void OnPerforming(PerformingContext context)
{
var uow = _unitOfWorkManager.Begin();
context.Items.Add(CurrentJobUow, uow);
}
public void OnPerformed(PerformedContext context)
{
AsyncHelper.RunSync(()=>OnPerformedAsync(context));
}
private async Task OnPerformedAsync(PerformedContext context)
{
if (context.Items.TryGetValue(CurrentJobUow, out var obj)
&& obj is IUnitOfWork uow)
{
if (context.Exception == null && !uow.IsCompleted)
{
await uow.CompleteAsync();
}
else
{
await uow.RollbackAsync();
}
uow.Dispose();
}
}
}

View File

@@ -0,0 +1,17 @@
<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.BackgroundWorkers.Hangfire" Version="$(AbpVersion)" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,35 @@
using Hangfire;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.BackgroundWorkers;
using Volo.Abp.BackgroundWorkers.Hangfire;
namespace Yi.Framework.BackgroundWorkers.Hangfire;
[DependsOn(typeof(AbpBackgroundWorkersHangfireModule))]
public class YiFrameworkBackgroundWorkersHangfireModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddConventionalRegistrar(new YiHangfireConventionalRegistrar());
}
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
//定时任务自动注入Abp默认只有在Quartz才实现
var backgroundWorkerManager = context.ServiceProvider.GetRequiredService<IBackgroundWorkerManager>();
var works = context.ServiceProvider.GetServices<IHangfireBackgroundWorker>();
foreach (var work in works)
{
//如果为空默认使用服务器本地utc时间
work.TimeZone ??= TimeZoneInfo.Local;
await backgroundWorkerManager.AddAsync(work);
}
}
public override void OnPreApplicationInitialization(ApplicationInitializationContext context)
{
var services = context.ServiceProvider;
GlobalJobFilters.Filters.Add(services.GetRequiredService<UnitOfWorkHangfireFilter>());
}
}

View File

@@ -0,0 +1,20 @@
using Volo.Abp.BackgroundWorkers.Hangfire;
using Volo.Abp.DependencyInjection;
namespace Yi.Framework.BackgroundWorkers.Hangfire;
public class YiHangfireConventionalRegistrar : DefaultConventionalRegistrar
{
protected override bool IsConventionalRegistrationDisabled(Type type)
{
return !typeof(IHangfireBackgroundWorker).IsAssignableFrom(type) || base.IsConventionalRegistrationDisabled(type);
}
protected override List<Type> GetExposedServiceTypes(Type type)
{
return new List<Type>()
{
typeof(IHangfireBackgroundWorker)
};
}
}

View File

@@ -0,0 +1,123 @@
using Hangfire.Dashboard;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Users;
namespace Yi.Framework.BackgroundWorkers.Hangfire;
public class YiTokenAuthorizationFilter : IDashboardAsyncAuthorizationFilter, ITransientDependency
{
private const string Bearer = "Bearer: ";
private string RequireUser { get; set; } = "cc";
private TimeSpan ExpiresTime { get; set; } = TimeSpan.FromMinutes(10);
private IServiceProvider _serviceProvider;
public YiTokenAuthorizationFilter(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public YiTokenAuthorizationFilter SetRequireUser(string userName)
{
RequireUser = userName;
return this;
}
public YiTokenAuthorizationFilter SetExpiresTime(TimeSpan expiresTime)
{
ExpiresTime = expiresTime;
return this;
}
public bool Authorize(DashboardContext context)
{
var httpContext = context.GetHttpContext();
var _currentUser = _serviceProvider.GetRequiredService<ICurrentUser>();
//如果验证通过设置cookies
if (_currentUser.IsAuthenticated)
{
var cookieOptions = new CookieOptions
{
Expires = DateTimeOffset.Now + ExpiresTime, // 设置 cookie 过期时间,10分钟
};
var authorization = httpContext.Request.Headers["Authorization"].ToString();
if (!string.IsNullOrWhiteSpace(authorization))
{
var token = httpContext.Request.Headers["Authorization"].ToString().Substring(Bearer.Length - 1);
httpContext.Response.Cookies.Append("Token", token, cookieOptions);
}
if (_currentUser.UserName == RequireUser)
{
return true;
}
}
SetChallengeResponse(httpContext);
return false;
}
private void SetChallengeResponse(HttpContext httpContext)
{
httpContext.Response.StatusCode = 401;
httpContext.Response.ContentType = "text/html; charset=utf-8";
string html = """
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Token </title>
<script>
function sendToken() {
// 获取输入的 token
var token = document.getElementById("tokenInput").value;
token = token.replace('Bearer ','');
// 构建请求 URL
var url = "/hangfire";
// 发送 GET 请求
fetch(url,{
headers: {
'Content-Type': 'application/json', // 设置内容类型为 JSON
'Authorization': 'Bearer '+encodeURIComponent(token), // 设置授权头,例如使用 Bearer token
},
})
.then(response => {
if (response.ok) {
return response.text(); // 或使用 response.json() 如果返回的是 JSON
}
throw new Error('Network response was not ok.');
})
.then(data => {
// 处理成功返回的数据
document.open();
document.write(data);
document.close();
})
.catch(error => {
// 处理错误
console.error('There has been a problem with your fetch operation:', error);
alert("请求失败: " + error.message);
});
}
</script>
</head>
<body style="text-align: center;">
<h1>Yi-hangfire</h1>
<h1>Token</h1>
<textarea id="tokenInput" placeholder="请输入 token" style="width: 80%;height: 120px;margin: 0 10%;"></textarea>
<button onclick="sendToken()"></button>
</body>
</html>
""";
httpContext.Response.WriteAsync(html);
}
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,40 @@
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
{
[Dependency(ReplaceServices =true)]
public class YiDistributedCacheKeyNormalizer : IDistributedCacheKeyNormalizer, ITransientDependency
{
protected ICurrentTenant CurrentTenant { get; }
protected AbpDistributedCacheOptions DistributedCacheOptions { get; }
public YiDistributedCacheKeyNormalizer(
ICurrentTenant currentTenant,
IOptions<AbpDistributedCacheOptions> distributedCacheOptions)
{
CurrentTenant = currentTenant;
DistributedCacheOptions = distributedCacheOptions.Value;
}
public virtual string NormalizeKey(DistributedCacheKeyNormalizeArgs args)
{
var normalizedKey = $"{DistributedCacheOptions.KeyPrefix}{args.Key}";
//if (!args.IgnoreMultiTenancy && CurrentTenant.Id.HasValue)
//{
// normalizedKey = $"t:{CurrentTenant.Id.Value},{normalizedKey}";
//}
return normalizedKey;
}
}
}

View File

@@ -0,0 +1,32 @@
using FreeRedis;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Caching;
namespace Yi.Framework.Caching.FreeRedis
{
/// <summary>
/// 此模块得益于FreeRedis作者支持IDistributedCache使用湿滑
/// </summary>
[DependsOn(typeof(AbpCachingModule))]
public class YiFrameworkCachingFreeRedisModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
var redisEnabled = configuration["Redis:IsEnabled"];
if (redisEnabled.IsNullOrEmpty() || bool.Parse(redisEnabled))
{
var redisConfiguration = configuration["Redis:Configuration"];
RedisClient redisClient = new RedisClient(redisConfiguration);
context.Services.AddSingleton<IRedisClient>(redisClient);
context.Services.Replace(ServiceDescriptor.Singleton<IDistributedCache>(new
DistributedCache(redisClient)));
}
}
}
}

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Data.Entities
namespace Yi.Framework.Core.Data
{
public interface IOrderNum
{

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Data.Entities
namespace Yi.Framework.Core.Data
{
public interface IState
{

View File

@@ -4,17 +4,17 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Enums
namespace Yi.Framework.Core.Enums
{
/// <summary>
/// 定义公共文件路径
/// </summary>
public enum FileTypeEnum
{
File,
Image,
Thumbnail,
Excel,
Temp
file,
image,
thumbnail,
excel,
temp
}
}

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Enums
namespace Yi.Framework.Core.Enums
{
public enum OrderByEnum
{

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Enums
namespace Yi.Framework.Core.Enums
{
public enum QueryOperatorEnum
{

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Enums
namespace Yi.Framework.Core.Enums
{
public enum ResultCodeEnum
{

View File

@@ -1,12 +1,8 @@
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
namespace Yi.Framework.Infrastructure.AspNetCore
namespace Yi.Framework.Core.Extensions
{
public static class HttpContextExtensions
{
@@ -78,9 +74,12 @@ namespace Yi.Framework.Infrastructure.AspNetCore
result = "127.0.0.1";
result = result.Replace("::ffff:", "127.0.0.1");
//Ip规则效验
var regResult = Regex.IsMatch(result, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
//如果有端口号,删除端口号
result = Regex.Replace(result, @":\d{1,5}$", "");
//Ip规则校验
var regResult =
Regex.IsMatch(result, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$")
|| Regex.IsMatch(result, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?):\d{1,5}$");
result = regResult ? result : "127.0.0.1";
return result;
@@ -95,5 +94,20 @@ namespace Yi.Framework.Infrastructure.AspNetCore
{
return context.Request.Headers["User-Agent"];
}
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"></param>
/// <returns></returns>
public static bool IsWebSocketRequest(this HttpContext context)
{
return context.WebSockets.IsWebSocketRequest || context.Request.Path == "/ws";
}
}
}

View File

@@ -5,7 +5,7 @@ using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public static class AssemblyHelper
{

View File

@@ -1,7 +1,7 @@
using System;
using System.Text;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public sealed class Base32Helper
{

View File

@@ -1,16 +1,102 @@
using System.Runtime.InteropServices;
using Newtonsoft.Json;
using Yi.Framework.Infrastructure.Extensions;
namespace Yi.Framework.Infrastructure.Helper
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 GetComputerInfo()
public static MemoryMetrics GetMemoryMetrics()
{
try
{
@@ -21,7 +107,7 @@ namespace Yi.Framework.Infrastructure.Helper
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() + "%";
memoryMetrics.CPURate = Math.Ceiling(GetCPURate().ParseToDouble()) + "%";
return memoryMetrics;
}
catch (Exception ex)
@@ -32,7 +118,7 @@ namespace Yi.Framework.Infrastructure.Helper
}
/// <summary>
/// 获取内存大小
/// 获取磁盘信息
/// </summary>
/// <returns></returns>
public static List<DiskInfo> GetDiskInfos()
@@ -101,7 +187,7 @@ namespace Yi.Framework.Infrastructure.Helper
var isUnix = RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
return isUnix;
}
public static string GetCPURate()
{
string cpuRate;
@@ -130,7 +216,7 @@ namespace Yi.Framework.Infrastructure.Helper
if (IsUnix())
{
string output = ShellHelper.Bash("uptime -s").Trim();
runTime = DateTimeHelper.FormatTime((DateTime.Now - output.ParseToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ParseToLong());
runTime = DateTimeHelper.FormatTime(ParseToLong((DateTime.Now - ParseToDateTime(output)).TotalMilliseconds.ToString().Split('.')[0]));
}
else
{
@@ -138,7 +224,7 @@ namespace Yi.Framework.Infrastructure.Helper
string[] outputArr = output.Split('=', (char)StringSplitOptions.RemoveEmptyEntries);
if (outputArr.Length == 2)
{
runTime = DateTimeHelper.FormatTime((DateTime.Now - outputArr[1].Split('.')[0].ParseToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ParseToLong());
runTime = DateTimeHelper.FormatTime(ParseToLong((DateTime.Now - ParseToDateTime( outputArr[1].Split('.')[0])).TotalMilliseconds.ToString().Split('.')[0]));
}
}
}
@@ -148,8 +234,69 @@ namespace Yi.Framework.Infrastructure.Helper
}
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>
@@ -163,10 +310,7 @@ namespace Yi.Framework.Infrastructure.Helper
public double Free { get; set; }
public string UsedRam { get; set; }
/// <summary>
/// CPU使用率%
/// </summary>
public string CPURate { get; set; }
/// <summary>
/// 总内存 GB
/// </summary>
@@ -233,20 +377,25 @@ namespace Yi.Framework.Infrastructure.Helper
/// <returns></returns>
public MemoryMetrics GetUnixMetrics()
{
string output = ShellHelper.Bash("free -m | awk '{print $2,$3,$4,$5,$6}'");
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();
var lines = output.Split('\n', (char)StringSplitOptions.RemoveEmptyEntries);
if (lines.Length <= 0) return metrics;
if (lines != null && lines.Length > 0)
if (!string.IsNullOrWhiteSpace(output))
{
var memory = lines[1].Split(' ', (char)StringSplitOptions.RemoveEmptyEntries);
if (memory.Length >= 3)
var memory = output.Split(' ', (char)StringSplitOptions.RemoveEmptyEntries);
if (memory.Length >= 2)
{
metrics.Total = double.Parse(memory[0]);
metrics.Used = double.Parse(memory[1]);
metrics.Free = double.Parse(memory[2]);//m
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;

View File

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

View File

@@ -1,6 +1,6 @@
using System;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public class DateHelper
{

View File

@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public class DateTimeHelper
{

View File

@@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public class Compare<T, C> : IEqualityComparer<T>
{

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public static class EnumHelper
{

View File

@@ -5,7 +5,7 @@ using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public static class ExpressionHelper
{

View File

@@ -4,7 +4,7 @@ using System.IO;
using System.Linq;
using System.Text;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public class FileHelper : IDisposable
{

View File

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

View File

@@ -10,7 +10,7 @@ using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public static class HttpHelper
{

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public static class IdHelper
{

View File

@@ -3,7 +3,7 @@ using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public class IpHelper
{

View File

@@ -1,10 +1,7 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Text.Json;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public class JsonHelper
{
@@ -37,7 +34,6 @@ namespace Yi.Framework.Infrastructure.Helper
string result = string.Empty;
try
{
System.Text.Json.JsonSerializer.Serialize("");
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =
new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
@@ -454,7 +450,7 @@ namespace Yi.Framework.Infrastructure.Helper
{
return;
}
//示例 ["aa",{"bbbb":123,"fff","ddd"}]
//示例 ["aa",{"bbbb":123,"fff","Ddd"}]
switch (c)
{
case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}]

View File

@@ -3,7 +3,7 @@ using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public class MD5Helper
{

View File

@@ -4,9 +4,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Infrastructure.Enums;
using Yi.Framework.Core.Enums;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public static class MimeHelper
{
@@ -45,8 +45,8 @@ namespace Yi.Framework.Infrastructure.Helper
{
var extension = Path.GetExtension(fileName);
if (ImageType.Contains(extension.ToLower()))
return FileTypeEnum.Image;
return FileTypeEnum.File;
return FileTypeEnum.image;
return FileTypeEnum.file;
}

View File

@@ -6,7 +6,7 @@ using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public class RSAFileHelper
{

View File

@@ -3,7 +3,7 @@ using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
/// <summary>
/// RSA加解密 使用OpenSSL的公钥加密/私钥解密

View File

@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public class RandomHelper
{

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public static class ReflexHelper
{

View File

@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public class ShellHelper
{

View File

@@ -4,7 +4,7 @@ using System.IO;
using System.Linq;
using System.Text;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public class StringHelper
{

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public static class TreeHelper
{
@@ -13,7 +13,7 @@ namespace Yi.Framework.Infrastructure.Helper
if (list is not null && list.Count > 0)
{
IList<T> result = new List<T>();
long pid = list.Min(m => (m as ITreeModel<T>)!.ParentId);
Guid pid = list.Min(m => (m as ITreeModel<T>)!.ParentId);
IList<T> t = list.Where(m => (m as ITreeModel<T>)!.ParentId == pid).ToList();
foreach (T model in t)
{
@@ -57,8 +57,8 @@ namespace Yi.Framework.Infrastructure.Helper
public interface ITreeModel<T>
{
public long Id { get; set; }
public long ParentId { get; set; }
public Guid Id { get; set; }
public Guid ParentId { get; set; }
public int OrderNum { get; set; }
public List<T>? Children { get; set; }

View File

@@ -2,7 +2,7 @@
using System.Text;
using System.Text.RegularExpressions;
namespace Yi.Framework.Infrastructure.Helper
namespace Yi.Framework.Core.Helper
{
public static class UnicodeHelper
{

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