Compare commits

...

1057 Commits

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

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

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

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

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

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

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

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

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

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

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

    style: 修复股票api过期问题

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

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

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

    feat: 添加值对象

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

    feat: 添加值对象

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

    feat: 去除新增的缓存操作

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

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

    style: 修复股票api过期问题

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

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

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

    feat: 添加值对象

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

    feat: 添加值对象

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

    feat: 去除新增的缓存操作

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

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

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

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

    feat: 添加值对象

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

    feat: 添加值对象

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

    feat: 去除新增的缓存操作

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

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

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

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

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

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

139
.gitignore vendored
View File

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

387
README.md
View File

@@ -1,100 +1,144 @@
<h1 align="center"><img align="left" height="100px" src="https://user-images.githubusercontent.com/68722157/138828506-f58b7c57-5e10-4178-8f7d-5d5e12050113.png"> Yi框架</h1>
<h4 align="center">一套与SqlSugar一样爽的.Net6开源框架</h4>
<h1 align="center"><img align="left" height="150px" src="https://ccnetcore.com/prod-api/wwwroot/logo.png"> Yi框架</h1>
<h4 align="center">一套以用户体验出发的.Net8 Web开源框架</h4>
<h5 align="center">支持Abp.vNext 版本原生版本、Furion版本前端后台接入Ruoyi Vue3.0</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)
****
### 简介:
## :tw-1f34e: 简介:
YiFramework是一个基于.Net8+Abp.vNext+SqlSugar的DDD领域驱动设计后端开源框架
谁说Abp复杂谁说DDD难`打破常规,化繁为简`,新人入门,项目二开,最佳方式之一
**中文:意框架**和他的名字一样“简易”同时接入Java的Ruoyi Vue3.0前端)
模块分化较多,可根据业务自行引用或抛弃,集大成者,大而全乎,也许你能从中学习到一些独特见解
正在持续更进业务模块已接入ruoyi
模块,可根据业务自行引用或抛弃,集大成者,大而全乎,也许你能从中学习到一些独特见解
**英文YiFramework**
Yi框架-一套与SqlSugar一样爽的.Net6低代码开源框架。
Yi框架-一套与SqlSugar一样爽的.Net8开源框架。
与Sqlsugar理念一致以用户体验出发。
架构干净整洁、无业务代码、采用微软风格原生框架封装、CodeFrist+配套自研文件模板代码生成器 开发。
适合.Net6学习、Sqlsugar学习 、项目二次开发。
适合.Net8学习、Sqlsugar学习 、项目二次开发。
集大成者,终究轮子
Yi框架最新版本标签`v1.2.1`,具体版本可以查看标签迭代
项目与Sqlsugar同步更新但这作者老杰哥代码天天爆肝到凌晨两点我们也尽量会跟上他的脚步。更新频繁所以可watching持续关注。
更新频繁可watching持续关注。
————这不仅仅是一个程序,更是一个艺术品,面向艺术的开发!
**分支**
> 核心特点简单好用框架不以打包形式引用而是直接以项目附带源码给出自由度拉满遵循Mit协议允许随意修改请注明来源即可
本项目由EFCore版本历经3年不断迭代至Sqlsugar版本现EFcore版本已弃用目前sqlsugar已带业务功能
**分支:**
**SqlSugar**:.Net6 DDD领域驱动设计 简单分层微服务架构
- (推荐) **Abp**: 基于Abp.vNext分支DDD领域驱动设计,回归开发本质,极度简单,用起来贼爽
- Yi.Framework.Net6.NetCore 6 意框架 (后端)
- Yi.Vue3.X.RuoYiVue3 RuoYi前端框架 (前端后台)
你没有听错已经接入java流行指数最高最火爆的框架之一与其他框架不同Yi框架后端为完全重制版并非为ruoyi java模仿版
- Yi.Vue3.x.VantVue3 移动端前端框架 (前端前台)持续迭代
**SqlSugar-Dev**为sqlsugar分支的实时开发版本
~~**ec**: EFcore完整电商项目~~
- **Furion**: 基于Furion分支
****
### 演示地址:
## :tw-1f350: 官网及演示地址:
废话少说直接上地址**请不要**更改里面的数据
废话少说直接上地址
API服务[yi.ccnetcore.com](http://yi.ccnetcore.com) 管理员账号cc 、 123456
Yi社区官网网址[ccnetcore.com](https://ccnetcore.com) (已上线,欢迎加入)
网关地址:~~[gate.ccnetcore.com/swagger](http://gate.ccnetcore.com/swagger)~~
Rbac后台管理系统已上线暂不提供演示地址可本地部署访问
~~WebFirst开发所有代码生成器已经配置完成无需任何操作数据库及任何代码只需要网页表格上点点点即可~~
App移动端系统已上线暂不提供演示地址可本地部署访问
代码自动生成:
Rbac演示地址https://ccnetcore.com:1000 用户cc、密码123456
![代码生成](Readme/%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90.gif)
### 支持:
## :tw-1f351: 支持:
- [x] 完全支持单体应用架构
- [x] 完全支持分布式应用架构
- [x] 完全支持微服务架构
- [ ] 即将支持网格服务架构我们将在后续版本加入dapr
****
### 软件架构:
## :tw-1f352: 详细到爆炸的Yi框架教程导航
**架构**:后端.NET6(Asp.NetCore 6)、WebFirst代码生成器~~与.NET5(Asp.NetCore 5)、前端Vue2.0~~
**关系型数据库**mysql、sql server、sqlite、oracle(正在兼容中)
**操作系统**Windows、Linux
**身份验证**JWT、IdentityServer4
**组件**SqlSugar、Autofac、Castle、Swagger、Log4Net、Redis、RabbitMq、ES、Quartz.net、~~T4~~
**分布式**CAP、Lock
**微服务**Consul、Ocelot、IdentityService、Apollo、Docker、Jenkins、Nginx、K8s、ELK、Polly
**封装**Json处理模块滑动验证码模块base64图片处理模块异常捕捉模块、邮件处理模块、linq封装模块、随机数模块、统一接口模块、基于策略的jwt验证、过滤器、数据库连接、跨域、初始化种子数据、Base32、Console输出、日期处理、文件传输、html筛选、http请求、ip过滤、md5加密、Rsa加密、序列化、雪花算法、字符串处理、编码处理、地址处理、xml处理、心跳检查。。。
1. [框架快速开始教程](https://ccnetcore.com/article/aaa00329-7f35-d3fe-d258-3a0f8380b742)(已完成)
2. [框架功能模块教程](https://ccnetcore.com/article/8c464ab3-8ba5-2761-a4b0-3a0f83a9f312)(已完成)
3. [实战演练开发教程](https://ccnetcore.com/article/e89c9593-f337-ada7-d108-3a0f83ae48e6)
4. [橙子运维CICD教程](https://ccnetcore.com/article/6b80ed42-50cd-db15-c073-3a0fa8f7fd77)(已完成)
5. [版本更新日志](https://ccnetcore.com/article/e9e69a38-ce1e-06f5-7944-3a0fdc942ef3)(已完成)
****
<h3>业务支持模块</h3>
## :tw-1f353: 它的理念:
谁说Abp复杂谁说DDD难打破常规化繁为简新人入门项目二开最佳方式之一
RABC权限管理系统正在更新
大部分ruoyi功能采用ruoyi前端
> 一百个人就有一百种DDDYi框架不一定是极度严格的DDD而是站在巨人的肩膀上经过极多项目的提炼摸索出一种最佳实践
优雅的进行快速开发通常简单程度与优雅程度不可兼得Yi框架并不一昧的追求极致的解耦会站在用户使用角度上在使用难易度进行考虑衡量
> 一个面向用户的快速开发后端框架
在真正的使用这,你会明白这一点,极致的简单,也是优雅的一种体现。
****
## :tw-1f354: 特点
- 面向用户的后端框架,使用简单,适合小型、中型、企业级项目
- 项目直接内置源码,不打包,非常适合进行二开改造
- 内置包含大量通用场景模块
- 优雅支持分布式及微服务架构
- 等等
## :tw-1f340: 基础设施简介
以下全部功能可直接使用:
- [Abp.vNext官网](https://docs.abp.io/zh-Hans/abp/latest/)
- [SqlSugar官网](https://www.donet5.com/home/doc)
## :tw-1f341: 内置模块简介
- Rbac权限管理系统已上线
- Bbs论坛社区系统已上线
> 重复的东西,无需再写一遍,这也是优雅的体现之一
****
## :tw-1f31e: 核心技术
#### 后端
C# Asp.NetCore 8.0
- [x] 动态ApiAbp.vNext
- [x] 鉴权授权Jwt
- [x] 日志Serilog
- [x] 模块化Abp.vNext
- [x] 依赖注入Autofac
- [x] 对象映射Mapster
- [x] ORM: SqlsugarCore
- [x] 多租户Abp.vNext
- [x] 后台任务Quartz.Net
- [x] 本地缓存Abp.vNext
- [x] 分布式缓存Abp.vNext
- [x] 事件总线Abp.vNext
#### 前端
js Vue3.2
- [x] 异步请求axios
- [x] 图表echarts
- [x] uielement-plus
- [x] 存储pinia
- [x] 路由vue-router
- [x] 打包vite
#### 运维
- [x] 部署nginx
- [x] CICDgitlab+Jenkins
- [x] Dockerharbor
****
## :tw-1f366: 业务支持模块:
#### :tw-1f42f: RABC权限管理系统持续更新
采用ruoyi前端
- 用户管理
- 角色管理
- 菜单管理
@@ -105,177 +149,100 @@ RABC权限管理系统正在更新
- 用户在线
- 操作日志
- 登录日志
- 等等
- 定时任务
- 缓存列表
- 服务监控
- WebFirst代码生成工具
ERP进销存系统(正在更新)
- 供货商管理
- 等等
#### :tw-1f431: BBS社区论坛系统(持续更新)
采用vue3前端
- 文章功能
- 板块功能
- 主题功能
- 个人中心
- 授权中心
- 权限管理
BBS论坛系统持续迭代
- 文章管理
- 评论管理
- 等等
#### :star: 演示截图:
<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/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管理
- 商品规格
- 商品分类
- 等等
![输入图片说明](Readme/%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86.png)
![输入图片说明](Readme/%E8%8F%9C%E5%8D%95%E7%AE%A1%E7%90%86.png)
### 框架支持模块:
大致如图:
![image](https://user-images.githubusercontent.com/68722157/142923071-2fa524eb-e833-4143-a926-51566e56e889.png)
![image](https://user-images.githubusercontent.com/68722157/142923150-ebe1b538-c3fc-42dd-bea8-83e10e0f819a.png)
![image](https://user-images.githubusercontent.com/68722157/142923529-e4fbb2f6-def1-4702-b9da-5adbd22f0a2f.png)
(删除线代表已实现功能还未迁移过来)
- [x] 支持大致`DDD领域驱动设计`进行分层,支持微服务扩展
- [x] 支持采用`异步`开发awit/async
- [x] 支持数据库主从`读写分离`
- [x] 支持功能替换,无需改动代码,只需配置`json文件`进行装配即可
- [x] 支持`Aop封装`FilterAop、IocAop、LogAop、SqlAop
- [x] 支持`Log4Net日志`记录自动生成至bin目录下的logs文件夹
- [x] 支持`DbSeed数据库种子数据`接入
- [x] 支持主流`数据库随意切换`Mysql/Sqlite/Sqlserver/Oracle
- [x] 支持上海杰哥官方`SqlSugar ORM`封装
- [x] 支持新版`SwaggerWebAPI`jwt身份认证接入
- [x] 支持`Cors`跨域
- [x] 支持`AutoFac`自动映射依赖注入
- [x] 支持`consul`服务器注册与发现
- [x] 支持`健康检查`
- [x] 支持`RabbitMQ`消息队列
- [x] 支持`Redis`多级缓存
- [x] 支持`MemoryCache`多级缓存
- [x] 支持`Ocelot`网关路由、服务聚合、服务发现、认证、鉴权、限流、熔断、缓存、Header头传递
- [x] 支持`Apollo`全局配置中心;
- [x] 支持`docker`镜像制作
- [x] 支持`Quartz.net`任务调度,实现任意接口被调度
- [x] 支持`ThumbnailSharp`缩略图封装
- [x] 支持`ELK`log4net+kafka+es+logstach+kibana
- [x] 支持`IdentityService4`授权中心
- [x] 支持`Es`分词查询
- [x] 支持多级`缓存`
- [x] 支持`CAP`分布式事务mysql+rabbitMq
- [x] 支持`Docker+k8s`部署
- [x] 支持`Jenkins+CI/CD`
- [x] 支持`AutoMapper`模块映射
- [x] 支持`微信支付`模块
- [x] 支持`单表多租户`常用功能
- [x] 支持`逻辑删除`常用功能
- [x] 支持`操作日志`常用功能
- [x] 支持`自动分表`
- [x] 支持`数据权限`
- [x] 支持`CodeFrist`快速构建数据库
- [x] 支持自研文件版`代码生成器`快速构建通用代码
- [x] 支持完整`Dto`模式
- [x] 支持 太多了忘了
****
### 目录结构:
![image](https://s1.ax1x.com/2022/04/09/LCTleH.png)
![image](https://s1.ax1x.com/2022/04/24/L4qlSs.png)
![image](https://s1.ax1x.com/2022/04/24/L4q1ln.png)
我们大致依照DDD领域驱动设计分层
分层如此清晰什么还感觉太复杂了用户只需关注Api、Service其他都是轮子啊
- BackGround后台进程通常使用消息队列进行消费任务
- Test测试单元测试
- Domain领域层Dto、服务接口层、模型层、仓储层、服务层
- Infrastructure基础实例层(通用工具层、核心层、定时任务Job、国际化、Web扩展层)
- Module模块层其他模块可按需进行引入例如微信支付、代码生成
- MicroServiceInstance服务层微服务
****
### 安装教程:
我们将在之后更新教程手册!
后端
1. 下载全部源码默认使用sqlite数据库已经生成
2. 直接点击sln文件运行即可没有任何其他依赖
前端
1. 下载全部源码npm i 安装依赖
2. 使用npm run dev进行运行
****
### 使用说明:
~~1. 导入使用仓库中的WebFirst数据库~~
~~2. 使用WebFirst添加实体、同步实体、修改模板生成路径并生成方案~~
没了,恭喜你已经成功完成了项目,并且已经具备大部分通用场景业务
是不是一个字?爽!
到此为止,你无需写任何一个代码!
**爽点**
新人,看这里,项目下载之后直接可以启动,无任何依赖,之后你可以查看`Test控制器`,迫不及待的快来爽一爽!
我们将使用说明转移至我们的官方论坛中,正在制作中,尽情期待!
****
### 感谢:
**大力支持** Eleven神、Sqlsugar上海杰哥、Gerry、哲学的老张
## :tw-1f44f: 感谢:
[橙子]https://ccnetcore.com
[lzw]https://github.com/yeslode
[XWen]https://gitee.com/on-wensil
[朝夕教育]https://www.zhaoxiedu.net
[Sqlsugar]https://www.donet5.com/Home/Doc
[Sqlsugar老杰哥]https://www.donet5.com/Home/Doc
[RuYiAdmin]https://gitee.com/pang-mingjun/RuYiAdmin
[车神]微信公众号搜索Dotnet技术进阶
[ZrAdminNetCore]https://gitee.com/izory/ZrAdminNetCore
[RuYiAdmin如意老兄]https://gitee.com/pang-mingjun/RuYiAdmin
[ZrAdminNetCore字母老哥]https://gitee.com/izory/ZrAdminNetCore
[Admin.NET]https://gitee.com/zuohuaijun/Admin.NET
[Furion百小僧]https://furion.baiqian.ltd/
****
### 联系我们:
## :tw-1f438: 联系我们:
作者QQ`454313500`2029年之前作者24小时在线时刻保持活跃更新。
QQ交流群官方一群已满、官方二群已满、官方三群`786308927`加作者QQ后同意
QQ交流群官方一群已满、官方二群已满、官方三群`786308927`已满)、官方四群:`498310311`(基本已满)、官方五群:`981136525`(新群
微信交流群:加作者微信 chengzilaoge520 橙子老哥520备注拉群
联系作者,这里人人都是顾问
官方网址:正在建设
官方网址留言区:[ccnetcore.com](https://ccnetcore.com)
****
### FQA:
## :tw-1f41e: FQA:
问1为什么不采用EFcore
前往官网查看留言区
答1别问问就是Sqlsugar和本框架一样爽
问2以后会持续更新下去吗
答2一定会的我们的标题是 一个和Sqlsugar一样爽的.Net6开源框架 只要Sqlsugar在我们将一直更新下去。
问3这个框架的针对人群是哪些人适合所有人吗
答3并不是适合所有人应该算适合需要有一定基础的开发人员当然如果你是大神你完全可以将这个框架二次开发
问4花如此多的精力制作这个框架是为了什么是为了赚钱吗和目前主流的abp等框架比又有什么意义呢
答4我们与Sqlsugar作者理念一致我们是从用户角度出发框架是为用户服务与ABP复杂上手理念完全是相反的。
问5为何不出版一个详细的说明书呢
答5暂时不会了之后可能会代码都是基于Asp.NetCore框架适用于新手不用造轮子整个框架较为简单阅读源码后基本能自定义改造使用了过难也已经封装完毕别忘了其意义是为了开发更加简易建议添加作者好友这里人人都是顾问。
我大抵要厌倦了负重前行。
[留言区](https://ccnetcore.com/discuss/1641030787056930818)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

View File

@@ -22,4 +22,9 @@
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md
README.md
!**/.gitignore
!.git/HEAD
!.git/config
!.git/packed-refs
!.git/refs/heads/**

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

@@ -0,0 +1,509 @@
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
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("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sample", "sample", "{01300F0F-686E-47B3-821D-12424177867B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Web", "sample\Acme.BookStore.Web\Acme.BookStore.Web.csproj", "{576DBC97-4E5D-4444-B65C-F41649A5F8E0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Domain.Shared", "sample\Acme.BookStore.Domain.Shared\Acme.BookStore.Domain.Shared.csproj", "{D7F8BD42-F6A2-4F0A-9212-391B5185A99D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Domain", "sample\Acme.BookStore.Domain\Acme.BookStore.Domain.csproj", "{B615847F-8568-41D1-8B7E-63D61AE69F3D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Application.Contracts", "sample\Acme.BookStore.Application.Contracts\Acme.BookStore.Application.Contracts.csproj", "{20827DB5-5CDE-491A-82E8-3CAB82618C1E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Application", "sample\Acme.BookStore.Application\Acme.BookStore.Application.csproj", "{320273B6-7AE3-42DA-9675-D9AD4928A289}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.SqlSugarCore", "sample\Acme.BookStore.SqlSugarCore\Acme.BookStore.SqlSugarCore.csproj", "{70CCBD89-C0A1-4AC8-9AFA-C86C356DFDD7}"
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
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
{576DBC97-4E5D-4444-B65C-F41649A5F8E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{576DBC97-4E5D-4444-B65C-F41649A5F8E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{576DBC97-4E5D-4444-B65C-F41649A5F8E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{576DBC97-4E5D-4444-B65C-F41649A5F8E0}.Release|Any CPU.Build.0 = Release|Any CPU
{D7F8BD42-F6A2-4F0A-9212-391B5185A99D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D7F8BD42-F6A2-4F0A-9212-391B5185A99D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D7F8BD42-F6A2-4F0A-9212-391B5185A99D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D7F8BD42-F6A2-4F0A-9212-391B5185A99D}.Release|Any CPU.Build.0 = Release|Any CPU
{B615847F-8568-41D1-8B7E-63D61AE69F3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B615847F-8568-41D1-8B7E-63D61AE69F3D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B615847F-8568-41D1-8B7E-63D61AE69F3D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B615847F-8568-41D1-8B7E-63D61AE69F3D}.Release|Any CPU.Build.0 = Release|Any CPU
{20827DB5-5CDE-491A-82E8-3CAB82618C1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20827DB5-5CDE-491A-82E8-3CAB82618C1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20827DB5-5CDE-491A-82E8-3CAB82618C1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20827DB5-5CDE-491A-82E8-3CAB82618C1E}.Release|Any CPU.Build.0 = Release|Any CPU
{320273B6-7AE3-42DA-9675-D9AD4928A289}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{320273B6-7AE3-42DA-9675-D9AD4928A289}.Debug|Any CPU.Build.0 = Debug|Any CPU
{320273B6-7AE3-42DA-9675-D9AD4928A289}.Release|Any CPU.ActiveCfg = Release|Any CPU
{320273B6-7AE3-42DA-9675-D9AD4928A289}.Release|Any CPU.Build.0 = Release|Any CPU
{70CCBD89-C0A1-4AC8-9AFA-C86C356DFDD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{70CCBD89-C0A1-4AC8-9AFA-C86C356DFDD7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{70CCBD89-C0A1-4AC8-9AFA-C86C356DFDD7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{70CCBD89-C0A1-4AC8-9AFA-C86C356DFDD7}.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
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}
{576DBC97-4E5D-4444-B65C-F41649A5F8E0} = {01300F0F-686E-47B3-821D-12424177867B}
{D7F8BD42-F6A2-4F0A-9212-391B5185A99D} = {01300F0F-686E-47B3-821D-12424177867B}
{B615847F-8568-41D1-8B7E-63D61AE69F3D} = {01300F0F-686E-47B3-821D-12424177867B}
{20827DB5-5CDE-491A-82E8-3CAB82618C1E} = {01300F0F-686E-47B3-821D-12424177867B}
{320273B6-7AE3-42DA-9675-D9AD4928A289} = {01300F0F-686E-47B3-821D-12424177867B}
{70CCBD89-C0A1-4AC8-9AFA-C86C356DFDD7} = {01300F0F-686E-47B3-821D-12424177867B}
{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}
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

@@ -2,8 +2,7 @@
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "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,157 @@
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;
namespace Yi.Framework.AspNetCore.Microsoft.Extensions.DependencyInjection
{
public static class SwaggerAddExtensions
{
public static IServiceCollection AddYiSwaggerGen<Program>(this IServiceCollection services, Action<SwaggerGenOptions>? action=null)
{
var serviceProvider = services.BuildServiceProvider();
var mvcOptions = serviceProvider.GetRequiredService<IOptions<AbpAspNetCoreMvcOptions>>();
var mvcSettings = mvcOptions.Value.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,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,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,27 @@
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.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
{
}
}

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,11 +4,10 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Common.Enum
namespace Yi.Framework.Core.Data
{
public enum ShowFlagEnum
public interface IOrderNum
{
NoShow=0,
Show=1
int OrderNum { get; set; }
}
}

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Data
{
public interface IState
{
public bool State { get; set; }
}
}

View File

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

View File

@@ -4,9 +4,11 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.DtoModel.ERP.Supplier.ConstConfig
namespace Yi.Framework.Core.Enums
{
public class SupplierConst
public enum OrderByEnum
{
Asc,
Desc
}
}

View File

@@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Core.Enums
{
public enum QueryOperatorEnum
{
/// <summary>
/// 相等
/// </summary>
Equal,
/// <summary>
/// 匹配
/// </summary>
Like,
/// <summary>
/// 大于
/// </summary>
GreaterThan,
/// <summary>
/// 大于或等于
/// </summary>
GreaterThanOrEqual,
/// <summary>
/// 小于
/// </summary>
LessThan,
/// <summary>
/// 小于或等于
/// </summary>
LessThanOrEqual,
/// <summary>
/// 等于集合
/// </summary>
In,
/// <summary>
/// 不等于集合
/// </summary>
NotIn,
/// <summary>
/// 左边匹配
/// </summary>
LikeLeft,
/// <summary>
/// 右边匹配
/// </summary>
LikeRight,
/// <summary>
/// 不相等
/// </summary>
NoEqual,
/// <summary>
/// 为空或空
/// </summary>
IsNullOrEmpty,
/// <summary>
/// 不为空
/// </summary>
IsNot,
/// <summary>
/// 不匹配
/// </summary>
NoLike,
/// <summary>
/// 时间段 值用 "|" 隔开
/// </summary>
DateRange
}
}

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Common.Enum
namespace Yi.Framework.Core.Enums
{
public enum ResultCodeEnum
{
@@ -24,18 +24,8 @@ namespace Yi.Framework.Common.Enum
NoPermission = 401,
/// <summary>
/// Access过期
/// 被拒绝
/// </summary>
AccessTokenExpire = 1001,
/// <summary>
/// Refresh过期
/// </summary>
RefreshTokenExpire = 1002,
/// <summary>
/// 没有角色登录
/// </summary>
NoRoleLogin = 1003,
Denied = 403
}
}

View File

@@ -0,0 +1,100 @@
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Http;
namespace Yi.Framework.Core.Extensions
{
public static class HttpContextExtensions
{
/// <summary>
/// 设置文件下载名称
/// </summary>
/// <param name="httpContext"></param>
/// <param name="fileName"></param>
public static void FileInlineHandle(this HttpContext httpContext, string fileName)
{
string encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));
httpContext.Response.Headers.Add("Content-Disposition", "inline;filename=" + encodeFilename);
}
/// <summary>
/// 设置文件附件名称
/// </summary>
/// <param name="httpContext"></param>
/// <param name="fileName"></param>
public static void FileAttachmentHandle(this HttpContext httpContext, string fileName)
{
string encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));
httpContext.Response.Headers.Add("Content-Disposition", "attachment;filename=" + encodeFilename);
}
/// <summary>
/// 获取语言种类
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
public static string GetLanguage(this HttpContext httpContext)
{
string res = "zh-CN";
var str = httpContext.Request.Headers["Accept-Language"].FirstOrDefault();
if (str is not null)
{
res = str.Split(",")[0];
}
return res;
}
/// <summary>
/// 判断是否为异步请求
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public static bool IsAjaxRequest(this HttpRequest request)
{
string header = request.Headers["X-Requested-With"];
return "XMLHttpRequest".Equals(header);
}
/// <summary>
/// 获取客户端IP
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public static string GetClientIp(this HttpContext context)
{
if (context == null) return "";
var result = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
if (string.IsNullOrEmpty(result))
{
result = context.Connection.RemoteIpAddress?.ToString();
}
if (string.IsNullOrEmpty(result) || result.Contains("::1"))
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 = regResult ? result : "127.0.0.1";
return result;
}
/// <summary>
/// 获取浏览器标识
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public static string GetUserAgent(this HttpContext context)
{
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();
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
using System;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class DateHelper
{
@@ -8,12 +8,12 @@ namespace Yi.Framework.Common.Helper
{
time = time.Substring(0, 10);
double timestamp = Convert.ToInt64(time);
System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
dateTime = dateTime.AddSeconds(timestamp).ToLocalTime();
return dateTime;
}
public static string TimeSubTract(DateTime time1,DateTime time2)
public static string TimeSubTract(DateTime time1, DateTime time2)
{
TimeSpan subTract = time1.Subtract(time2);
return $"{subTract.Days} 天 {subTract.Hours} 时 {subTract.Minutes} 分 ";

View File

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

View File

@@ -5,23 +5,23 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class Compare<T, C> : IEqualityComparer<T>
{
private Func<T, C> _getField;
public Compare(Func<T, C> getfield)
{
this._getField = getfield;
_getField = getfield;
}
public bool Equals(T? x, T? y)
{
return EqualityComparer<C>.Default.Equals(_getField(x!), _getField(y!));
}
public int GetHashCode(T obj)
{
return EqualityComparer<C>.Default.GetHashCode(this._getField(obj)!);
return EqualityComparer<C>.Default.GetHashCode(_getField(obj)!);
}
}
public static class DistinctHelper

View File

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

View File

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

View File

@@ -4,7 +4,7 @@ using System.IO;
using System.Linq;
using System.Text;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class FileHelper : IDisposable
{
@@ -128,7 +128,7 @@ namespace Yi.Framework.Common.Helper
FileStream f = File.Create(Path);
f.Close();
}
StreamWriter f2 = new StreamWriter(Path, false, System.Text.Encoding.GetEncoding("gb2312"));
StreamWriter f2 = new StreamWriter(Path, false, Encoding.GetEncoding("gb2312"));
f2.Write(Strings);
f2.Close();
f2.Dispose();
@@ -175,7 +175,7 @@ namespace Yi.Framework.Common.Helper
s = "不存在相应的目录";
else
{
StreamReader f2 = new StreamReader(Path, System.Text.Encoding.GetEncoding("gb2312"));
StreamReader f2 = new StreamReader(Path, Encoding.GetEncoding("gb2312"));
s = f2.ReadToEnd();
f2.Close();
f2.Dispose();

View File

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

View File

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

View File

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

View File

@@ -2,8 +2,8 @@
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class IpHelper
{

View File

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

View File

@@ -0,0 +1,132 @@
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Yi.Framework.Core.Helper
{
public class MD5Helper
{
/// <summary>
/// 生成PasswordSalt
/// </summary>
/// <returns>返回string</returns>
public static string GenerateSalt()
{
byte[] buf = new byte[16];
#pragma warning disable SYSLIB0023 // 类型或成员已过时
new RNGCryptoServiceProvider().GetBytes(buf);
#pragma warning restore SYSLIB0023 // 类型或成员已过时
return Convert.ToBase64String(buf);
}
/// <summary>
/// 加密密码
/// </summary>
/// <param name="pass">密码</param>
/// <param name="passwordFormat">加密类型</param>
/// <param name="salt">PasswordSalt</param>
/// <returns>加密后的密码</returns>
public static string SHA2Encode(string pass, string salt, int passwordFormat = 1)
{
if (passwordFormat == 0) // MembershipPasswordFormat.Clear
return pass;
byte[] bIn = Encoding.Unicode.GetBytes(pass);
byte[] bSalt = Convert.FromBase64String(salt);
byte[] bAll = new byte[bSalt.Length + bIn.Length];
byte[]? bRet = null;
Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length);
Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length);
#pragma warning disable SYSLIB0021 // 类型或成员已过时
var s = SHA512.Create();
#pragma warning restore SYSLIB0021 // 类型或成员已过时
bRet = s.ComputeHash(bAll);
return ConvertEx.ToUrlBase64String(bRet);
}
/// <summary>
/// 16位MD5加密
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public static string MD5Encrypt16(string password)
{
var md5 = MD5.Create();
string t2 = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(password)), 4, 8);
t2 = t2.Replace("-", string.Empty);
return t2;
}
/// <summary>
/// 32位MD5加密
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public static string MD5Encrypt32(string password = "")
{
string pwd = string.Empty;
try
{
if (!string.IsNullOrEmpty(password) && !string.IsNullOrWhiteSpace(password))
{
MD5 md5 = MD5.Create(); //实例化一个md5对像
// 加密后是一个字节类型的数组这里要注意编码UTF8/Unicode等的选择 
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
// 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
foreach (var item in s)
{
// 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母如果使用大写X则格式后的字符是大写字符
pwd = string.Concat(pwd, item.ToString("X2"));
}
}
}
catch
{
throw new Exception($"错误的 password 字符串:【{password}】");
}
return pwd;
}
/// <summary>
/// 64位MD5加密
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public static string MD5Encrypt64(string password)
{
// 实例化一个md5对像
// 加密后是一个字节类型的数组这里要注意编码UTF8/Unicode等的选择 
MD5 md5 = MD5.Create();
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
return Convert.ToBase64String(s);
}
}
public class ConvertEx
{
static readonly char[] padding = { '=' };
public static string ToUrlBase64String(byte[] inArray)
{
var str = Convert.ToBase64String(inArray);
str = str.TrimEnd(padding).Replace('+', '-').Replace('/', '_');
return str;
}
public static byte[] FromUrlBase64String(string s)
{
string incoming = s.Replace('_', '/').Replace('-', '+');
switch (s.Length % 4)
{
case 2: incoming += "=="; break;
case 3: incoming += "="; break;
}
byte[] bytes = Convert.FromBase64String(incoming);
return bytes;
}
}
}

View File

@@ -0,0 +1,260 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Core.Enums;
namespace Yi.Framework.Core.Helper
{
public static class MimeHelper
{
// 通过自己定义一个静态类
// 将所有的Content Type都扔进去吧
// 调用的时候直接调用静态方法即可。
public static List<string> ImageType { get; set; } = new List<string>
{
".jpg",".png",".jpeg"
};
private static Hashtable _mimeMappingTable;
private static void AddMimeMapping(string extension, string MimeType)
{
_mimeMappingTable.Add(extension, MimeType);
}
public static string GetMimeMapping(string FileName)
{
string text = null!;
int num = FileName.LastIndexOf('.');
if (0 < num && num > FileName.LastIndexOf('\\'))
{
text = (string)_mimeMappingTable[FileName.Substring(num)]!;
}
if (text == null)
{
text = (string)_mimeMappingTable[".*"]!;
}
return text;
}
public static FileTypeEnum GetFileType(string fileName)
{
var extension = Path.GetExtension(fileName);
if (ImageType.Contains(extension.ToLower()))
return FileTypeEnum.Image;
return FileTypeEnum.File;
}
static MimeHelper()
{
_mimeMappingTable = new Hashtable(190, StringComparer.CurrentCultureIgnoreCase);
AddMimeMapping(".323", "text/h323");
AddMimeMapping(".asx", "video/x-ms-asf");
AddMimeMapping(".acx", "application/internet-property-stream");
AddMimeMapping(".ai", "application/postscript");
AddMimeMapping(".aif", "audio/x-aiff");
AddMimeMapping(".aiff", "audio/aiff");
AddMimeMapping(".axs", "application/olescript");
AddMimeMapping(".aifc", "audio/aiff");
AddMimeMapping(".asr", "video/x-ms-asf");
AddMimeMapping(".avi", "video/x-msvideo");
AddMimeMapping(".asf", "video/x-ms-asf");
AddMimeMapping(".au", "audio/basic");
AddMimeMapping(".application", "application/x-ms-application");
AddMimeMapping(".bin", "application/octet-stream");
AddMimeMapping(".bas", "text/plain");
AddMimeMapping(".bcpio", "application/x-bcpio");
AddMimeMapping(".bmp", "image/bmp");
AddMimeMapping(".cdf", "application/x-cdf");
AddMimeMapping(".cat", "application/vndms-pkiseccat");
AddMimeMapping(".crt", "application/x-x509-ca-cert");
AddMimeMapping(".c", "text/plain");
AddMimeMapping(".css", "text/css");
AddMimeMapping(".cer", "application/x-x509-ca-cert");
AddMimeMapping(".crl", "application/pkix-crl");
AddMimeMapping(".cmx", "image/x-cmx");
AddMimeMapping(".csh", "application/x-csh");
AddMimeMapping(".cod", "image/cis-cod");
AddMimeMapping(".cpio", "application/x-cpio");
AddMimeMapping(".clp", "application/x-msclip");
AddMimeMapping(".crd", "application/x-mscardfile");
AddMimeMapping(".deploy", "application/octet-stream");
AddMimeMapping(".dll", "application/x-msdownload");
AddMimeMapping(".dot", "application/msword");
AddMimeMapping(".doc", "application/msword");
AddMimeMapping(".dvi", "application/x-dvi");
AddMimeMapping(".dir", "application/x-director");
AddMimeMapping(".dxr", "application/x-director");
AddMimeMapping(".der", "application/x-x509-ca-cert");
AddMimeMapping(".dib", "image/bmp");
AddMimeMapping(".dcr", "application/x-director");
AddMimeMapping(".disco", "text/xml");
AddMimeMapping(".exe", "application/octet-stream");
AddMimeMapping(".etx", "text/x-setext");
AddMimeMapping(".evy", "application/envoy");
AddMimeMapping(".eml", "message/rfc822");
AddMimeMapping(".eps", "application/postscript");
AddMimeMapping(".flr", "x-world/x-vrml");
AddMimeMapping(".fif", "application/fractals");
AddMimeMapping(".gtar", "application/x-gtar");
AddMimeMapping(".gif", "image/gif");
AddMimeMapping(".gz", "application/x-gzip");
AddMimeMapping(".hta", "application/hta");
AddMimeMapping(".htc", "text/x-component");
AddMimeMapping(".htt", "text/webviewhtml");
AddMimeMapping(".h", "text/plain");
AddMimeMapping(".hdf", "application/x-hdf");
AddMimeMapping(".hlp", "application/winhlp");
AddMimeMapping(".html", "text/html");
AddMimeMapping(".htm", "text/html");
AddMimeMapping(".hqx", "application/mac-binhex40");
AddMimeMapping(".isp", "application/x-internet-signup");
AddMimeMapping(".iii", "application/x-iphone");
AddMimeMapping(".ief", "image/ief");
AddMimeMapping(".ivf", "video/x-ivf");
AddMimeMapping(".ins", "application/x-internet-signup");
AddMimeMapping(".ico", "image/x-icon");
AddMimeMapping(".jpg", "image/jpeg");
AddMimeMapping(".jfif", "image/pjpeg");
AddMimeMapping(".jpe", "image/jpeg");
AddMimeMapping(".jpeg", "image/jpeg");
AddMimeMapping(".js", "application/x-javascript");
AddMimeMapping(".lsx", "video/x-la-asf");
AddMimeMapping(".latex", "application/x-latex");
AddMimeMapping(".lsf", "video/x-la-asf");
AddMimeMapping(".manifest", "application/x-ms-manifest");
AddMimeMapping(".mhtml", "message/rfc822");
AddMimeMapping(".mny", "application/x-msmoney");
AddMimeMapping(".mht", "message/rfc822");
AddMimeMapping(".mid", "audio/mid");
AddMimeMapping(".mpv2", "video/mpeg");
AddMimeMapping(".man", "application/x-troff-man");
AddMimeMapping(".mvb", "application/x-msmediaview");
AddMimeMapping(".mpeg", "video/mpeg");
AddMimeMapping(".m3u", "audio/x-mpegurl");
AddMimeMapping(".mdb", "application/x-msaccess");
AddMimeMapping(".mpp", "application/vnd.ms-project");
AddMimeMapping(".m1v", "video/mpeg");
AddMimeMapping(".mpa", "video/mpeg");
AddMimeMapping(".me", "application/x-troff-me");
AddMimeMapping(".m13", "application/x-msmediaview");
AddMimeMapping(".movie", "video/x-sgi-movie");
AddMimeMapping(".m14", "application/x-msmediaview");
AddMimeMapping(".mpe", "video/mpeg");
AddMimeMapping(".mp2", "video/mpeg");
AddMimeMapping(".mov", "video/quicktime");
AddMimeMapping(".mp3", "audio/mpeg");
AddMimeMapping(".mpg", "video/mpeg");
AddMimeMapping(".ms", "application/x-troff-ms");
AddMimeMapping(".nc", "application/x-netcdf");
AddMimeMapping(".nws", "message/rfc822");
AddMimeMapping(".oda", "application/oda");
AddMimeMapping(".ods", "application/oleobject");
AddMimeMapping(".pmc", "application/x-perfmon");
AddMimeMapping(".p7r", "application/x-pkcs7-certreqresp");
AddMimeMapping(".p7b", "application/x-pkcs7-certificates");
AddMimeMapping(".p7s", "application/pkcs7-signature");
AddMimeMapping(".pmw", "application/x-perfmon");
AddMimeMapping(".ps", "application/postscript");
AddMimeMapping(".p7c", "application/pkcs7-mime");
AddMimeMapping(".pbm", "image/x-portable-bitmap");
AddMimeMapping(".ppm", "image/x-portable-pixmap");
AddMimeMapping(".pub", "application/x-mspublisher");
AddMimeMapping(".pnm", "image/x-portable-anymap");
AddMimeMapping(".png", "image/png");
AddMimeMapping(".pml", "application/x-perfmon");
AddMimeMapping(".p10", "application/pkcs10");
AddMimeMapping(".pfx", "application/x-pkcs12");
AddMimeMapping(".p12", "application/x-pkcs12");
AddMimeMapping(".pdf", "application/pdf");
AddMimeMapping(".pps", "application/vnd.ms-powerpoint");
AddMimeMapping(".p7m", "application/pkcs7-mime");
AddMimeMapping(".pko", "application/vndms-pkipko");
AddMimeMapping(".ppt", "application/vnd.ms-powerpoint");
AddMimeMapping(".pmr", "application/x-perfmon");
AddMimeMapping(".pma", "application/x-perfmon");
AddMimeMapping(".pot", "application/vnd.ms-powerpoint");
AddMimeMapping(".prf", "application/pics-rules");
AddMimeMapping(".pgm", "image/x-portable-graymap");
AddMimeMapping(".qt", "video/quicktime");
AddMimeMapping(".ra", "audio/x-pn-realaudio");
AddMimeMapping(".rgb", "image/x-rgb");
AddMimeMapping(".ram", "audio/x-pn-realaudio");
AddMimeMapping(".rmi", "audio/mid");
AddMimeMapping(".ras", "image/x-cmu-raster");
AddMimeMapping(".roff", "application/x-troff");
AddMimeMapping(".rtf", "application/rtf");
AddMimeMapping(".rtx", "text/richtext");
AddMimeMapping(".sv4crc", "application/x-sv4crc");
AddMimeMapping(".spc", "application/x-pkcs7-certificates");
AddMimeMapping(".setreg", "application/set-registration-initiation");
AddMimeMapping(".snd", "audio/basic");
AddMimeMapping(".stl", "application/vndms-pkistl");
AddMimeMapping(".setpay", "application/set-payment-initiation");
AddMimeMapping(".stm", "text/html");
AddMimeMapping(".shar", "application/x-shar");
AddMimeMapping(".sh", "application/x-sh");
AddMimeMapping(".sit", "application/x-stuffit");
AddMimeMapping(".spl", "application/futuresplash");
AddMimeMapping(".sct", "text/scriptlet");
AddMimeMapping(".scd", "application/x-msschedule");
AddMimeMapping(".sst", "application/vndms-pkicertstore");
AddMimeMapping(".src", "application/x-wais-source");
AddMimeMapping(".sv4cpio", "application/x-sv4cpio");
AddMimeMapping(".tex", "application/x-tex");
AddMimeMapping(".tgz", "application/x-compressed");
AddMimeMapping(".t", "application/x-troff");
AddMimeMapping(".tar", "application/x-tar");
AddMimeMapping(".tr", "application/x-troff");
AddMimeMapping(".tif", "image/tiff");
AddMimeMapping(".txt", "text/plain");
AddMimeMapping(".texinfo", "application/x-texinfo");
AddMimeMapping(".trm", "application/x-msterminal");
AddMimeMapping(".tiff", "image/tiff");
AddMimeMapping(".tcl", "application/x-tcl");
AddMimeMapping(".texi", "application/x-texinfo");
AddMimeMapping(".tsv", "text/tab-separated-values");
AddMimeMapping(".ustar", "application/x-ustar");
AddMimeMapping(".uls", "text/iuls");
AddMimeMapping(".vcf", "text/x-vcard");
AddMimeMapping(".wps", "application/vnd.ms-works");
AddMimeMapping(".wav", "audio/wav");
AddMimeMapping(".wrz", "x-world/x-vrml");
AddMimeMapping(".wri", "application/x-mswrite");
AddMimeMapping(".wks", "application/vnd.ms-works");
AddMimeMapping(".wmf", "application/x-msmetafile");
AddMimeMapping(".wcm", "application/vnd.ms-works");
AddMimeMapping(".wrl", "x-world/x-vrml");
AddMimeMapping(".wdb", "application/vnd.ms-works");
AddMimeMapping(".wsdl", "text/xml");
AddMimeMapping(".xap", "application/x-silverlight-app");
AddMimeMapping(".xml", "text/xml");
AddMimeMapping(".xlm", "application/vnd.ms-excel");
AddMimeMapping(".xaf", "x-world/x-vrml");
AddMimeMapping(".xla", "application/vnd.ms-excel");
AddMimeMapping(".xls", "application/vnd.ms-excel");
AddMimeMapping(".xlsx", "application/vnd.ms-excel");
AddMimeMapping(".xof", "x-world/x-vrml");
AddMimeMapping(".xlt", "application/vnd.ms-excel");
AddMimeMapping(".xlc", "application/vnd.ms-excel");
AddMimeMapping(".xsl", "text/xml");
AddMimeMapping(".xbm", "image/x-xbitmap");
AddMimeMapping(".xlw", "application/vnd.ms-excel");
AddMimeMapping(".xpm", "image/x-xpixmap");
AddMimeMapping(".xwd", "image/x-xwindowdump");
AddMimeMapping(".xsd", "text/xml");
AddMimeMapping(".z", "application/x-compress");
AddMimeMapping(".zip", "application/x-zip-compressed");
AddMimeMapping(".*", "application/octet-stream");
}
}
}

View File

@@ -6,7 +6,7 @@ using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class RSAFileHelper
{
@@ -23,9 +23,9 @@ namespace Yi.Framework.Common.Helper
{
string rootPath = Directory.GetCurrentDirectory();
string filePath = Path.Combine(rootPath, fileName);
if (!System.IO.File.Exists(filePath))
if (!File.Exists(filePath))
throw new Exception("文件不存在");
string key = System.IO.File.ReadAllText(filePath);
string key = File.ReadAllText(filePath);
var rsa = RSA.Create();
rsa.ImportFromPem(key.AsSpan());
return rsa;

View File

@@ -0,0 +1,390 @@
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Yi.Framework.Core.Helper
{
/// <summary>
/// RSA加解密 使用OpenSSL的公钥加密/私钥解密
/// 公私钥请使用openssl生成
/// </summary>
public class RSAHelper
{
public readonly RSA? _privateKeyRsaProvider;
public readonly RSA? _publicKeyRsaProvider;
private readonly HashAlgorithmName _hashAlgorithmName;
private readonly Encoding _encoding;
/// <summary>
/// 实例化RSAHelper
/// </summary>
/// <param name="rsaType">加密算法类型 RSA SHA1;RSA2 SHA256 密钥长度至少为2048</param>
/// <param name="encoding">编码类型</param>
/// <param name="privateKey">私钥</param>
/// <param name="publicKey">公钥</param>
public RSAHelper(RSAType rsaType, Encoding encoding, string privateKey, string? publicKey = null)
{
_encoding = encoding;
if (!string.IsNullOrEmpty(privateKey))
{
_privateKeyRsaProvider = CreateRsaProviderFromPrivateKey(privateKey);
}
if (!string.IsNullOrEmpty(publicKey))
{
_publicKeyRsaProvider = CreateRsaProviderFromPublicKey(publicKey);
}
_hashAlgorithmName = rsaType == RSAType.RSA ? HashAlgorithmName.SHA1 : HashAlgorithmName.SHA256;
}
#region 使
/// <summary>
/// 使用私钥签名
/// </summary>
/// <param name="data">原始数据</param>
/// <returns></returns>
public string Sign(string data)
{
byte[] dataBytes = _encoding.GetBytes(data);
var signatureBytes = _privateKeyRsaProvider!.SignData(dataBytes, _hashAlgorithmName, RSASignaturePadding.Pkcs1);
return Convert.ToBase64String(signatureBytes);
}
#endregion
#region 使
/// <summary>
/// 使用公钥验签
/// </summary>
/// <param name="data">原始数据</param>
/// <param name="sign">签名</param>
/// <returns></returns>
public bool Verify(string data, string sign)
{
byte[] dataBytes = _encoding.GetBytes(data);
byte[] signBytes = Convert.FromBase64String(sign);
var verify = _publicKeyRsaProvider!.VerifyData(dataBytes, signBytes, _hashAlgorithmName, RSASignaturePadding.Pkcs1);
return verify;
}
#endregion
#region
/// <summary>
/// 私钥解密(原)
/// </summary>
/// <param name="cipherText">解密字符串(base64)</param>
/// <returns></returns>
//public string Decrypt(string cipherText)
//{
// if (_privateKeyRsaProvider == null)
// {
// throw new Exception("_privateKeyRsaProvider is null");
// }
// return _encoding.GetString(_privateKeyRsaProvider.Decrypt(Convert.FromBase64String(cipherText), RSAEncryptionPadding.Pkcs1));
//}
/// <summary>
/// 私钥解密(支持大量数据)
/// </summary>
/// <param name="cipherText"></param>
/// <returns></returns>
public string Decrypt(string cipherText)
{
if (_privateKeyRsaProvider == null)
{
throw new Exception("_privateKeyRsaProvider is null");
}
var bufferSize = _privateKeyRsaProvider.KeySize / 8;
byte[] buffer = new byte[bufferSize];//待解密块
using (MemoryStream msInput = new MemoryStream(Convert.FromBase64String(cipherText)))
{
using (MemoryStream msOutput = new MemoryStream())
{
int readLen; while ((readLen = msInput.Read(buffer, 0, bufferSize)) > 0)
{
byte[] dataToEnc = new byte[readLen];
Array.Copy(buffer, 0, dataToEnc, 0, readLen); byte[] encData = _privateKeyRsaProvider.Decrypt(dataToEnc, RSAEncryptionPadding.Pkcs1);
msOutput.Write(encData, 0, encData.Length);
}
byte[] result = msOutput.ToArray();
return _encoding.GetString(result);
}
}
}
#endregion
#region
/// <summary>
/// 公钥加密(原)
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
//public string Encrypt(string text)
//{
// if (_publicKeyRsaProvider == null)
// {
// throw new Exception("_publicKeyRsaProvider is null");
// }
// return Convert.ToBase64String(_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.Pkcs1));
//}
/// <summary>
/// 公钥加密(支持大量数据)
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public string Encrypt(string text)
{
if (_publicKeyRsaProvider == null)
{
throw new Exception("_publicKeyRsaProvider is null");
}
var bufferSize = _publicKeyRsaProvider.KeySize / 8 - 11;
byte[] buffer = new byte[bufferSize];//待加密块
using (MemoryStream msInput = new MemoryStream(_encoding.GetBytes(text)))
{
using (MemoryStream msOutput = new MemoryStream())
{
int readLen; while ((readLen = msInput.Read(buffer, 0, bufferSize)) > 0)
{
byte[] dataToEnc = new byte[readLen];
Array.Copy(buffer, 0, dataToEnc, 0, readLen); byte[] encData = _publicKeyRsaProvider.Encrypt(dataToEnc, RSAEncryptionPadding.Pkcs1);
msOutput.Write(encData, 0, encData.Length);
}
byte[] result = msOutput.ToArray();
return Convert.ToBase64String(result);
}
}
}
#endregion
#region 使RSA实例
/// <summary>
/// 使用私钥创建RSA实例
/// </summary>
/// <param name="privateKey"></param>
/// <returns></returns>
private RSA CreateRsaProviderFromPrivateKey(string privateKey)
{
var privateKeyBits = Convert.FromBase64String(privateKey);
var rsa = RSA.Create();
var rsaParameters = new RSAParameters();
using (BinaryReader binr = new BinaryReader(new MemoryStream(privateKeyBits)))
{
byte bt = 0;
ushort twobytes = 0;
twobytes = binr.ReadUInt16();
if (twobytes == 0x8130)
binr.ReadByte();
else if (twobytes == 0x8230)
binr.ReadInt16();
else
throw new Exception("Unexpected value read binr.ReadUInt16()");
twobytes = binr.ReadUInt16();
if (twobytes != 0x0102)
throw new Exception("Unexpected version");
bt = binr.ReadByte();
if (bt != 0x00)
throw new Exception("Unexpected value read binr.ReadByte()");
rsaParameters.Modulus = binr.ReadBytes(GetIntegerSize(binr));
rsaParameters.Exponent = binr.ReadBytes(GetIntegerSize(binr));
rsaParameters.D = binr.ReadBytes(GetIntegerSize(binr));
rsaParameters.P = binr.ReadBytes(GetIntegerSize(binr));
rsaParameters.Q = binr.ReadBytes(GetIntegerSize(binr));
rsaParameters.DP = binr.ReadBytes(GetIntegerSize(binr));
rsaParameters.DQ = binr.ReadBytes(GetIntegerSize(binr));
rsaParameters.InverseQ = binr.ReadBytes(GetIntegerSize(binr));
}
rsa.ImportParameters(rsaParameters);
return rsa;
}
#endregion
#region 使RSA实例
/// <summary>
/// 使用公钥创建RSA实例
/// </summary>
/// <param name="publicKeyString"></param>
/// <returns></returns>
public RSA? CreateRsaProviderFromPublicKey(string publicKeyString)
{
// encoded OID sequence for PKCS #1 rsaEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1"
byte[] seqOid = { 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 };
byte[] seq = new byte[15];
var x509Key = Convert.FromBase64String(publicKeyString);
// --------- Set up stream to read the asn.1 encoded SubjectPublicKeyInfo blob ------
using (MemoryStream mem = new MemoryStream(x509Key))
{
using (BinaryReader binr = new BinaryReader(mem)) //wrap Memory Stream with BinaryReader for easy reading
{
byte bt = 0;
ushort twobytes = 0;
twobytes = binr.ReadUInt16();
if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)
binr.ReadByte(); //advance 1 byte
else if (twobytes == 0x8230)
binr.ReadInt16(); //advance 2 bytes
else
return null;
seq = binr.ReadBytes(15); //read the Sequence OID
if (!CompareBytearrays(seq, seqOid)) //make sure Sequence for OID is correct
return null;
twobytes = binr.ReadUInt16();
if (twobytes == 0x8103) //data read as little endian order (actual data order for Bit String is 03 81)
binr.ReadByte(); //advance 1 byte
else if (twobytes == 0x8203)
binr.ReadInt16(); //advance 2 bytes
else
return null;
bt = binr.ReadByte();
if (bt != 0x00) //expect null byte next
return null;
twobytes = binr.ReadUInt16();
if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)
binr.ReadByte(); //advance 1 byte
else if (twobytes == 0x8230)
binr.ReadInt16(); //advance 2 bytes
else
return null;
twobytes = binr.ReadUInt16();
byte lowbyte = 0x00;
byte highbyte = 0x00;
if (twobytes == 0x8102) //data read as little endian order (actual data order for Integer is 02 81)
lowbyte = binr.ReadByte(); // read next bytes which is bytes in modulus
else if (twobytes == 0x8202)
{
highbyte = binr.ReadByte(); //advance 2 bytes
lowbyte = binr.ReadByte();
}
else
return null;
byte[] modint = { lowbyte, highbyte, 0x00, 0x00 }; //reverse byte order since asn.1 key uses big endian order
int modsize = BitConverter.ToInt32(modint, 0);
int firstbyte = binr.PeekChar();
if (firstbyte == 0x00)
{ //if first byte (highest order) of modulus is zero, don't include it
binr.ReadByte(); //skip this null byte
modsize -= 1; //reduce modulus buffer size by 1
}
byte[] modulus = binr.ReadBytes(modsize); //read the modulus bytes
if (binr.ReadByte() != 0x02) //expect an Integer for the exponent data
return null;
int expbytes = binr.ReadByte(); // should only need one byte for actual exponent data (for all useful values)
byte[] exponent = binr.ReadBytes(expbytes);
// ------- create RSACryptoServiceProvider instance and initialize with public key -----
var rsa = RSA.Create();
RSAParameters rsaKeyInfo = new RSAParameters
{
Modulus = modulus,
Exponent = exponent
};
rsa.ImportParameters(rsaKeyInfo);
return rsa;
}
}
}
#endregion
#region
private int GetIntegerSize(BinaryReader binr)
{
byte bt = 0;
int count = 0;
bt = binr.ReadByte();
if (bt != 0x02)
return 0;
bt = binr.ReadByte();
if (bt == 0x81)
count = binr.ReadByte();
else
if (bt == 0x82)
{
var highbyte = binr.ReadByte();
var lowbyte = binr.ReadByte();
byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };
count = BitConverter.ToInt32(modint, 0);
}
else
{
count = bt;
}
while (binr.ReadByte() == 0x00)
{
count -= 1;
}
binr.BaseStream.Seek(-1, SeekOrigin.Current);
return count;
}
private bool CompareBytearrays(byte[] a, byte[] b)
{
if (a.Length != b.Length)
return false;
int i = 0;
foreach (byte c in a)
{
if (c != b[i])
return false;
i++;
}
return true;
}
#endregion
}
/// <summary>
/// RSA算法类型
/// </summary>
public enum RSAType
{
/// <summary>
/// SHA1
/// </summary>
RSA = 0,
/// <summary>
/// RSA2 密钥长度至少为2048
/// SHA256
/// </summary>
RSA2
}
}

View File

@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class RandomHelper
{
@@ -61,11 +61,11 @@ namespace Yi.Framework.Common.Helper
string str = string.Empty;
long num2 = DateTime.Now.Ticks + rep;
rep++;
Random random = new Random(((int)(((ulong)num2) & 0xffffffffL)) | ((int)(num2 >> rep)));
Random random = new Random((int)((ulong)num2 & 0xffffffffL) | (int)(num2 >> rep));
for (int i = 0; i < codeCount; i++)
{
int num = random.Next();
str = str + ((char)(0x30 + ((ushort)(num % 10)))).ToString();
str = str + ((char)(0x30 + (ushort)(num % 10))).ToString();
}
return str;
}

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.Core.Helper
{
public static class ReflexHelper
{
#region
/// <summary>
/// 取对象属性值
/// </summary>
/// <param name="FieldName"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static string GetModelValue(string FieldName, object obj)
{
try
{
Type Ts = obj.GetType();
object o = Ts.GetProperty(FieldName).GetValue(obj, null);
if (null == o)
return null;
string Value = Convert.ToString(o);
if (string.IsNullOrEmpty(Value))
return null;
return Value;
}
catch (Exception ex)
{
throw ex;
}
return null;
}
/// <summary>
/// 设置对象属性值
/// </summary>
/// <param name="FieldName"></param>
/// <param name="Value"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static bool SetModelValue(string FieldName, object Value, object obj)
{
try
{
Type Ts = obj.GetType();
Ts.GetProperty(FieldName).SetValue(obj, Value, null);
return true;
}
catch (Exception ex)
{
throw ex;
}
return false;
}
#endregion
}
}

View File

@@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
namespace Yi.Framework.Core.Helper
{
public class ShellHelper
{
/// <summary>
/// linux 系统命令
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
public static string Bash(string command)
{
var escapedArgs = command.Replace("\"", "\\\"");
var process = new Process()
{
StartInfo = new ProcessStartInfo
{
FileName = "/bin/bash",
Arguments = $"-c \"{escapedArgs}\"",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
}
};
process.Start();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Dispose();
return result;
}
/// <summary>
/// windows系统命令
/// </summary>
/// <param name="fileName"></param>
/// <param name="args"></param>
/// <returns></returns>
public static string Cmd(string fileName, string args)
{
string output = string.Empty;
var info = new ProcessStartInfo();
info.FileName = fileName;
info.Arguments = args;
info.RedirectStandardOutput = true;
using (var process = Process.Start(info))
{
output = process.StandardOutput.ReadToEnd();
}
return output;
}
}
}

View File

@@ -4,7 +4,7 @@ using System.IO;
using System.Linq;
using System.Text;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class StringHelper
{
@@ -84,7 +84,8 @@ namespace Yi.Framework.Common.Helper
/// </summary>
/// <param name="format">格式-默认为N</param>
/// <returns></returns>
public static string GetGUID(string format="N") {
public static string GetGUID(string format = "N")
{
return Guid.NewGuid().ToString(format);
}
/// <summary>
@@ -102,9 +103,10 @@ namespace Yi.Framework.Common.Helper
/// <param name="resourceStr"></param>
/// <param name="length"></param>
/// <returns></returns>
public static string GetCusLine(string resourceStr, int length) {
public static string GetCusLine(string resourceStr, int length)
{
string[] arrStr = resourceStr.Split("\r\n");
return string.Join("", (from q in arrStr select q).Skip(arrStr.Length - length + 1).Take(length).ToArray());
return string.Join("", (from q in arrStr select q).Skip(arrStr.Length - length + 1).Take(length).ToArray());
}
}

View File

@@ -3,9 +3,8 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Common.Models;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public static class TreeHelper
{
@@ -14,7 +13,7 @@ namespace Yi.Framework.Common.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)
{
@@ -23,7 +22,7 @@ namespace Yi.Framework.Common.Helper
action(model);
}
result.Add(model);
var item = (model as ITreeModel<T>);
var item = model as ITreeModel<T>;
IList<T> children = list.Where(m => (m as ITreeModel<T>)!.ParentId == item!.Id).ToList();
if (children.Count > 0)
{
@@ -36,7 +35,7 @@ namespace Yi.Framework.Common.Helper
}
private static void SetTreeChildren<T>(IList<T> list, IList<T> children, T model, Action<T> action = null!)
{
var mm = (model as ITreeModel<T>);
var mm = model as ITreeModel<T>;
mm!.Children = new List<T>();
foreach (T item in children)
{
@@ -45,7 +44,7 @@ namespace Yi.Framework.Common.Helper
action(item);
}
mm.Children.Add(item);
var _item = (item as ITreeModel<T>);
var _item = item as ITreeModel<T>;
IList<T> _children = list.Where(m => (m as ITreeModel<T>)!.ParentId == _item!.Id).ToList();
if (_children.Count > 0)
{
@@ -54,5 +53,16 @@ namespace Yi.Framework.Common.Helper
}
mm.Children = mm.Children.OrderByDescending(m => (m as ITreeModel<T>)!.OrderNum).ToList();
}
public interface ITreeModel<T>
{
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.Common.Helper
namespace Yi.Framework.Core.Helper
{
public static class UnicodeHelper
{

View File

@@ -1,14 +1,15 @@
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class UrlHelper
public class UrlHelper
{
/// <summary>
/// UrlEncode编码
/// </summary>
/// <param name="url">url</param>
/// <returns></returns>
public static string UrlEncode(string url) {
return System.Web.HttpUtility.UrlEncode(url, System.Text.Encoding.UTF8);
public static string UrlEncode(string url)
{
return System.Web.HttpUtility.UrlEncode(url, System.Text.Encoding.UTF8);
}
/// <summary>
/// UrlEncode解码

View File

@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
namespace Yi.Framework.Common.Helper
namespace Yi.Framework.Core.Helper
{
public class XmlHelper
{
@@ -37,7 +37,7 @@ namespace Yi.Framework.Common.Helper
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <returns></returns>
public static T ParseFormByXml<T>(string xml,string rootName="root")
public static T ParseFormByXml<T>(string xml, string rootName = "root")
{
XmlSerializer serializer = new XmlSerializer(typeof(T), new XmlRootAttribute(rootName));
StringReader reader = new StringReader(xml);
@@ -45,7 +45,7 @@ namespace Yi.Framework.Common.Helper
T res = (T)serializer.Deserialize(reader)!;
reader.Close();
reader.Dispose();
return res;
}
return res;
}
}
}

View File

@@ -0,0 +1,59 @@
using System.Diagnostics;
using System.Text;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity;
namespace Yi.Framework.Core.Modularity;
[Dependency(ReplaceServices =true)]
public class YiModuleManager : ModuleManager, IModuleManager, ISingletonDependency
{
private readonly IModuleContainer _moduleContainer;
private readonly IEnumerable<IModuleLifecycleContributor> _lifecycleContributors;
private readonly ILogger<YiModuleManager> _logger;
public YiModuleManager(IModuleContainer moduleContainer, ILogger<YiModuleManager> logger, IOptions<AbpModuleLifecycleOptions> options, IServiceProvider serviceProvider) : base(moduleContainer, logger, options, serviceProvider)
{
_moduleContainer = moduleContainer;
_logger = logger;
_lifecycleContributors = options.Value.Contributors.Select(serviceProvider.GetRequiredService).Cast<IModuleLifecycleContributor>().ToArray();
}
public override async Task InitializeModulesAsync(ApplicationInitializationContext context)
{
_logger.LogDebug("==========模块Initialize初始化统计-跳过0ms模块==========");
var total = 0;
var watch =new Stopwatch();
long totalTime = 0;
foreach (var contributor in _lifecycleContributors)
{
foreach (var module in _moduleContainer.Modules)
{
try
{
watch.Restart();
await contributor.InitializeAsync(context, module.Instance);
watch.Stop();
totalTime += watch.ElapsedMilliseconds;
total++;
if (watch.ElapsedMilliseconds > 1)
{
_logger.LogDebug($"耗时-{watch.ElapsedMilliseconds}ms,已加载模块-{module.Assembly.GetName().Name}");
}
}
catch (Exception ex)
{
throw new AbpInitializationException($"An error occurred during the initialize {contributor.GetType().FullName} phase of the module {module.Type.AssemblyQualifiedName}: {ex.Message}. See the inner exception for details.", ex);
}
}
}
_logger.LogInformation($"==========【{total}】个模块初始化执行完毕,总耗时【{totalTime}ms】==========");
}
}

View File

@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Volo.Abp.Core" Version="$(AbpVersion)" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,9 @@
using Volo.Abp.Modularity;
namespace Yi.Framework.Core
{
public class YiFrameworkCoreModule:AbpModule
{
}
}

View File

@@ -0,0 +1,10 @@
using Volo.Abp;
using Volo.Abp.Application.Services;
namespace Yi.Framework.Ddd.Application.Contracts
{
public interface IDeletesAppService<in TKey> : IDeleteAppService< TKey> , IApplicationService, IRemoteService
{
Task DeleteAsync(IEnumerable<TKey> ids);
}
}

View File

@@ -0,0 +1,10 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Ddd.Application.Contracts
{
public interface IPageTimeResultRequestDto : IPagedAndSortedResultRequest
{
DateTime? StartTime { get; set; }
DateTime? EndTime { get; set; }
}
}

View File

@@ -0,0 +1,8 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Ddd.Application.Contracts
{
public interface IPagedAllResultRequestDto : IPageTimeResultRequestDto, IPagedAndSortedResultRequest
{
}
}

View File

@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace Yi.Framework.Ddd.Application.Contracts
{
public interface IYiCrudAppService<TEntityDto, in TKey> : ICrudAppService<TEntityDto, TKey>
{
}
public interface IYiCrudAppService<TEntityDto, in TKey, in TGetListInput> : ICrudAppService<TEntityDto, TKey, TGetListInput>
{
}
public interface IYiCrudAppService<TEntityDto, in TKey, in TGetListInput, in TCreateInput> : ICrudAppService<TEntityDto, TKey, TGetListInput, TCreateInput>
{
}
public interface IYiCrudAppService<TEntityDto, in TKey, in TGetListInput, in TCreateInput, in TUpdateInput> : ICrudAppService<TEntityDto, TKey, TGetListInput, TCreateInput, TUpdateInput>
{
}
public interface IYiCrudAppService<TGetOutputDto, TGetListOutputDto, in TKey, in TGetListInput, in TCreateInput, in TUpdateInput> : ICrudAppService<TGetOutputDto, TGetListOutputDto, TKey, TGetListInput, TCreateInput, TUpdateInput>, IDeletesAppService<TKey>
{
}
}

View File

@@ -0,0 +1,17 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Ddd.Application.Contracts
{
public class PagedAllResultRequestDto : PagedAndSortedResultRequestDto, IPagedAllResultRequestDto
{
/// <summary>
/// 查询开始时间条件
/// </summary>
public DateTime? StartTime { get; set; }
/// <summary>
/// 查询结束时间条件
/// </summary>
public DateTime? EndTime { get; set; }
}
}

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Application.Contracts" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Yi.Framework.Core\Yi.Framework.Core.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,10 @@
using Volo.Abp.Application;
using Volo.Abp.Modularity;
namespace Yi.Framework.Ddd.Application.Contracts
{
[DependsOn(typeof(AbpDddApplicationContractsModule))]
public class YiFrameworkDddApplicationContractsModule : AbpModule
{
}
}

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<ItemGroup>
<PackageReference Include="MiniExcel" Version="1.31.3" />
<PackageReference Include="Volo.Abp.Ddd.Application" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Yi.Framework.Ddd.Application.Contracts\Yi.Framework.Ddd.Application.Contracts.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,119 @@
using Volo.Abp.Application.Dtos;
using Volo.Abp.Caching;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.MultiTenancy;
namespace Yi.Framework.Ddd.Application
{
public abstract class YiCacheCrudAppService<TEntity, TEntityDto, TKey> : YiCrudAppService<TEntity, TEntityDto, TKey, PagedAndSortedResultRequestDto>
where TEntity : class, IEntity<TKey>
where TEntityDto : IEntityDto<TKey>
{
protected YiCacheCrudAppService(IRepository<TEntity, TKey> repository) : base(repository)
{
}
}
public abstract class YiCacheCrudAppService<TEntity, TEntityDto, TKey, TGetListInput>
: YiCrudAppService<TEntity, TEntityDto, TKey, TGetListInput, TEntityDto>
where TEntity : class, IEntity<TKey>
where TEntityDto : IEntityDto<TKey>
{
protected YiCacheCrudAppService(IRepository<TEntity, TKey> repository) : base(repository)
{
}
}
public abstract class YiCacheCrudAppService<TEntity, TEntityDto, TKey, TGetListInput, TCreateInput>
: YiCrudAppService<TEntity, TEntityDto, TKey, TGetListInput, TCreateInput, TCreateInput>
where TEntity : class, IEntity<TKey>
where TEntityDto : IEntityDto<TKey>
{
protected YiCacheCrudAppService(IRepository<TEntity, TKey> repository) : base(repository)
{
}
}
public abstract class YiCacheCrudAppService<TEntity, TEntityDto, TKey, TGetListInput, TCreateInput, TUpdateInput>
: YiCrudAppService<TEntity, TEntityDto, TEntityDto, TKey, TGetListInput, TCreateInput, TUpdateInput>
where TEntity : class, IEntity<TKey>
where TEntityDto : IEntityDto<TKey>
{
protected YiCacheCrudAppService(IRepository<TEntity, TKey> repository) : base(repository)
{
}
}
public abstract class YiCacheCrudAppService<TEntity, TGetOutputDto, TGetListOutputDto, TKey, TGetListInput, TCreateInput, TUpdateInput>
: YiCrudAppService<TEntity, TGetOutputDto, TGetListOutputDto, TKey, TGetListInput, TCreateInput, TUpdateInput>
where TEntity : class, IEntity<TKey>
where TGetOutputDto : IEntityDto<TKey>
where TGetListOutputDto : IEntityDto<TKey>
{
protected IDistributedCache<TEntity> Cache => LazyServiceProvider.LazyGetRequiredService<IDistributedCache<TEntity>>();
protected string GetCacheKey(TKey id) => typeof(TEntity).Name + ":" + CurrentTenant.Id ?? Guid.Empty + ":" + id.ToString();
protected YiCacheCrudAppService(IRepository<TEntity, TKey> repository) : base(repository)
{
}
public override async Task<TGetOutputDto> UpdateAsync(TKey id, TUpdateInput input)
{
var output = await base.UpdateAsync(id, input);
await Cache.RemoveAsync(GetCacheKey(id));
return output;
}
public override async Task<PagedResultDto<TGetListOutputDto>> GetListAsync(TGetListInput input)
{
//两种方式:
//1全表缓存使用缓存直接查询
//2非全部缓存查询到的数据直接添加到缓存
//判断是否该实体为全表缓存
throw new NotImplementedException();
//IDistributedCache 有局限性,条件查询无法进行缓存了
//if (true)
//{
// return await GetListByCacheAsync(input);
//}
//else
//{
// return await GetListByDbAsync(input);
//}
}
protected virtual async Task<PagedResultDto<TGetListOutputDto>> GetListByDbAsync(TGetListInput input)
{
//如果不是全表缓存,可以走这个啦
throw new NotImplementedException();
}
protected virtual async Task<PagedResultDto<TGetListOutputDto>> GetListByCacheAsync(TGetListInput input)
{
//如果是全表缓存,可以走这个啦
throw new NotImplementedException();
}
protected override async Task<TEntity> GetEntityByIdAsync(TKey id)
{
var output = await Cache.GetOrAddAsync(GetCacheKey(id), async () => await base.GetEntityByIdAsync(id));
return output!;
}
public override async Task DeleteAsync(IEnumerable<TKey> id)
{
await base.DeleteAsync(id);
foreach (var itemId in id)
{
await Cache.RemoveAsync(GetCacheKey(itemId));
}
}
}
}

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