38 Commits

Author SHA1 Message Date
dubai
d9d3118879 chore(app): 移除更新提示功能 2026-01-11 14:11:37 +08:00
dubai
1d78fec144 fix(core): 统一电话号码字段名称从 phonenumber 改为 phone 2026-01-11 14:06:04 +08:00
dubai
d12769dd29 fix(core): 统一用户昵称字段名称从 nickName 改为 nick 2026-01-11 14:04:57 +08:00
dubai
bd51228293 docs(readme): 更新项目文档 2026-01-11 14:02:38 +08:00
dubai
eaf5c01a33 fix(project): 移除不必要的项目引用
- 移除 Yi.Abp.SqlSugarCore 中对 Yi.Framework.Stock.SqlSugarCore 的引用
- 移除 Yi.Framework.Rbac.Application.Contracts 中对 Yi.Framework.Bbs.Domain.Shared 的引用
2026-01-11 14:01:44 +08:00
橙子
369d5ef54e update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2026-01-10 10:31:36 +00:00
橙子
8975b76e79 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2026-01-10 10:29:36 +00:00
橙子
7512a373a6 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2026-01-10 10:23:55 +00:00
橙子
7b3b7292ea style: 新增vben系统截图
Signed-off-by: 橙子 <454313500@qq.com>
2026-01-10 10:23:09 +00:00
橙子
816f680672 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2026-01-10 10:19:31 +00:00
橙子
50e86f99a4 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2026-01-10 10:15:16 +00:00
橙子
6701a09ad1 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2026-01-10 10:11:38 +00:00
ccnetcore
ecba8d5c66 ci: 修改发布 2026-01-10 18:06:48 +08:00
ccnetcore
69618eef33 Merge remote-tracking branch 'origin/main' 2026-01-10 18:06:15 +08:00
ccnetcore
44394dffac ci: 修改发布 2026-01-10 18:06:04 +08:00
橙子
66c2d641a8 update README.md.
Signed-off-by: 橙子 <454313500@qq.com>
2026-01-10 10:04:56 +00:00
ccnetcore
7e90624467 chore: 调整发布脚本打包目录路径 2026-01-10 17:34:08 +08:00
ccnetcore
19e26f4383 ci: 新增发布流程 2026-01-10 17:24:19 +08:00
ccnetcore
699fc54885 feat: 精简模板代码 2026-01-10 17:11:37 +08:00
ccnetcore
05b81b710f feat: 合并提交 2026-01-10 15:41:12 +08:00
wcg
3c9c882c42 feat: 新增系统字典:Vben5通知类型 2026-01-04 14:11:47 +08:00
dubai
176af22572 fix: 把 Yi.Vben5.Vue3 下的 packages 目录放出来 2026-01-04 14:10:59 +08:00
wcg
51ee3fb460 feat(project): 添加vben5前端 2026-01-04 13:45:07 +08:00
wcg
2c0689fe02 fix:删除文件夹 2026-01-04 13:43:01 +08:00
dubai
1c8899ed4f feat: 新增vben5前端 2026-01-04 13:40:02 +08:00
wcg
30c45eeb59 fix(rbac): 修复字典数据种子和菜单种子中的错误 2026-01-04 13:01:12 +08:00
wcg
cbd76d2952 config(App): 允许vben5默认端口5666跨域请求 2026-01-04 11:50:40 +08:00
wcg
9a121af7bd feat(rbac): 添加操作日志标题模糊搜索 2026-01-04 11:31:28 +08:00
wcg
96503a2f15 feat(role): 添加角色菜单和部门树获取功能 2026-01-04 11:29:52 +08:00
wcg
29f61e1dc9 feat(menu): 添加菜单树构建功能和相关接口 2026-01-04 11:05:53 +08:00
wcg
80d8ac2bc8 feat(menu): 添加菜单树构建功能和相关接口 2026-01-04 11:02:13 +08:00
wcg
f77c775229 feat(rbac): 添加Vben5菜单 2026-01-04 10:55:28 +08:00
wcg
38463fc477 feat(rbac): 为字典种子数据添加列表样式类 2026-01-04 10:43:19 +08:00
wcg
5a212d7949 refactor(application): 将 GetSelectDataListAsync 方法返回类型从 PagedResultDto<T> 改为 List<T> 2026-01-04 10:33:16 +08:00
wcg
fe7e2eb660 feat(user): 添加按部门获取用户列表功能 2026-01-04 10:31:46 +08:00
wcg
225d8d4726 feat(dept): 添加排除指定部门及其子孙部门的查询功能 2026-01-04 10:29:10 +08:00
wcg
b69c6d86c1 feat(dept): 添加部门树形结构功能和相关API接口 2026-01-04 10:23:42 +08:00
wcg
fe7c1763ba feat(config): 添加配置数据种子和根据key查询配置功能
- 添加初始密码配置项的种子数据 (sys.user.initPassword: 123456)
- 在 ConfigService 中新增 GetConfigKeyAsync 方法支持根据key查询配置值
2026-01-04 10:13:51 +08:00
2060 changed files with 128769 additions and 16660 deletions

4
.gitignore vendored
View File

@@ -154,6 +154,10 @@ PublishScripts/
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# 把 Yi.Vben5.Vue3 下的 packages 目录重新放出来
!**/Yi.Vben5.Vue3/packages/
!**/Yi.Vben5.Vue3/packages/**
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed

View File

@@ -1,6 +1,6 @@
<h1 align="center"><img align="left" height="150px" src="https://ccnetcore.com/prod-api/wwwroot/logo.png"> Yi框架</h1>
<h4 align="center">一套以用户体验出发的.Net8 Web开源框架</h4>
<h5 align="center">支持Abp.vNext 版本原生版本、Furion版本前端接入Ruoyi/Pure Vue</h5>
<h5 align="center">支持Abp.vNext 版本原生版本、Furion版本前端接入Vben/Ruoyi/Pure Vue</h5>
<h2 align="center">集大成者,终究轮子</h2>
[![star](https://gitee.com/ccnetcore/yi/badge/star.svg?theme=dark)](https://gitee.com/ccnetcore/Yi)
@@ -39,14 +39,17 @@ Yi框架-一套与SqlSugar一样爽的.Net8开源框架。
**分支目录:**
- 分支**Abp**: 基于Abp.vNext分支DDD领域驱动设计,回归开发本质,极度简单,一个后台支持以下多个前端
- 分支**main**: 基于Abp.vNext分支默认分支只使用Rbac权限管理后台
- 分支**abp**: 基于Abp.vNext分支完整分支具备超多内置模块
- Yi.Abp.Net8后端
- Yi.Bbs.Vue3Bbs社区 前端
- Yi.Doc.Md: 开源文档教程
- Yi.Vben5.Vue3Vben ts后台前端
- Yi.Pure.Vue3Pure ts后台前端
- Yi.RuoYi.Vue3RuoYi js后台前端
****
## 🍉 docker 一键启动
@@ -56,7 +59,7 @@ Yi框架-一套与SqlSugar一样爽的.Net8开源框架。
bbs前端`docker run -d --name yi.bbs -p 18001:18001 -v /home/Yi/Yi.Bbs.Vue3/yi-bbs.conf:/etc/nginx/conf.d/yi-bbs.conf jiftcc/yi.bbs:last`
> 另外我们提供docker的build操作我们更希望你能通过此种方式二开构建属于自己的镜像
> 另外我们提供docker的build操作我们更希望你能通过此种方式二开构建属于自己的镜像,因为上面镜像更新不及时
****
@@ -64,11 +67,24 @@ bbs前端`docker run -d --name yi.bbs -p 18001:18001 -v /home/Yi/Yi.Bbs.Vue3/
废话少说直接上地址
Yi社区官网网址Bbs社区正式[ccnetcore.com](https://ccnetcore.com) (已上线,欢迎加入)
- Yi社区官网网址Bbs社区正式[ccnetcore.com](https://ccnetcore.com) (已上线,欢迎加入)
Rbac后台演示地址https://data.ccnetcore.com:1000 用户cc、密码123456
DotNet后端主要由SharpDance 意框架官方团队 及 数百名 开源用户 共同维护
Pure后台演示地址https://data.ccnetcore.com:1001 用户cc、密码123456
- Vben后台演示地址https://data.ccnetcore.com:2000 用户cc、密码123456
Vben前端主要由【https://gitee.com/vichen2021】贡献维护
- Ruoyi后台演示地址https://data.ccnetcore.com:1000 用户cc、密码123456
Ruoyi前端主要由30多名开源用户共同贡献维护
- Pure后台演示地址https://data.ccnetcore.com:1001 用户cc、密码123456
Pure前端主要由3名开源用户共同贡献维护
## 🍏 支持:
@@ -118,8 +134,13 @@ Pure后台演示地址https://data.ccnetcore.com:1001 用户cc、密码12
- [SqlSugar官网](https://www.donet5.com/home/doc)
## 🍅 内置模块简介
- Rbac权限管理系统已上线支持pure、ruoyi前端
- Bbs论坛社区系统已上线
- rbac 权限管理系统已上线支持vben、pure、ruoyi前端
- bbs 论坛社区系统(已上线)
- ai-stock Ai模拟炒股系统已上线
- chat-hub Ai在线聊天室系统已上线
- code-gen 代码生成器工具系统(已上线)
- digital-collectibles 数字藏品小程序系统(已上线)
> 重复的东西,无需再写一遍,这也是优雅的体现之一
@@ -140,14 +161,6 @@ C# Asp.NetCore 8.0
- [x] 分布式缓存Abp.vNext
- [x] 事件总线Abp.vNext
#### 前端
js Vue3
- [x] 异步请求axios
- [x] 图表echarts
- [x] uielement-plus
- [x] 存储pinia
- [x] 路由vue-router
- [x] 打包vite
#### 运维
- [x] 部署nginx
@@ -174,24 +187,16 @@ js Vue3
- 缓存列表
- 服务监控
#### 🍐 BBS社区论坛系统持续更新
采用vue3前端
- 文章功能
- 板块功能
- 主题功能
- 个人中心
- 授权中心
- 权限管理
#### 🍉 演示截图:
<table>
<tr>
<td><img src="readme/101.png"/></td>
<td><img src="readme/102.png"/></td>
<td><img src="readme/303.png"/></td>
<td><img src="readme/304.png"/></td>
</tr>
<tr>
<td><img src="readme/103.png"/></td>
<td><img src="readme/104.png"/></td>
<td><img src="readme/301.png"/></td>
<td><img src="readme/302.png"/></td>
</tr>
</table>
@@ -262,6 +267,8 @@ js Vue3
[Furion百小僧]https://furion.baiqian.ltd/
[du白]https://gitee.com/vichen2021
****
## 🌽 联系我们:
@@ -269,7 +276,7 @@ js Vue3
QQ交流群官方一群已满、官方二群已满、官方三群`786308927`(已满)、官方四群:`498310311`(已满)、官方五群:`981136525`
微信交流群:官方微信一群(已满)、官方微信二群(已满)、官方微信三群
微信交流群:官方微信一群(已满)、官方微信二群(已满)、官方微信三群(已满)、官方微信四群(即满)
微信交流群:加作者微信 chengzilaoge520 橙子老哥520备注拉群
@@ -280,6 +287,12 @@ QQ交流群官方一群已满、官方二群已满、官方三群
****
## 🍄 FQA:
前往官网查看留言区
如何修改仓库代码请直接pr即可官方团队会第一时间处理目前前端都是pr来的
gitee仓库官方地址https://gitee.com/ccnetcore/Yi
github仓库官方地址https://github.com/ccnetcore/Yi.Abp.Admin
前往官网查看留言区:
[留言区](https://ccnetcore.com/discuss/1641030787056930818)

View File

@@ -64,18 +64,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.Rbac.Domain.Sh
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}"
@@ -98,20 +86,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.TenantManageme
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}"
@@ -126,18 +102,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.SettingManagem
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}"
@@ -158,34 +122,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Abp.Tool.HttpApi.Client"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.SettingManagement.Application", "module\setting-management\Yi.Framework.SettingManagement.Application\Yi.Framework.SettingManagement.Application.csproj", "{2A31D7CB-BDCC-4253-BA73-273B6B5E1956}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "digital-collectibles", "digital-collectibles", "{B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.DigitalCollectibles.Application", "module\digital-collectibles\Yi.Framework.DigitalCollectibles.Application\Yi.Framework.DigitalCollectibles.Application.csproj", "{236B88D4-F018-4A5F-A506-7458F2308C70}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.DigitalCollectibles.Application.Contracts", "module\digital-collectibles\Yi.Framework.DigitalCollectibles.Application.Contracts\Yi.Framework.DigitalCollectibles.Application.Contracts.csproj", "{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.DigitalCollectibles.Domain", "module\digital-collectibles\Yi.Framework.DigitalCollectibles.Domain\Yi.Framework.DigitalCollectibles.Domain.csproj", "{9B5CAE1A-E062-4C9B-8121-E58FBF69309C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.DigitalCollectibles.Domain.Shared", "module\digital-collectibles\Yi.Framework.DigitalCollectibles.Domain.Shared\Yi.Framework.DigitalCollectibles.Domain.Shared.csproj", "{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.DigitalCollectibles.SqlSugarCore", "module\digital-collectibles\Yi.Framework.DigitalCollectibles.SqlSugarCore\Yi.Framework.DigitalCollectibles.SqlSugarCore.csproj", "{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.WeChat.MiniProgram", "framework\Yi.Framework.WeChat.MiniProgram\Yi.Framework.WeChat.MiniProgram.csproj", "{81CEA2ED-917B-41D8-BE0D-39A785B050C0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.BackgroundWorkers.Hangfire", "framework\Yi.Framework.BackgroundWorkers.Hangfire\Yi.Framework.BackgroundWorkers.Hangfire.csproj", "{862CA181-BEE6-4870-82D2-B662E527ED8C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ai-stock", "ai-stock", "{DB46873F-981A-43D8-91B0-D464CCB65943}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.Application", "module\ai-stock\Yi.Framework.Stock.Application\Yi.Framework.Stock.Application.csproj", "{B79CE23C-10F8-48A5-A039-5940A188CF5A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.Application.Contracts", "module\ai-stock\Yi.Framework.Stock.Application.Contracts\Yi.Framework.Stock.Application.Contracts.csproj", "{846B781A-B77E-4F86-A31F-0B5B57AB0775}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.Domain", "module\ai-stock\Yi.Framework.Stock.Domain\Yi.Framework.Stock.Domain.csproj", "{162821E4-8FE0-4A68-B3C0-49BD6596446F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.Domain.Shared", "module\ai-stock\Yi.Framework.Stock.Domain.Shared\Yi.Framework.Stock.Domain.Shared.csproj", "{10273544-715D-4BB3-893C-6F010D947BDD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.Stock.SqlSugarCore", "module\ai-stock\Yi.Framework.Stock.SqlSugarCore\Yi.Framework.Stock.SqlSugarCore.csproj", "{5F49318F-E6C7-4194-BAE0-83D4FB8D1983}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -264,26 +204,6 @@ Global
{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
@@ -320,30 +240,10 @@ Global
{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
@@ -364,26 +264,6 @@ Global
{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
@@ -420,26 +300,6 @@ Global
{2A31D7CB-BDCC-4253-BA73-273B6B5E1956}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2A31D7CB-BDCC-4253-BA73-273B6B5E1956}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2A31D7CB-BDCC-4253-BA73-273B6B5E1956}.Release|Any CPU.Build.0 = Release|Any CPU
{236B88D4-F018-4A5F-A506-7458F2308C70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{236B88D4-F018-4A5F-A506-7458F2308C70}.Debug|Any CPU.Build.0 = Debug|Any CPU
{236B88D4-F018-4A5F-A506-7458F2308C70}.Release|Any CPU.ActiveCfg = Release|Any CPU
{236B88D4-F018-4A5F-A506-7458F2308C70}.Release|Any CPU.Build.0 = Release|Any CPU
{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B}.Release|Any CPU.Build.0 = Release|Any CPU
{9B5CAE1A-E062-4C9B-8121-E58FBF69309C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9B5CAE1A-E062-4C9B-8121-E58FBF69309C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9B5CAE1A-E062-4C9B-8121-E58FBF69309C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9B5CAE1A-E062-4C9B-8121-E58FBF69309C}.Release|Any CPU.Build.0 = Release|Any CPU
{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061}.Release|Any CPU.Build.0 = Release|Any CPU
{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F}.Release|Any CPU.Build.0 = Release|Any CPU
{81CEA2ED-917B-41D8-BE0D-39A785B050C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{81CEA2ED-917B-41D8-BE0D-39A785B050C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{81CEA2ED-917B-41D8-BE0D-39A785B050C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -448,26 +308,6 @@ Global
{862CA181-BEE6-4870-82D2-B662E527ED8C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{862CA181-BEE6-4870-82D2-B662E527ED8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{862CA181-BEE6-4870-82D2-B662E527ED8C}.Release|Any CPU.Build.0 = Release|Any CPU
{B79CE23C-10F8-48A5-A039-5940A188CF5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B79CE23C-10F8-48A5-A039-5940A188CF5A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B79CE23C-10F8-48A5-A039-5940A188CF5A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B79CE23C-10F8-48A5-A039-5940A188CF5A}.Release|Any CPU.Build.0 = Release|Any CPU
{846B781A-B77E-4F86-A31F-0B5B57AB0775}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{846B781A-B77E-4F86-A31F-0B5B57AB0775}.Debug|Any CPU.Build.0 = Debug|Any CPU
{846B781A-B77E-4F86-A31F-0B5B57AB0775}.Release|Any CPU.ActiveCfg = Release|Any CPU
{846B781A-B77E-4F86-A31F-0B5B57AB0775}.Release|Any CPU.Build.0 = Release|Any CPU
{162821E4-8FE0-4A68-B3C0-49BD6596446F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{162821E4-8FE0-4A68-B3C0-49BD6596446F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{162821E4-8FE0-4A68-B3C0-49BD6596446F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{162821E4-8FE0-4A68-B3C0-49BD6596446F}.Release|Any CPU.Build.0 = Release|Any CPU
{10273544-715D-4BB3-893C-6F010D947BDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{10273544-715D-4BB3-893C-6F010D947BDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{10273544-715D-4BB3-893C-6F010D947BDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{10273544-715D-4BB3-893C-6F010D947BDD}.Release|Any CPU.Build.0 = Release|Any CPU
{5F49318F-E6C7-4194-BAE0-83D4FB8D1983}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5F49318F-E6C7-4194-BAE0-83D4FB8D1983}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5F49318F-E6C7-4194-BAE0-83D4FB8D1983}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5F49318F-E6C7-4194-BAE0-83D4FB8D1983}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -492,12 +332,6 @@ Global
{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}
@@ -509,25 +343,13 @@ Global
{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}
@@ -537,20 +359,8 @@ Global
{4AE84CDE-2A47-4D68-8E93-86193F72E4E8} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4}
{C8F97775-D903-4365-A4FF-3DA97E318CD2} = {084CBEEC-5D37-4716-B9C7-D80D6960DFF4}
{2A31D7CB-BDCC-4253-BA73-273B6B5E1956} = {8C68059E-F3B1-4D28-A1C9-A5830F53E5D3}
{B8F76A6B-2EEB-4E64-9F26-D84584E16B9C} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{236B88D4-F018-4A5F-A506-7458F2308C70} = {B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}
{4FE7AC0E-91CC-4DF1-ACA7-ED83483C3F3B} = {B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}
{9B5CAE1A-E062-4C9B-8121-E58FBF69309C} = {B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}
{FFEC9DA6-1A13-480A-AE9E-2BF8763D3061} = {B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}
{4CE6E4AE-0BA4-4984-A4F1-A9A414B1BB8F} = {B8F76A6B-2EEB-4E64-9F26-D84584E16B9C}
{81CEA2ED-917B-41D8-BE0D-39A785B050C0} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{862CA181-BEE6-4870-82D2-B662E527ED8C} = {77B949E9-530E-45A5-9657-20F7D5C6875C}
{DB46873F-981A-43D8-91B0-D464CCB65943} = {2317227D-7796-4E7B-BEDB-7CD1CAE7B853}
{B79CE23C-10F8-48A5-A039-5940A188CF5A} = {DB46873F-981A-43D8-91B0-D464CCB65943}
{846B781A-B77E-4F86-A31F-0B5B57AB0775} = {DB46873F-981A-43D8-91B0-D464CCB65943}
{162821E4-8FE0-4A68-B3C0-49BD6596446F} = {DB46873F-981A-43D8-91B0-D464CCB65943}
{10273544-715D-4BB3-893C-6F010D947BDD} = {DB46873F-981A-43D8-91B0-D464CCB65943}
{5F49318F-E6C7-4194-BAE0-83D4FB8D1983} = {DB46873F-981A-43D8-91B0-D464CCB65943}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {23D6FBC9-C970-4641-BC1E-2AEA59F51C18}

View File

@@ -20,12 +20,12 @@ namespace Yi.Framework.AspNetCore.Microsoft.AspNetCore.Middlewares
/// <returns>异步任务</returns>
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
// 在响应开始时处理文件下载相关的响应头
context.Response.OnStarting(() =>
{
HandleFileDownloadResponse(context);
return Task.CompletedTask;
});
// // 在响应开始时处理文件下载相关的响应头
// context.Response.OnStarting(() =>
// {
// HandleFileDownloadResponse(context);
// return Task.CompletedTask;
// });
// 继续处理管道中的下一个中间件
await next(context);

View File

@@ -185,15 +185,13 @@ namespace Yi.Framework.Ddd.Application
/// </summary>
/// <param name="keywords">查询关键字</param>
/// <returns></returns>
public virtual async Task<PagedResultDto<TGetListOutputDto>> GetSelectDataListAsync(string? keywords = null)
public virtual async Task<List<TGetListOutputDto>> GetSelectDataListAsync(string? keywords = null)
{
List<TEntity> entities = await Repository.GetListAsync();
// 获取总数并映射结果
var totalCount = entities.Count;
var dtos = await MapToGetListOutputDtosAsync(entities);
return new PagedResultDto<TGetListOutputDto>(totalCount, dtos);
return dtos;
}
/// <summary>

View File

@@ -1,66 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockHolding
{
/// <summary>
/// 用户股票持仓DTO
/// </summary>
public class StockHoldingDto : EntityDto<Guid>
{
/// <summary>
/// 用户ID
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 股票代码
/// </summary>
public string StockCode { get; set; }
/// <summary>
/// 股票名称
/// </summary>
public string StockName { get; set; }
/// <summary>
/// 持有数量
/// </summary>
public int Quantity { get; set; }
/// <summary>
/// 持仓成本
/// </summary>
public decimal CostPrice { get; set; }
/// <summary>
/// 当前价格
/// </summary>
public decimal CurrentPrice { get; set; }
/// <summary>
/// 持仓市值
/// </summary>
public decimal MarketValue { get; set; }
/// <summary>
/// 盈亏金额
/// </summary>
public decimal ProfitLoss { get; set; }
/// <summary>
/// 盈亏百分比
/// </summary>
public decimal ProfitLossPercentage { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,21 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockHolding
{
/// <summary>
/// 获取用户持仓列表的输入DTO
/// </summary>
public class StockHoldingGetListInputDto : PagedAndSortedResultRequestDto
{
/// <summary>
/// 股票代码
/// </summary>
public string? StockCode { get; set; }
/// <summary>
/// 股票名称
/// </summary>
public string? StockName { get; set; }
}
}

View File

@@ -1,20 +0,0 @@
using System;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket
{
/// <summary>
/// 买入股票输入DTO
/// </summary>
public class BuyStockInputDto
{
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 买入数量
/// </summary>
public int Quantity { get; set; }
}
}

View File

@@ -1,23 +0,0 @@
using System;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket;
/// <summary>
/// 创建股市输入DTO
/// </summary>
public class CreateStockMarketInputDto
{
/// <summary>
/// 股市代码
/// </summary>
public string MarketCode { get; set; }
/// <summary>
/// 股市名称
/// </summary>
public string MarketName { get; set; }
/// <summary>
/// 股市描述
/// </summary>
public string Description { get; set; }
}

View File

@@ -1,20 +0,0 @@
using System;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket
{
/// <summary>
/// 卖出股票输入DTO
/// </summary>
public class SellStockInputDto
{
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 卖出数量
/// </summary>
public int Quantity { get; set; }
}
}

View File

@@ -1,36 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket
{
/// <summary>
/// 股市信息DTO
/// </summary>
public class StockMarketDto : EntityDto<Guid>
{
/// <summary>
/// 股市代码
/// </summary>
public string MarketCode { get; set; }
/// <summary>
/// 股市名称
/// </summary>
public string MarketName { get; set; }
/// <summary>
/// 股市描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 状态
/// </summary>
public bool State { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,26 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket
{
/// <summary>
/// 获取股市列表的输入DTO
/// </summary>
public class StockMarketGetListInputDto : PagedAndSortedResultRequestDto
{
/// <summary>
/// 股市代码
/// </summary>
public string? MarketCode { get; set; }
/// <summary>
/// 股市名称
/// </summary>
public string? MarketName { get; set; }
/// <summary>
/// 状态
/// </summary>
public bool? State { get; set; }
}
}

View File

@@ -1,41 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockNews
{
/// <summary>
/// 股市新闻DTO
/// </summary>
public class StockNewsDto : EntityDto<Guid>
{
/// <summary>
/// 新闻标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 新闻内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 发布时间
/// </summary>
public DateTime PublishTime { get; set; }
/// <summary>
/// 新闻来源
/// </summary>
public string Source { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; }
/// <summary>
/// 排序号
/// </summary>
public int OrderNum { get; set; }
}
}

View File

@@ -1,37 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockNews
{
/// <summary>
/// 获取股市新闻列表的输入DTO
/// </summary>
public class StockNewsGetListInputDto : PagedAndSortedResultRequestDto
{
/// <summary>
/// 新闻标题关键词
/// </summary>
public string? Title { get; set; }
/// <summary>
/// 新闻来源
/// </summary>
public string? Source { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? StartTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? EndTime { get; set; }
/// <summary>
/// 是否只显示最近10天的新闻
/// </summary>
/// <remarks>默认为true查询最近10天的新闻</remarks>
public bool IsRecent { get; set; } = true;
}
}

View File

@@ -1,47 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockPrice
{
/// <summary>
/// 股市价格记录DTO
/// </summary>
public class StockPriceRecordDto : EntityDto<Guid>
{
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 记录时间
/// </summary>
public DateTime CreationTime { get; set; }
/// <summary>
/// 当前价
/// </summary>
public decimal CurrentPrice { get; set; }
/// <summary>
/// 交易量
/// </summary>
public long Volume { get; set; }
/// <summary>
/// 交易额
/// </summary>
public decimal Turnover { get; set; }
/// <summary>
/// 时间周期类型
/// </summary>
public PeriodTypeEnum PeriodType { get; set; }
/// <summary>
/// 记录时间
/// </summary>
public DateTime RecordTime { get; set; }
}
}

View File

@@ -1,32 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockPrice
{
/// <summary>
/// 获取股市价格记录的输入DTO
/// </summary>
public class StockPriceRecordGetListInputDto : PagedAndSortedResultRequestDto
{
/// <summary>
/// 股票ID
/// </summary>
public Guid? StockId { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? StartTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? EndTime { get; set; }
/// <summary>
/// 时间周期类型
/// </summary>
public PeriodTypeEnum? PeriodType { get; set; }
}
}

View File

@@ -1,62 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockTransaction
{
/// <summary>
/// 股票交易记录DTO
/// </summary>
public class StockTransactionDto : EntityDto<Guid>
{
/// <summary>
/// 用户ID
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 股票代码
/// </summary>
public string StockCode { get; set; }
/// <summary>
/// 股票名称
/// </summary>
public string StockName { get; set; }
/// <summary>
/// 交易类型
/// </summary>
public TransactionTypeEnum TransactionType { get; set; }
/// <summary>
/// 交易价格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 交易数量
/// </summary>
public int Quantity { get; set; }
/// <summary>
/// 交易总额
/// </summary>
public decimal TotalAmount { get; set; }
/// <summary>
/// 交易费用
/// </summary>
public decimal Fee { get; set; }
/// <summary>
/// 交易时间
/// </summary>
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,37 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockTransaction
{
/// <summary>
/// 获取交易记录的输入DTO
/// </summary>
public class StockTransactionGetListInputDto : PagedAndSortedResultRequestDto
{
/// <summary>
/// 股票代码
/// </summary>
public string? StockCode { get; set; }
/// <summary>
/// 股票名称
/// </summary>
public string? StockName { get; set; }
/// <summary>
/// 交易类型
/// </summary>
public TransactionTypeEnum? TransactionType { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? StartTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? EndTime { get; set; }
}
}

View File

@@ -1,29 +0,0 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockHolding;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockTransaction;
namespace Yi.Framework.Stock.Application.Contracts.IServices
{
/// <summary>
/// 用户持仓服务接口
/// </summary>
public interface IStockHoldingService : IApplicationService
{
/// <summary>
/// 获取当前用户的持仓列表
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>持仓列表</returns>
Task<PagedResultDto<StockHoldingDto>> GetUserHoldingsAsync(StockHoldingGetListInputDto input);
/// <summary>
/// 获取当前用户的交易记录
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>交易记录列表</returns>
Task<PagedResultDto<StockTransactionDto>> GetUserTransactionsAsync(StockTransactionGetListInputDto input);
}
}

View File

@@ -1,49 +0,0 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockPrice;
namespace Yi.Framework.Stock.Application.Contracts.IServices
{
/// <summary>
/// 股市服务接口
/// </summary>
public interface IStockMarketService : IApplicationService
{
/// <summary>
/// 获取股市列表
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>股市列表</returns>
Task<PagedResultDto<StockMarketDto>> GetStockMarketListAsync(StockMarketGetListInputDto input);
/// <summary>
/// 获取股市价格记录看板
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>股价记录列表</returns>
Task<PagedResultDto<StockPriceRecordDto>> GetStockPriceRecordListAsync(StockPriceRecordGetListInputDto input);
/// <summary>
/// 买入股票
/// </summary>
/// <param name="input">买入股票参数</param>
/// <returns>操作结果</returns>
Task BuyStockAsync(BuyStockInputDto input);
/// <summary>
/// 卖出股票
/// </summary>
/// <param name="input">卖出股票参数</param>
/// <returns>操作结果</returns>
Task SellStockAsync(SellStockInputDto input);
/// <summary>
/// 生成最新股票记录
/// </summary>
/// <returns>操作结果</returns>
Task GenerateStocksAsync();
}
}

View File

@@ -1,20 +0,0 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockNews;
namespace Yi.Framework.Stock.Application.Contracts.IServices
{
/// <summary>
/// 股市新闻服务接口
/// </summary>
public interface IStockNewsService : IApplicationService
{
/// <summary>
/// 获取股市新闻列表
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>新闻列表</returns>
Task<PagedResultDto<StockNewsDto>> GetStockNewsListAsync(StockNewsGetListInputDto input);
}
}

View File

@@ -1,15 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<ItemGroup>
<ProjectReference Include="..\..\..\framework\Yi.Framework.Ddd.Application.Contracts\Yi.Framework.Ddd.Application.Contracts.csproj" />
<ProjectReference Include="..\Yi.Framework.Stock.Domain.Shared\Yi.Framework.Stock.Domain.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.SettingManagement.Application.Contracts" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<Folder Include="IServices\" />
</ItemGroup>
</Project>

View File

@@ -1,17 +0,0 @@
using Volo.Abp.SettingManagement;
using Yi.Framework.Stock.Domain.Shared;
using Yi.Framework.Ddd.Application.Contracts;
namespace Yi.Framework.Stock.Application.Contracts
{
[DependsOn(
typeof(YiFrameworkStockDomainSharedModule),
typeof(AbpSettingManagementApplicationContractsModule),
typeof(YiFrameworkDddApplicationContractsModule))]
public class YiFrameworkStockApplicationContractsModule:AbpModule
{
}
}

View File

@@ -1,107 +0,0 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockHolding;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockTransaction;
using Yi.Framework.Stock.Application.Contracts.IServices;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
using Volo.Abp.Users;
namespace Yi.Framework.Stock.Application.Services
{
/// <summary>
/// 用户持仓服务实现
/// </summary>
[Authorize]
public class StockHoldingService : ApplicationService, IStockHoldingService
{
private readonly ISqlSugarRepository<StockHoldingAggregateRoot> _stockHoldingRepository;
private readonly ISqlSugarRepository<StockTransactionEntity> _stockTransactionRepository;
public StockHoldingService(
ISqlSugarRepository<StockHoldingAggregateRoot> stockHoldingRepository,
ISqlSugarRepository<StockTransactionEntity> stockTransactionRepository)
{
_stockHoldingRepository = stockHoldingRepository;
_stockTransactionRepository = stockTransactionRepository;
}
/// <summary>
/// 获取当前用户的持仓列表
/// </summary>
[Authorize]
[HttpGet("stock/user-holdings")]
public async Task<PagedResultDto<StockHoldingDto>> GetUserHoldingsAsync(StockHoldingGetListInputDto input)
{
Guid userId = CurrentUser.GetId();
RefAsync<int> total = 0;
var query = _stockHoldingRepository._DbQueryable
.Where(h => h.UserId == userId)
.WhereIF(!string.IsNullOrEmpty(input.StockCode), h => h.StockCode.Contains(input.StockCode))
.WhereIF(!string.IsNullOrEmpty(input.StockName), h => h.StockName.Contains(input.StockName))
.OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),t=>t.CreationTime,OrderByType.Desc);
var list = await query
.Select(h => new StockHoldingDto
{
Id = h.Id,
UserId = h.UserId,
StockId = h.StockId,
StockCode = h.StockCode,
StockName = h.StockName,
Quantity = h.Quantity,
CreationTime = h.CreationTime
})
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
return new PagedResultDto<StockHoldingDto>(total, list);
}
/// <summary>
/// 获取当前用户的交易记录
/// </summary>
[Authorize]
[HttpGet("stock/user-transactions")]
public async Task<PagedResultDto<StockTransactionDto>> GetUserTransactionsAsync(StockTransactionGetListInputDto input)
{
Guid userId = CurrentUser.GetId();
RefAsync<int> total = 0;
var query = _stockTransactionRepository._DbQueryable
.Where(t => t.UserId == userId)
.WhereIF(!string.IsNullOrEmpty(input.StockCode), t => t.StockCode.Contains(input.StockCode))
.WhereIF(!string.IsNullOrEmpty(input.StockName), t => t.StockName.Contains(input.StockName))
.WhereIF(input.TransactionType.HasValue, t => t.TransactionType == input.TransactionType.Value)
.WhereIF(input.StartTime.HasValue, t => t.CreationTime >= input.StartTime.Value)
.WhereIF(input.EndTime.HasValue, t => t.CreationTime <= input.EndTime.Value)
.OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),t=>t.CreationTime,OrderByType.Desc);
var list = await query
.Select(t => new StockTransactionDto
{
Id = t.Id,
UserId = t.UserId,
StockId = t.StockId,
StockCode = t.StockCode,
StockName = t.StockName,
TransactionType = t.TransactionType,
Price = t.Price,
Quantity = t.Quantity,
TotalAmount = t.TotalAmount,
Fee = t.Fee,
CreationTime = t.CreationTime
})
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
return new PagedResultDto<StockTransactionDto>(total, list);
}
}
}

View File

@@ -1,167 +0,0 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Users;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockPrice;
using Yi.Framework.Stock.Application.Contracts.IServices;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
using Yi.Framework.Stock.Domain.Managers;
using Mapster;
namespace Yi.Framework.Stock.Application.Services
{
/// <summary>
/// 股市服务实现
/// </summary>
public class StockMarketService : ApplicationService, IStockMarketService
{
private readonly ISqlSugarRepository<StockMarketAggregateRoot> _stockMarketRepository;
private readonly ISqlSugarRepository<StockPriceRecordEntity> _stockPriceRecordRepository;
private readonly StockMarketManager _stockMarketManager;
public StockMarketService(
ISqlSugarRepository<StockMarketAggregateRoot> stockMarketRepository,
ISqlSugarRepository<StockPriceRecordEntity> stockPriceRecordRepository,
StockMarketManager stockMarketManager)
{
_stockMarketRepository = stockMarketRepository;
_stockPriceRecordRepository = stockPriceRecordRepository;
_stockMarketManager = stockMarketManager;
}
/// <summary>
/// 创建股市
/// </summary>
[HttpPost("stock/markets")]
[Authorize]
public async Task<StockMarketDto> CreateStockMarketAsync(CreateStockMarketInputDto input)
{
// 使用映射将输入DTO转换为实体
var stockMarket = input.Adapt<StockMarketAggregateRoot>();
// 保存到数据库
var result = await _stockMarketRepository.InsertReturnEntityAsync(stockMarket);
// 使用映射将实体转换为返回DTO
return result.Adapt<StockMarketDto>();
}
/// <summary>
/// 获取股市列表
/// </summary>
[HttpGet("stock/markets")]
public async Task<PagedResultDto<StockMarketDto>> GetStockMarketListAsync(StockMarketGetListInputDto input)
{
RefAsync<int> total = 0;
var query = _stockMarketRepository._DbQueryable
.WhereIF(!string.IsNullOrEmpty(input.MarketCode), m => m.MarketCode.Contains(input.MarketCode))
.WhereIF(!string.IsNullOrEmpty(input.MarketName), m => m.MarketName.Contains(input.MarketName))
.WhereIF(input.State.HasValue, m => m.State == input.State.Value)
.OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),m=>m.OrderNum,OrderByType.Asc)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),m=>m.CreationTime,OrderByType.Desc);
var list = await query
.Select(m => new StockMarketDto
{
Id = m.Id,
MarketCode = m.MarketCode,
MarketName = m.MarketName,
Description = m.Description,
State = m.State,
CreationTime = m.CreationTime
})
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
return new PagedResultDto<StockMarketDto>(total, list);
}
/// <summary>
/// 获取股市价格记录看板
/// </summary>
[HttpGet("stock/price-records")]
public async Task<PagedResultDto<StockPriceRecordDto>> GetStockPriceRecordListAsync(StockPriceRecordGetListInputDto input)
{
RefAsync<int> total = 0;
var query = _stockPriceRecordRepository._DbQueryable
.WhereIF(input.StockId.HasValue, p => p.StockId == input.StockId.Value)
.WhereIF(input.StartTime.HasValue, p => p.RecordTime >= input.StartTime.Value)
.WhereIF(input.EndTime.HasValue, p => p.RecordTime <= input.EndTime.Value)
.WhereIF(input.PeriodType.HasValue, p => p.PeriodType == input.PeriodType.Value)
.Where(x=>x.RecordTime<=DateTime.Now)
.OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),p=>p.RecordTime);
var list = await query
.Select(p => new StockPriceRecordDto
{
Id = p.Id,
StockId = p.StockId,
CreationTime = p.CreationTime,
RecordTime = p.RecordTime,
CurrentPrice = p.CurrentPrice,
Volume = p.Volume,
Turnover = p.Turnover,
PeriodType = p.PeriodType
})
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
return new PagedResultDto<StockPriceRecordDto>(total, list);
}
/// <summary>
/// 买入股票
/// </summary>
[HttpPost("stock/buy")]
[Authorize]
public async Task BuyStockAsync(BuyStockInputDto input)
{
// 获取当前登录用户ID
var userId = CurrentUser.GetId();
// 调用领域服务进行股票购买
await _stockMarketManager.BuyStockAsync(
userId,
input.StockId,
input.Quantity
);
}
/// <summary>
/// 卖出股票
/// </summary>
[HttpDelete("stock/sell")]
[Authorize]
public async Task SellStockAsync(SellStockInputDto input)
{
// 获取当前登录用户ID
var userId = CurrentUser.GetId();
// 调用领域服务进行股票卖出
await _stockMarketManager.SellStockAsync(
userId,
input.StockId,
input.Quantity
);
}
/// <summary>
/// 生成最新股票记录
/// </summary>
[HttpPost("stock/generate")]
[Authorize]
public async Task GenerateStocksAsync()
{
await _stockMarketManager.GenerateStocksAsync();
}
}
}

View File

@@ -1,80 +0,0 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockNews;
using Yi.Framework.Stock.Application.Contracts.IServices;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
using Yi.Framework.Stock.Domain.Managers;
namespace Yi.Framework.Stock.Application.Services
{
/// <summary>
/// 股市新闻服务实现
/// </summary>
public class StockNewsService : ApplicationService, IStockNewsService
{
private readonly ISqlSugarRepository<StockNewsAggregateRoot> _stockNewsRepository;
private readonly NewsManager _newsManager;
public StockNewsService(
ISqlSugarRepository<StockNewsAggregateRoot> stockNewsRepository,
NewsManager newsManager)
{
_stockNewsRepository = stockNewsRepository;
_newsManager = newsManager;
}
/// <summary>
/// 获取股市新闻列表
/// </summary>
[HttpGet("/api/app/stock/news")]
public async Task<PagedResultDto<StockNewsDto>> GetStockNewsListAsync(StockNewsGetListInputDto input)
{
RefAsync<int> total = 0;
// 计算10天前的日期
DateTime tenDaysAgo = DateTime.Now.AddDays(-10);
var query = _stockNewsRepository._DbQueryable
.WhereIF(!string.IsNullOrEmpty(input.Title), n => n.Title.Contains(input.Title))
.WhereIF(!string.IsNullOrEmpty(input.Source), n => n.Source.Contains(input.Source))
.WhereIF(input.StartTime.HasValue, n => n.PublishTime >= input.StartTime.Value)
.WhereIF(input.EndTime.HasValue, n => n.PublishTime <= input.EndTime.Value)
// 如果IsRecent为true则只查询最近10天的新闻
.WhereIF(input.IsRecent, n => n.PublishTime >= tenDaysAgo)
.OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),n=>n.OrderNum,OrderByType.Asc)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),n=>n.PublishTime,OrderByType.Desc) ;
var list = await query
.Select(n => new StockNewsDto
{
Id = n.Id,
Title = n.Title,
Content = n.Content,
PublishTime = n.PublishTime,
Source = n.Source,
CreationTime = n.CreationTime,
OrderNum = n.OrderNum
})
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
return new PagedResultDto<StockNewsDto>(total, list);
}
/// <summary>
/// 生成股市新闻
/// </summary>
/// <returns>生成结果</returns>
[HttpPost("/api/app/stock/news/generate")]
public async Task GenerateNewsAsync()
{
await _newsManager.GenerateNewsAsync();
}
}
}

View File

@@ -1,12 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<ItemGroup>
<ProjectReference Include="..\..\..\framework\Yi.Framework.Ddd.Application\Yi.Framework.Ddd.Application.csproj" />
<ProjectReference Include="..\Yi.Framework.Stock.Application.Contracts\Yi.Framework.Stock.Application.Contracts.csproj" />
<ProjectReference Include="..\Yi.Framework.Stock.Domain\Yi.Framework.Stock.Domain.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,17 +0,0 @@
using Yi.Framework.Stock.Application.Contracts;
using Yi.Framework.Stock.Domain;
using Yi.Framework.Ddd.Application;
namespace Yi.Framework.Stock.Application
{
[DependsOn(
typeof(YiFrameworkStockApplicationContractsModule),
typeof(YiFrameworkStockDomainModule),
typeof(YiFrameworkDddApplicationModule)
)]
public class YiFrameworkStockApplicationModule : AbpModule
{
}
}

View File

@@ -1,41 +0,0 @@
namespace Yi.Framework.Stock.Domain.Shared
{
/// <summary>
/// 时间周期类型枚举
/// </summary>
/// <remarks>
/// 用于定义股票价格记录的时间周期类型
/// </remarks>
public enum PeriodTypeEnum
{
/// <summary>
/// 分钟
/// </summary>
Minute = 0,
/// <summary>
/// 小时
/// </summary>
Hour = 1,
/// <summary>
/// 天
/// </summary>
Day = 2,
/// <summary>
/// 周
/// </summary>
Week = 3,
/// <summary>
/// 月
/// </summary>
Month = 4,
/// <summary>
/// 年
/// </summary>
Year = 5
}
}

View File

@@ -1,18 +0,0 @@
namespace Yi.Framework.Stock.Domain.Shared
{
/// <summary>
/// 交易类型枚举
/// </summary>
public enum TransactionTypeEnum
{
/// <summary>
/// 买入
/// </summary>
Buy = 0,
/// <summary>
/// 卖出
/// </summary>
Sell = 1
}
}

View File

@@ -1,56 +0,0 @@
using System;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Domain.Shared.Etos
{
/// <summary>
/// 股票交易事件数据传输对象
/// </summary>
public class StockTransactionEto
{
/// <summary>
/// 用户ID
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 股票代码
/// </summary>
public string StockCode { get; set; }
/// <summary>
/// 股票名称
/// </summary>
public string StockName { get; set; }
/// <summary>
/// 交易类型
/// </summary>
public TransactionTypeEnum TransactionType { get; set; }
/// <summary>
/// 交易价格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 交易数量
/// </summary>
public int Quantity { get; set; }
/// <summary>
/// 交易总额
/// </summary>
public decimal TotalAmount { get; set; }
/// <summary>
/// 交易费用
/// </summary>
public decimal Fee { get; set; }
}
}

View File

@@ -1,21 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Domain.Shared" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.SettingManagement.Domain.Shared" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<Folder Include="Consts\" />
<Folder Include="Dtos\" />
<Folder Include="Enums\" />
<Folder Include="Etos\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\bbs\Yi.Framework.Bbs.Domain.Shared\Yi.Framework.Bbs.Domain.Shared.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,14 +0,0 @@
using Volo.Abp.Domain;
using Volo.Abp.SettingManagement;
namespace Yi.Framework.Stock.Domain.Shared
{
[DependsOn(
typeof(AbpSettingManagementDomainSharedModule),
typeof(AbpDddDomainSharedModule))]
public class YiFrameworkStockDomainSharedModule : AbpModule
{
}
}

View File

@@ -1,141 +0,0 @@
using SqlSugar;
using Volo.Abp.Auditing;
using Volo.Abp.Domain.Entities;
using Yi.Framework.Core.Data;
namespace Yi.Framework.Stock.Domain.Entities
{
/// <summary>
/// 用户股票持仓聚合根
/// </summary>
/// <remarks>
/// 记录用户持有的股票数量和相关信息
/// </remarks>
[SugarTable("Stock_Holding")]
public class StockHoldingAggregateRoot : AggregateRoot<Guid>, ISoftDelete, IAuditedObject
{
/// <summary>
/// 逻辑删除
/// </summary>
public bool IsDeleted { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; } = DateTime.Now;
/// <summary>
/// 创建者
/// </summary>
public Guid? CreatorId { get; set; }
/// <summary>
/// 最后修改者
/// </summary>
public Guid? LastModifierId { get; set; }
/// <summary>
/// 最后修改时间
/// </summary>
public DateTime? LastModificationTime { get; set; }
/// <summary>
/// 用户ID
/// </summary>
/// <remarks>关联到持有股票的用户</remarks>
public Guid UserId { get; set; }
/// <summary>
/// 股票ID
/// </summary>
/// <remarks>关联到具体的股票</remarks>
public Guid StockId { get; set; }
/// <summary>
/// 股票代码
/// </summary>
/// <remarks>冗余字段,方便查询</remarks>
public string StockCode { get; set; } = string.Empty;
/// <summary>
/// 股票名称
/// </summary>
/// <remarks>冗余字段,方便查询</remarks>
public string StockName { get; set; } = string.Empty;
/// <summary>
/// 持有数量
/// </summary>
/// <remarks>用户持有的股票数量</remarks>
public int Quantity { get; set; }
/// <summary>
/// 平均成本价
/// </summary>
/// <remarks>用户购买这些股票的平均成本价</remarks>
public decimal AverageCostPrice { get; set; }
/// <summary>
/// 持仓成本
/// </summary>
/// <remarks>总投入成本 = 平均成本价 * 持有数量</remarks>
[SugarColumn(IsIgnore = true)]
public decimal TotalCost => AverageCostPrice * Quantity;
public StockHoldingAggregateRoot() { }
public StockHoldingAggregateRoot(
Guid userId,
Guid stockId,
string stockCode,
string stockName,
int quantity,
decimal averageCostPrice)
{
UserId = userId;
StockId = stockId;
StockCode = stockCode;
StockName = stockName;
Quantity = quantity;
AverageCostPrice = averageCostPrice;
}
/// <summary>
/// 增加持仓数量
/// </summary>
/// <param name="quantity">增加的数量</param>
/// <param name="price">本次购买价格</param>
public void AddQuantity(int quantity, decimal price)
{
if (quantity <= 0)
throw new ArgumentException("增加的数量必须大于0");
// 计算新的平均成本价
decimal totalCost = AverageCostPrice * Quantity + price * quantity;
Quantity += quantity;
AverageCostPrice = totalCost / Quantity;
}
/// <summary>
/// 减少持仓数量
/// </summary>
/// <param name="quantity">减少的数量</param>
public void ReduceQuantity(int quantity)
{
if (quantity <= 0)
throw new ArgumentException("减少的数量必须大于0");
if (quantity > Quantity)
throw new ArgumentException("减少的数量不能大于持有数量");
Quantity -= quantity;
// 如果数量为0标记为删除
if (Quantity == 0)
{
IsDeleted = true;
}
}
}
}

View File

@@ -1,79 +0,0 @@
using SqlSugar;
using Volo.Abp.Auditing;
using Volo.Abp.Domain.Entities;
using Yi.Framework.Core.Data;
namespace Yi.Framework.Stock.Domain.Entities
{
/// <summary>
/// 股市聚合根实体
/// </summary>
/// <remarks>
/// 用于定义有哪些公司上架的股市
/// </remarks>
[SugarTable("Stock_Market")]
public class StockMarketAggregateRoot : AggregateRoot<Guid>, ISoftDelete, IAuditedObject, IOrderNum, IState
{
/// <summary>
/// 逻辑删除
/// </summary>
public bool IsDeleted { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; }
/// <summary>
/// 创建者
/// </summary>
public Guid? CreatorId { get; set; }
/// <summary>
/// 最后修改者
/// </summary>
public Guid? LastModifierId { get; set; }
/// <summary>
/// 最后修改时间
/// </summary>
public DateTime? LastModificationTime { get; set; }
/// <summary>
/// 排序
/// </summary>
public int OrderNum { get; set; } = 0;
/// <summary>
/// 状态
/// </summary>
public bool State { get; set; } = true;
/// <summary>
/// 股市代码
/// </summary>
public string MarketCode { get; set; } = string.Empty;
/// <summary>
/// 股市名称
/// </summary>
public string MarketName { get; set; } = string.Empty;
/// <summary>
/// 股市描述
/// </summary>
public string Description { get; set; } = string.Empty;
public StockMarketAggregateRoot() { }
public StockMarketAggregateRoot(
string marketCode,
string marketName,
string description = "")
{
MarketCode = marketCode;
MarketName = marketName;
Description = description;
}
}
}

View File

@@ -1,87 +0,0 @@
using SqlSugar;
using Volo.Abp.Auditing;
using Volo.Abp.Domain.Entities;
using Yi.Framework.Core.Data;
namespace Yi.Framework.Stock.Domain.Entities
{
/// <summary>
/// 股市新闻聚合根实体
/// </summary>
/// <remarks>
/// 用于记录影响股市波动的新闻事件
/// </remarks>
[SugarTable("Stock_News")]
public class StockNewsAggregateRoot : AggregateRoot<Guid>, ISoftDelete, IAuditedObject, IOrderNum
{
/// <summary>
/// 逻辑删除
/// </summary>
public bool IsDeleted { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; }
/// <summary>
/// 创建者ID
/// </summary>
public Guid? CreatorId { get; set; }
/// <summary>
/// 最后修改时间
/// </summary>
public DateTime? LastModificationTime { get; set; }
/// <summary>
/// 最后修改者ID
/// </summary>
public Guid? LastModifierId { get; set; }
/// <summary>
/// 排序号
/// </summary>
public int OrderNum { get; set; } = 0;
/// <summary>
/// 新闻标题
/// </summary>
public string Title { get; set; } = string.Empty;
/// <summary>
/// 新闻内容
/// </summary>
[SugarColumn(ColumnDataType = StaticConfig.CodeFirst_BigString)]
public string Content { get; set; } = string.Empty;
/// <summary>
/// 发布时间
/// </summary>
public DateTime PublishTime { get; set; }
/// <summary>
/// 新闻来源
/// </summary>
public string Source { get; set; } = string.Empty;
/// <summary>
/// 新闻摘要
/// </summary>
public string Summary { get; set; } = string.Empty;
public StockNewsAggregateRoot() { }
public StockNewsAggregateRoot(
string title,
string content,
string source = "")
{
Title = title;
Content = content;
Source = source;
PublishTime = DateTime.Now;
}
}
}

View File

@@ -1,78 +0,0 @@
using SqlSugar;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Auditing;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Domain.Entities
{
/// <summary>
/// 股票价格记录实体
/// </summary>
/// <remarks>
/// 用于记录每支股票在不同时间点的价格数据,支持趋势分析和图表展示
/// </remarks>
[SugarTable("Stock_PriceRecord")]
public class StockPriceRecordEntity : Entity<Guid>, IHasCreationTime
{
/// <summary>
/// 股票ID
/// </summary>
/// <remarks>关联到具体的股票</remarks>
public Guid StockId { get; set; }
/// <summary>
/// 创建时间(审计日志)
/// </summary>
public DateTime CreationTime { get; set; }
/// <summary>
/// 记录时间
/// </summary>
/// <remarks>价格记录的实际时间点</remarks>
public DateTime RecordTime { get; set; }
/// <summary>
/// 当前价
/// </summary>
public decimal CurrentPrice { get; set; }
/// <summary>
/// 交易量
/// </summary>
/// <remarks>该时间段内的交易股数</remarks>
public long Volume { get; set; }
/// <summary>
/// 交易额
/// </summary>
/// <remarks>该时间段内的交易金额</remarks>
public decimal Turnover { get; set; }
/// <summary>
/// 时间周期类型
/// </summary>
/// <remarks>
/// 记录的时间周期类型:分钟、小时、日、周、月等
/// </remarks>
public PeriodTypeEnum PeriodType { get; set; }
public StockPriceRecordEntity() { }
public StockPriceRecordEntity(
Guid stockId,
decimal currentPrice,
long volume = 0,
decimal turnover = 0,
PeriodTypeEnum periodType = PeriodTypeEnum.Day)
{
StockId = stockId;
CreationTime = DateTime.Now;
RecordTime = DateTime.Now;
CurrentPrice = currentPrice;
Volume = volume;
Turnover = turnover;
PeriodType = periodType;
}
}
}

View File

@@ -1,121 +0,0 @@
using SqlSugar;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Auditing;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Domain.Entities
{
/// <summary>
/// 股票交易记录实体
/// </summary>
/// <remarks>
/// 用于记录用户买入或卖出股票的交易历史
/// </remarks>
[SugarTable("Stock_Transaction")]
public class StockTransactionEntity : Entity<Guid>, IAuditedObject
{
/// <summary>
/// 用户ID
/// </summary>
/// <remarks>进行交易的用户</remarks>
public Guid UserId { get; set; }
/// <summary>
/// 股票ID
/// </summary>
/// <remarks>交易的股票</remarks>
public Guid StockId { get; set; }
/// <summary>
/// 股票代码
/// </summary>
/// <remarks>冗余字段,方便查询</remarks>
public string StockCode { get; set; } = string.Empty;
/// <summary>
/// 股票名称
/// </summary>
/// <remarks>冗余字段,方便查询</remarks>
public string StockName { get; set; } = string.Empty;
/// <summary>
/// 交易类型
/// </summary>
public TransactionTypeEnum TransactionType { get; set; }
/// <summary>
/// 交易价格
/// </summary>
/// <remarks>股票的单价</remarks>
public decimal Price { get; set; }
/// <summary>
/// 交易数量
/// </summary>
/// <remarks>买入或卖出的股票数量</remarks>
public int Quantity { get; set; }
/// <summary>
/// 交易总额
/// </summary>
/// <remarks>价格 × 数量</remarks>
public decimal TotalAmount { get; set; }
/// <summary>
/// 交易费用
/// </summary>
/// <remarks>手续费、佣金等</remarks>
public decimal Fee { get; set; }
/// <summary>
/// 创建时间
/// </summary>
/// <remarks>交易发生时间</remarks>
public DateTime CreationTime { get; set; }
/// <summary>
/// 创建者ID
/// </summary>
public Guid? CreatorId { get; set; }
/// <summary>
/// 最后修改时间
/// </summary>
public DateTime? LastModificationTime { get; set; }
/// <summary>
/// 最后修改者ID
/// </summary>
public Guid? LastModifierId { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; } = string.Empty;
public StockTransactionEntity() { }
public StockTransactionEntity(
Guid userId,
Guid stockId,
string stockCode,
string stockName,
TransactionTypeEnum transactionType,
decimal price,
int quantity,
decimal fee = 0)
{
Id = Guid.NewGuid();
UserId = userId;
StockId = stockId;
StockCode = stockCode;
StockName = stockName;
TransactionType = transactionType;
Price = price;
Quantity = quantity;
TotalAmount = price * quantity;
Fee = fee;
CreationTime = DateTime.Now;
}
}
}

View File

@@ -1,42 +0,0 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.Stock.Domain.Shared.Etos;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.Stock.Domain.EventHandlers
{
/// <summary>
/// 股票交易事件处理器
/// </summary>
public class StockTransactionEventHandler : ILocalEventHandler<StockTransactionEto>, ITransientDependency
{
private readonly ISqlSugarRepository<StockTransactionEntity> _transactionRepository;
public StockTransactionEventHandler(
ISqlSugarRepository<StockTransactionEntity> transactionRepository)
{
_transactionRepository = transactionRepository;
}
public async Task HandleEventAsync(StockTransactionEto eventData)
{
// 创建交易记录实体
var transaction = new StockTransactionEntity(
eventData.UserId,
eventData.StockId,
eventData.StockCode,
eventData.StockName,
eventData.TransactionType,
eventData.Price,
eventData.Quantity,
eventData.Fee
);
// 保存交易记录
await _transactionRepository.InsertAsync(transaction);
}
}
}

View File

@@ -1,91 +0,0 @@
using Volo.Abp.Domain.Services;
using Yi.Framework.SqlSugarCore.Abstractions;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins;
using System.Text;
using System.IO;
namespace Yi.Framework.Stock.Domain.Managers;
public class NewsManager:DomainService
{
private SemanticKernelClient _skClient;
private ISqlSugarRepository<StockNewsAggregateRoot> _newsRepository;
public NewsManager(SemanticKernelClient skClient,ISqlSugarRepository<StockNewsAggregateRoot> newsRepository)
{
_skClient = skClient;
_newsRepository = newsRepository;
}
/// <summary>
/// 获取最近的新闻
/// </summary>
/// <param name="count">获取数量</param>
/// <returns>最近的新闻列表</returns>
public async Task<List<StockNewsAggregateRoot>> GetRecentNewsAsync(int count = 10)
{
return await _newsRepository._DbQueryable
.OrderByDescending(n => n.CreationTime)
.Take(count)
.Select(n => new StockNewsAggregateRoot
{
Title = n.Title,
Summary = n.Summary,
Source = n.Source,
CreationTime = n.CreationTime
})
.ToListAsync();
}
/// <summary>
/// 生成一个新闻
/// </summary>
/// <returns></returns>
public async Task GenerateNewsAsync()
{
// 获取最近10条新闻
var recentNews = await GetRecentNewsAsync(10);
// 构建新闻背景上下文
var newsContext = new StringBuilder();
if (recentNews.Any())
{
newsContext.AppendLine("以下是最近的新闻简介:");
foreach (var news in recentNews)
{
newsContext.AppendLine($"- {news.CreationTime:yyyy-MM-dd} 来源:{news.Source}");
newsContext.AppendLine($" 标题:{news.Title}");
newsContext.AppendLine($" 简介:{news.Summary}");
newsContext.AppendLine();
}
}
else
{
newsContext.AppendLine("目前没有最近的新闻记录。");
}
var promptPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "stock", "newsPrompt.txt");
var question = await File.ReadAllTextAsync(promptPath);
question = question.Replace("{{newsContext}}", newsContext.ToString());
await _skClient.ChatCompletionAsync(question, ("NewsPlugins","save_news"));
}
public async Task SaveNewsAsync(NewsModel news)
{
var newsEntity = new StockNewsAggregateRoot(
title: news.Title,
content: news.Content,
source: news.Source
)
{
Summary = news.Summary,
CreationTime = DateTime.Now,
IsDeleted = false,
OrderNum = 0
};
await _newsRepository.InsertAsync(newsEntity);
}
}

View File

@@ -1,42 +0,0 @@
using System.ComponentModel;
using System.Text.Json.Serialization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
namespace Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins;
public class NewsPlugins
{
private readonly IServiceProvider _serviceProvider;
public NewsPlugins(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
[KernelFunction("save_news"), Description("生成并保存一个新闻")]
public async Task SaveAsync(NewsModel news)
{
var newsManager = _serviceProvider.GetRequiredService<NewsManager>();
await newsManager.SaveNewsAsync(news);
}
}
public class NewsModel
{
[JsonPropertyName("title")]
[DisplayName("新闻标题")]
public string Title { get; set; }
[JsonPropertyName("content")]
[DisplayName("新闻内容")]
public string Content { get; set; }
[JsonPropertyName("summary")]
[DisplayName("新闻简介")]
public string Summary { get; set; }
[JsonPropertyName("source")]
[DisplayName("新闻来源")]
public string Source { get; set; }
}

View File

@@ -1,34 +0,0 @@
using System.ComponentModel;
using System.Text.Json.Serialization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
namespace Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins;
public class StockPlugins
{
private readonly IServiceProvider _serviceProvider;
public StockPlugins(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
[KernelFunction("save_stocks"), Description("生成并且保存多个股票记录")]
public async Task SaveAsync(List<StockModel> stockModels)
{
var stockMarketManager= _serviceProvider.GetRequiredService<StockMarketManager>();
await stockMarketManager.SaveStockAsync(stockModels);
}
}
public class StockModel
{
[JsonPropertyName("id")]
[DisplayName("股票id")]
public Guid Id { get; set; }
[JsonPropertyName("values")]
[DisplayName("股票未来24小时价格")]
public decimal[] Values { get; set; }
}

View File

@@ -1,55 +0,0 @@
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Volo.Abp.DependencyInjection;
namespace Yi.Framework.Stock.Domain.Managers.SemanticKernel;
public class SemanticKernelClient:ITransientDependency
{
public Kernel Kernel { get;}
public SemanticKernelClient(Kernel kernel)
{
this.Kernel = kernel;
}
/// <summary>
/// 执行插件
/// </summary>
/// <param name="input"></param>
/// <param name="pluginName"></param>
/// <param name="functionName"></param>
/// <returns></returns>
public async Task<string> InovkerFunctionAsync(string input, string pluginName, string functionName)
{
KernelFunction jsonFun = this.Kernel.Plugins.GetFunction(pluginName, functionName);
var result = await this.Kernel.InvokeAsync(function: jsonFun, new KernelArguments() { ["input"] = input });
return result.GetValue<string>();
}
/// <summary>
/// 聊天对话,调用方法
/// </summary>
/// <returns></returns>
public async Task<IReadOnlyList<ChatMessageContent>> ChatCompletionAsync(string question,params (string,string)[] functions)
{
if (functions is null)
{
throw new Exception("请选择插件");
}
var openSettings = new OpenAIPromptExecutionSettings()
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(functions.Select(x=>this.Kernel.Plugins.GetFunction(x.Item1, x.Item2)).ToList(),true),
// ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions,
MaxTokens =1000
};
var chatCompletionService = this.Kernel.GetRequiredService<IChatCompletionService>();
var results =await chatCompletionService.GetChatMessageContentsAsync(
question,
executionSettings: openSettings,
kernel: Kernel);
return results;
}
}

View File

@@ -1,9 +0,0 @@
namespace Yi.Framework.Stock.Domain.Managers.SemanticKernel
{
public class SemanticKernelOptions
{
public List<string> ModelIds { get; set; }
public string Endpoint { get; set; }
public string ApiKey { get; set; }
}
}

View File

@@ -1,446 +0,0 @@
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Domain.Services;
using Volo.Abp.EventBus.Local;
using Yi.Framework.Bbs.Domain.Shared.Etos;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.Stock.Domain.Shared;
using Yi.Framework.Stock.Domain.Shared.Etos;
using Yi.Framework.SqlSugarCore.Abstractions;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins;
using Microsoft.Extensions.Hosting;
using System.Text;
using System.IO;
namespace Yi.Framework.Stock.Domain.Managers
{
/// <summary>
/// 股市领域服务
/// </summary>
/// <remarks>
/// 处理股票交易相关业务,例如买入、卖出等
/// </remarks>
public class StockMarketManager : DomainService
{
private readonly ISqlSugarRepository<StockHoldingAggregateRoot> _stockHoldingRepository;
private readonly ISqlSugarRepository<StockTransactionEntity> _stockTransactionRepository;
private readonly ISqlSugarRepository<StockPriceRecordEntity> _stockPriceRecordRepository;
private readonly ISqlSugarRepository<StockMarketAggregateRoot> _stockMarketRepository;
private readonly ILocalEventBus _localEventBus;
private readonly SemanticKernelClient _skClient;
private readonly IHostEnvironment _hostEnvironment;
private readonly NewsManager _newsManager;
public StockMarketManager(
ISqlSugarRepository<StockHoldingAggregateRoot> stockHoldingRepository,
ISqlSugarRepository<StockTransactionEntity> stockTransactionRepository,
ISqlSugarRepository<StockPriceRecordEntity> stockPriceRecordRepository,
ISqlSugarRepository<StockMarketAggregateRoot> stockMarketRepository,
ILocalEventBus localEventBus,
SemanticKernelClient skClient,
IHostEnvironment hostEnvironment,
NewsManager newsManager)
{
_stockHoldingRepository = stockHoldingRepository;
_stockTransactionRepository = stockTransactionRepository;
_stockPriceRecordRepository = stockPriceRecordRepository;
_stockMarketRepository = stockMarketRepository;
_localEventBus = localEventBus;
_skClient = skClient;
_hostEnvironment = hostEnvironment;
_newsManager = newsManager;
}
/// <summary>
/// 购买股票
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="stockId">股票ID</param>
/// <param name="quantity">购买数量</param>
/// <returns></returns>
public async Task BuyStockAsync(Guid userId, Guid stockId, int quantity)
{
if (quantity <= 0)
{
throw new UserFriendlyException("购买数量必须大于0");
}
// 通过stockId查询获取股票信息
var stockInfo = await _stockMarketRepository.GetFirstAsync(s => s.Id == stockId);
if (stockInfo == null)
{
throw new UserFriendlyException("找不到指定的股票");
}
string stockCode = stockInfo.MarketCode; // 根据实际字段调整
string stockName = stockInfo.MarketName; // 根据实际字段调整
// 获取当前股票价格
decimal currentPrice = await GetCurrentStockPriceAsync(stockId);
// 计算总金额和手续费
decimal totalAmount = currentPrice * quantity;
decimal fee = CalculateTradingFee(totalAmount, TransactionTypeEnum.Buy);
decimal totalCost = totalAmount + fee;
// 扣减用户资金
await _localEventBus.PublishAsync(
new MoneyChangeEventArgs { UserId = userId, Number = -totalCost }, false);
// 更新或创建用户持仓
var holding = await _stockHoldingRepository.GetFirstAsync(h =>
h.UserId == userId &&
h.StockId == stockId &&
!h.IsDeleted);
if (holding == null)
{
// 创建新持仓
holding = new StockHoldingAggregateRoot(
userId,
stockId,
stockCode,
stockName,
quantity,
currentPrice);
await _stockHoldingRepository.InsertAsync(holding);
}
else
{
// 更新现有持仓
holding.AddQuantity(quantity, currentPrice);
await _stockHoldingRepository.UpdateAsync(holding);
}
// 发布交易事件
await _localEventBus.PublishAsync(new StockTransactionEto
{
UserId = userId,
StockId = stockId,
StockCode = stockCode,
StockName = stockName,
TransactionType = TransactionTypeEnum.Buy,
Price = currentPrice,
Quantity = quantity,
TotalAmount = totalAmount,
Fee = fee
}, false);
}
/// <summary>
/// 卖出股票
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="stockId">股票ID</param>
/// <param name="quantity">卖出数量</param>
/// <returns></returns>
public async Task SellStockAsync(Guid userId, Guid stockId, int quantity)
{
// 验证卖出时间
VerifySellTime();
if (quantity <= 0)
{
throw new UserFriendlyException("卖出数量必须大于0");
}
// 获取用户持仓
var holding = await _stockHoldingRepository.GetFirstAsync(h =>
h.UserId == userId &&
h.StockId == stockId &&
!h.IsDeleted);
if (holding == null)
{
throw new UserFriendlyException("您没有持有该股票");
}
if (holding.Quantity < quantity)
{
throw new UserFriendlyException("持仓数量不足");
}
// 获取当前股票价格
decimal currentPrice = await GetCurrentStockPriceAsync(stockId);
// 计算总金额和手续费
decimal totalAmount = currentPrice * quantity;
decimal fee = CalculateTradingFee(totalAmount, TransactionTypeEnum.Sell);
decimal actualIncome = totalAmount - fee;
// 增加用户资金
await _localEventBus.PublishAsync(
new MoneyChangeEventArgs { UserId = userId, Number = actualIncome }, false);
// 更新用户持仓
holding.ReduceQuantity(quantity);
if (holding.Quantity > 0)
{
await _stockHoldingRepository.UpdateAsync(holding);
}
else
{
await _stockHoldingRepository.DeleteAsync(holding);
}
// 发布交易事件
await _localEventBus.PublishAsync(new StockTransactionEto
{
UserId = userId,
StockId = stockId,
StockCode = holding.StockCode,
StockName = holding.StockName,
TransactionType = TransactionTypeEnum.Sell,
Price = currentPrice,
Quantity = quantity,
TotalAmount = totalAmount,
Fee = fee
}, false);
}
/// <summary>
/// 获取股票当前价格
/// </summary>
/// <param name="stockId">股票ID</param>
/// <returns>当前价格</returns>
public async Task<decimal> GetCurrentStockPriceAsync(Guid stockId)
{
// 获取最新的价格记录
var latestPriceRecord = await _stockPriceRecordRepository._DbQueryable
.Where(p => p.StockId == stockId)
.Where(x=>x.RecordTime<=DateTime.Now)
.OrderByDescending(p => p.RecordTime)
.FirstAsync();
if (latestPriceRecord == null)
{
throw new UserFriendlyException("无法获取股票价格信息");
}
return latestPriceRecord.CurrentPrice;
}
/// <summary>
/// 计算交易手续费
/// </summary>
/// <param name="amount">交易金额</param>
/// <param name="transactionType">交易类型</param>
/// <returns>手续费</returns>
private decimal CalculateTradingFee(decimal amount, TransactionTypeEnum transactionType)
{
// 买入不收手续费卖出收2%
decimal feeRate = transactionType == TransactionTypeEnum.Buy ? 0m : 0.02m;
return amount * feeRate;
}
/// <summary>
/// 验证卖出时间
/// </summary>
/// <exception cref="UserFriendlyException">如果不在允许卖出的时间范围内</exception>
private void VerifySellTime()
{
// 如果是开发环境,跳过验证
if (_hostEnvironment.IsDevelopment())
{
return;
}
DateTime now = DateTime.Now;
// 检查是否为工作日(周一到周五)
if (now.DayOfWeek == DayOfWeek.Saturday || now.DayOfWeek == DayOfWeek.Sunday)
{
throw new UserFriendlyException("股票只能在工作日(周一至周五)卖出");
}
// 检查是否在下午5点到6点之间
if (now.Hour < 17 || now.Hour >= 18)
{
throw new UserFriendlyException("股票只能在下午5点到6点之间卖出");
}
}
/// <summary>
/// 批量保存多个股票的最新价格记录
/// </summary>
/// <param name="priceRecords">价格记录列表</param>
/// <returns>保存的记录数量</returns>
public async Task BatchSaveStockPriceRecordsAsync(List<StockPriceRecordEntity> priceRecords)
{
if (priceRecords == null || !priceRecords.Any())
{
return;
}
// 验证数据
for (int i = 0; i < priceRecords.Count; i++)
{
var record = priceRecords[i];
if (record.CurrentPrice <= 0)
{
throw new UserFriendlyException($"股票ID {record.StockId} 的价格必须大于0");
}
// 计算交易额(如果未设置)
if (record.Turnover == 0 && record.Volume > 0)
{
record.Turnover = record.CurrentPrice * record.Volume;
}
}
await _stockPriceRecordRepository.InsertManyAsync(priceRecords);
}
public async Task SaveStockAsync(List<StockModel> stockModels)
{
if (stockModels == null || !stockModels.Any())
{
return;
}
// 收集所有股票ID
var stockIds = stockModels.Select(m => m.Id).ToList();
// 一次性查询所有相关股票信息
var stockMarkets = await _stockMarketRepository.GetListAsync(s => stockIds.Contains(s.Id));
// 构建字典以便快速查找
var stockMarketsDict = stockMarkets.ToDictionary(s => s.Id);
// 将StockModel转换为StockPriceRecordEntity
var priceRecords = new List<StockPriceRecordEntity>();
// 获取当前小时的起始时间点
var currentHour = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, 0, 0);
foreach (var stockModel in stockModels)
{
if (stockModel.Values == null || !stockModel.Values.Any())
{
continue;
}
// 从字典中查找股票信息,而不是每次查询数据库
if (!stockMarketsDict.TryGetValue(stockModel.Id, out var stockMarket))
{
continue;
}
// 为每个价格点创建一个记录,并设置递增的时间
for (int i = 0; i < stockModel.Values.Count(); i++)
{
var priceValue = stockModel.Values[i];
var recordTime = currentHour.AddHours(i); // 从当前小时开始每个价格点加1小时
var priceRecord = new StockPriceRecordEntity
{
StockId = stockMarket.Id,
CurrentPrice = priceValue,
Volume = 0, // 可以根据实际情况设置
Turnover = 0, // 可以根据实际情况设置
PeriodType = PeriodTypeEnum.Hour,
RecordTime = recordTime // 直接在这里设置时间
};
priceRecords.Add(priceRecord);
}
}
// 批量保存价格记录
if (priceRecords.Any())
{
await _stockPriceRecordRepository.InsertManyAsync(priceRecords);
}
}
/// <summary>
/// 获取所有活跃股票的最新价格
/// </summary>
/// <returns>股票ID和最新价格的字典</returns>
private async Task<Dictionary<Guid, decimal>> GetLatestStockPricesAsync()
{
// 获取所有活跃的股票
var activeStocks = await _stockMarketRepository.GetListAsync(s => s.State && !s.IsDeleted);
var result = new Dictionary<Guid, decimal>();
foreach (var stock in activeStocks)
{
try
{
var price = await GetCurrentStockPriceAsync(stock.Id);
result.Add(stock.Id, price);
}
catch
{
// 如果获取价格失败使用默认价格10
result.Add(stock.Id, 10m);
}
}
return result;
}
/// <summary>
/// 生成最新股票记录
/// </summary>
/// <returns></returns>
public async Task GenerateStocksAsync()
{
// 获取所有活跃股票的最新价格
var stockPrices = await GetLatestStockPricesAsync();
if (!stockPrices.Any())
{
return; // 没有股票数据,直接返回
}
// 获取所有活跃股票信息,用于构建提示词
var activeStocks = await _stockMarketRepository.GetListAsync(s =>
s.State && !s.IsDeleted && stockPrices.Keys.Contains(s.Id));
// 获取最近10条新闻
var recentNews = await _newsManager.GetRecentNewsAsync(10);
// 构建新闻上下文
var newsContext = new StringBuilder();
if (recentNews.Any())
{
newsContext.AppendLine("以下是最近的新闻摘要:");
foreach (var news in recentNews)
{
newsContext.AppendLine($"- {news.CreationTime:yyyy-MM-dd}: {news.Title}");
newsContext.AppendLine($" {news.Summary}");
newsContext.AppendLine();
}
}
else
{
newsContext.AppendLine("最近没有重要新闻报道。");
}
// 构建股票信息上下文
var stocksContext = new StringBuilder();
stocksContext.AppendLine("以下是需要预测的股票信息:");
foreach (var stock in activeStocks)
{
if (stockPrices.TryGetValue(stock.Id, out var price))
{
stocksContext.AppendLine($"{stock.MarketName}id:{stock.Id},简介:{stock.Description} 最后一次价格:{price:F2}");
}
}
// 从文件读取问题模板
string promptTemplate = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "stock", "marketPrompt.txt"));
// 替换变量
string question = promptTemplate
.Replace("{{newsContext}}", newsContext.ToString())
.Replace("{{stocksContext}}", stocksContext.ToString());
await _skClient.ChatCompletionAsync(question, ("StockPlugins", "save_stocks"));
}
}
}

View File

@@ -1,21 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<ItemGroup>
<PackageReference Include="Microsoft.SemanticKernel" Version="1.40.0" />
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="$(AbpVersion)" />
<PackageReference Include="Volo.Abp.Caching" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\framework\Yi.Framework.Mapster\Yi.Framework.Mapster.csproj" />
<ProjectReference Include="..\..\..\framework\Yi.Framework.SqlSugarCore.Abstractions\Yi.Framework.SqlSugarCore.Abstractions.csproj" />
<ProjectReference Include="..\Yi.Framework.Stock.Domain.Shared\Yi.Framework.Stock.Domain.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="EventHandlers\" />
<Folder Include="Repositories\" />
</ItemGroup>
</Project>

View File

@@ -1,51 +0,0 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Volo.Abp.Caching;
using Volo.Abp.Domain;
using Yi.Framework.Mapster;
using Yi.Framework.Stock.Domain.Managers;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Domain
{
[DependsOn(
typeof(YiFrameworkStockDomainSharedModule),
typeof(YiFrameworkMapsterModule),
typeof(AbpDddDomainModule),
typeof(AbpCachingModule)
)]
public class YiFrameworkStockDomainModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
var services = context.Services;
// 配置绑定
var semanticKernelSection = configuration.GetSection("SemanticKernel");
services.Configure<SemanticKernelOptions>(configuration.GetSection("SemanticKernel"));
services.AddHttpClient();
#pragma warning disable SKEXP0010
// 从配置中获取值
var options = semanticKernelSection.Get<SemanticKernelOptions>();
//股市优先使用第一个ai模型
services.AddKernel()
.AddOpenAIChatCompletion(
modelId: options.ModelIds.FirstOrDefault(),
endpoint: new Uri(options.Endpoint),
apiKey: options.ApiKey);
#pragma warning restore SKEXP0010
// 添加插件
services.AddSingleton<KernelPlugin>(sp => KernelPluginFactory.CreateFromType<NewsPlugins>(serviceProvider: sp));
services.AddSingleton<KernelPlugin>(sp => KernelPluginFactory.CreateFromType<StockPlugins>(serviceProvider: sp));
// 注册NewsManager
services.AddTransient<NewsManager>();
}
}
}

View File

@@ -1,19 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<ItemGroup>
<ProjectReference Include="..\..\..\framework\Yi.Framework.Mapster\Yi.Framework.Mapster.csproj" />
<ProjectReference Include="..\..\..\framework\Yi.Framework.SqlSugarCore\Yi.Framework.SqlSugarCore.csproj" />
<ProjectReference Include="..\..\..\module\audit-logging\Yi.Framework.AuditLogging.SqlSugarCore\Yi.Framework.AuditLogging.SqlSugarCore.csproj" />
<ProjectReference Include="..\..\..\module\rbac\Yi.Framework.Rbac.SqlSugarCore\Yi.Framework.Rbac.SqlSugarCore.csproj" />
<ProjectReference Include="..\..\..\module\tenant-management\Yi.Framework.TenantManagement.SqlSugarCore\Yi.Framework.TenantManagement.SqlSugarCore.csproj" />
<ProjectReference Include="..\..\..\module\setting-management\Yi.Framework.SettingManagement.SqlSugarCore\Yi.Framework.SettingManagement.SqlSugarCore.csproj" />
<ProjectReference Include="..\Yi.Framework.Stock.Domain\Yi.Framework.Stock.Domain.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="DataSeeds\" />
<Folder Include="Repositories\" />
</ItemGroup>
</Project>

View File

@@ -1,30 +0,0 @@
using Yi.Framework.Stock.Domain;
using Yi.Framework.AuditLogging.SqlSugarCore;
using Yi.Framework.Mapster;
using Yi.Framework.Rbac.SqlSugarCore;
using Yi.Framework.SettingManagement.SqlSugarCore;
using Yi.Framework.SqlSugarCore;
using Yi.Framework.TenantManagement.SqlSugarCore;
namespace Yi.Framework.Stock.SqlsugarCore
{
[DependsOn(
typeof(YiFrameworkStockDomainModule),
typeof(YiFrameworkRbacSqlSugarCoreModule),
typeof(YiFrameworkSettingManagementSqlSugarCoreModule),
typeof(YiFrameworkAuditLoggingSqlSugarCoreModule),
typeof(YiFrameworkTenantManagementSqlSugarCoreModule),
typeof(YiFrameworkMapsterModule),
typeof(YiFrameworkSqlSugarCoreModule)
)]
public class YiFrameworkStockSqlSugarCoreModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
//默认不开放可根据项目需要是否Db直接对外开放
//context.Services.AddTransient(x => x.GetRequiredService<ISqlSugarDbContext>().SqlSugarClient);
}
}
}

View File

@@ -1,9 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.AccessLog
{
public class AccessLogDto
{
public long Number { get; set; }
public DateTime? LastModificationTime { get; set; }
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,24 +0,0 @@
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Analyse;
/// <summary>
/// 用户排行榜
/// </summary>
public class BaseAnalyseTopUserDto
{
public Guid UserId { get; set; }
public string UserName { get; set; }
public string? Nick { get; set; }
public int Order { get; set; }
public string? Icon { get; set; }
public int Level { get; set; }
/// <summary>
/// 用户等级名称
/// </summary>
public string LevelName { get; set; }
/// <summary>
/// 用户限制
/// </summary>
public UserLimitEnum UserLimit { get; set; }
}

View File

@@ -1,7 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Analyse;
public class MoneyTopUserDto:BaseAnalyseTopUserDto
{
public decimal Money { get; set; }
}

View File

@@ -1,8 +0,0 @@
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Analyse;
public class PointsTopUserDto:BaseAnalyseTopUserDto
{
public int Points { get; set; }
}

View File

@@ -1,20 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Analyse;
public class RegisterAnalyseDto
{
public RegisterAnalyseDto(DateTime time, int number)
{
Time = time;
Number = number;
}
/// <summary>
/// 时间
/// </summary>
public DateTime Time { get; set; }
/// <summary>
/// 人数
/// </summary>
public int Number { get; set; }
}

View File

@@ -1,6 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Analyse;
public class ValueTopUserDto:BaseAnalyseTopUserDto
{
public decimal Value { get; set; }
}

View File

@@ -1,24 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Argee
{
public class AgreeDto
{
public AgreeDto(bool isAgree)
{
IsAgree = isAgree;
if (isAgree)
{
Message = "点赞成功,点赞+1";
}
else
{
Message = "取消点赞,点赞-1";
}
}
public bool IsAgree { get; set; }
public string Message { get; set; }
}
}

View File

@@ -1,16 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleAllOutputDto : EntityDto<Guid>
{
//批量查询,不给内容,性能考虑
//public string Content { get; set; }
public string Name { get; set; }
public Guid DiscussId { get; set; }
public Guid ParentId { get; set; }
public List<ArticleAllOutputDto>? Children { get; set; }
}
}

View File

@@ -1,19 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
/// <summary>
/// Article输入创建对象
/// </summary>
public class ArticleCreateInputVo
{
public string Content { get; set; }
public string Name { get; set; }
public Guid DiscussId { get; set; }
public Guid ParentId { get; set; }
}
}

View File

@@ -1,13 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Ddd.Application.Contracts;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleGetListInputVo : PagedAllResultRequestDto
{
public string? Content { get; set; }
public string? Name { get; set; }
public Guid? DiscussId { get; set; }
public Guid? ParentId { get; set; }
}
}

View File

@@ -1,14 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleGetListOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public Guid DiscussId { get; set; }
public List<ArticleGetListOutputDto>? Children { get; set; }
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,33 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Domain.Shared.Consts;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleGetOutputDto : EntityDto<Guid>
{
public string Content { get; set; }
public string Name { get; set; }
public Guid DiscussId { get; set; }
public Guid ParentId { get; set; }
public DateTime CreationTime { get; set; }
public bool HasPermission { get;internal set; }
/// <summary>
/// 设置权限
/// </summary>
public void SetPassPermission()
{
HasPermission = true;
}
/// <summary>
/// 设置无权限
/// </summary>
public void SetNoPermission()
{
HasPermission = false;
Content=DiscussConst.Privacy;
}
}
}

View File

@@ -1,24 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleImprotDto
{
/// <summary>
/// 主题id
/// </summary>
[Required]
public Guid DiscussId { get; set; }
public Guid ArticleParentId { get; set; }= Guid.Empty;
public ArticleImportTypeEnum ImportType { get; set; } = ArticleImportTypeEnum.Default;
}
}

View File

@@ -1,10 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleUpdateInputVo
{
public string Content { get; set; }
public string Name { get; set; }
public Guid DiscussId { get; set; }
public Guid ParentId { get; set; }
}
}

View File

@@ -1,44 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Assignment;
public class AssignmentDefineGetListOutputDto : EntityDto<Guid>
{
/// <summary>
/// 任务名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remarks { get; set; }
/// <summary>
/// 任务类型
/// </summary>
public AssignmentTypeEnum AssignmentType { get; set; }
/// <summary>
/// 任务需求类型
/// </summary>
public AssignmentRequirementTypeEnum AssignmentRequirementType{ get; set; }
/// <summary>
/// 总共步骤数
/// </summary>
public int TotalStepNumber { get; set; }
/// <summary>
/// 前置任务id
/// </summary>
public Guid? PreAssignmentId { get; set; }
/// <summary>
/// 任务奖励的钱钱数量
/// </summary>
public decimal RewardsMoneyNumber { get; set; }
public int OrderNum { get; set; }
}

View File

@@ -1,24 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Assignment;
public class AssignmentGetListInput
{
/// <summary>
/// 任务查询条件
/// </summary>
public AssignmentQueryStateEnum AssignmentQueryState { get; set; } = AssignmentQueryStateEnum.Progress;
}
public enum AssignmentQueryStateEnum
{
/// <summary>
/// 正在进行
/// </summary>
Progress,
/// <summary>
/// 已结束
/// </summary>
End
}

View File

@@ -1,54 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Assignment;
public class AssignmentGetListOutputDto:EntityDto<Guid>
{
/// <summary>
/// 任务名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remarks { get; set; }
/// <summary>
/// 当前步骤数
/// </summary>
public int CurrentStepNumber { get; set; }
/// <summary>
/// 总共步骤数
/// </summary>
public int TotalStepNumber { get; set; }
/// <summary>
/// 任务类型
/// </summary>
public AssignmentTypeEnum AssignmentType { get; set; }
/// <summary>
/// 任务需求类型
/// </summary>
public AssignmentRequirementTypeEnum AssignmentRequirementType{ get; set; }
/// <summary>
/// 任务状态
/// </summary>
public AssignmentStateEnum AssignmentState { get; set; }
/// <summary>
/// 任务奖励的钱钱数量
/// </summary>
public decimal RewardsMoneyNumber { get; set; }
/// <summary>
/// 任务过期时间
/// </summary>
public DateTime? ExpireTime { get; set; }
public DateTime? CompleteTime { get; set; }
public DateTime CreationTime { get; set; }
public int OrderNum { get; set; }
}

View File

@@ -1,44 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Bank
{
public class BankCardDto:EntityDto<Guid>
{
/// <summary>
/// 满期限时间,可空
/// </summary>
public DateTime? FulltermTime { get; set; }
public DateTime? LastDepositTime { get; set; }
public DateTime CreationTime { get; set; }
/// <summary>
/// 用户id
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// 当前存储的钱
/// </summary>
public decimal StorageMoney { get; set; }
/// <summary>
/// 最大可存储的钱钱
/// </summary>
public decimal MaxStorageMoney { get; set; }
/// <summary>
/// 银行卡状态
/// </summary>
public BankCardStateEnum BankCardState { get; set; } = BankCardStateEnum.Unused;
}
}

View File

@@ -1,25 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Bank
{
public class InterestRecordsDto : EntityDto<Guid>
{
public DateTime CreationTime { get; set; }
/// <summary>
/// 当前汇率值
/// </summary>
public decimal Value { get; set; }
/// <summary>
/// 是否波动期
/// </summary>
public bool IsFluctuate { get; set; }
}
}

View File

@@ -1,12 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Banner
{
/// <summary>
/// Banner输入创建对象
/// </summary>
public class BannerCreateInputVo
{
public string Name { get; set; }
public string? Logo { get; set; }
public string? Color { get; set; }
}
}

View File

@@ -1,9 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Banner
{
public class BannerGetListInputVo : PagedAndSortedResultRequestDto
{
public string? Name { get; set; }
}
}

View File

@@ -1,13 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Banner
{
public class BannerGetListOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public string? Logo { get; set; }
public string? Color { get; set; }
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,13 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Banner
{
public class BannerGetOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public string? Logo { get; set; }
public string? Color { get; set; }
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,9 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Banner
{
public class BannerUpdateInputVo
{
public string? Name { get; set; }
public string? Logo { get; set; }
public string? Color { get; set; }
}
}

View File

@@ -1,27 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser
{
public class BbsUserAnalyseGetOutput
{
/// <summary>
/// 注册人数
/// </summary>
public long RegisterNumber { get; set; }
/// <summary>
/// 在线人数
/// </summary>
public long OnlineNumber { get; set; }
/// <summary>
/// 昨天新增用户
/// </summary>
public long YesterdayNewUser { get; set; }
}
}

View File

@@ -1,39 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser
{
public class BbsUserGetListOutputDto: UserGetListOutputDto
{
/// <summary>
/// 用户等级
/// </summary>
public int Level { get; set; }
/// <summary>
/// 用户限制
/// </summary>
public UserLimitEnum UserLimit { get; set; }
/// <summary>
/// 钱钱
/// </summary>
public decimal Money { get; set; }
/// <summary>
/// 经验
/// </summary>
public long Experience { get; set; }
/// <summary>
/// 用户等级名称
/// </summary>
public string LevelName { get; set; }
}
}

View File

@@ -1,23 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser
{
public class BbsUserGetOutputDto: UserGetOutputDto
{
/// <summary>
/// 用户等级
/// </summary>
public int Level { get; set; }
/// <summary>
/// 用户限制
/// </summary>
public UserLimitEnum UserLimit { get; set; }
}
}

View File

@@ -1,29 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Comment
{
/// <summary>
/// Comment输入创建对象
/// </summary>
public class CommentCreateInputVo
{
/// <summary>
/// 评论id
/// </summary>
public string? Content { get; set; }
/// <summary>
/// 主题id
/// </summary>
public Guid DiscussId { get; set; }
/// <summary>
/// 第一层评论id第一层为0
/// </summary>
public Guid RootId { get; set; }
/// <summary>
/// 被回复的CommentId第一层为0
/// </summary>
public Guid ParentId { get; set; }
}
}

View File

@@ -1,11 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Comment
{
public class CommentGetListInputVo
{
public DateTime? creationTime { get; set; }
public string? Content { get; set; }
//Ӧ<><D3A6>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ī<EFBFBD><C4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ
public Guid? DiscussId { get; set; }
}
}

View File

@@ -1,49 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Comment
{
/// <summary>
/// <20><><EFBFBD>۶෴
/// </summary>
public class CommentGetListOutputDto : EntityDto<Guid>
{
public DateTime? CreationTime { get; set; }
public string Content { get; set; }
/// <summary>
/// <20><><EFBFBD><EFBFBD>id
/// </summary>
public Guid DiscussId { get; set; }
public Guid ParentId { get; set; }
public Guid RootId { get; set; }
/// <summary>
/// <20>û<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ϣ
/// </summary>
public BbsUserGetOutputDto CreateUser { get; set; }
public Guid? CreatorId { get; set; }
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5>û<EFBFBD><C3BB><EFBFBD>Ϣ
/// </summary>
public BbsUserGetOutputDto CommentedUser { get; set; }
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><E9A3AC>Childrenֻ<6E><D6BB><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB>
/// </summary>
public List<CommentGetListOutputDto> Children { get; set; } = new List<CommentGetListOutputDto>();
}
}

View File

@@ -1,35 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Comment
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD><DBBC><EFBFBD>
/// </summary>
public class CommentGetOutputDto : EntityDto<Guid>
{
public DateTime? CreateTime { get; set; }
public string Content { get; set; }
public Guid DiscussId { get; set; }
/// <summary>
/// <20>û<EFBFBD>id<69><64><EFBFBD><EFBFBD>Ϊ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public BbsUserGetOutputDto User { get; set; }
/// <summary>
/// <20><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id
/// </summary>
public Guid RootId { get; set; }
/// <summary>
/// <20><><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>CommentId
/// </summary>
public Guid ParentId { get; set; }
}
}

View File

@@ -1,10 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Comment
{
public class CommentUpdateInputVo
{
public string Content { get; set; }
//<2F><><EFBFBD>²<EFBFBD><C2B2>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
}
}

View File

@@ -1,71 +0,0 @@
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss
{
/// <summary>
/// Discuss输入创建对象
/// </summary>
public class DiscussCreateInput
{
public DiscussTypeEnum DiscussType { get; set; }
public string Title { get; set; }
public string? Types { get; set; }
public string? Introduction { get; set; }
public DateTime? CreateTime { get; set; } = DateTime.Now;
public string Content { get; set; }
public string? Color { get; set; }
public Guid PlateId { get; set; }
/// <summary>
/// 默认公开
/// </summary>
public DiscussPermissionTypeEnum PermissionType { get; set; } = DiscussPermissionTypeEnum.Public;
/// <summary>
/// 封面
/// </summary>
public string? Cover { get; set; }
public int OrderNum { get; set; } = 0;
/// <summary>
/// 是否禁止评论创建功能
/// </summary>
public bool IsDisableCreateComment { get; set; }
/// <summary>
/// 标签
/// </summary>
public List<Guid>? DiscussLableIds { get; set; }
/// <summary>
/// 角色
/// </summary>
public List<string>? PermissionRoleCodes { get; set; } = new List<string>();
/// <summary>
/// 悬赏类型主题
/// </summary>
public DiscussRewardCreateInput? RewardData { get; set; }
}
public class DiscussRewardCreateInput
{
/// <summary>
/// 悬赏最小价值
/// </summary>
public decimal MinValue { get; set; }
/// <summary>
/// 悬赏最大价值
/// </summary>
public decimal? MaxValue { get; set; }
/// <summary>
/// 作者联系方式
/// </summary>
public string Contact { get; set; }
}
}

View File

@@ -1,25 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss
{
public class DiscussGetListInputVo : PagedAndSortedResultRequestDto
{
/// <summary>
/// 创建者的用户名
/// </summary>
public string? UserName { get; set; }
public Guid? UserId { get; set; }
public string? Title { get; set; }
public Guid? PlateId { get; set; }
//默认查询非置顶
public bool? IsTop { get; set; }
//查询方式
public QueryDiscussTypeEnum Type { get; set; } = QueryDiscussTypeEnum.New;
}
}

View File

@@ -1,58 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser;
using Yi.Framework.Bbs.Application.Contracts.Dtos.DiscussLable;
using Yi.Framework.Bbs.Domain.Shared.Consts;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss
{
public class DiscussGetListOutputDto : EntityDto<Guid>
{
/// <summary>
/// 是否禁止评论创建功能
/// </summary>
public bool IsDisableCreateComment { get; set; }
/// <summary>
/// 是否已点赞,默认未登录不点赞
/// </summary>
public bool IsAgree { get; set; } = false;
public string Title { get; set; }
public string? Introduction { get; set; }
public int AgreeNum { get; set; }
public int SeeNum { get; set; }
//批量查询,不给内容,性能考虑
//public string Content { get; set; }
public string? Color { get; set; }
public Guid PlateId { get; set; }
//是否置顶默认false
public bool IsTop { get; set; }
public DiscussTypeEnum DiscussType { get; set; }
public DiscussPermissionTypeEnum PermissionType { get; set; }
//是否禁止默认false
public bool IsBan { get; set; }
/// <summary>
/// 封面
/// </summary>
public string? Cover { get; set; }
public DateTime CreationTime { get; set; }
/// <summary>
/// 所需角色
/// </summary>
public List<string>? PermissionRoleCodes { get; set; } = new List<string>();
public BbsUserGetListOutputDto User { get; set; }
public List<Guid>? DiscussLableIds { get; set; } = new List<Guid>();
public List<DiscussLableGetOutputDto> Lables { get; set; } = new List<DiscussLableGetOutputDto>();
}
}

View File

@@ -1,73 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser;
using Yi.Framework.Bbs.Application.Contracts.Dtos.DiscussLable;
using Yi.Framework.Bbs.Application.Contracts.Dtos.Plate;
using Yi.Framework.Bbs.Domain.Shared.Consts;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss
{
public class DiscussGetOutputDto : EntityDto<Guid>
{
/// <summary>
/// 是否禁止评论创建功能
/// </summary>
public bool IsDisableCreateComment { get; set; }
public string Title { get; set; }
public string? Introduction { get; set; }
public int AgreeNum { get; set; }
public int SeeNum { get; set; }
public string Content { get; set; }
public string? Color { get; set; }
public Guid PlateId { get; set; }
//是否置顶默认false
public bool IsTop { get; set; }
/// <summary>
/// 主题类型
/// </summary>
public DiscussTypeEnum DiscussType { get; set; }
/// <summary>
/// 封面
/// </summary>
public string? Cover { get; set; }
//是否私有默认false
public bool IsPrivate { get; set; }
//私有需要判断code权限
public string? PrivateCode { get; set; }
public DateTime CreationTime { get; set; }
public DiscussPermissionTypeEnum PermissionType { get; set; }
public bool IsAgree { get; set; } = false;
public List<string> PermissionRoleCodes { get; set; } = new List<string>();
public BbsUserGetListOutputDto User { get; set; }
public PlateGetOutputDto Plate { get; set; }
public List<Guid>? DiscussLableIds { get; set; } = new List<Guid>();
public List<DiscussLableGetOutputDto> Lables { get; set; } =new List<DiscussLableGetOutputDto>();
public bool HasPermission { get;internal set; }
public DiscussRewardGetOutputDto? RewardData { get; set; }
/// <summary>
/// 设置权限
/// </summary>
public void SetPassPermission()
{
HasPermission = true;
}
/// <summary>
/// 设置无权限
/// </summary>
public void SetNoPermission()
{
HasPermission = false;
Content=DiscussConst.Privacy;
}
}
}

View File

@@ -1,23 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss;
public class DiscussRewardGetOutputDto
{
/// <summary>
/// 是否已解决
/// </summary>
public bool IsResolved{ get; set; }
/// <summary>
/// 悬赏最小价值
/// </summary>
public decimal MinValue { get; set; }
/// <summary>
/// 悬赏最大价值
/// </summary>
public decimal? MaxValue { get; set; }
/// <summary>
/// 作者联系方式
/// </summary>
public string Contact { get; set; }
}

View File

@@ -1,39 +0,0 @@
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss
{
public class DiscussUpdateInput
{
public string Title { get; set; }
public string? Types { get; set; }
public string? Introduction { get; set; }
public string Content { get; set; }
public string? Color { get; set; }
public List<Guid>? PermissionUserIds { get; set; }
public DiscussPermissionTypeEnum PermissionType { get; set; }
/// <summary>
/// 封面
/// </summary>
public string? Cover { get; set; }
public int OrderNum { get; set; }
/// <summary>
/// 是否禁止评论创建功能
/// </summary>
public bool IsDisableCreateComment { get; set; }
/// <summary>
/// 标签
/// </summary>
public List<Guid>? DiscussLableIds { get; set; }
/// <summary>
/// 需求角色
/// </summary>
public List<string>? PermissionRoleCodes { get; set; } = new List<string>();
}
}

View File

@@ -1,11 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.DiscussLable;
public class DiscussLableGetOutputDto:EntityDto<Guid>
{
public Guid Id { get; set; }
public string Name { get; set; }
public string? Color { get; set; }
public string? BackgroundColor { get; set; }
}

View File

@@ -1,31 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Integral
{
public class SignInDto
{
/// <summary>
/// 签到数据
/// </summary>
public List<SignInItemDto> SignInItem { get; set; }=new List<SignInItemDto>();
/// <summary>
/// 当前连续签到次数
/// </summary>
public int CurrentContinuousNumber { get; set; }
}
public class SignInItemDto : EntityDto<Guid>
{
/// <summary>
/// 签到时间
/// </summary>
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Level
{
public class LevelGetListInputDto:PagedResultRequestDto
{ /// <summary>
/// 当前等级
/// </summary>
public int? MinLevel { get; set; }
/// <summary>
/// 等级名称
/// </summary>
public string? Name { get; set; }
}
}

View File

@@ -1,34 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Level
{
public class LevelOutputDto : EntityDto<Guid>
{
public Guid Id { get; set; }
/// <summary>
/// 当前等级
/// </summary>
public int CurrentLevel { get; set; }
/// <summary>
/// 最小所需经验值
/// </summary>
public decimal MinExperience { get; set; }
/// <summary>
/// 等级名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 等级称号
/// </summary>
public string? Nick { get; set; }
/// <summary>
/// 等候logo
/// </summary>
public string? Logo { get; set; }
}
}

View File

@@ -1,12 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.MyType
{
/// <summary>
/// Label输入创建对象
/// </summary>
public class DiscussLableCreateInputVo
{
public string Name { get; set; }
public string? Color { get; set; }
public string? BackgroundColor { get; set; }
}
}

View File

@@ -1,9 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.MyType
{
public class DiscussLableGetListInputVo : PagedAndSortedResultRequestDto
{
public string? Name { get; set; }
}
}

View File

@@ -1,11 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.MyType
{
public class DiscussLableGetListOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public string? Color { get; set; }
public string? BackgroundColor { get; set; }
}
}

View File

@@ -1,12 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.MyType
{
public class DiscussLableOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public string? Color { get; set; }
public string? BackgroundColor { get; set; }
public Guid UserId { get; set; }
}
}

View File

@@ -1,9 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.MyType
{
public class DiscussLableUpdateInputVo
{
public string Name { get; set; }
public string? Color { get; set; }
public string? BackgroundColor { get; set; }
}
}

View File

@@ -1,14 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Ddd.Application.Contracts;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Notice
{
public class BbsNoticeGetListInputVo:PagedAllResultRequestDto
{
}
}

View File

@@ -1,37 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Notice
{
public class BbsNoticeGetListOutputDto
{
/// <summary>
/// 消息,支持html
/// </summary>
public string Message { get; set; }
/// <summary>
/// 消息类型
/// </summary>
public NoticeTypeEnum NoticeType { get; }
/// <summary>
/// 是否已读
/// </summary>
public bool IsRead { get; private set; }
/// <summary>
/// 已读时间
/// </summary>
public DateTime? ReadTime { get; private set; }
/// <summary>
/// 消息创建时间
/// </summary>
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,18 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Plate
{
/// <summary>
/// Plate输入创建对象
/// </summary>
public class PlateCreateInputVo
{
public string Name { get; set; }
public string? Logo { get; set; }
public string? Introduction { get; set; }
public string Code { get; set; }
public int OrderNum { get; set; }
public bool IsDisableCreateDiscuss { get; set; }
}
}

View File

@@ -1,11 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Ddd.Application.Contracts;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Plate
{
public class PlateGetListInputVo : PagedAllResultRequestDto
{
public string? Name { get; set; }
public string? Code { get; set; }
}
}

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