├── .gitee
├── ISSUE_TEMPLATE.zh-CN.md
└── PULL_REQUEST_TEMPLATE.zh-CN.md
├── .gitignore
├── DISCLAIMER.md
├── LICENSE
├── LICENSE-APACHE
├── MalusApi
├── .gitattributes
├── .gitignore
├── ConsoleApp1
│ ├── ConsoleApp1.csproj
│ ├── InitData
│ │ ├── bs_bingwallpaper.json
│ │ ├── bs_gallery.json
│ │ ├── bs_miniappsitelink.json
│ │ ├── bs_wx_config.json
│ │ ├── t_sys_config.json
│ │ ├── t_sys_menu.json
│ │ ├── t_sys_role.json
│ │ ├── t_sys_role_menu.json
│ │ ├── t_sys_role_permiss.json
│ │ └── t_sys_user.json
│ └── Program.cs
├── MalusAdmin.BackUpServices
│ ├── Components
│ │ ├── Configuration
│ │ │ ├── AddConfigureSetup.cs
│ │ │ └── AppSettings.cs
│ │ └── Sqlsugar
│ │ │ ├── SqlSugarRepository.cs
│ │ │ └── SqlsugarSetup.cs
│ ├── CronAttribute.cs
│ ├── Dtos
│ │ └── EveryBingRes.cs
│ ├── Helper
│ │ ├── FileHelper.cs
│ │ └── SqlsugarHelper.cs
│ ├── JobService.cs
│ ├── MalusAdmin.BackUpServices.csproj
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── QuartzJob
│ │ ├── EveryDayBingQuartzJob.cs
│ │ ├── HelloQuartzJob.cs
│ │ └── WordQuartzJob.cs
│ └── appsettings.json
├── MalusAdmin.Common
│ ├── App.cs
│ ├── Attributes
│ │ ├── AutoInjectAttribute.cs
│ │ ├── PermissionAttribute.cs
│ │ └── ReadOnlyAttribute.cs
│ ├── Components
│ │ ├── ApiControllerBase.cs
│ │ ├── ApiJson
│ │ │ ├── ApiCode.cs
│ │ │ ├── ApiJson.cs
│ │ │ ├── ApiJsonException.cs
│ │ │ └── ResultFilter.cs
│ │ ├── Authorization
│ │ │ ├── AppUser
│ │ │ │ ├── CurrentUser.cs
│ │ │ │ └── ICurrentUser.cs
│ │ │ ├── AuthorizationSetup.cs
│ │ │ ├── CustomToken
│ │ │ │ └── CustomTokenAuthenticationHandler.cs
│ │ │ ├── Jwt
│ │ │ │ ├── JwtConfiguration.cs
│ │ │ │ └── JwtSetup.cs
│ │ │ └── Token
│ │ │ │ ├── GuidToken.cs
│ │ │ │ ├── ITokenService.cs
│ │ │ │ └── JwtToken.cs
│ │ ├── BaseServiceRegister.cs
│ │ ├── Cache
│ │ │ ├── CacheSetup.cs
│ │ │ ├── ICacheService.cs
│ │ │ ├── MemoryCacheService.cs
│ │ │ └── RedisCacheService.cs
│ │ ├── Configuration
│ │ │ └── AddConfigureSetup.cs
│ │ ├── Cors
│ │ │ └── AddCorsSetup.cs
│ │ ├── DI
│ │ │ └── ServiceCollectionExtensions.cs
│ │ ├── DataValidation
│ │ │ ├── DataValidationFilter.cs
│ │ │ └── DataValidationMvcBuilderExtensions.cs
│ │ ├── DynamicApiController
│ │ │ ├── Const
│ │ │ │ └── DynamicApiConsts.cs
│ │ │ ├── Conventions
│ │ │ │ └── DynamicWebApiConvention.cs
│ │ │ ├── Dependencies
│ │ │ │ └── IDynamicApiController.cs
│ │ │ ├── Extensions
│ │ │ │ └── DynamicApiControllerServiceCollectionExtensions.cs
│ │ │ ├── Helper
│ │ │ │ ├── ControllerSelector.cs
│ │ │ │ └── DynamicApiHelper.cs
│ │ │ └── Providers
│ │ │ │ └── DynamicApiControllerFeatureProvider.cs
│ │ ├── InternalApp.cs
│ │ ├── JsonOptions
│ │ │ ├── AddNewtonsoftJson.cs
│ │ │ └── SystemTextJson
│ │ │ │ ├── AddJsonOptions.cs
│ │ │ │ └── JsonConverter.cs
│ │ ├── LogoExtension
│ │ │ └── LogoExtension.cs
│ │ ├── RabbitMq
│ │ │ ├── AddEasyNetQExtension.cs
│ │ │ └── EasyNetQ
│ │ │ │ ├── MQPublish.cs
│ │ │ │ ├── MQSubscribe.cs
│ │ │ │ └── SubscribeWorker.cs
│ │ ├── Sqlsugar
│ │ │ ├── PageParamBase.cs
│ │ │ ├── PagedQueryableExtensions.cs
│ │ │ ├── SqlSugarRepository.cs
│ │ │ └── SqlsugarSetup.cs
│ │ └── Swagger
│ │ │ ├── SwaggerConfiguration.cs
│ │ │ ├── SwaggerDocConfiguration.cs
│ │ │ ├── SwaggerGroupConfiguration.cs
│ │ │ ├── SwaggerSetup.cs
│ │ │ └── UseSwaggerExtension.cs
│ ├── Constant
│ │ ├── AppUserConst.cs
│ │ ├── AuthConstants.cs
│ │ ├── CacheConstant.cs
│ │ └── TokenConstant.cs
│ ├── GlobalUsings.cs
│ ├── Helper
│ │ ├── AssemblyHelper.cs
│ │ ├── Encryption
│ │ │ ├── AesUtil.cs
│ │ │ ├── DesUtil.cs
│ │ │ ├── Md5Util.cs
│ │ │ ├── RsaUtil.cs
│ │ │ └── ShaUtil.cs
│ │ ├── EnumHelper.cs
│ │ ├── HttpHelper.cs
│ │ ├── IOFileHelper.cs
│ │ ├── JsonHelper.cs
│ │ ├── ObjectHelper.cs
│ │ ├── ServerInfoUtil.cs
│ │ └── ShellUtil.cs
│ ├── MalusAdmin - Backup.Common.csproj
│ ├── MalusAdmin.Common.csproj
│ ├── Middleware
│ │ ├── GlobalExceptionMiddleware.cs
│ │ └── RealIpMiddleware.cs
│ └── Model
│ │ ├── AuthenticationMethod.cs
│ │ ├── TokenData.cs
│ │ └── XnPageResult.cs
├── MalusAdmin.Repository
│ ├── GlobalUsings.cs
│ ├── MalusAdmin.Repository.csproj
│ └── Model
│ │ ├── Business
│ │ ├── BsBingWallpaper.cs
│ │ ├── BsCustomer.cs
│ │ ├── BsCustomerCollect.cs
│ │ ├── BsGallery.cs
│ │ ├── BsMiniappsiteLink.cs
│ │ └── BsWxConfig.cs
│ │ ├── ModelBase.cs
│ │ └── System
│ │ ├── TBsSysConfig.cs
│ │ ├── TSysLogErr.cs
│ │ ├── TSysLogOp.cs
│ │ ├── TSysLogVis.cs
│ │ ├── TSysMenu.cs
│ │ ├── TSysOnlineUser.cs
│ │ ├── TSysRole.cs
│ │ ├── TSysRoleMenu.cs
│ │ ├── TSysUser.cs
│ │ ├── TSysUserPermission.cs
│ │ └── TSysUserRole.cs
├── MalusAdmin.Servers
│ ├── BackStageManger
│ │ ├── Hub
│ │ │ ├── IOnlineUserHub.cs
│ │ │ └── OnlineUserHub.cs
│ │ ├── SysCache
│ │ │ ├── ISysCacheService.cs
│ │ │ └── SysCacheService.cs
│ │ ├── SysConfig
│ │ │ ├── Dto
│ │ │ │ └── WechatConfigAddandUpIn.cs
│ │ │ ├── ISysConfigService.cs
│ │ │ └── SysConfigService.cs
│ │ ├── SysData
│ │ │ ├── Dto
│ │ │ │ ├── NuGetPackage.cs
│ │ │ │ └── ServerInfo.cs
│ │ │ ├── ISysDataService.cs
│ │ │ └── SysDataService.cs
│ │ ├── SysLog
│ │ │ ├── Dto
│ │ │ │ └── LogPageIn.cs
│ │ │ ├── ISysLogService.cs
│ │ │ └── SysLogService.cs
│ │ ├── SysMenu
│ │ │ ├── Dto
│ │ │ │ ├── MenuAddandUpIn.cs
│ │ │ │ └── TSysMenu.cs
│ │ │ ├── ISysMenuService.cs
│ │ │ └── SysMenuService.cs
│ │ ├── SysOnlineUser
│ │ │ ├── Dto
│ │ │ │ ├── OnlineUser.cs
│ │ │ │ ├── OnlineUserPageInput.cs
│ │ │ │ └── SendMsgOneInput.cs
│ │ │ ├── ISysOnlineUserService.cs
│ │ │ └── SysOnlineUserService.cs
│ │ ├── SysRole
│ │ │ ├── Dto
│ │ │ │ ├── RoleAddandUpIn.cs
│ │ │ │ └── RoleListOut.cs
│ │ │ ├── ISysRoleService.cs
│ │ │ └── SysRoleService.cs
│ │ ├── SysRoleMenu
│ │ │ ├── Dto
│ │ │ │ └── UpdateRoleUserMenuIn.cs
│ │ │ ├── ISysRoleMenuService.cs
│ │ │ └── SysRoleMenuService.cs
│ │ ├── SysRolePermission
│ │ │ ├── Dto
│ │ │ │ ├── AllButtonPermissOut.cs
│ │ │ │ └── UpdateRoleButtonIn.cs
│ │ │ ├── ISysRolePermissionService.cs
│ │ │ └── SysRolePermissionService.cs
│ │ └── SysUser
│ │ │ ├── Dto
│ │ │ ├── GetUserInfoOut.cs
│ │ │ ├── ResetPassWord.cs
│ │ │ ├── SysUserLoginIn.cs
│ │ │ ├── SysUserLoginOut.cs
│ │ │ ├── UserAddAndUpIn.cs
│ │ │ ├── UserMenuOut.cs
│ │ │ ├── UserPageIn.cs
│ │ │ └── UserPageOut.cs
│ │ │ ├── ISysUserService.cs
│ │ │ └── SysUserService.cs
│ ├── BusinessManger
│ │ ├── BingWapaper
│ │ │ └── BingWallpaperService.cs
│ │ ├── Customer
│ │ │ ├── CustomerSevice.cs
│ │ │ └── Dto
│ │ │ │ └── cuetomerPageIn.cs
│ │ ├── Gallery
│ │ │ └── GallerySevices.cs
│ │ ├── GalleryCategory
│ │ │ └── GalleryCategoryService.cs
│ │ └── TestSevices.cs
│ ├── GlobalUsings.cs
│ ├── MalusAdmin.Servers.csproj
│ └── WeatherForecast
│ │ ├── Dto
│ │ └── WeatherForecast.cs
│ │ ├── IWeatherForecastService.cs
│ │ ├── TestService.cs
│ │ └── WeatherForecastService.cs
├── MalusAdmin.WebApi
│ ├── ApiSetup.cs
│ ├── Controllers
│ │ ├── BackStageManger
│ │ │ ├── SysCacheController.cs
│ │ │ ├── SysConfigController.cs
│ │ │ ├── SysDataController.cs
│ │ │ ├── SysLogController.cs
│ │ │ ├── SysLoginController.cs
│ │ │ ├── SysMenuController.cs
│ │ │ ├── SysOnlineUserController.cs
│ │ │ ├── SysRoleController.cs
│ │ │ ├── SysRoleMenuController.cs
│ │ │ ├── SysRolePermissionController.cs
│ │ │ └── SysUserController.cs
│ │ ├── BusinessManger
│ │ │ ├── BingWallpaperController.cs
│ │ │ ├── CustomerController.cs
│ │ │ └── GalleryController.cs
│ │ └── Orther
│ │ │ ├── HomeController.cs
│ │ │ ├── OrtherController.cs
│ │ │ └── TestController.cs
│ ├── Filter
│ │ ├── CustomApiResultProvider.cs
│ │ ├── CustomAuthorizationFilter.cs
│ │ ├── GlobalExceptionFilter.cs
│ │ └── RequestActionFilter.cs
│ ├── GlobalUsings.cs
│ ├── MalusAdmin.WebApi.csproj
│ ├── Middleware
│ │ ├── GlobalException.cs
│ │ └── ServiceInspectorMiddleware.cs
│ ├── Permission
│ │ └── PermissionChecker.cs
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── appsettings.json
│ ├── pm2.json
│ └── wwwroot
│ │ ├── index.html
│ │ └── logo.txt
├── MalusAdmin.sln
├── TODO.md
├── TemplateEngineHost
│ └── vs
│ │ ├── .vstemplates.global.etag
│ │ ├── .vstemplates.local.etag
│ │ └── templatecache.json
├── Wechat.Servers
│ ├── GlobalUsings.cs
│ ├── Wechat.Servers.csproj
│ ├── Wechat
│ │ └── WeChatGetOpenId.cs
│ └── WxApiControllerBase.cs
└── Wechat.WebApi
│ ├── Controllers
│ ├── Element
│ │ ├── Dto
│ │ │ ├── BingEveryInput.cs
│ │ │ └── EveryDayBingOutput.cs
│ │ └── ElementController.cs
│ ├── Gallery
│ │ ├── Dto
│ │ │ ├── CategorizeOutput.cs
│ │ │ ├── LikeImgPage.cs
│ │ │ ├── RandomGalleryOutput.cs
│ │ │ └── RandomPage.cs
│ │ └── GalleryServiceController.cs
│ ├── HomeController.cs
│ ├── MiniServiceController.cs
│ └── Wechat
│ │ ├── Dto
│ │ ├── WechatPhoneLoginInput.cs
│ │ └── WxLoginOutput.cs
│ │ └── WechatController.cs
│ ├── Filter
│ ├── CustomApiResultProvider.cs
│ └── GlobalExceptionFilter.cs
│ ├── GlobalUsings.cs
│ ├── Program.cs
│ ├── Properties
│ └── launchSettings.json
│ ├── WeChatGetOpenId.cs
│ ├── Wechat.WebApi.csproj
│ ├── WxApiControllerBase.cs
│ └── appsettings.json
├── README.en.md
├── README.md
└── doc
├── dbsql
├── 20240429.sql
├── 20240611.sql
├── 20241014_sqlserver.sql
└── 20241017_mysql_malustest.sql
├── images
├── 1abaa087f16b5a3d074cfbd373161ac.jpg
├── 20240429112515.png
├── 20240429132404.png
├── 443e64138bacb6deb3fcf27ca163c9a.jpg
├── 95084fd62cc92f610b95f4831e4743a.jpg
├── 957e9f5757f1691e21286eefcfc2922.jpg
├── 9e47ef5edb4f352ed31b80212820301.jpg
├── b66f7dfe10870656878a573e2c8931f.jpg
├── malus1.png
├── malus10.png
├── malus11.png
├── malus12.png
├── malus13.png
├── malus14.png
├── malus15.png
├── malus16.png
├── malus2.png
├── malus3.png
├── malus4.png
├── malus5.png
├── malus6.png
├── malus7.png
├── malus8.png
├── malus9.png
└── mp-code.png
├── 更新文档 - 模板.md
└── 更新文档.md
/.gitee/ISSUE_TEMPLATE.zh-CN.md:
--------------------------------------------------------------------------------
1 | ### 该问题是怎么引起的?
2 |
3 |
4 |
5 | ### 重现步骤
6 |
7 |
8 |
9 | ### 报错信息
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md:
--------------------------------------------------------------------------------
1 | ### 一、内容说明(相关的Issue)
2 |
3 |
4 |
5 | ### 二、建议测试周期和提测地址
6 | 建议测试完成时间:xxxx.xx.xx
7 | 投产上线时间:xxxx.xx.xx
8 | 提测地址:CI环境/压测环境
9 | 测试账号:
10 |
11 | ### 三、变更内容
12 | * 3.1 关联PR列表
13 |
14 | * 3.2 数据库和部署说明
15 | 1. 常规更新
16 | 2. 重启unicorn
17 | 3. 重启sidekiq
18 | 4. 迁移任务:是否有迁移任务,没有写 "无"
19 | 5. rake脚本:`bundle exec xxx RAILS_ENV = production`;没有写 "无"
20 |
21 | * 3.4 其他技术优化内容(做了什么,变更了什么)
22 | - 重构了 xxxx 代码
23 | - xxxx 算法优化
24 |
25 |
26 | * 3.5 废弃通知(什么字段、方法弃用?)
27 |
28 |
29 |
30 | * 3.6 后向不兼容变更(是否有无法向后兼容的变更?)
31 |
32 |
33 |
34 | ### 四、研发自测点(自测哪些?冒烟用例全部自测?)
35 | 自测测试结论:
36 |
37 |
38 | ### 五、测试关注点(需要提醒QA重点关注的、可能会忽略的地方)
39 | 检查点:
40 |
41 | | 需求名称 | 是否影响xx公共模块 | 是否需要xx功能 | 需求升级是否依赖其他子产品 |
42 | |------|------------|----------|---------------|
43 | | xxx | 否 | 需要 | 不需要 |
44 | | | | | |
45 |
46 | 接口测试:
47 |
48 | 性能测试:
49 |
50 | 并发测试:
51 |
52 | 其他:
53 |
54 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /MalusApi/.idea
2 | /MalusApi/MalusAdmin.WebApi/appsettings.json
3 | /MalusApi/MalusAdmin.WebApi/appsettings.json
4 | /MalusApi/MalusAdmin.WebApi/appsettings.Development.json
5 | /MalusApi/MalusAdmin.WebApi/Filter/RequestActionFilter.cs
6 | /MalusApi/Wechat.WebApi/appsettings.Development.json
7 | /MalusApi/MalusAdmin.BackUpServices/appsettings.Development.json
8 |
--------------------------------------------------------------------------------
/DISCLAIMER.md:
--------------------------------------------------------------------------------
1 |
MalusAdmin 开源框架法律声明与授权条款
2 |
3 | ```
4 | 任何用户在使用由 MalusAdmin 技术开发团队(以下简称「本团队」)研发的系列框架(以下简称「通用权限开发框架」)前,请您仔细阅读并透彻理解本声明。若您一旦使用 MalusAdmin 通用权限开发框架,您的使用行为即被视为对本声明全部内容的认可和接受。
5 | ```
6 |
7 | **免责声明**
8 |
9 | 1. MalusAdmin 通用权限开发框架仅属于快速开发框架并不涉及具体业务应用场景,其尊重并保护所有用户的个人隐私权,不窃取任何用户计算机中的信息,更不具备用户数据存储等网络传输功能。
10 |
11 | 2. 任何单位或个人因下载使用 MalusAdmin 通用权限开发框架而产生的任何意外、疏忽、合约毁坏、诽谤、数据丢失、系统故障、服务中断、经济损失、商誉损害、版权或知识产权侵犯及其造成的损失 (包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。
12 |
13 | 3. 任何单位或个人在阅读本免责声明后,应在开源许可证所允许的范围内进行合法的发布、传播和使用 MalusAdmin 通用权限开发框架等行为,若违反本免责声明条款或违反法律法规所造成的法律责任(包括但不限于民事赔偿和刑事责任),由违约者自行承担,本团队不承担任何法律责任。
14 |
15 | 4. 本团队对 MalusAdmin 通用权限开发框架拥有知识产权(包括但不限于商标权、专利权、著作权、商业秘密等),上述产品均受到相关法律法规的保护。任何单位或个人不得在未经本团队书面授权的情况下对 MalusAdmin 通用权限开发框架本身申请相关的知识产权。
16 |
17 | 5. 使用者必须在适用法律和法规允许的范围内正确使用 MalusAdmin,严禁将其用于非法、欺诈、恶意或侵犯他人合法权益的目的,亦不将运用于任何违反我国法律法规的平台。若发现任何未经授权或违法使用本框架的情况,我们将依据相关法律追究责任,并有权采取必要的措施予以制止。
18 |
19 | 6. 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动。任何基于本项目二次开发而产生的一切法律纠纷和责任,均与作者无关。
20 |
21 | 7. 用户明确并同意本声明条款列举的全部内容,对使用 MalusAdmin 通用权限开发框架可能存在的风险和相关后果将完全由用户自行承担,本团队不承担任何法律责任。
22 |
23 | 8. 如果本声明的任何部分被认为无效或不可执行,则该部分将被解释为反映本团队的初衷,其余部分仍具有完全效力。不可执行的部分声明,并不构成我们放弃执行该声明的权利。
24 |
25 |
26 | **授权条款**
27 |
28 | MalusAdmin 是一个基于 .NET 构建的开源通用权限开发框架,我们采用了双重授权条款,您可以在 Apache 许可证(版本 2.0)或 MIT 许可证的条款下自由地使用、复制、分发、修改和贡献此项目。这意味着您可以根据自身需求和法律要求选择更适合您的许可条款:
29 |
30 | 1. **Apache 许可证(版本 2.0)**:您可以通过访问 [LICENSE-APACHE](https://gitee.com/Pridejoy/MalusAdmin/blob/master/LICENSE-APACHE) 获取详细信息,并遵照其条款使用本框架。
31 |
32 | 2. **MIT 许可证**:另一种选择是遵循 MIT 许可协议,详情参见 [LICENSE-MIT](https://gitee.com/Pridejoy/MalusAdmin/blob/master/LICENSE)。
33 |
34 |
35 | **责任限制**
36 |
37 | MalusAdmin 团队及社区成员尽力提供完善的文档和技术支持,但并不对因使用框架过程中产生的问题提供绝对的解决方案保障。所有用户提供或推荐的解决方案、代码片段、最佳实践等均“按原样”提供,使用者须自行判断并承担使用后的一切风险。
38 |
39 |
40 | **法律义务与合规性**
41 |
42 | 使用者在利用 MalusAdmin 开发应用程序时,负有确保其应用程序符合所有适用法律、行业标准以及信息安全规范的全部责任。使用者应自行评估并确保其产品不会滥用框架功能,尤其是防止被用于潜在有害或不道德的目的。
43 |
44 |
45 | **技术交流**
46 |
47 | MalusAdmin 交流群提供的支持和资源旨在辅助开发过程,但不应视为全面的技术指导或保证。我们鼓励用户积极参与开源过程,同时也提醒用户充分测试其开发成果,确保其安全性和稳定性。
48 |
49 |
50 | **变更说明**
51 |
52 | 本团队有权随时对声明条款及附件内容进行单方面的变更或更新,变更或更新后立即自动生效,无需另行单独通知您或任何第三方;若您在声明内容公告变更后继续使用的,表示您已充分阅读、理解并接受修改后的声明内容。
53 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 PrideJoy
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/MalusApi/ConsoleApp1/ConsoleApp1.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net8.0
6 | enable
7 | enable
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Always
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/MalusApi/ConsoleApp1/InitData/bs_miniappsitelink.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "MiniAppSiteLinkId": 1,
4 | "MiniAppId": "wx7560d334dd837f70",
5 | "MiniAppUrl": "http://imagesoss.hunji.xyz/tuniao/sitelink/wx7560d334dd837f70.jpg",
6 | "MiniAppName": "迷恋图库",
7 | "Path": null,
8 | "IsDeleted": false
9 | }
10 | ]
--------------------------------------------------------------------------------
/MalusApi/ConsoleApp1/InitData/bs_wx_config.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "WechatAppID": "wx7560d334dd837f70",
4 | "WechatAppSecret": "你自己小程序的密钥",
5 | "WechatAppName": "迷恋图库",
6 | "UpTime": "2024-08-27T00:00:00",
7 | "AccessToken": "1",
8 | "ExpireTime": 1200,
9 | "NextUpTime": "2024-08-27T00:00:00",
10 | "Res": "初始化"
11 | }
12 | ]
--------------------------------------------------------------------------------
/MalusApi/ConsoleApp1/InitData/t_sys_config.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "ConfigID": 1,
4 | "ConfigKey": "tokenExpireTime",
5 | "ConfigType": "后台",
6 | "ConfigValue": "301",
7 | "ConfigDescribe": "Token过期时间【分钟】",
8 | "IsDeleted": false
9 | },
10 | {
11 | "ConfigID": 2,
12 | "ConfigKey": "Apptime",
13 | "ConfigType": "小程序测试参数",
14 | "ConfigValue": "3",
15 | "ConfigDescribe": "测试参数",
16 | "IsDeleted": false
17 | }
18 | ]
--------------------------------------------------------------------------------
/MalusApi/ConsoleApp1/InitData/t_sys_user.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "Id": 1,
4 | "Account": "admin",
5 | "Name": "Malus",
6 | "PassWord": "3FDE6BB0541387E4EBDADF7C2FF31123",
7 | "UserRolesId": "[1]",
8 | "Status": 1,
9 | "Tel": "18888888889",
10 | "Email": "188888888@163.com",
11 | "SysCreateUser": 0,
12 | "SysCreateTime": "1900-01-01T00:00:00",
13 | "SysUpdateUser": 1,
14 | "SysUpdateTime": "2024-10-08T10:22:12.313",
15 | "SysDeleteUser": 0,
16 | "SysDeleteTime": "1900-01-01T00:00:00",
17 | "SysIsDelete": 0,
18 | "DeptId": 1,
19 | "IsSuperAdmin": true
20 | },
21 | {
22 | "Id": 2,
23 | "Account": "pridejoy",
24 | "Name": "管理员",
25 | "PassWord": "E10ADC3949BA59ABBE56E057F20F883E",
26 | "UserRolesId": "[15,1,17,16]",
27 | "Status": 1,
28 | "Tel": "18888888888",
29 | "Email": "18888888888@163.com",
30 | "SysCreateUser": 0,
31 | "SysCreateTime": "1900-01-01T00:00:00",
32 | "SysUpdateUser": 0,
33 | "SysUpdateTime": "1900-01-01T00:00:00",
34 | "SysDeleteUser": 0,
35 | "SysDeleteTime": "1900-01-01T00:00:00",
36 | "SysIsDelete": 0,
37 | "DeptId": 2,
38 | "IsSuperAdmin": false
39 | },
40 | {
41 | "Id": 46,
42 | "Account": "121我",
43 | "Name": "21213",
44 | "PassWord": "8A373F4ECBC59038E3CFA8AA8E31FF65",
45 | "UserRolesId": "[15]",
46 | "Status": 1,
47 | "Tel": "211212323",
48 | "Email": "12饿1321",
49 | "SysCreateUser": 1,
50 | "SysCreateTime": "2024-09-25T09:28:30.970",
51 | "SysUpdateUser": 1,
52 | "SysUpdateTime": "2024-10-08T10:22:59.117",
53 | "SysDeleteUser": 0,
54 | "SysDeleteTime": "1900-01-01T00:00:00",
55 | "SysIsDelete": 1,
56 | "IsSuperAdmin": false
57 | },
58 | {
59 | "Id": 47,
60 | "Account": "测试测试测试测试测试测试测试测试",
61 | "Name": "测试",
62 | "PassWord": "E10ADC3949BA59ABBE56E057F20F883E",
63 | "UserRolesId": "[1]",
64 | "Status": 1,
65 | "Tel": "12345678910",
66 | "Email": "123@qq.com",
67 | "SysCreateUser": 2,
68 | "SysCreateTime": "2024-09-29T17:17:03.553",
69 | "SysUpdateUser": 1,
70 | "SysUpdateTime": "2024-10-08T10:22:57.797",
71 | "SysDeleteUser": 0,
72 | "SysDeleteTime": "1900-01-01T00:00:00",
73 | "SysIsDelete": 1,
74 | "IsSuperAdmin": false
75 | }
76 | ]
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/Components/Configuration/AddConfigureSetup.cs:
--------------------------------------------------------------------------------
1 |
2 | using Microsoft.Extensions.Configuration;
3 | using Microsoft.Extensions.DependencyInjection;
4 |
5 | namespace MalusAdmin.Common;
6 |
7 | public static class Configure
8 | {
9 | public static IServiceCollection AddConfigureSetup(this IServiceCollection services, IConfiguration config)
10 | {
11 | //强类型的注册
12 | //https://www.dotnetshare.com/guid/conf-options/options.html
13 | //services.Configure(config.GetSection(PositionOptions.Position));
14 |
15 | //services.Configure(config.GetSection("RabbitMQConfig"));
16 |
17 | //等其他选项
18 | return services;
19 | }
20 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/Components/Configuration/AppSettings.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.Configuration;
2 | using SqlSugar.Extensions;
3 |
4 | namespace MalusAdmin.Common;
5 |
6 | public static class AppSettings
7 | {
8 | private static IConfiguration? _configuration;
9 |
10 | public static IConfiguration Configuration
11 | {
12 | get
13 | {
14 | if (_configuration == null) throw new NullReferenceException(nameof(Configuration));
15 | return _configuration;
16 | }
17 | }
18 |
19 |
20 | ///
21 | /// 设置 Configuration 的实例
22 | ///
23 | ///
24 | ///
25 | ///
26 | public static void AddConfigSteup(IConfiguration? configuration)
27 | {
28 | //if (_configuration != null) throw Exception($"{nameof(Configuration)}不可修改!");
29 | _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
30 | }
31 |
32 | #region 以下存放的全部都是静态配置
33 |
34 | ///
35 | /// 数据库链接
36 | ///
37 | public static string SqlServerConnection => Configuration["SqlServerConnection"]??"";
38 |
39 |
40 | ///
41 | /// RabbitMq链接
42 | ///
43 | public static string RabbitMqConnetion => Configuration["RabbitMqConnetion"]??"";
44 |
45 |
46 |
47 | #endregion
48 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/CronAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace MalusAdmin.BackUpServices
8 | {
9 | [AttributeUsage(AttributeTargets.Class, Inherited = true)]
10 | public class CronAttribute: Attribute
11 | {
12 | public CronAttribute(string cron)
13 | {
14 | Cron = cron;
15 | }
16 |
17 | public string Cron { get; }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/Helper/FileHelper.cs:
--------------------------------------------------------------------------------
1 | using System.Text;
2 |
3 | namespace MalusAdmin.BackUpServices;
4 |
5 | public class FileHelper
6 | {
7 | //相对路径
8 | //await WriteAsync("file.txt", "Hello World");
9 | //await WriteAsync("subfolder/file.txt", "Hello World");
10 | ///
11 | /// 创建文件或者附加内容
12 | ///
13 | /// 要写入的文本
14 | /// 文件路径(支持相对路径或绝对路径)
15 | public static async Task Write(string filePath = "", string Data = "")
16 | {
17 | filePath = filePath.Contains("txt")
18 | ? filePath
19 | : "logs/" + filePath + DateTime.Now.ToString("yyyyMMdd") + ".log";
20 | var Encode = "UTF-8";
21 | Data = DateTime.Now + " :" + Data + "\n";
22 | try
23 | {
24 | //获取文件对象
25 | var file = new FileInfo(filePath);
26 | //判断文件夹是否创建
27 | if (!file.Directory.Exists) file.Directory.Create();
28 | //判断文件是否存在
29 | //或者判断文件属性是否只读,是只读的话将只读属性去掉
30 | if (!file.Exists)
31 | using (file.Create())
32 | {
33 | }
34 | else if (file.Attributes.ToString().IndexOf("ReadOnly") != -1) file.IsReadOnly = false;
35 |
36 | //将内容覆盖或者追加到文件的最后
37 | using (var writer = new StreamWriter(file.FullName, true, Encoding.GetEncoding(Encode)))
38 | {
39 | writer.Write(Data);
40 | writer.Flush();
41 | }
42 |
43 | return true;
44 | }
45 | catch (Exception ex)
46 | {
47 | Console.Write(ex.Message);
48 | return false;
49 | }
50 | }
51 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/Helper/SqlsugarHelper.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Common;
2 | using SqlSugar;
3 |
4 | namespace MalusAdmin.BackUpServices;
5 |
6 | public class SqlsugarHelper
7 | {
8 | //创建数据库对象
9 | public SqlSugarClient db
10 | {
11 | get {
12 | return new SqlSugarClient(new ConnectionConfig
13 | {
14 | ConnectionString = AppSettings.SqlServerConnection,
15 | DbType = DbType.SqlServer,
16 | IsAutoCloseConnection = true
17 | });
18 | }
19 | }
20 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/JobService.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using Quartz;
3 | using Quartz.Impl;
4 |
5 | namespace MalusAdmin.BackUpServices;
6 |
7 | public class JobService
8 | {
9 | private readonly IScheduler scheduler;
10 |
11 | public JobService()
12 | {
13 | scheduler = new StdSchedulerFactory().GetScheduler().GetAwaiter().GetResult();
14 | }
15 |
16 | ///
17 | /// 开始执行所有的job
18 | ///
19 | ///
20 | public async Task StartAll()
21 | {
22 | var jobTypes = GetJobTypes(); // 获取所有实现了 IJob 接口的类型
23 | foreach (var type in jobTypes)
24 | {
25 | Console.WriteLine($"当前任务:{type.Name}");
26 | var jobDetail = JobBuilder.Create(type).Build();
27 | var trigger = TriggerBuilder.Create().WithCronSchedule(GetCronExpression(type)).Build();
28 | await scheduler.ScheduleJob(jobDetail, trigger);
29 | }
30 | Console.WriteLine("开始执行所有的job");
31 | await scheduler.Start();
32 | }
33 |
34 | private IEnumerable GetJobTypes()
35 | {
36 | return Assembly.GetExecutingAssembly().GetTypes().Where(type => typeof(IJob).IsAssignableFrom(type));
37 | }
38 |
39 |
40 | private string GetCronExpression(Type type)
41 | {
42 | // 可以根据需要自定义获取 cron 表达式的逻辑
43 | //return (string)type.GetField("Cron", BindingFlags.Static | BindingFlags.Public)?.GetValue(null)??"";
44 |
45 | var cron = type.GetCustomAttribute().Cron;
46 | Console.WriteLine("表达式"+cron);
47 | if (string.IsNullOrEmpty(cron)) throw new Exception("当前特性Corn为空,请检查");
48 | return cron;
49 | }
50 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/MalusAdmin.BackUpServices.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net8.0
6 | enable
7 | enable
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/Program.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Common;
2 | using Microsoft.AspNetCore.Builder;
3 |
4 | namespace MalusAdmin.BackUpServices;
5 |
6 | internal class Program
7 | {
8 | //文档地址:https://www.dotnetshare.com/guid/service/quartz-service.html
9 | public static async Task Main(string[] args)
10 | {
11 | try
12 | {
13 | //为了解耦单独得做成服务
14 | var builder = WebApplication.CreateBuilder(args);
15 |
16 | //进行配置注册 | 添加静态文件读取(优先级比较高)
17 | AppSettings.AddConfigSteup(builder.Configuration);
18 |
19 | //https://www.dotnetshare.com/guid/service/install/use-windows-server.html
20 | //指定项目可以部署为Windows服务
21 | //builder.Host.UseWindowsService();
22 |
23 | //添加sqlsugaer的注入
24 | builder.Services.AddSqlsugarSetup();
25 |
26 | builder.Services.AddSingleton();
27 |
28 | var app = builder.Build();
29 | //获取任务服务
30 | var jobService = app.Services.GetService();
31 |
32 | await jobService.StartAll();
33 |
34 | await FileHelper.Write("任务开始了", "run");
35 |
36 | Console.WriteLine("开始执行");
37 |
38 | app.Run();
39 | }
40 | catch (Exception e)
41 | {
42 |
43 | throw;
44 | }
45 | }
46 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "profiles": {
3 | "MalusAdmin.BackUpServices": {
4 | "commandName": "Project",
5 | "launchBrowser": true,
6 | "environmentVariables": {
7 | "ASPNETCORE_ENVIRONMENT": "Development"
8 | },
9 | "applicationUrl": "https://localhost:59033;http://localhost:59034"
10 | }
11 | }
12 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/QuartzJob/HelloQuartzJob.cs:
--------------------------------------------------------------------------------
1 | using System.Text.Json.Serialization;
2 | using MalusAdmin.Common;
3 | using MalusAdmin.Repository.Model;
4 | using Newtonsoft.Json;
5 | using Quartz;
6 | using SqlSugar;
7 |
8 | namespace MalusAdmin.BackUpServices;
9 |
10 | [Cron("0/1 * * * * ? ")]
11 | public class HelloQuartzJob : IJob
12 | {
13 |
14 | public async Task Execute(IJobExecutionContext context)
15 | {
16 | try
17 | {
18 | //业务处理逻辑
19 | Console.WriteLine("任务1,HelloQuartzJob");
20 |
21 | // 查询数据库表
22 | //var date = await new SqlsugarHelper().db.Queryable()
23 | // .Take(1)
24 | // .OrderBy(x => SqlFunc.GetRandom())
25 | // .FirstAsync();
26 |
27 | //Console.WriteLine(JsonConvert.SerializeObject(date));
28 | }
29 | catch (Exception ex)
30 | {
31 | FileHelper.Write(ex.Message, "error");
32 | }
33 | }
34 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/QuartzJob/WordQuartzJob.cs:
--------------------------------------------------------------------------------
1 | //using Quartz;
2 |
3 | //namespace MalusAdmin.BackUpServices.QuartzJob;
4 |
5 | //public class WordQuartzJob : IJob
6 | //{
7 | // ///
8 | // /// 当前任务执行的Core表达式
9 | // ///
10 | // public static string Cron = "0/1 * * * * ? ";
11 |
12 |
13 | // public async Task Execute(IJobExecutionContext context)
14 | // {
15 | // try
16 | // {
17 | // //业务处理逻辑
18 | // Console.WriteLine("我是WordQuartzJob,任务2");
19 |
20 | // // 查询数据库表
21 | // //var date = await SqlsugarHelper.db.Queryable()
22 | // // .Where(x => x.IsDelete == false)
23 | // // .OrderBy(x => SqlFunc.GetRandom())
24 | // // .FirstAsync();
25 |
26 | // //Console.WriteLine(JsonConvert.SerializeObject(date));
27 | // }
28 | // catch (Exception ex)
29 | // {
30 | // FileHelper.Write(ex.Message, "error");
31 | // }
32 | // }
33 | //}
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.BackUpServices/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft.AspNetCore": "Warning"
6 | }
7 | },
8 | "RabbitMqConnetion": "host=127.0.0.1;virtualHost=/;username=admin;password=111",
9 | "SqlServerConnection": "Data Source=127.0.0.1;Initial Catalog=MalusAdminTest;User ID=sa;Password=11;Integrated Security=False;Column Encryption Setting=Enabled;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;"
10 | }
11 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Attributes/AutoInjectAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using Microsoft.Extensions.DependencyInjection;
7 |
8 | ///
9 | /// 自动注入特性
10 | ///
11 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
12 | public class AutoInjectAttribute : Attribute
13 | {
14 | public ServiceLifetime Lifetime { get; }
15 |
16 | public AutoInjectAttribute(ServiceLifetime lifetime = ServiceLifetime.Scoped)
17 | {
18 | Lifetime = lifetime;
19 | }
20 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Attributes/PermissionAttribute.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Common;
2 |
3 | ///
4 | /// 接口按钮特性,映射到按钮权限
5 | ///
6 | public class PermissionAttribute : Attribute
7 | {
8 | public PermissionAttribute(string permissionName)
9 | {
10 | PermissionName = permissionName;
11 | }
12 |
13 | public string PermissionName { get; private set; }
14 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Attributes/ReadOnlyAttribute.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc.Filters;
2 | using SqlSugar.Extensions;
3 |
4 | namespace MalusAdmin.Common;
5 |
6 | ///
7 | /// 演示环境禁止操作
8 | ///
9 | public class ReadOnlyAttribute : ActionFilterAttribute
10 | {
11 | public override void OnActionExecuting(ActionExecutingContext context)
12 | {
13 | //是否演示环境
14 | if (App.Configuration["IsDemo"].ObjToBool()) throw ApiException.Exception207Bad("演示环境,禁止操作");
15 | base.OnActionExecuting(context);
16 | }
17 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/ApiControllerBase.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Authorization;
2 |
3 | namespace MalusAdmin.Common;
4 |
5 | [ApiController]
6 | [Route("api/[controller]/[action]")]
7 | [Produces("application/json")] //返回数据的格式 直接约定为Json
8 | //[Authorize] //接口全部需要登录,特殊的除外
9 | [Authorize(AuthenticationSchemes = "CustomScheme")]
10 | public class ApiControllerBase : ControllerBase
11 | {
12 |
13 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/ApiJson/ApiCode.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel;
2 |
3 | namespace MalusAdmin.Common;
4 |
5 | public enum ApiCode
6 | {
7 | [Description("成功")]
8 | 成功 = 200,
9 |
10 | //Exception207Bad
11 | [Description("自定义错误信息")]
12 | Exception207Bad = 207,
13 | 自定义错误信息 = 207,
14 |
15 | [Description("错误的请求")]
16 | 错误的请求 = 400,
17 |
18 | [Description("没有登录状态")]
19 | 没有登录状态 = 401,
20 |
21 | [Description("缺少权限")]
22 | 缺少权限 = 403,
23 |
24 | [Description("找不到资源")]
25 | 找不到资源 = 404,
26 |
27 | [Description("存在冲突")]
28 | 存在冲突 = 409,
29 |
30 | [Description("服务器错误")]
31 | 服务器错误 = 500
32 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/ApiJson/ApiJson.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection.Emit;
2 | using Dm;
3 | using EasyNetQ;
4 | using static Dm.net.buffer.ByteArrayBuffer;
5 |
6 | namespace MalusAdmin.Common;
7 |
8 | public class ApiJson
9 | {
10 | public ApiJson(ApiCode apicode, string? message = null, object? body = null)
11 | {
12 | Code = apicode.GetHashCode();
13 | Message = message ?? apicode.GetDescription();
14 | Body = body;
15 | }
16 | public ApiJson()
17 | {
18 | Code = -1;
19 | Message = string.Empty;
20 | Body = null;
21 | }
22 |
23 | public int Code { get; set; }
24 |
25 | public string? Message { get; set; }
26 |
27 | public object? Body { get; set; }
28 | }
29 |
30 |
31 | public static class Tool
32 | {
33 | public static ApiJson RJson(this Enum apicode, object body = null, string message = "")
34 | {
35 | if (string.IsNullOrEmpty(message)) message = apicode.GetDescription();
36 | return new ApiJson()
37 | {
38 | Code = apicode.GetHashCode(),
39 | Message = message,
40 | Body = body
41 | };
42 | }
43 |
44 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/ApiJson/ApiJsonException.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Common;
2 |
3 | ///
4 | /// 返回统一结果的异常。
5 | /// 需要配合 AppResultActionFilter 使用。
6 | ///
7 | ///
8 | public class ApiJsonException : Exception
9 | {
10 | public ApiJsonException(ApiJson ApiJson)
11 | : this(ApiJson, null)
12 | {
13 | apiJson = ApiJson;
14 | }
15 |
16 | public ApiJsonException(ApiJson ApiJson, Exception? innerException)
17 | : base(ApiJson.Message, innerException)
18 | {
19 | apiJson = ApiJson;
20 | }
21 |
22 | ///
23 | /// API 结果
24 | ///
25 | public ApiJson apiJson { get; private set; }
26 | }
27 |
28 | public static class ApiException
29 | {
30 | public static ApiJsonException Exception(ApiCode apicode, string? message = "", object? data = null)
31 | {
32 | if (string.IsNullOrEmpty(message)) message = apicode.GetDescription();
33 | var ApiJson = new ApiJson(apicode, message, data);
34 | return new ApiJsonException(ApiJson);
35 | }
36 |
37 | public static ApiJsonException Exception401(string? message, object? data = null)
38 | {
39 | return new ApiJsonException(ApiCode.没有登录状态.RJson(data, message));
40 | }
41 |
42 | public static ApiJsonException Exception207Bad(string? message, object? data = null)
43 | {
44 | var j = ApiCode.Exception207Bad.RJson(data, message);
45 | return new ApiJsonException(j);
46 | }
47 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/ApiJson/ResultFilter.cs:
--------------------------------------------------------------------------------
1 | using System.Net;
2 | using Microsoft.AspNetCore.Http.HttpResults;
3 | using Microsoft.AspNetCore.Mvc;
4 | using Microsoft.AspNetCore.Mvc.Filters;
5 |
6 | namespace MalusAdmin.Common;
7 |
8 | ///
9 | /// 统一接口返回
10 | ///
11 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
12 | public class ResultFilter : Attribute, IResultFilter
13 | {
14 | public void OnResultExecuting(ResultExecutingContext context)
15 | {
16 | var json = context.Result as ObjectResult;
17 |
18 | if (json != null)
19 | {
20 | var result = ApiCode.成功.RJson(json.Value);
21 | context.Result = new OkObjectResult(result); // 使用OkObjectResult来包装result对象
22 | }
23 | }
24 |
25 | public void OnResultExecuted(ResultExecutedContext context)
26 | {
27 | //返回结果之后
28 | }
29 |
30 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Authorization/AppUser/ICurrentUser.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using MalusAdmin.Common;
7 |
8 | ///
9 | /// 当前用户
10 | ///
11 | public interface ICurrentUser
12 | {
13 | int UserId { get; }
14 |
15 | string UserName { get; }
16 |
17 | string UserAccount { get; }
18 |
19 | bool IsSuperAdmin { get; }
20 |
21 | List UserRolesId { get; }
22 |
23 | //List UserPermiss { get; }
24 |
25 | //DateTime? LoginTime { get; }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Authorization/AuthorizationSetup.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Common.Components;
2 | using Microsoft.AspNetCore.Authentication;
3 | using Microsoft.AspNetCore.Authentication.JwtBearer;
4 | using Microsoft.AspNetCore.Authentication.OAuth;
5 | using Microsoft.AspNetCore.Authorization;
6 | using Microsoft.Extensions.DependencyInjection;
7 | using Microsoft.Extensions.DependencyInjection.Extensions;
8 |
9 | namespace MalusAdmin.Common;
10 |
11 | public static class AuthorizationSetup
12 | {
13 | public static IServiceCollection AddAuthorizationSetup(this IServiceCollection services)
14 | {
15 |
16 | switch (AuthenticationSettings.CurrentAuthenticationMethod)
17 | {
18 | case AuthenticationMethod.Jwt:
19 | // 启动Jwt授权
20 | services.AddJwtSetup();
21 | break;
22 |
23 | case AuthenticationMethod.Guid:
24 | services.AddAuthentication("CustomScheme")
25 | .AddScheme("CustomScheme", null);
26 | break;
27 | }
28 | return services;
29 | }
30 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Authorization/Jwt/JwtConfiguration.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Globalization;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace MalusAdmin.Common
9 | {
10 |
11 | public class JwtOptions
12 | {
13 | public string Issuer { get; set; }
14 | public string Secret { get; set; }
15 | public string Audience { get; set; }
16 | public int ExpireDays { get; set; }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Authorization/Token/GuidToken.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Common;
2 |
3 | ///
4 | /// 基于自定义GUID实现的Token
5 | ///
6 | [AutoInject]
7 | public class GuidToken : ITokenService
8 | {
9 | private readonly ICacheService _cacheService;
10 | private readonly IHttpContextAccessor _httpContextAccessor;
11 |
12 | private readonly int expiresTime=TokenConstant.TokenExpiresTime;
13 |
14 | public GuidToken(ICacheService cacheService, IHttpContextAccessor httpContextAccessor)
15 | {
16 | _cacheService = cacheService;
17 | _httpContextAccessor = httpContextAccessor;
18 | }
19 |
20 | ///
21 | /// 生成token
22 | ///
23 | ///
24 | ///
25 | public async Task GenerateTokenAsync(TokenData tokenData)
26 | {
27 | //redis存放的是用户信息-TokenData
28 | var token = Guid.NewGuid().ToString("N");
29 | _cacheService.Set(CacheConstant.UserToken + token, tokenData, 60 * expiresTime);
30 | return token;
31 | }
32 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Authorization/Token/ITokenService.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Common;
2 |
3 |
4 | public interface ITokenService
5 | {
6 | ///
7 | /// 生成token
8 | ///
9 | ///
10 | ///
11 | Task GenerateTokenAsync(TokenData tokenData);
12 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Authorization/Token/JwtToken.cs:
--------------------------------------------------------------------------------
1 | using System.IdentityModel.Tokens.Jwt;
2 | using System.Security.Claims;
3 | using MalusAdmin.Common.Constant;
4 | using Microsoft.IdentityModel.Tokens;
5 |
6 | namespace MalusAdmin.Common.Components
7 | {
8 | public class JwtToken : ITokenService
9 | {
10 | private readonly ICacheService _cacheService;
11 |
12 | private readonly int expiresTime = TokenConstant.TokenExpiresTime;
13 |
14 | public JwtToken(ICacheService cacheService)
15 | {
16 | _cacheService = cacheService;
17 | }
18 |
19 | public async Task GenerateTokenAsync(TokenData tokenData)
20 | {
21 | // 获取配置
22 | var jwtConfiguration = App.GetOptions();
23 |
24 | var claims = new List
25 | {
26 | new Claim("AppName", "MalusAdmin"),
27 | new Claim("Author", "Malus"),
28 | //和guidtoken存放的内容保持一直
29 | new Claim(AppUserConst.UserId, tokenData.UserId.ToString()),
30 | new Claim(AppUserConst.UserAccount, tokenData.UserAccount.ToString()),
31 | };
32 |
33 | //dic.ToList().ForEach(kvp => claims.Add(new Claim(kvp.Key, kvp.Value)));
34 |
35 | var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfiguration.Secret));
36 | var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
37 | var token = new JwtSecurityToken(
38 | issuer: jwtConfiguration.Issuer,
39 | audience: jwtConfiguration.Audience,
40 | claims: claims,
41 | expires: DateTime.Now.AddDays(jwtConfiguration.ExpireDays),
42 | signingCredentials: creds
43 | );
44 |
45 | return new JwtSecurityTokenHandler().WriteToken(token);
46 | }
47 |
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/BaseServiceRegister.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using MalusAdmin.Common;
7 | using MalusAdmin.Common.Components;
8 | using Microsoft.Extensions.DependencyInjection;
9 |
10 | public static class BaseServiceRegister
11 | {
12 | //注册项目所需的服务
13 | public static IServiceCollection AddBaseServices(this IServiceCollection services)
14 | {
15 | //打印控制台显示
16 | services.AddLogo();
17 |
18 | //配置url小写
19 | //services.AddRouting(o => { o.LowercaseUrls = true; });
20 |
21 | //HttpContext
22 | services.AddHttpContextAccessor();
23 | services.AddSingleton();
24 |
25 | services.AddTransient();
26 |
27 | switch (AuthenticationSettings.CurrentAuthenticationMethod)
28 | {
29 | case AuthenticationMethod.Jwt:
30 | services.AddSingleton();
31 | break;
32 | default:
33 | services.AddSingleton();
34 | break;
35 | }
36 |
37 | services.AddResponseCaching();
38 |
39 | services.AddSignalR();
40 |
41 | services.AddEndpointsApiExplorer();
42 |
43 | return services;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Cache/CacheSetup.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Common.Components.Cache;
2 | using Microsoft.Extensions.DependencyInjection;
3 | using SqlSugar.Extensions;
4 |
5 | namespace MalusAdmin.Common;
6 |
7 | public static class CacheSetup
8 | {
9 | ///
10 | /// 注册缓存服务,如有配置 Redis 则启用,没有则启用分布式内存缓存(DistributedMemoryCache)
11 | ///
12 | ///
13 | ///
14 | public static IServiceCollection AddCacheSetup(this IServiceCollection services)
15 | {
16 | // 根据情况,启用 Redis 或 DistributedMemoryCache
17 | if (App.Configuration["Redis:Enabled"].ObjToBool())
18 | {
19 | services.AddSingleton();
20 | }
21 | else
22 | {
23 | // 注册 IMemoryCache 服务
24 | services.AddMemoryCache();
25 | services.AddSingleton();
26 | }
27 |
28 |
29 | //更多的缓存实现方式
30 | return services;
31 | }
32 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Configuration/AddConfigureSetup.cs:
--------------------------------------------------------------------------------
1 | using System.Configuration;
2 | using MalusAdmin.Common.Components;
3 | using Microsoft.Extensions.Configuration;
4 | using Microsoft.Extensions.DependencyInjection;
5 |
6 | namespace MalusAdmin.Common;
7 |
8 | public static class Configure
9 | {
10 | public static IServiceCollection AddConfigureSetup(this IServiceCollection services, IConfiguration config)
11 | {
12 | //强类型的注册
13 | //https://www.dotnetshare.com/guid/conf-options/options.html
14 | //services.Configure(config.GetSection(PositionOptions.Position));
15 |
16 | //services.Configure(config.GetSection("RabbitMQConfig"));
17 |
18 |
19 | //等其他选项
20 | return services;
21 | }
22 |
23 | //配置读取的方式
24 |
25 | //方式1
26 | //var connection = App.Configuration["Redis:ConnectionString"]?.ToString();
27 | //if (connection == null) throw new NullReferenceException("配置读取失败");
28 |
29 | //读取数组
30 | //App.Configuration.GetSection("AllowCors").Get()
31 |
32 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Cors/AddCorsSetup.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Common;
2 | using Microsoft.AspNetCore.Cors.Infrastructure;
3 | using Microsoft.Extensions.Configuration;
4 | using Microsoft.Extensions.DependencyInjection;
5 |
6 | public static class CorsServiceCollectionExtensions
7 | {
8 | ///
9 | /// 添加默认跨域配置
10 | ///
11 | ///
12 | ///
13 | ///
14 | public static IServiceCollection AddCorsSetup(this IServiceCollection services, Action? setupAction = null)
15 | {
16 | //教程
17 | //https://www.dotnetshare.com/guid/cors.html
18 | services.AddCors(options =>
19 | {
20 | options.AddDefaultPolicy(policy =>
21 | {
22 | var allowCors = App.Configuration.GetSection("AllowCors").Get();
23 |
24 | if (allowCors.Any(c => c == "*"))
25 | // 允许任意跨域
26 | policy.AllowAnyOrigin()
27 | .AllowAnyHeader()
28 | .AllowAnyMethod();
29 | else
30 | // 允许指定域名
31 | policy.WithOrigins(allowCors);
32 | });
33 | });
34 |
35 | // 自定义配置
36 | if (setupAction != null) services.Configure(setupAction);
37 |
38 | return services;
39 | }
40 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/DataValidation/DataValidationFilter.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc.Filters;
2 | using Microsoft.AspNetCore.Mvc.ModelBinding;
3 |
4 | namespace MalusAdmin.Common
5 | {
6 | public class DataValidationFilter : IActionFilter, IOrderedFilter
7 | {
8 | public const int FilterOrder = -2000;
9 |
10 | public int Order { get; set; } = FilterOrder;
11 |
12 | public void OnActionExecuting(ActionExecutingContext context)
13 | {
14 |
15 | // 检查是否需要禁用模型验证
16 | //if (context.ActionArguments.ContainsKey("pageInput") &&
17 | // context.ActionArguments["pageInput"] is Keyword)
18 | //{
19 | // // 禁用模型验证
20 | // //context.ModelState.Clear();
21 | // return;
22 | //}
23 |
24 | // 如果其他过滤器已经设置了结果,则跳过验证
25 | if (context.Result != null) return;
26 |
27 | // 获取模型验证状态
28 | var modelState = context.ModelState;
29 |
30 | // 如果验证通过,跳过后面的动作
31 | if (modelState.IsValid) return;
32 |
33 | // 获取失败的验证信息列表
34 | var errors = modelState.Where(s => s.Value != null && s.Value.ValidationState == ModelValidationState.Invalid)
35 | .SelectMany(s => s.Value!.Errors.ToList())
36 | .Select(e => e.ErrorMessage)
37 | .ToArray();
38 |
39 | // 统一返回
40 | var result = ApiCode.Exception207Bad.RJson(errors);
41 |
42 | // 设置结果
43 | context.Result = new ObjectResult(result);
44 | }
45 |
46 | public void OnActionExecuted(ActionExecutedContext context)
47 | {
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/DataValidation/DataValidationMvcBuilderExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using Microsoft.Extensions.DependencyInjection;
7 |
8 | namespace MalusAdmin.Common
9 | {
10 | public static class DataValidationMvcBuilderExtensions
11 | {
12 | ///
13 | /// 配置模型验证
14 | ///
15 | ///
16 | /// 结果过滤器排序
17 | ///
18 | public static IMvcBuilder AddDataValidation(this IMvcBuilder builder, int filterOrder = DataValidationFilter.FilterOrder)
19 | {
20 | builder.ConfigureApiBehaviorOptions(options =>
21 | {
22 | // 禁用默认模型验证过滤器
23 | options.SuppressModelStateInvalidFilter = true;
24 | });
25 |
26 | builder.AddMvcOptions(options =>
27 | {
28 | // 添加自定义模型验证过滤器
29 | //options.Filters.Add(filterOrder);
30 | });
31 |
32 | return builder;
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/DynamicApiController/Const/DynamicApiConsts.cs:
--------------------------------------------------------------------------------
1 |
2 |
3 | namespace MalusAdmin.Common;
4 |
5 | public static class DynamicApiConsts
6 | {
7 | ///
8 | /// 默认API前缀
9 | ///
10 | public const string DefaultApiPrefix = "api";
11 |
12 | ///
13 | /// 默认根路径:如(/api/app/test/xxx),其中app为根路径,可根据实际需求修改。
14 | /// 是否需要将根路径添加到路由中,根据实际情况而定,此处是参考abp的约定来做,请根据实际需求来决定是否使用根路径。
15 | /// 此处提供DefaultIsRootPathInRoute快捷开关,默认不开启,如需客开,可在DynamicWebApiConvention处理
16 | ///
17 | public const string DefaultRootPath = "app";
18 |
19 | ///
20 | /// 是否需要将根路径添加到路由中
21 | ///
22 | public static bool DefaultIsRootPathInRoute = false;
23 |
24 | ///
25 | /// 默认HTTP方法
26 | ///
27 | public const string DefaultHttpVerb = "POST";
28 |
29 | ///
30 | /// 控制器名称后缀
31 | ///
32 | public static string[] CommonPostfixes { get; set; } = { "AppService", "ApplicationService", "Service" };
33 |
34 | ///
35 | /// 默认的约定前缀
36 | ///
37 | public static IReadOnlyDictionary ConventionalPrefixes { get; } = new Dictionary
38 | {
39 | ["GET"] = new[] { "GetList", "GetAll", "Get" },
40 | ["PUT"] = new[] { "Put", "Update" },
41 | ["DELETE"] = new[] { "Delete", "Remove" },
42 | ["POST"] = new[] { "Create", "Add", "Insert", "Post" },
43 | ["PATCH"] = new[] { "Patch" }
44 | };
45 | }
46 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/DynamicApiController/Dependencies/IDynamicApiController.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace MalusAdmin.Common;
3 |
4 |
5 | ///
6 | /// Dynamic API controller Interface.
7 | ///
8 | public interface IDynamicApiController { }
9 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/DynamicApiController/Extensions/DynamicApiControllerServiceCollectionExtensions.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc;
2 | using Microsoft.AspNetCore.Mvc.ApplicationParts;
3 | using Microsoft.Extensions.DependencyInjection;
4 |
5 |
6 | namespace MalusAdmin.Common;
7 |
8 | public static class DynamicApiControllerServiceCollectionExtensions
9 | {
10 | ///
11 | /// 添加动态API控制器服务
12 | ///
13 | /// 服务集合
14 | /// 服务集合
15 | public static IServiceCollection AddDynamicApiControllers(this IServiceCollection services)
16 | {
17 | if (services == null)
18 | {
19 | throw new ArgumentNullException(nameof(services));
20 | }
21 |
22 | //AddDynamicApiControllers 必须在 AddControllers 之后调用
23 | var partManager = services.FirstOrDefault(s => s.ServiceType == typeof(ApplicationPartManager))?.ImplementationInstance as ApplicationPartManager;
24 | if (partManager is null)
25 | {
26 | throw new InvalidOperationException(
27 | $"请确保在调用 {nameof(AddDynamicApiControllers)} 之前已调用 {nameof(MvcServiceCollectionExtensions.AddControllers)}。" +
28 | $"正确的顺序为:services.AddControllers().{nameof(AddDynamicApiControllers)}();"
29 | );
30 | }
31 |
32 | //动态API控制器特性提供者,用于动态发现和注册 API 控制器
33 | partManager.FeatureProviders.Add(new DynamicApiControllerFeatureProvider());
34 |
35 | services.Configure(o =>
36 | {
37 | //动态API控制器路由约定
38 | o.Conventions.Add(new DynamicWebApiConvention());
39 | });
40 |
41 | return services;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/DynamicApiController/Helper/ControllerSelector.cs:
--------------------------------------------------------------------------------
1 |
2 | using Microsoft.AspNetCore.Mvc;
3 |
4 | namespace MalusAdmin.Common;
5 |
6 |
7 | public class ControllerSelector
8 | {
9 | ///
10 | /// 判断类型是否为动态API控制器
11 | ///
12 | /// 要检查的类型
13 | /// 如果类型符合动态 API 控制器的约定条件,则返回 true;否则返回 false
14 | public static bool IsDynamicApiController(Type type)
15 | {
16 | if (!type.IsPublic) // 排除非公开类型
17 | {
18 | return false;
19 | }
20 |
21 | if (type.IsPrimitive) // 基元类型(int/string等)
22 | {
23 | return false;
24 | }
25 |
26 | if (type.IsValueType) // 值类型(如 struct)
27 | {
28 | return false;
29 | }
30 |
31 | if (type.IsAbstract) // 抽象类
32 | {
33 | return false;
34 | }
35 |
36 | if (type.IsInterface) // 接口
37 | {
38 | return false;
39 | }
40 |
41 | if (type.IsGenericType) // 泛型类型
42 | {
43 | return false;
44 | }
45 |
46 | if (type.IsDefined(typeof(NonControllerAttribute), false)) //标记了[NonController]特性,排除
47 | {
48 | return false;
49 | }
50 |
51 | return typeof(IDynamicApiController).IsAssignableFrom(type);
52 | }
53 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/DynamicApiController/Providers/DynamicApiControllerFeatureProvider.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc.Controllers;
2 | using System.Reflection;
3 |
4 | namespace MalusAdmin.Common;
5 |
6 | ///
7 | /// 自定义控制器特性提供程序,用于动态识别和注册API控制器
8 | ///
9 | public class DynamicApiControllerFeatureProvider : ControllerFeatureProvider
10 | {
11 | protected override bool IsController(TypeInfo typeInfo)
12 | {
13 | return ControllerSelector.IsDynamicApiController(typeInfo);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/JsonOptions/AddNewtonsoftJson.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Newtonsoft.Json.Serialization;
3 |
4 | public static class JsonCollectionExtensions
5 | {
6 | ///
7 | /// 添加默认 Json 序列化/反序列化 配置
8 | ///
9 | ///
10 | ///
11 | //[Obsolete("不在使用")]
12 | public static IServiceCollection AddJsonOptions(this IServiceCollection services, Action? setupAction = null)
13 | {
14 |
15 | // 配置 JsonOptions
16 | services.AddControllers()
17 | .AddNewtonsoftJson(options =>
18 | {
19 | // 首字母小写(驼峰样式)
20 | options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
21 | // 时间格式化
22 | options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
23 | // 忽略循环引用
24 | options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
25 | // 忽略空值
26 | //options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
27 | });
28 |
29 | return services;
30 | }
31 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/JsonOptions/SystemTextJson/AddJsonOptions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Text.Encodings.Web;
6 | using System.Text.Json.Serialization;
7 | using System.Text.Json;
8 | using System.Text.Unicode;
9 | using System.Threading.Tasks;
10 | using Microsoft.Extensions.DependencyInjection;
11 | using MalusAdmin.Common.Components.SystemTextJson;
12 | using Microsoft.Extensions.Options;
13 |
14 | namespace MalusAdmin.Common.Components.JsonOptionsExtensions
15 | {
16 | public static class JsonOptionsExtensions
17 | {
18 | public static IServiceCollection AddTextJsonOptions(this IServiceCollection services,
19 | Action? setupAction = null)
20 | {
21 |
22 |
23 | // 配置 JsonOptions
24 | services.Configure(options =>
25 | {
26 | // 内部函数 配置 JsonSerializerOptions
27 | JsonSerializerOptions ConfigureJsonOptions(JsonSerializerOptions options)
28 | {
29 | // 驼峰命名
30 | options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
31 |
32 | // Unicode 编码
33 | options.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
34 |
35 | // 忽略循环引用
36 | // https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json-preserve-references
37 | options.ReferenceHandler = ReferenceHandler.IgnoreCycles;
38 |
39 | // 自定义 Converter
40 | options.Converters.Add(new DateTimeJsonConverter());
41 | options.Converters.Add(new EnumJsonConverter());
42 |
43 | // 如果传入自定义配置
44 | if (setupAction != null) setupAction(options);
45 |
46 | return options;
47 | }
48 |
49 | });
50 |
51 |
52 | return services;
53 | }
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/LogoExtension/LogoExtension.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 |
3 | namespace MalusAdmin.Common.Components;
4 |
5 | public static class LogoExtension
6 | {
7 | public static void AddLogo(this IServiceCollection services)
8 | {
9 | Console.ForegroundColor = ConsoleColor.Blue;
10 | //var contentTpl = JnHelper.ReadTemplate("", "logo.txt");
11 | //var filePath = "wwwroot/logo.txt";
12 | // 使用StreamReader打开文件
13 | // using (var reader = new StreamReader(filePath))
14 | // {
15 | // string line;
16 | // // 逐行读取文件内容
17 | // while ((line = reader.ReadLine()) != null) Console.WriteLine(line);
18 | // }
19 |
20 | string content = " __ __ _ _ _ \n | \\/ | | | " +
21 | " /\\ | | (_) \n | \\ / | __ _ | | _ _ ___ / \\ " +
22 | " __| | _ __ ___ _ _ __ \n | |\\/| | / _` || || | | |/ __| / /\\ \\ / _` || '_ ` _ \\ | || '_ \\ \n | | " +
23 | " | || (_| || || |_| |\\__ \\ / ____ \\| (_| || | | | | || || | | |\n |_| |_| \\__,_||_| \\__,_||___//_/ " +
24 | " \\_\\\\__,_||_| |_| |_||_||_| |_|\n "; // 你的多行字符串
25 |
26 | // 使用 Split 方法按换行符分割字符串
27 | string[] lines = content.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
28 |
29 | // 遍历每一行并打印
30 | foreach (string line in lines)
31 | {
32 | if (!string.IsNullOrEmpty(line))
33 | {
34 | Console.WriteLine(line);
35 | }
36 | }
37 | //Console.WriteLine(content);
38 | Console.ForegroundColor = ConsoleColor.Blue;
39 | Console.WriteLine("欢迎使用MalusAdmin 后台权限管理系统");
40 | Console.WriteLine("文档地址:https://www.dotnetshare.com");
41 | Console.WriteLine("在线体验:https://malus.dotnetshare.com");
42 | Console.ForegroundColor = ConsoleColor.White;
43 | }
44 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/RabbitMq/AddEasyNetQExtension.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using Microsoft.Extensions.DependencyInjection;
7 | using Microsoft.Extensions.Hosting;
8 |
9 | namespace MalusAdmin.Common.Components
10 | {
11 | public static class EasyNetQExtension
12 | {
13 | //
14 | //
15 | public static IServiceCollection AddEasyNetQExtension(this IServiceCollection services)
16 | {
17 | var RabbitMqConnetion = App.Configuration["RabbitMqConnetion"]?.ToString();
18 | if (RabbitMqConnetion == null) throw new NullReferenceException("配置读取失败");
19 |
20 | services.RegisterEasyNetQ(RabbitMqConnetion);
21 |
22 | services.AddTransient();
23 |
24 | services.AddTransient();
25 | //添加消息处理
26 | services.AddHostedService();
27 |
28 | return services;
29 | }
30 |
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/RabbitMq/EasyNetQ/MQSubscribe.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using EasyNetQ;
7 | using MalusAdmin.Repository.Model;
8 |
9 | namespace MalusAdmin.Common.Components
10 | {
11 | public class MQSubscribe
12 | {
13 | // MQ消息总线
14 | private readonly IBus bus;
15 | private readonly ISqlSugarClient db;
16 | public MQSubscribe(IBus bus,ISqlSugarClient db)
17 | {
18 | this.bus = bus;
19 | this.db = db;
20 | }
21 |
22 | ///
23 | /// 处理消息的总入口
24 | ///
25 | ///
26 | public Task Init()
27 | {
28 |
29 | SubscribeTSysLogVis();
30 | //程序不结束,等待输入
31 | Console.WriteLine($"已启动(处理消息) {DateTime.UtcNow}");
32 |
33 | return Task.CompletedTask;
34 | }
35 |
36 | private Task SubscribeTSysLogVis()
37 | {
38 | var advancedBus = bus.Advanced;
39 | //订阅TSysLogVis日志 - 请不要在两次发布之间重复使用它
40 | var queue = advancedBus.QueueDeclare("TSysLogVis");
41 |
42 | advancedBus.Consume(queue, async (body, properties, info) =>
43 | {
44 | try
45 | {
46 | var message = Encoding.UTF8.GetString(body.ToArray());
47 | var data = JsonConvert.DeserializeObject(message);
48 | Console.WriteLine($"消息处理 {DateTime.Now} : {JsonConvert.SerializeObject(message)}");
49 | db.Insertable(data).SplitTable().ExecuteReturnSnowflakeId();
50 | }
51 | catch (Exception ex)
52 | {
53 | // 处理异常,例如记录日志或重新抛出
54 | Console.Error.WriteLine($"处理消息时发生异常: {ex}");
55 | }
56 | });
57 |
58 | return Task.CompletedTask;
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/RabbitMq/EasyNetQ/SubscribeWorker.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using Microsoft.Extensions.Hosting;
7 |
8 | namespace MalusAdmin.Common.Components
9 | {
10 | public class SubscribeWorker : BackgroundService
11 | {
12 | private readonly MQSubscribe _Service;
13 |
14 | public SubscribeWorker(MQSubscribe Service)
15 | {
16 | _Service = Service;
17 | }
18 |
19 | // 执行逻辑
20 | protected override async Task ExecuteAsync(CancellationToken stoppingToken)
21 | {
22 | await _Service.Init();
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Sqlsugar/PageParamBase.cs:
--------------------------------------------------------------------------------
1 | ///
2 | ///通用分页输入参数
3 | ///
4 | public class PageParamBase
5 | {
6 | ///
7 | ///搜索值
8 | ///
9 | public string? KeyWord { get; set; }
10 |
11 | ///
12 | ///当前页码
13 | ///
14 | public int PageNo { get; set; } = 1;
15 |
16 | ///
17 | ///页码容量
18 | ///
19 | public int PageSize { get; set; } = 20;
20 |
21 | ///
22 | ///搜索开始时间
23 | ///
24 | public string? SearchBeginTime { get; set; }
25 |
26 | ///
27 | ///搜索结束时间
28 | ///
29 | public string? SearchEndTime { get; set; }
30 |
31 | ///
32 | ///排序字段
33 | ///
34 | public string? SortField { get; set; }
35 |
36 | ///
37 | ///排序方法,默认升序,否则降序(配合antd前端,约定参数为 Ascend,Dscend)
38 | ///
39 | public string? SortOrder { get; set; }
40 |
41 | ///
42 | ///降序排序(不要问我为什么是descend不是desc,前端约定参数就是这样)
43 | ///
44 | public virtual string DescStr { get; set; } = "descend";
45 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Swagger/SwaggerConfiguration.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using Microsoft.Extensions.DependencyInjection;
7 | using Microsoft.OpenApi.Models;
8 | using Swashbuckle.AspNetCore.SwaggerGen;
9 |
10 | namespace MalusAdmin.Common.Components.Swagger
11 | {
12 | public static class SwaggerConfiguration
13 | {
14 | public static OpenApiSecurityScheme Scheme => new OpenApiSecurityScheme
15 | {
16 | In = ParameterLocation.Header,
17 | Description = "在下面输入框输入Token,不用输入Bearer[空格] ",
18 | Name = "Authorization",
19 | Type = SecuritySchemeType.Http,
20 | BearerFormat = "JWT",
21 | Scheme = "Bearer",
22 | Reference = new OpenApiReference
23 | {
24 | Id = "Bearer",
25 | Type = ReferenceType.SecurityScheme,
26 | },
27 | };
28 |
29 | public static void Configure(SwaggerGenOptions option)
30 | {
31 | option.ResolveConflictingActions(apiDesc => apiDesc.First());
32 | option.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" });
33 | option.AddSecurityDefinition(Scheme.Reference.Id, Scheme);
34 |
35 | option.AddSecurityRequirement(new OpenApiSecurityRequirement
36 | {
37 | { Scheme, Array.Empty() },
38 | });
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Swagger/SwaggerDocConfiguration.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using Microsoft.Extensions.DependencyInjection;
7 | using Microsoft.Extensions.Options;
8 | using Microsoft.OpenApi.Models;
9 | using Swashbuckle.AspNetCore.SwaggerGen;
10 |
11 | namespace MalusAdmin.Common.Components.Swagger
12 | {
13 | public static class SwaggerDocConfiguration
14 | {
15 | public static void Configure(SwaggerGenOptions options)
16 | {
17 | options.SwaggerDoc("vdefault", new OpenApiInfo { Title = "Default API", Version = "v1" });
18 |
19 | var basePath = AppContext.BaseDirectory;
20 |
21 | // 获取根目录下,所有 xml 完整路径(注:并不会获取二级目录下的文件)
22 | var directoryInfo = new DirectoryInfo(basePath);
23 | var xmls = directoryInfo
24 | .GetFiles()
25 | .Where(f => f.Name.ToLower().EndsWith(".xml"))
26 | .Select(f => f.FullName)
27 | .ToList();
28 |
29 | // 添加注释文档
30 | foreach (var xml in xmls) options.IncludeXmlComments(xml, true);
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Swagger/SwaggerGroupConfiguration.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using Microsoft.AspNetCore.Mvc.ApiExplorer;
7 | using Microsoft.Extensions.DependencyInjection;
8 | using Microsoft.Extensions.Options;
9 | using Microsoft.OpenApi.Models;
10 | using Swashbuckle.AspNetCore.SwaggerGen;
11 |
12 | namespace MalusAdmin.Common.Components.Swagger
13 | {
14 | public class SwaggerGroup : IConfigureOptions
15 | {
16 | private readonly IApiDescriptionGroupCollectionProvider _provider;
17 |
18 | // 通过构造函数注入 IApiDescriptionGroupCollectionProvider
19 | public SwaggerGroup(IApiDescriptionGroupCollectionProvider provider)
20 | {
21 | _provider = provider;
22 | }
23 |
24 | public void Configure(SwaggerGenOptions options)
25 | {
26 | // 为每个 API 描述组创建一个 Swagger 文档
27 | foreach (var group in _provider.ApiDescriptionGroups.Items)
28 | {
29 | if (!string.IsNullOrEmpty(group.GroupName))
30 | options.SwaggerDoc(group.GroupName, new OpenApiInfo
31 | {
32 | Title = $"{group.GroupName} API",
33 | Version = group.GroupName,
34 | Description = $"Documentation for {group.GroupName} version of the API"
35 | });
36 | }
37 |
38 | // 为没有明确分组的控制器创建默认分组
39 | options.SwaggerDoc("Default", new OpenApiInfo
40 | {
41 | Title = "Default API",
42 | Version = "Default",
43 | Description = "Default API documentation for unspecified versions"
44 | });
45 |
46 | options.OrderActionsBy(a => a.GroupName);
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Swagger/SwaggerSetup.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Common.Components;
2 | using MalusAdmin.Common.Components.Swagger;
3 | using Microsoft.AspNetCore.Mvc.ApiExplorer;
4 | using Microsoft.Extensions.DependencyInjection;
5 | using Microsoft.Extensions.Options;
6 | using Microsoft.OpenApi.Models;
7 | using Swashbuckle.AspNetCore.SwaggerGen;
8 |
9 | namespace MalusAdmin.Common;
10 |
11 | public static class SwaggerSetup
12 | {
13 | public static IServiceCollection AddSwaggerBaseSetup(this IServiceCollection services)
14 | {
15 | //默认文档
16 | services.AddSwaggerGen(SwaggerDocConfiguration.Configure);
17 | //JWT配置
18 | services.AddSwaggerGen(SwaggerConfiguration.Configure);
19 | //文档分组
20 | services.AddTransient, SwaggerGroup>();
21 |
22 | // 其他配置
23 | Action defaultSetupAction = options =>
24 | {
25 |
26 | };
27 |
28 | // 注册 Swagger 并添加默认配置
29 | services.AddSwaggerGen(defaultSetupAction);
30 |
31 |
32 | return services;
33 | }
34 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Components/Swagger/UseSwaggerExtension.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Builder;
2 | using Microsoft.AspNetCore.Mvc.ApiExplorer;
3 | using Swashbuckle.AspNetCore.SwaggerUI;
4 |
5 | namespace MalusAdmin.Common.Components;
6 |
7 | public static class SwaggerExtension
8 | {
9 | ///
10 | /// app.use
11 | ///
12 | ///
13 | public static void UseSwaggerExtension(this IApplicationBuilder app)
14 | {
15 | app.UseSwagger();
16 | app.UseSwaggerUI(c =>
17 | {
18 | // 获取 IApiDescriptionGroupCollectionProvider 服务
19 | var provider = App.GetService();
20 |
21 | // 遍历所有API描述组
22 | foreach (var descriptionGroup in provider.ApiDescriptionGroups.Items)
23 | {
24 | if (descriptionGroup.GroupName is null)
25 | // 为默认分组设置端点
26 | c.SwaggerEndpoint("/swagger/vdefault/swagger.json", "Default API");
27 | else
28 | // 为每个分组指定Swagger文档和标题
29 | c.SwaggerEndpoint($"/swagger/{descriptionGroup.GroupName}/swagger.json",
30 | descriptionGroup.GroupName);
31 | }
32 | //指定Swagger JSON文件的终结点,用于加载和显示API文档。
33 |
34 | //指定swagger文档的启动目录 。默认为swagger
35 | //可以通过设置为空字符串来让Swagger UI直接在根路径下进行访问
36 | //c.RoutePrefix = string.Empty;
37 |
38 | //设置默认的接口文档展开方式,可选值包括None、List和Full。
39 | //默认值为None,表示不展开接口文档;
40 | //List表示只展开接口列表;
41 | //Full表示展开所有接口详情
42 | c.DocExpansion(DocExpansion.None); // 设置为完整模式
43 |
44 | c.DisplayRequestDuration();
45 | c.EnablePersistAuthorization();
46 |
47 | });
48 | }
49 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Constant/AppUserConst.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace MalusAdmin.Common.Constant
8 | {
9 | public class AppUserConst
10 | {
11 |
12 | public static string UserId = "UserId";
13 |
14 | public static string UserAccount = "UserAccount";
15 |
16 | public static string IsSuperAdmin = "IsSuperAdmin";
17 |
18 | public static string UserRolesId = "UserRolesId";
19 |
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Constant/AuthConstants.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace MalusAdmin.Common
8 | {
9 | public class AuthConstants
10 | {
11 | public const string AuthPolicyName = "Permission";
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Constant/CacheConstant.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | ///
8 | /// 缓存常量
9 | ///
10 | public static class CacheConstant
11 | {
12 | public const string UserToken = "UserToken:";
13 |
14 | public const string OnlineUser = "OnlineUser:";
15 |
16 | public const string AllButtonPermiss = "AllButtonPermiss";
17 |
18 | public const string UserMenus = "UserMenus:";
19 |
20 | public const string UserButton = "UserButton:";
21 | }
22 |
23 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Constant/TokenConstant.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Common;
2 |
3 | ///
4 | /// 缓存常量
5 | ///
6 | public static class TokenConstant
7 | {
8 | ///
9 | /// 60分钟内无操作
10 | ///
11 | public static int TokenExpiresTime = 60 * 4;
12 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/GlobalUsings.cs:
--------------------------------------------------------------------------------
1 | global using System;
2 | global using System.Text.Json;
3 | global using System.Linq;
4 | global using System.Text;
5 | global using System.Threading.Tasks;
6 | global using System.Collections.Generic;
7 | global using Microsoft.AspNetCore.Mvc;
8 | global using Microsoft.AspNetCore.Http;
9 | global using SqlSugar;
10 | global using Newtonsoft.Json;
11 |
12 | //global using MalusAdmin.;
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Helper/Encryption/Md5Util.cs:
--------------------------------------------------------------------------------
1 | using System.Security.Cryptography;
2 |
3 | namespace MalusAdmin.Encryption;
4 |
5 | public class Md5Util
6 | {
7 | ///
8 | /// MD5加密
9 | ///
10 | ///
11 | ///
12 | public static byte[] Encrypt(byte[] data)
13 | {
14 | var md5Provider = new MD5CryptoServiceProvider();
15 | return md5Provider.ComputeHash(data);
16 | }
17 |
18 | ///
19 | /// MD5加密字符串
20 | ///
21 | ///
22 | ///
23 | public static string Encrypt(string data)
24 | {
25 | var bytes = Encrypt(Encoding.UTF8.GetBytes(data));
26 | var result = new StringBuilder();
27 | for (var i = 0; i < bytes.Length; i++)
28 | //x2为小写,X2为大写
29 | result.Append(bytes[i].ToString("X2"));
30 | return result.ToString();
31 | }
32 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Helper/Encryption/ShaUtil.cs:
--------------------------------------------------------------------------------
1 | using System.Security.Cryptography;
2 |
3 | namespace MalusAdmin.Encryption;
4 |
5 | public class ShaUtil
6 | {
7 | public enum ShaType
8 | {
9 | SHA1,
10 | SHA256,
11 | SHA384,
12 | SHA512
13 | }
14 |
15 | public static byte[] Encrypt(byte[] data, ShaType shaType)
16 | {
17 | HashAlgorithm ShaProvider = new SHA256CryptoServiceProvider();
18 | switch (shaType)
19 | {
20 | case ShaType.SHA1:
21 | ShaProvider = new SHA1CryptoServiceProvider();
22 | break;
23 | case ShaType.SHA256:
24 | ShaProvider = new SHA256CryptoServiceProvider();
25 | break;
26 | case ShaType.SHA384:
27 | ShaProvider = new SHA384CryptoServiceProvider();
28 | break;
29 | case ShaType.SHA512:
30 | ShaProvider = new SHA512CryptoServiceProvider();
31 | break;
32 | }
33 |
34 | return ShaProvider.ComputeHash(data);
35 | }
36 |
37 | public static string Encrypt(string data, ShaType shaType)
38 | {
39 | var bytes = Encrypt(Encoding.UTF8.GetBytes(data), shaType);
40 | var result = new StringBuilder();
41 | for (var i = 0; i < bytes.Length; i++)
42 | //x2为小写,X2为大写
43 | result.Append(bytes[i].ToString("X2"));
44 | return result.ToString();
45 | }
46 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Helper/HttpHelper.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Common;
2 |
3 | public static class HttpHelper
4 | {
5 | ///
6 | /// 获取完整请求地址
7 | ///
8 | ///
9 | ///
10 | public static string GetRequestUrlAddress(this HttpRequest request)
11 | {
12 | return new StringBuilder()
13 | .Append(request.Scheme).Append("://").Append(request.Host)
14 | .Append(request.PathBase.ToString())
15 | .Append(request.Path.ToString())
16 | .Append(request.QueryString)
17 | .ToString();
18 | }
19 |
20 |
21 | ///
22 | /// 获取请求的ip4
23 | ///
24 | ///
25 | ///
26 | public static string GetRequestIPv4(this HttpContext context)
27 | {
28 | var ip = string.Empty;
29 | if (context.Connection.RemoteIpAddress != null)
30 | {
31 | if (context.Request.Headers.ContainsKey("X-Real-IP"))
32 | ip = context.Request.Headers["X-Real-IP"].FirstOrDefault() ?? "";
33 | if (context.Request.Headers.ContainsKey("X-Forwarded-For"))
34 | ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault() ?? "";
35 | if (string.IsNullOrEmpty(ip)) ip = context.Connection.RemoteIpAddress?.MapToIPv4()?.ToString() ?? "";
36 | }
37 |
38 | return ip;
39 | }
40 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Helper/IOFileHelper.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Common.Helper;
2 |
3 | public static class IOFileHelper
4 | {
5 | ///
6 | /// 创建文件或者附加内容
7 | ///
8 | /// 文件路径
9 | /// 要写入的文本
10 | public static async Task Write(string filePath = "", string Data = "")
11 | {
12 | filePath = filePath.Contains("txt")
13 | ? filePath
14 | : "logs/" + filePath + DateTime.Now.ToString("yyyyMMdd") + ".log";
15 | var Encode = "UTF-8";
16 | Data = DateTime.Now + " :" + Data + "\n";
17 | try
18 | {
19 | //获取文件对象
20 | var file = new FileInfo(filePath);
21 | //判断文件夹是否创建
22 | if (!file.Directory.Exists) file.Directory.Create();
23 | //判断文件是否存在
24 | //或者判断文件属性是否只读,是只读的话将只读属性去掉
25 | if (!file.Exists)
26 | using (file.Create())
27 | {
28 | }
29 | else if (file.Attributes.ToString().IndexOf("ReadOnly") != -1) file.IsReadOnly = false;
30 |
31 | //将内容覆盖或者追加到文件的最后
32 | using (var writer = new StreamWriter(file.FullName, true, Encoding.GetEncoding(Encode)))
33 | {
34 | writer.Write(Data);
35 | writer.Flush();
36 | }
37 |
38 | return true;
39 | }
40 | catch (Exception ex)
41 | {
42 | Console.Write(ex.Message);
43 | return false;
44 | }
45 | }
46 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Helper/JsonHelper.cs:
--------------------------------------------------------------------------------
1 | using Newtonsoft.Json.Serialization;
2 |
3 | namespace MalusAdmin.Common;
4 |
5 | public static class JsonHelper
6 | {
7 | ///
8 | /// 字符串序列化对象
9 | ///
10 | ///
11 | ///
12 | ///
13 | public static T ToDeserializeObject(this string obj)
14 | {
15 | return JsonConvert.DeserializeObject(obj);
16 | }
17 |
18 | ///
19 | /// 对象转Json
20 | ///
21 | ///
22 | ///
23 | public static string ToJson(this object obj)
24 | {
25 | return JsonConvert.SerializeObject(obj);
26 | }
27 |
28 | ///
29 | ///
30 | ///
31 | ///
32 | ///
33 | public static string ToJson(this object obj, bool ContractResolver)
34 | {
35 | var settings = new JsonSerializerSettings
36 | {
37 | ContractResolver = new CamelCasePropertyNamesContractResolver()
38 | };
39 |
40 | return JsonConvert.SerializeObject(obj, settings);
41 | }
42 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Helper/ObjectHelper.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Common;
2 |
3 | public static class ObjectHelper
4 | {
5 | ///
6 | /// 检查 Object 是否为 NULL
7 | ///
8 | ///
9 | ///
10 | public static bool IsEmpty(this object value)
11 | {
12 | return value == null || string.IsNullOrEmpty(value.ToString());
13 | }
14 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Helper/ShellUtil.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics;
2 |
3 | namespace MalusAdmin.Common.Helper;
4 |
5 | public class ShellUtil
6 | {
7 | ///
8 | /// linux 系统命令
9 | ///
10 | ///
11 | ///
12 | public static string Bash(string command)
13 | {
14 | var escapedArgs = command.Replace("\"", "\\\"");
15 | var process = new Process
16 | {
17 | StartInfo = new ProcessStartInfo
18 | {
19 | FileName = "/bin/bash",
20 | Arguments = $"-c \"{escapedArgs}\"",
21 | RedirectStandardOutput = true,
22 | UseShellExecute = false,
23 | CreateNoWindow = true
24 | }
25 | };
26 | process.Start();
27 | var result = process.StandardOutput.ReadToEnd();
28 | process.WaitForExit();
29 | process.Dispose();
30 | return result;
31 | }
32 |
33 | ///
34 | /// windows系统命令
35 | ///
36 | ///
37 | ///
38 | ///
39 | public static string Cmd(string fileName, string args)
40 | {
41 | var output = string.Empty;
42 |
43 | var info = new ProcessStartInfo();
44 | info.FileName = fileName;
45 | info.Arguments = args;
46 | info.RedirectStandardOutput = true;
47 |
48 | using (var process = Process.Start(info))
49 | {
50 | output = process.StandardOutput.ReadToEnd();
51 | }
52 |
53 | return output;
54 | }
55 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/MalusAdmin - Backup.Common.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net7.0
5 | enable
6 | enable
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/MalusAdmin.Common.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0
5 | enable
6 | enable
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Middleware/RealIpMiddleware.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Net;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | ///
9 | /// 远程IP中间件,nginx代理服务的时候需要使用才能通过RemoteIpAddress获取客户端真实IP
10 | ///
11 | public class RealIpMiddleware
12 | {
13 | private readonly RequestDelegate _next;
14 |
15 | public RealIpMiddleware(RequestDelegate next)
16 | {
17 | _next = next;
18 | }
19 |
20 | public Task Invoke(HttpContext context)
21 | {
22 | var headers = context.Request.Headers;
23 | if (headers.TryGetValue("X-Forwarded-For", out var header))
24 | {
25 | context.Connection.RemoteIpAddress = IPAddress.Parse(header.ToString()
26 | .Split(',', StringSplitOptions.RemoveEmptyEntries)[0]);
27 | }
28 |
29 | return _next(context);
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Model/AuthenticationMethod.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | public enum AuthenticationMethod
8 | {
9 | Guid,
10 | Jwt
11 | }
12 |
13 |
14 | public static class AuthenticationSettings
15 | {
16 | //身份认证鉴权方式[jwt,guid]
17 | public const AuthenticationMethod CurrentAuthenticationMethod = AuthenticationMethod.Guid;
18 |
19 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Model/TokenData.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Common;
2 |
3 |
4 |
5 | ///
6 | /// redis 存放的数据
7 | ///
8 | public class TokenData
9 | {
10 | public int UserId { get; set; }
11 |
12 | public string UserName { get; set; }
13 |
14 | public string UserAccount { get; set; }
15 |
16 | public bool IsSuperAdmin { get; set; }
17 |
18 | public List UserRolesId { get; set; }
19 |
20 | public List UserPermiss { get; set; }
21 |
22 | public DateTime? LoginTime { get; set; }
23 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Common/Model/XnPageResult.cs:
--------------------------------------------------------------------------------
1 | ///
2 | /// 分页返回
3 | ///
4 | ///
5 | public class PageResult
6 | {
7 | public int Page { get; set; }
8 | public int PageSize { get; set; }
9 | public int TotalPage { get; set; }
10 | public int Total { get; set; }
11 | public ICollection Rows { get; set; }
12 | }
13 |
14 | ///
15 | /// Scui分页
16 | ///
17 | public static class XnPageResult
18 | {
19 | ///
20 | /// 替换sqlsugar分页
21 | ///
22 | ///
23 | ///
24 | public static dynamic XnPagedResult(this SqlSugarPagedList page)
25 | {
26 | return new
27 | {
28 | Page = page.PageIndex,
29 | page.PageSize,
30 | TotalPage = page.TotalPages,
31 | Total = page.TotalCount,
32 | Rows = page.Items
33 | };
34 | }
35 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/GlobalUsings.cs:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/MalusApi/MalusAdmin.Repository/GlobalUsings.cs
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/MalusAdmin.Repository.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0
5 | enable
6 | enable
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/Business/BsBingWallpaper.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | [SugarTable("bs_bingwallpaper")]
6 | public class BsBingWallpaper
7 | {
8 | [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]
9 | public int Id { get; set; }
10 |
11 | public string CopyRight { get; set; }
12 |
13 | [SugarColumn(IsNullable = true)] public string GitUrl { get; set; }
14 |
15 | ///
16 | /// 开始时间
17 | ///
18 | public DateTime StartDate { get; set; }
19 |
20 | public string Url { get; set; }
21 |
22 | public string MobileUrl { get; set; }
23 |
24 | public bool IsDeleted { get; set; }
25 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/Business/BsCustomer.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | ///
6 | /// 微信客户表
7 | ///
8 | [SugarTable("bs_customer")]
9 | public class BsCustomer
10 | {
11 | ///
12 | /// Desc:
13 | /// Default:
14 | /// Nullable:False
15 | ///
16 | [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
17 | public int UserID { get; set; }
18 |
19 | ///
20 | /// Desc:微信OpenID
21 | /// Default:
22 | ///
23 | public string OpenID { get; set; }
24 |
25 | ///
26 | /// Desc:微信昵称
27 | /// Default:
28 | /// Nullable:True
29 | ///
30 | public string? NickName { get; set; }
31 |
32 | ///
33 | /// Desc:真实姓名
34 | /// Default:
35 | /// Nullable:True
36 | ///
37 | public string? RealName { get; set; }
38 |
39 | ///
40 | /// Desc:头像
41 | /// Default:
42 | /// Nullable:True
43 | ///
44 | public string? AvatarUrl { get; set; }
45 |
46 | ///
47 | /// Desc:创建时间
48 | /// Default:DateTime.Now
49 | /// Nullable:True
50 | ///
51 | public DateTime? CreatedDate { get; set; }
52 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/Business/BsCustomerCollect.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | ///
6 | /// 用户喜欢表
7 | ///
8 | [SugarTable("bs_customer_collect")]
9 | public class BsCustomerCollect
10 | {
11 | ///
12 | /// Desc:
13 | /// Default:
14 | /// Nullable:False
15 | ///
16 | [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
17 | public int CollectID { get; set; }
18 |
19 | ///
20 | /// Desc:
21 | /// Default:
22 | /// Nullable:True
23 | ///
24 | public int UserID { get; set; }
25 |
26 | ///
27 | ///
28 | public int ImagesID { get; set; }
29 |
30 | public bool IsLike { get; set; }
31 |
32 | ///
33 | /// Desc:
34 | /// Default:
35 | /// Nullable:True
36 | ///
37 | public DateTime? CreatedTime { get; set; }
38 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/Business/BsGallery.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | ///
6 | /// 壁纸库
7 | ///
8 | [SugarTable("bs_gallery", TableDescription = "")]
9 | public class BsGallery
10 | {
11 | ///
12 | /// 父id
13 | ///
14 | [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
15 | public int ImagesID { get; set; }
16 |
17 | public string ImagesURL { get; set; }
18 | public decimal ImagesWide { get; set; }
19 | public decimal ImagesHeiget { get; set; }
20 | public decimal ImagesSize { get; set; }
21 | public string Type { get; set; }
22 | public bool VerticalScreen { get; set; }
23 | public bool IsDelete { get; set; }
24 | public DateTime UpdateTime { get; set; }
25 | public int Praise { get; set; }
26 | public int DisLike { get; set; }
27 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/Business/BsMiniappsiteLink.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | ///
6 | /// 小程序友链表
7 | ///
8 | [SugarTable("bs_miniappsitelink")]
9 | public class BsMiniappsiteLink
10 | {
11 | ///
12 | /// Desc:
13 | /// Default:
14 | /// Nullable:False
15 | ///
16 | [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
17 | public int MiniAppSiteLinkId { get; set; }
18 |
19 | ///
20 | /// Desc:
21 | /// Default:
22 | /// Nullable:True
23 | ///
24 | public string MiniAppId { get; set; }
25 |
26 | ///
27 | /// 小程序链接
28 | ///
29 | public string MiniAppUrl { get; set; }
30 |
31 | ///
32 | /// Desc:小程序名称
33 | /// Default:
34 | /// Nullable:True
35 | ///
36 | public string MiniAppName { get; set; }
37 |
38 | ///
39 | /// 跳转路径
40 | /// Default:
41 | /// Nullable:True
42 | ///
43 | [SugarColumn(IsNullable = true)]
44 | public string Path { get; set; }
45 |
46 |
47 | ///
48 | /// Desc:
49 | /// Default:0
50 | /// Nullable:False
51 | ///
52 | public bool IsDeleted { get; set; }
53 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/Business/BsWxConfig.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | [SugarTable("bs_wechatconfig")]
6 | public class BsWxConfig
7 | {
8 | ///
9 | /// 小程序的appid
10 | ///
11 | [SugarColumn(IsPrimaryKey = true)]
12 | public string WechatAppID { get; set; }
13 |
14 | ///
15 | /// 小程序的servere
16 | ///
17 | public string WechatAppSecret { get; set; }
18 |
19 | ///
20 | /// 小程序的名称
21 | ///
22 | public string WechatAppName { get; set; }
23 |
24 | ///
25 | /// Token
26 | ///
27 | public string AccessToken { get; set; }
28 |
29 | ///
30 | /// 过期时间(秒),提前一个小时过期。每小时去拿一次
31 | ///
32 | public int ExpireTime { get; set; }
33 |
34 | ///
35 | /// 更新时间
36 | ///
37 | public DateTime UpTime { get; set; }
38 |
39 | ///
40 | /// 下次过期时间
41 | ///
42 | public DateTime NextUpTime { get; set; }
43 |
44 | ///
45 | /// 返回的信息
46 | ///
47 | public string Res { get; set; }
48 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/ModelBase.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 | ///
5 | /// 实体的基类
6 | ///
7 | public class ModelBase
8 | {
9 | ///
10 | /// 系统字段-创建人
11 | ///
12 | [SugarColumn(ColumnName = "SysCreateUser")]
13 | public int SysCreateUser { get; set; }
14 |
15 | ///
16 | /// 系统字段-创建时间
17 | /// 默认值:CURRENT_TIMESTAMP
18 | ///
19 | [SugarColumn(ColumnName = "SysCreateTime", InsertServerTime = true, IsOnlyIgnoreInsert = true,IsIgnore = true)]
20 | public DateTime SysCreateTime { get; set; }
21 |
22 | ///
23 | /// 系统字段-修改人
24 | ///
25 | [SugarColumn(ColumnName = "SysUpdateUser")]
26 | public int SysUpdateUser { get; set; }
27 |
28 | ///
29 | ///系统字段-修改时间
30 | /// 默认值:CURRENT_TIMESTAMP
31 | ///
32 | [SugarColumn(ColumnName = "SysUpdateTime", UpdateServerTime = true, IsOnlyIgnoreInsert = true,IsIgnore = true)]
33 | public DateTime SysUpdateTime { get; set; }
34 |
35 | /////
36 | /////系统字段-删除人
37 | /////
38 | //[SugarColumn(ColumnName = "SysDeleteUser")]
39 | //public int SysDeleteUser { get; set; }
40 |
41 | /////
42 | ///// 系统字段-删除时间
43 | /////
44 | //[SugarColumn(ColumnName = "SysDeleteTime",UpdateServerTime = true, IsOnlyIgnoreInsert = true,IsIgnore = true)]
45 | //public DateTime SysDeleteTime { get; set; }
46 |
47 | ///
48 | /// 系统字段-删除标记
49 | /// 默认值:0
50 | ///
51 | [SugarColumn(ColumnName = "SysIsDelete", DefaultValue = "0")]
52 | public bool SysIsDelete { get; set; }
53 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/System/TBsSysConfig.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | ///
6 | ///参数配置表
7 | ///
8 | [SugarTable("t_sys_config")]
9 | public class TBsSysConfig
10 | {
11 | ///
12 | ///Desc:
13 | ///Default:
14 | ///Nullable:False
15 | ///
16 | [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
17 | public int ConfigID { get; set; }
18 |
19 | ///
20 | ///Desc:参数key
21 | ///Default:
22 | ///Nullable:True
23 | ///
24 | public string? ConfigKey { get; set; }
25 |
26 |
27 | ///
28 | ///参数类型
29 | ///
30 | public string? ConfigType { get; set; }
31 |
32 | ///
33 | ///Desc:参数值
34 | ///Default:
35 | ///Nullable:True
36 | ///
37 | public string? ConfigValue { get; set; }
38 |
39 | ///
40 | ///Desc:
41 | ///Default:
42 | ///Nullable:True
43 | ///
44 | public string? ConfigDescribe { get; set; }
45 |
46 | ///
47 | ///Desc:
48 | ///Default:0
49 | ///Nullable:True
50 | ///
51 | public bool? IsDeleted { get; set; }
52 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/System/TSysLogErr.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | ///
6 | /// 操作日志表
7 | ///
8 | [SplitTable(SplitType.Month)]
9 | [SugarTable("sys_log_err_{year}{month}{day}")]
10 | public class TSysLogErr
11 | {
12 | ///
13 | /// 主键Id
14 | ///
15 | [SugarColumn(ColumnDescription = "Id主键", IsPrimaryKey = true)]
16 | public virtual long Id { get; set; }
17 |
18 | ///
19 | /// 异常类型
20 | ///
21 | [SugarColumn(Length = 100)]
22 | public string ExceptionType { get; set; }
23 |
24 | ///
25 | ///操作方法名称
26 | ///
27 | [SugarColumn(Length = 100)]
28 | public string ActionName { get; set; }
29 |
30 |
31 | ///
32 | ///日志消息
33 | ///
34 | public string Message { get; set; }
35 |
36 |
37 | ///
38 | ///日志时间
39 | ///
40 | [SugarColumn(IsNullable = true)]
41 | public DateTime LogDateTime { get; set; } = DateTime.Now;
42 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/System/TSysLogOp.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel;
2 | using SqlSugar;
3 |
4 | namespace MalusAdmin.Repository.Model;
5 | ///
6 | /// 操作日志表
7 | ///
8 | [SplitTable(SplitType.Month)]
9 | [SugarTable("sys_log_op_{year}{month}{day}")]
10 | [Description("操作日志表")]
11 | public class TSysLogOp
12 | {
13 | ///
14 | /// 主键Id
15 | ///
16 | [SugarColumn(ColumnDescription = "Id主键", IsPrimaryKey = true)]
17 | public long Id { get; set; }
18 |
19 | ///
20 | /// 日志类型
21 | ///
22 | [SugarColumn(Length = 100)]
23 | public string LogType { get; set; }
24 |
25 |
26 | ///
27 | /// 日志详情
28 | ///
29 | [SugarColumn(ColumnDataType = StaticConfig.CodeFirst_BigString)]
30 | public string Message { get; set; }
31 |
32 |
33 | ///
34 | /// 日志时间
35 | ///
36 | [SugarColumn(IsNullable = true)]
37 | public DateTime LogDateTime { get; set; } = DateTime.Now;
38 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/System/TSysOnlineUser.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel.DataAnnotations;
2 | using SqlSugar;
3 |
4 | namespace MalusAdmin.Repository.Model;
5 |
6 | [SugarTable("t_sys_onlineuser")]
7 | public class TSysOnlineUser
8 | {
9 | ///
10 | /// 主键
11 | ///
12 | [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
13 | public int Id { get; set; }
14 |
15 | ///
16 | /// 连接Id
17 | ///
18 | [SugarColumn(ColumnDescription = "连接Id")]
19 | public string? ConnectionId { get; set; }
20 |
21 | ///
22 | /// 用户Id
23 | ///
24 | [SugarColumn(ColumnDescription = "用户Id")]
25 | public long UserId { get; set; }
26 |
27 | ///
28 | /// 账号
29 | ///
30 | [SugarColumn(ColumnDescription = "账号", Length = 32)]
31 | [Required]
32 | [MaxLength(32)]
33 | public virtual string UserName { get; set; }
34 |
35 | ///
36 | /// 真实姓名
37 | ///
38 | [SugarColumn(ColumnDescription = "真实姓名", Length = 32)]
39 | [MaxLength(32)]
40 | public string? RealName { get; set; }
41 |
42 | ///
43 | /// 连接时间
44 | ///
45 | [SugarColumn(ColumnDescription = "连接时间")]
46 | public DateTime? Time { get; set; }
47 |
48 | ///
49 | /// 连接IP
50 | ///
51 | [SugarColumn(ColumnDescription = "连接IP", Length = 256)]
52 | [MaxLength(256)]
53 | public string? Ip { get; set; }
54 |
55 | ///
56 | /// 浏览器
57 | ///
58 | [SugarColumn(ColumnDescription = "浏览器", Length = 128)]
59 | [MaxLength(128)]
60 | public string? Browser { get; set; }
61 |
62 | ///
63 | /// 操作系统
64 | ///
65 | [SugarColumn(ColumnDescription = "操作系统", Length = 128)]
66 | [MaxLength(128)]
67 | public string? Os { get; set; }
68 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/System/TSysRole.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | ///
6 | /// t_sys_role:数据库映射类
7 | ///
8 | [Serializable]
9 | [SugarTable("t_sys_role")]
10 | public class TSysRole : ModelBase
11 | {
12 | ///
13 | /// 主键
14 | ///
15 | [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
16 | public int Id { get; set; }
17 |
18 |
19 | ///
20 | /// 角色名称
21 | ///
22 | [SugarColumn(ColumnName = "Name")]
23 | public string Name { get; set; }
24 |
25 | ///
26 | /// 描述
27 | ///
28 | [SugarColumn(ColumnName = "Desc")]
29 | public string Desc { get; set; }
30 |
31 | ///
32 | /// 是否启用
33 | /// 默认值:1
34 | ///
35 | public int Status { get; set; }
36 |
37 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/System/TSysRoleMenu.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | ///
6 | /// 角色菜单表
7 | ///
8 | [SugarTable("t_sys_role_menu")]
9 | public class TSysRoleMenu : ModelBase
10 | {
11 | ///
12 | /// 主键
13 | ///
14 | [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
15 | public int Id { get; set; }
16 |
17 | ///
18 | /// 角色ID
19 | ///
20 | [SugarColumn(ColumnName = "RoleId")]
21 | public int RoleId { get; set; }
22 |
23 | ///
24 | /// 菜单ID
25 | ///
26 | [SugarColumn(ColumnName = "MenuId")]
27 | public int MenuId { get; set; }
28 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/System/TSysUser.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | ///
6 | /// t_sys_user:数据库映射类
7 | ///
8 | [Serializable]
9 | [SugarTable("t_sys_user")]
10 | public class TSysUser : ModelBase
11 | {
12 | ///
13 | /// 主键
14 | ///
15 | [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
16 | public int Id { get; set; }
17 |
18 | ///
19 | /// 登录账号
20 | ///
21 | [SugarColumn(ColumnName = "Account")]
22 | public string Account { get; set; }
23 |
24 | ///
25 | /// 用户名
26 | ///
27 | [SugarColumn(ColumnName = "Name")]
28 | public string Name { get; set; }
29 |
30 | ///
31 | /// 密码
32 | ///
33 | [SugarColumn(ColumnName = "PassWord")]
34 | public string PassWord { get; set; }
35 |
36 | ///
37 | /// 角色ID
38 | ///
39 | [SugarColumn(ColumnDescription = "角色IDs", IsJson = true)]
40 | public List UserRolesId { get; set; }
41 |
42 | ///
43 | /// 状态(10正常,00冻结)
44 | /// 默认值:10
45 | ///
46 | [SugarColumn(ColumnName = "Status", DefaultValue = "10")]
47 | public int Status { get; set; }
48 |
49 | ///
50 | /// 头像
51 | ///
52 | [SugarColumn(ColumnName = "Avatar")]
53 | public string Avatar { get; set; }
54 |
55 | ///
56 | /// 电话
57 | ///
58 | [SugarColumn(ColumnName = "Tel")]
59 | public string Tel { get; set; }
60 |
61 | ///
62 | /// 邮箱
63 | ///
64 | [SugarColumn(ColumnName = "Email")]
65 | public string Email { get; set; }
66 |
67 | ///
68 | /// 备注
69 | ///
70 | [SugarColumn(ColumnName = "Remark")]
71 | public string Remark { get; set; }
72 |
73 | ///
74 | /// 是否是超级管理员
75 | ///
76 | public bool IsSuperAdmin { get; set; }
77 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/System/TSysUserPermission.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | ///
6 | /// t_sys_user_button_permiss:数据库映射类
7 | ///
8 | [Serializable]
9 | [SugarTable("t_sys_role_permiss")]
10 | public class TSysRolePermission : ModelBase
11 | {
12 | ///
13 | /// 主键
14 | ///
15 | [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
16 | public int Id { get; set; }
17 |
18 | ///
19 | /// Desc:角色id
20 | /// Default:
21 | /// Nullable:False
22 | ///
23 | public int RoleId { get; set; }
24 |
25 | ///
26 | /// Desc:用户访问接口的权限
27 | /// Default:
28 | /// Nullable:False
29 | ///
30 | public string UserPermiss { get; set; }
31 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Repository/Model/System/TSysUserRole.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar;
2 |
3 | namespace MalusAdmin.Repository.Model;
4 |
5 | ///
6 | /// 用户角色表
7 | ///
8 | [SugarTable("t_sys_user_role")]
9 | public class TSysUserRole : ModelBase
10 | {
11 | ///
12 | /// 用户id
13 | ///
14 | public int UserId { get; set; }
15 |
16 | ///
17 | /// 角色id
18 | ///
19 | public int RoleId { get; set; }
20 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/Hub/IOnlineUserHub.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.Hub;
2 |
3 | public interface IOnlineUserHub
4 | {
5 | ///
6 | /// 在线用户列表
7 | ///
8 | ///
9 | ///
10 | Task OnlineUserList(object context);
11 |
12 | ///
13 | /// 强制下线
14 | ///
15 | ///
16 | ///
17 | Task ForceOffline(object context);
18 |
19 |
20 | ///
21 | /// 发布上线通知消息
22 | ///
23 | ///
24 | ///
25 | Task PublicNotice(string context);
26 |
27 | ///
28 | /// 接收消息
29 | ///
30 | ///
31 | ///
32 | Task ReceiveMessage(object context);
33 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysCache/ISysCacheService.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | ///
4 | /// 系统缓存服务接口
5 | ///
6 | public interface ISysCacheService
7 | {
8 | ///
9 | /// 获取所有缓存的key
10 | ///
11 | ///
12 | List GetAllKeys();
13 |
14 | ///
15 | /// 根据key获取缓存的value
16 | ///
17 | /// 缓存Key
18 | ///
19 | dynamic GetKeys(string key);
20 |
21 | ///
22 | /// 删除缓存
23 | ///
24 | /// 缓存Key
25 | ///
26 | Task RemoveAsync(string key);
27 | }
28 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysCache/SysCacheService.cs:
--------------------------------------------------------------------------------
1 | using ICacheService = MalusAdmin.Common.ICacheService;
2 |
3 | namespace MalusAdmin.Servers;
4 |
5 | public class SysCacheService: ISysCacheService
6 | {
7 | private readonly ICacheService _cacheService;
8 |
9 | public SysCacheService(ICacheService cacheService)
10 | {
11 | _cacheService = cacheService;
12 | }
13 |
14 | ///
15 | /// 获取所有缓存的key
16 | ///
17 | ///
18 | public List GetAllKeys()
19 | {
20 | return _cacheService.GetAllKeys();
21 | }
22 |
23 | ///
24 | /// 根据key获取缓存的value
25 | ///
26 | ///
27 | public dynamic GetKeys(string key)
28 | {
29 | return _cacheService.Get(key);
30 | }
31 |
32 |
33 | ///
34 | /// 删除缓存
35 | ///
36 | ///
37 | public async Task RemoveAsync(string key)
38 | {
39 | return await _cacheService.RemoveAsync(key);
40 | }
41 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysConfig/Dto/WechatConfigAddandUpIn.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | public class WechatConfigAddandUpIn
4 | {
5 | public int ConfigID { get; set; }
6 |
7 | ///
8 | /// Desc:
9 | /// Default:
10 | /// Nullable:True
11 | ///
12 | public string? ConfigKey { get; set; }
13 |
14 | ///
15 | /// Desc:
16 | /// Default:
17 | /// Nullable:True
18 | ///
19 | public string? ConfigValue { get; set; }
20 |
21 | ///
22 | /// 参数配置类型
23 | ///
24 | public string? ConfigType { get; set; }
25 |
26 | ///
27 | /// Desc:
28 | /// Default:
29 | /// Nullable:True
30 | ///
31 | public string? configDescribe { get; set; }
32 |
33 | ///
34 | /// Desc:
35 | /// Default:0
36 | /// Nullable:True
37 | ///
38 | public bool? IsDeleted { get; set; }
39 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysConfig/ISysConfigService.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 |
4 |
5 | ///
6 | /// 参数配置服务接口
7 | ///
8 | public interface ISysConfigService
9 | {
10 | ///
11 | /// 通过类型和key来返回配置值
12 | ///
13 | /// 配置Key
14 | /// 配置类型
15 | ///
16 | Task GetTypeKeyConfig(string key, string type);
17 |
18 | ///
19 | /// 配置分页
20 | ///
21 | /// 分页参数
22 | ///
23 | Task> PageList(PageParamBase input);
24 |
25 | ///
26 | /// 添加配置
27 | ///
28 | /// 配置输入参数
29 | ///
30 | Task Add(WechatConfigAddandUpIn input);
31 |
32 | ///
33 | /// 删除配置
34 | ///
35 | /// 配置ID
36 | ///
37 | Task Delete(int id);
38 |
39 | ///
40 | /// 更新配置
41 | ///
42 | /// 配置输入参数
43 | ///
44 | Task Update(WechatConfigAddandUpIn input);
45 | }
46 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysData/Dto/NuGetPackage.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | public class NuGetPackage
4 | {
5 | public string Name { get; set; }
6 | public string Version { get; set; }
7 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysData/Dto/ServerInfo.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Common.Helper;
2 |
3 | namespace MalusAdmin.Servers.SysData.Dto;
4 |
5 | ///
6 | /// 服务器信息类
7 | ///
8 | public class ServerInfo
9 | {
10 | public string MachineName { get; set; }
11 | public string OSName { get; set; }
12 | public string OSArchitecture { get; set; }
13 | public string DoNetName { get; set; }
14 | public string IP { get; set; }
15 | public int CpuCount { get; set; }
16 | public string UseRam { get; set; }
17 | public string StartTime { get; set; }
18 | public string RunTime { get; set; }
19 | public List DiskInfo { get; set; }
20 | public MemoryInfo MemoryInfo { get; set; }
21 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysData/ISysDataService.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers.SysData.Dto;
2 |
3 | namespace MalusAdmin.Servers;
4 |
5 | ///
6 | /// 系统数据服务接口
7 | ///
8 | public interface ISysDataService
9 | {
10 | ///
11 | /// 获取服务器信息
12 | ///
13 | ///
14 | Task GetServerInfo();
15 |
16 | ///
17 | /// 获取当前使用的Nuget包
18 | ///
19 | ///
20 | Task> GetNuGetPackages();
21 | }
22 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysData/SysDataService.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Common.Helper;
2 | using MalusAdmin.Servers.SysData.Dto;
3 |
4 | namespace MalusAdmin.Servers;
5 |
6 | public class SysDataService:ISysDataService
7 | {
8 | ///
9 | /// 获取服务器信息
10 | ///
11 | ///
12 | public async Task GetServerInfo()
13 | {
14 | var serverInfo = new ServerInfo
15 | {
16 | MachineName = ServerInfoUtil.MachineName,
17 | OSName = ServerInfoUtil.OSName,
18 | OSArchitecture = ServerInfoUtil.OSArchitecture,
19 | DoNetName = ServerInfoUtil.DoNetName,
20 | IP = ServerInfoUtil.IP[0],
21 | CpuCount = ServerInfoUtil.CpuCount,
22 | UseRam = ServerInfoUtil.UseRam,
23 | StartTime = ServerInfoUtil.StartTime,
24 | RunTime = ServerInfoUtil.RunTime,
25 | DiskInfo = ServerInfoUtil.DiskInfo,
26 | MemoryInfo = ServerInfoUtil.MemoryInfo
27 | };
28 |
29 | return serverInfo;
30 | }
31 |
32 | ///
33 | /// 获取当前使用的Nuget包
34 | ///
35 | ///
36 | public async Task> GetNuGetPackages()
37 | {
38 | //var runtimeDependencies = DependencyContext.Default.RuntimeLibraries;
39 | //var nuGetPackages = runtimeDependencies
40 | // //.Where(lib => lib.Type == "package" && lib.Dependencies.Any())
41 | // .Select(lib => new NuGetPackage
42 | // {
43 | // Name = lib.Name,
44 | // Version = lib.Version
45 | // });
46 |
47 | //return nuGetPackages.ToList();
48 | return new List
49 | {
50 | new NuGetPackage
51 | {
52 | Name = "MalusAdmin",
53 | Version = "1.0.0"
54 | }
55 | };
56 | }
57 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysLog/Dto/LogPageIn.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | public class SysLogPageIn : PageParamBase
4 | {
5 | ///
6 | /// 日志类型
7 | ///
8 | public string LogType { get; set; }
9 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysLog/ISysLogService.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 |
3 | namespace MalusAdmin.Servers;
4 |
5 | ///
6 | /// 日志服务接口
7 | ///
8 | public interface ISysLogService
9 | {
10 | ///
11 | /// 添加系统操作日志
12 | ///
13 | /// 日志类型
14 | /// 日志消息
15 | ///
16 | Task AddLog(string type, string Message);
17 |
18 | ///
19 | /// 获取访问日志分页列表
20 | ///
21 | /// 分页输入参数
22 | ///
23 | Task> VisPageList(SysLogPageIn input);
24 |
25 | ///
26 | /// 获取异常日志分页列表
27 | ///
28 | /// 分页输入参数
29 | ///
30 | Task> ErrPageList(SysLogPageIn input);
31 |
32 | ///
33 | /// 获取操作日志分页列表
34 | ///
35 | /// 分页输入参数
36 | ///
37 | Task> OpPageList(SysLogPageIn input);
38 | }
39 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysMenu/Dto/TSysMenu.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysMenu;
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysMenu/ISysMenuService.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers.SysMenu;
2 | using MalusAdmin.Servers.SysRole;
3 |
4 | namespace MalusAdmin.Servers;
5 |
6 | ///
7 | /// 菜单服务接口
8 | ///
9 | public interface ISysMenuService
10 | {
11 | ///
12 | /// 菜单树状查询
13 | ///
14 | ///
15 | Task> MenuTreeList();
16 |
17 | ///
18 | /// 添加菜单
19 | ///
20 | /// 菜单输入参数
21 | ///
22 | Task Add(MenuAddandUpIn input);
23 |
24 | ///
25 | /// 删除菜单
26 | ///
27 | /// 菜单ID
28 | ///
29 | Task Delete(int id);
30 |
31 | ///
32 | /// 更新菜单
33 | ///
34 | /// 菜单输入参数
35 | ///
36 | Task Update(MenuAddandUpIn input);
37 |
38 | ///
39 | /// 获取用户菜单
40 | ///
41 | ///
42 | Task> GetUserMenu();
43 |
44 | ///
45 | /// 获取全部菜单
46 | ///
47 | ///
48 | Task> GetAllMenu();
49 | }
50 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysOnlineUser/Dto/OnlineUser.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysOnlineUser;
2 |
3 | public class OnlineUser
4 | {
5 | ///
6 | /// 链接id
7 | ///
8 | public string ConnectionId { get; set; }
9 |
10 | ///
11 | /// 用户名字
12 | ///
13 | public string RealName { get; set; }
14 |
15 | ///
16 | /// 在线时间
17 | ///
18 | public DateTime Time { get; set; }
19 |
20 | ///
21 | /// ip
22 | ///
23 | public string Ip { get; set; }
24 |
25 | ///
26 | /// 浏览器
27 | ///
28 | public string Browser { get; set; }
29 |
30 | ///
31 | /// 系统
32 | ///
33 | public string Os { get; set; }
34 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysOnlineUser/Dto/OnlineUserPageInput.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysOnlineUser;
2 |
3 | public class OnlineUserPageInput : PageParamBase
4 | {
5 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysOnlineUser/Dto/SendMsgOneInput.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysOnlineUser;
2 |
3 | public class SendMsgOneInput
4 | {
5 | ///
6 | /// 连接的id
7 | ///
8 | public string ConnectionId { get; set; }
9 |
10 | ///
11 | /// 具体的消息
12 | ///
13 | public string Msg { get; set; }
14 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysOnlineUser/ISysOnlineUserService.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysOnlineUser;
2 |
3 | ///
4 | /// 在线用户服务接口
5 | ///
6 | public interface ISysOnlineUserService
7 | {
8 | ///
9 | /// 在线用户分页
10 | ///
11 | /// 分页输入参数
12 | ///
13 | Task> PageList(OnlineUserPageInput input);
14 |
15 | ///
16 | /// 强制用户下线
17 | ///
18 | /// 链接的ID
19 | ///
20 | Task ForceOffline(string connectionId);
21 |
22 | ///
23 | /// 给某人发送消息
24 | ///
25 | /// 消息输入参数
26 | ///
27 | Task SendMsgToOne(SendMsgOneInput input);
28 | }
29 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysOnlineUser/SysOnlineUserService.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers.Hub;
2 | using Microsoft.AspNetCore.SignalR;
3 |
4 | namespace MalusAdmin.Servers.SysOnlineUser;
5 |
6 | ///
7 | ///
8 | public class SysOnlineUserService: ISysOnlineUserService
9 | {
10 | private readonly IHubContext _onlineUserHubContext;
11 | private readonly SqlSugarRepository _rep; // 仓储
12 |
13 | public SysOnlineUserService(SqlSugarRepository rep,
14 | IHubContext onlineUserHubContext)
15 | {
16 | _rep = rep;
17 | _onlineUserHubContext = onlineUserHubContext;
18 | }
19 |
20 | ///
21 | /// 在线用户分页
22 | ///
23 | ///
24 | ///
25 | public async Task> PageList(OnlineUserPageInput input)
26 | {
27 | var data = await _rep.AsQueryable()
28 | .Where(x => x.Time >= DateTime.Now.AddHours(-3))
29 | .ToPagedListAsync(input.PageNo, input.PageSize);
30 | return data.PagedResult();
31 | }
32 |
33 | ///
34 | /// 强制用户下线
35 | ///
36 | /// 链接的id
37 | ///
38 | public async Task ForceOffline(string connectionId)
39 | {
40 | try
41 | {
42 | await _rep.DeleteAsync(x => x.ConnectionId == connectionId);
43 | await _onlineUserHubContext.Clients.Client(connectionId).ForceOffline("强制下线");
44 | }
45 | catch (Exception e)
46 | {
47 | Console.WriteLine(e);
48 | }
49 |
50 | return true;
51 | }
52 |
53 | ///
54 | /// 给某人发送消息
55 | ///
56 | ///
57 | ///
58 | public async Task SendMsgToOne(SendMsgOneInput input)
59 | {
60 | try
61 | {
62 | await _onlineUserHubContext.Clients.Client(input.ConnectionId).PublicNotice(input.Msg);
63 | }
64 | catch (Exception e)
65 | {
66 | Console.WriteLine(e);
67 | }
68 |
69 | return true;
70 | }
71 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysRole/Dto/RoleAddandUpIn.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysRole;
2 |
3 | public class RoleAddandUpIn
4 | {
5 | ///
6 | /// 主键
7 | ///
8 | public int Id { get; set; }
9 |
10 | ///
11 | /// 角色名称
12 | ///
13 | public string Name { get; set; }
14 |
15 |
16 | ///
17 | /// 描述
18 | ///
19 | public string Desc { get; set; }
20 |
21 | ///
22 | /// 是否启用
23 | /// 默认值:1
24 | ///
25 | public bool Status { get; set; }
26 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysRole/Dto/RoleListOut.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysRole;
2 |
3 | public class RoleListOut
4 | {
5 | ///
6 | /// id
7 | ///
8 | public int Id { get; set; }
9 |
10 | ///
11 | /// 角色名称
12 | ///
13 | public string Name { get; set; }
14 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysRole/ISysRoleService.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers.SysRole;
2 | using MalusAdmin.Servers.SysUser.Dto;
3 |
4 | namespace MalusAdmin.Servers;
5 |
6 | ///
7 | /// 角色服务接口
8 | ///
9 | public interface ISysRoleService
10 | {
11 | ///
12 | /// 角色列表分页
13 | ///
14 | /// 分页输入参数
15 | ///
16 | Task> PageList(UserPageIn input);
17 |
18 | ///
19 | /// 添加角色
20 | ///
21 | /// 角色输入参数
22 | ///
23 | Task Add(RoleAddandUpIn input);
24 |
25 | ///
26 | /// 删除角色
27 | ///
28 | /// 角色ID
29 | ///
30 | Task Delete(int id);
31 |
32 | ///
33 | /// 更新角色
34 | ///
35 | /// 角色输入参数
36 | ///
37 | Task Update(RoleAddandUpIn input);
38 |
39 | ///
40 | /// 用户列表
41 | ///
42 | ///
43 | Task> List();
44 | }
45 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysRoleMenu/Dto/UpdateRoleUserMenuIn.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysRoleMenu.Dto;
2 |
3 | ///
4 | /// 用户菜单更新
5 | ///
6 | public class UpdateRoleUserMenuIn
7 | {
8 | public int RoleId { get; set; }
9 |
10 |
11 | public List MenuId { get; set; }
12 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysRoleMenu/ISysRoleMenuService.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers.SysRoleMenu.Dto;
2 |
3 | namespace MalusAdmin.Servers.SysRoleMenu;
4 |
5 | ///
6 | /// 角色菜单服务接口
7 | ///
8 | public interface ISysRoleMenuService
9 | {
10 | ///
11 | /// 角色菜单获取
12 | ///
13 | /// 角色ID列表
14 | ///
15 | Task> RoleUserMenu(List RoleId);
16 |
17 | ///
18 | /// 角色菜单设置
19 | ///
20 | /// 角色菜单更新输入
21 | ///
22 | Task SetRoleUserMenu(UpdateRoleUserMenuIn input);
23 | }
24 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysRoleMenu/SysRoleMenuService.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers.SysRoleMenu.Dto;
2 |
3 | namespace MalusAdmin.Servers.SysRoleMenu;
4 |
5 | ///
6 | /// 角色菜单服务
7 | ///
8 | public class SysRoleMenuService : ISysRoleMenuService
9 | {
10 | private readonly ISqlSugarClient _db;
11 | private readonly SqlSugarRepository _sysRoleMenuRep; // 仓储
12 | private readonly ITokenService _TokenService;
13 |
14 | public SysRoleMenuService(SqlSugarRepository sysRoleMenuRep, ITokenService tokenService)
15 | {
16 | _sysRoleMenuRep = sysRoleMenuRep;
17 | _TokenService = tokenService;
18 | }
19 |
20 |
21 | ///
22 | /// 角色菜单获取
23 | ///
24 | ///
25 | ///
26 | public async Task> RoleUserMenu(List RoleId)
27 | {
28 | var HideorDisableMenusId = await _sysRoleMenuRep.Context.Queryable()
29 | .Where(x => x.Status == 2).Select(x => x.Id).ToListAsync();
30 |
31 | var Res = await _sysRoleMenuRep.Where(x => RoleId.Contains(x.RoleId))
32 | .Where(x => !HideorDisableMenusId.Contains(x.MenuId))
33 | .Select(x => x.MenuId)
34 | .ToListAsync();
35 |
36 | return Res;
37 | }
38 |
39 | ///
40 | /// 角色菜单设置
41 | ///
42 | ///
43 | ///
44 | public async Task SetRoleUserMenu(UpdateRoleUserMenuIn input)
45 | {
46 | await _sysRoleMenuRep.DeleteAsync(x => x.RoleId == input.RoleId);
47 | var list = new List();
48 | input.MenuId.ForEach(x => { list.Add(new TSysRoleMenu { RoleId = input.RoleId, MenuId = x }); });
49 | var ResCount = await _sysRoleMenuRep.Context.Insertable(list).ExecuteCommandAsync();
50 |
51 | return ResCount > 0;
52 | }
53 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysRolePermission/Dto/AllButtonPermissOut.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | public class AllButtonPermissOut
4 | {
5 | ///
6 | ///权限id,也就是路由的名称
7 | ///
8 | public string PermissionId { get; set; }
9 |
10 | ///
11 | ///权限名称
12 | ///
13 | public string PermissionName { get; set; }
14 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysRolePermission/Dto/UpdateRoleButtonIn.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | public class UpdateRoleButtonIn
4 | {
5 | ///
6 | /// 角色的id
7 | ///
8 | public int RoleId { get; set; }
9 |
10 | ///
11 | /// 用户的角色按钮权限
12 | ///
13 | public List PermissionId { get; set; }
14 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysRolePermission/ISysRolePermissionService.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers ;
2 |
3 | namespace MalusAdmin.Servers;
4 |
5 | ///
6 | /// 用户按钮权限服务接口
7 | ///
8 | public interface ISysRolePermissionService
9 | {
10 | ///
11 | /// 是否有访问当前接口的权限
12 | ///
13 | /// 路由路径
14 | ///
15 | Task HasPermissionAsync(string RouthPath);
16 |
17 | ///
18 | /// 获取接口所有的路由信息
19 | ///
20 | ///
21 | Task> GetAllButen();
22 |
23 | ///
24 | /// 删除角色的所有权限信息
25 | ///
26 | /// 角色ID
27 | ///
28 | Task DeleteRoleButtonPermiss(int RoleId);
29 |
30 | ///
31 | /// 为角色添加按钮权限
32 | ///
33 | /// 角色按钮权限更新输入
34 | ///
35 | Task AddRoleButtonPermiss(UpdateRoleButtonIn Input);
36 |
37 | ///
38 | /// 获取当前角色按钮权限
39 | ///
40 | /// 角色ID
41 | ///
42 | Task> GetRoleButtonPermiss(int RoleId);
43 |
44 | ///
45 | /// 获取当前用户的权限
46 | ///
47 | /// 用户ID
48 | ///
49 | Task> GetUserPermiss(int userid);
50 | }
51 |
52 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysUser/Dto/GetUserInfoOut.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | public class GetUserInfoOut
4 | {
5 | public List buttons { get; set; }
6 |
7 | public List roles { get; set; }
8 |
9 | public int userId { get; set; }
10 |
11 | public string userName { get; set; }
12 |
13 | public SysUserInfo userInfo { get; set; }
14 | }
15 |
16 | public class SysUserInfo
17 | {
18 | public string Name { get; set; }
19 |
20 | ///
21 | /// 电话
22 | ///
23 | [SugarColumn(ColumnName = "Tel")]
24 | public string Tel { get; set; }
25 |
26 | ///
27 | /// 邮箱
28 | ///
29 | [SugarColumn(ColumnName = "Email")]
30 | public string Email { get; set; }
31 |
32 | ///
33 | /// 备注
34 | ///
35 | [SugarColumn(ColumnName = "Remark")]
36 | public string Remark { get; set; }
37 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysUser/Dto/ResetPassWord.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel.DataAnnotations;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace MalusAdmin.Servers
9 | {
10 | public class ResetPassWord
11 | {
12 | ///
13 | /// 登录账号
14 | ///
15 | [Required]
16 | public string? NewPassWord { get; set; }
17 |
18 |
19 | ///
20 | /// 旧密码密码
21 | ///
22 | [Required]
23 | public string? OldPassWord { get; set; }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysUser/Dto/SysUserLoginIn.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel.DataAnnotations;
2 |
3 | namespace MalusAdmin.Servers;
4 |
5 |
6 | public class SysUserLoginIn
7 | {
8 | ///
9 | /// 登录账号
10 | ///
11 | /// admin
12 | [Required]
13 | public string? Account { get; set; }
14 |
15 |
16 | ///
17 | /// 密码
18 | ///
19 | /// 1q2w3e
20 | public string? PassWord { get; set; }
21 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysUser/Dto/SysUserLoginOut.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysUser.Dto;
2 |
3 | public class SysUserLoginOut
4 | {
5 | public int Id { get; set; }
6 | public string Name { get; set; }
7 | public string Token { get; set; }
8 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysUser/Dto/UserAddAndUpIn.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysUser.Dto;
2 |
3 | public class UserAddAndUpIn
4 | {
5 | ///
6 | /// 用户主键
7 | ///
8 | public int? Id { get; set; }
9 |
10 | ///
11 | /// 登录账号
12 | ///
13 | public string Account { get; set; }
14 |
15 | ///
16 | /// 用户名
17 | ///
18 | public string Name { get; set; }
19 |
20 | ///
21 | /// 密码
22 | ///
23 | public string PassWord { get; set; }
24 |
25 |
26 | ///
27 | /// 角色ID
28 | ///
29 | public List UserRolesId { get; set; }
30 |
31 | ///
32 | /// 状态(10正常,00冻结)
33 | /// 默认值:10
34 | ///
35 | public int Status { get; set; }
36 |
37 | ///
38 | /// 头像
39 | ///
40 | public string Avatar { get; set; }
41 |
42 | ///
43 | /// 电话
44 | ///
45 | public string Tel { get; set; }
46 |
47 | ///
48 | /// 邮箱
49 | ///
50 | public string Email { get; set; }
51 |
52 | ///
53 | /// 备注
54 | ///
55 | public string Remark { get; set; }
56 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysUser/Dto/UserMenuOut.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysUser.Dto;
2 |
3 | public class UserMenu
4 | {
5 | ///
6 | /// 名字
7 | ///
8 | public string Name { get; set; }
9 |
10 | ///
11 | /// 路由路径
12 | ///
13 | public string Path { get; set; }
14 |
15 | ///
16 | /// 组件
17 | ///
18 | public string Component { get; set; }
19 |
20 | ///
21 | ///
22 | public Meta Meta { get; set; }
23 |
24 | public List Children { get; set; }
25 | }
26 |
27 | ///
28 | ///
29 | public class Meta
30 | {
31 | public string Title { get; set; }
32 |
33 | ///
34 | /// 图标
35 | ///
36 | public string Icon { get; set; }
37 |
38 | ///
39 | /// 路由排序顺序
40 | ///
41 | public int Order { get; set; }
42 |
43 | ///
44 | /// 是否在菜单中隐藏该路由
45 | ///
46 | public bool HideInMenu { get; set; }
47 |
48 | ///
49 | /// 路由的外部链接
50 | ///
51 | public string Href { get; set; }
52 | }
53 |
54 | public class UserMenuOut
55 | {
56 | public string Home { get; set; }
57 |
58 | public List Routes { get; set; }
59 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysUser/Dto/UserPageIn.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysUser.Dto;
2 |
3 | public class UserPageIn : PageParamBase
4 | {
5 | ///
6 | /// 登录账号
7 | ///
8 | public string Account { get; set; }
9 |
10 | ///
11 | /// 用户名
12 | ///
13 | public string Name { get; set; }
14 |
15 | ///
16 | /// 密码
17 | ///
18 | public string PassWord { get; set; }
19 |
20 | ///
21 | /// 角色ID
22 | ///
23 | public int RoleId { get; set; }
24 |
25 | ///
26 | /// 状态(1正常,0冻结)
27 | /// 默认值:10
28 | ///
29 | public int? Status { get; set; }
30 |
31 | ///
32 | /// 头像
33 | ///
34 | public string Avatar { get; set; }
35 |
36 | ///
37 | /// 电话
38 | ///
39 | public string Tel { get; set; }
40 |
41 | ///
42 | /// 邮箱
43 | ///
44 | public string Email { get; set; }
45 |
46 | ///
47 | /// 备注
48 | ///
49 | public string Remark { get; set; }
50 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysUser/Dto/UserPageOut.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.SysUser.Dto;
2 |
3 | public class UserPageOut
4 | {
5 | public int id { get; set; }
6 |
7 | ///
8 | /// 登录账号
9 | ///
10 | public string Account { get; set; }
11 |
12 | ///
13 | /// 用户名
14 | ///
15 | public string Name { get; set; }
16 |
17 |
18 | ///
19 | /// 状态(10正常,00冻结)
20 | /// 默认值:10
21 | ///
22 | public string Status { get; set; }
23 |
24 | ///
25 | /// 头像
26 | ///
27 | public string Avatar { get; set; }
28 |
29 | ///
30 | /// 电话
31 | ///
32 | public string Tel { get; set; }
33 |
34 | ///
35 | /// 邮箱
36 | ///
37 | public string Email { get; set; }
38 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BackStageManger/SysUser/ISysUserService.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers.SysUser.Dto;
2 |
3 | namespace MalusAdmin.Servers.SysUser;
4 |
5 | ///
6 | /// 用户服务接口
7 | ///
8 | public interface ISysUserService
9 | {
10 | ///
11 | /// 用户登录
12 | ///
13 | /// 登录输入参数
14 | ///
15 | Task Login(SysUserLoginIn input);
16 |
17 | ///
18 | /// 获取用户信息
19 | ///
20 | ///
21 | Task GetUserInfo();
22 |
23 | ///
24 | /// 更改用户信息
25 | ///
26 | /// 用户信息输入
27 | ///
28 | Task UpdateUserInfo(SysUserInfo input);
29 |
30 | ///
31 | /// 更改密码
32 | ///
33 | /// 密码重置输入
34 | ///
35 | Task ResetPassWord(ResetPassWord input);
36 |
37 | ///
38 | /// 用户列表分页
39 | ///
40 | /// 分页输入参数
41 | ///
42 | Task> PageList(UserPageIn input);
43 |
44 | ///
45 | /// 添加用户
46 | ///
47 | /// 用户添加输入
48 | ///
49 | Task Add(UserAddAndUpIn input);
50 |
51 | ///
52 | /// 删除用户
53 | ///
54 | /// 用户ID
55 | ///
56 | Task Delete(int userId);
57 |
58 | ///
59 | /// 更新用户
60 | ///
61 | /// 用户更新输入
62 | ///
63 | Task Update(UserAddAndUpIn input);
64 |
65 | ///
66 | /// 获取登录用户的菜单权限
67 | ///
68 | ///
69 | Task GetUserMenu();
70 | }
71 |
72 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BusinessManger/BingWapaper/BingWallpaperService.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using SqlSugar.IOC;
3 |
4 | namespace MalusAdmin.Servers;
5 |
6 | [AutoInject(ServiceLifetime.Transient)]
7 | public class BingWallpaperService
8 | {
9 | private readonly ISqlSugarClient _db;
10 | private readonly SqlSugarRepository _repository; // 仓储
11 | private readonly ITokenService _TokenService;
12 | private readonly ISysLogService _sysLogService;
13 |
14 | public BingWallpaperService(SqlSugarRepository repository,
15 | ITokenService tokenService, ISysLogService sysLogService)
16 | {
17 | _repository = repository;
18 | _TokenService = tokenService;
19 | _sysLogService = sysLogService;
20 | }
21 |
22 |
23 | ///
24 | /// 必应壁纸列表分页
25 | ///
26 | ///
27 | ///
28 | public async Task> PageList(PageParamBase input)
29 | {
30 | await _sysLogService.AddLog("后台操作", $"用户{App.CurrentUser.UserId}获取了必应壁纸");
31 | var list = await _repository.AsQueryable()
32 | .WhereIF(!string.IsNullOrWhiteSpace(input.KeyWord),
33 | u => u.CopyRight.Contains(input.KeyWord.Trim()) )
34 | .OrderByDescending(u=>u.StartDate)
35 | .ToPagedListAsync(input.PageNo, input.PageSize);
36 | return list.PagedResult();
37 | }
38 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BusinessManger/Customer/CustomerSevice.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 |
3 | namespace MalusAdmin.Servers;
4 |
5 | ///
6 | /// 用户服务
7 | ///
8 | [AutoInject(ServiceLifetime.Transient)]
9 | public class CustomerService
10 | {
11 | private readonly ISqlSugarClient _db;
12 | private readonly SqlSugarRepository _repository; // 仓储
13 | private readonly ITokenService _TokenService;
14 |
15 | public CustomerService(SqlSugarRepository repository, ITokenService tokenService)
16 | {
17 | _repository = repository;
18 | _TokenService = tokenService;
19 | }
20 |
21 | ///
22 | /// 客户列表分页
23 | ///
24 | ///
25 | ///
26 | public async Task> PageList(PageParamBase input)
27 | {
28 | var list = await _repository.AsQueryable()
29 | .WhereIF(!string.IsNullOrWhiteSpace(input.KeyWord),
30 | u => u.NickName.Contains(input.KeyWord.Trim()) )
31 | .ToPagedListAsync(input.PageNo, input.PageSize);
32 | return list.PagedResult();
33 | }
34 |
35 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BusinessManger/Customer/Dto/cuetomerPageIn.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | public class cuetomerPageIn: PageParamBase
4 | {
5 |
6 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BusinessManger/Gallery/GallerySevices.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 |
3 | namespace MalusAdmin.Servers.Gallery;
4 |
5 |
6 | [AutoInject(ServiceLifetime.Transient)]
7 | public class GalleryService
8 | {
9 | private readonly ISqlSugarClient _db;
10 | private readonly SqlSugarRepository _repository; // 仓储
11 | private readonly ITokenService _TokenService;
12 |
13 | public GalleryService(SqlSugarRepository repository, ITokenService tokenService)
14 | {
15 | _repository = repository;
16 | _TokenService = tokenService;
17 | }
18 |
19 |
20 | ///
21 | /// 必应壁纸列表分页
22 | ///
23 | ///
24 | ///
25 | public async Task> PageList(PageParamBase input)
26 | {
27 | var list = await _repository.AsQueryable()
28 | .WhereIF(!string.IsNullOrWhiteSpace(input.KeyWord),
29 | u => u.Type.Contains(input.KeyWord.Trim()) )
30 | // .OrderByDescending(u=>u.StartDate)
31 | .ToPagedListAsync(input.PageNo, input.PageSize);
32 | return list.PagedResult();
33 | }
34 |
35 |
36 |
37 | ///
38 | /// 删除壁纸
39 | ///
40 | ///
41 | ///
42 | public async Task Delete(int id)
43 | {
44 | var entity = await _repository.FirstOrDefaultAsync(u => u.ImagesID == id);
45 | if (entity == null) throw ApiException.Exception207Bad("未找到当前角色");
46 | return await _repository.DeleteAsync(entity) > 0;
47 | }
48 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BusinessManger/GalleryCategory/GalleryCategoryService.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers.GalleryCategory;
2 |
3 | public class GalleryCategoryService
4 | {
5 |
6 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/BusinessManger/TestSevices.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | public class TestTwoService
4 | {
5 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/GlobalUsings.cs:
--------------------------------------------------------------------------------
1 | global using System;
2 | global using System.Collections.Generic;
3 | global using System.Linq;
4 | global using System.Text;
5 | global using System.Threading.Tasks;
6 | global using MalusAdmin.Common;
7 | global using MalusAdmin.Encryption;
8 | global using Microsoft.AspNetCore.Http;
9 | global using Microsoft.AspNetCore.Mvc;
10 | global using NetTaste;
11 | global using SqlSugar;
12 | global using MalusAdmin.Repository.Model;
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/MalusAdmin.Servers.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0
5 | enable
6 | enable
7 | True
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/WeatherForecast/Dto/WeatherForecast.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | public class WeatherForecast
4 | {
5 | public DateOnly Date { get; set; }
6 |
7 | public int TemperatureC { get; set; }
8 |
9 | public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
10 |
11 | public string? Summary { get; set; }
12 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/WeatherForecast/IWeatherForecastService.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | public interface IWeatherForecastService
4 | {
5 | Task> Get();
6 |
7 | Task CreatClass(string str);
8 |
9 | Task CreatTable();
10 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.Servers/WeatherForecast/WeatherForecastService.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.Servers;
2 |
3 | public class WeatherForecastService : IWeatherForecastService
4 | {
5 | private static readonly string[] Summaries =
6 | {
7 | "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
8 | };
9 |
10 | private readonly ISqlSugarClient _db;
11 | private readonly IHttpContextAccessor _httpContext;
12 |
13 | public WeatherForecastService(ISqlSugarClient db)
14 | {
15 | _db = db;
16 | }
17 |
18 | ///
19 | /// 生成实体
20 | ///
21 | ///
22 | ///
23 | public async Task CreatClass(string values)
24 | {
25 | _db.DbFirst.IsCreateAttribute().StringNullable()
26 | .Where(x => x.StartsWith(values))
27 | .CreateClassFile("D:\\PrideJoy\\MalusAdmin\\MalusApi\\MalusAdmin.Repository\\Entity");
28 | }
29 |
30 |
31 | ///
32 | /// 生成数据库表
33 | ///
34 | ///
35 | public async Task CreatTable()
36 | {
37 | _db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(TSysOnlineUser));
38 | }
39 |
40 | ///
41 | /// 测试
42 | ///
43 | ///
44 | public async Task> Get()
45 | {
46 | var MyList = Enumerable.Range(1, 2).Select(index => new WeatherForecast
47 | {
48 | Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
49 | TemperatureC = Random.Shared.Next(-20, 55),
50 | Summary = Summaries[Random.Shared.Next(Summaries.Length)]
51 | }).ToArray();
52 |
53 | return MyList;
54 | }
55 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BackStageManger/SysCacheController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 |
3 | namespace MalusAdmin.WebApi.Controllers;
4 |
5 | ///
6 | /// 缓存服务
7 | ///
8 | [ApiExplorerSettings(GroupName = "后台管理")]
9 | public class SysCacheController : ApiControllerBase
10 | {
11 | private readonly ISysCacheService _sysCacheService;
12 |
13 | public SysCacheController(ISysCacheService sysCacheService)
14 | {
15 | _sysCacheService = sysCacheService;
16 | }
17 |
18 |
19 | ///
20 | /// 获取所有缓存的Key
21 | ///
22 | ///
23 | [HttpGet]
24 | [Permission("缓存-获取所有缓存的Key")]
25 | public async Task> GetAllKeys()
26 | {
27 | return _sysCacheService.GetAllKeys();
28 | }
29 |
30 | ///
31 | /// 根据key获取缓存的value
32 | ///
33 | ///
34 | [HttpGet]
35 | [Permission("缓存-根据key获取缓存")]
36 | public dynamic GetKeys(string key)
37 | {
38 | return _sysCacheService.GetKeys(key);
39 | }
40 |
41 |
42 | ///
43 | /// 根据key获取缓存的value
44 | ///
45 | ///
46 | [HttpPost]
47 | [Permission("缓存-根据key删除缓存")]
48 | public async Task DeleteKey(string key)
49 | {
50 | return await _sysCacheService.RemoveAsync(key) > 0;
51 | }
52 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BackStageManger/SysConfigController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Server;
2 | using MalusAdmin.Servers;
3 |
4 | ///
5 | /// 参数配置管理
6 | ///
7 | [ApiExplorerSettings(GroupName = "后台管理")]
8 | public class SysConfigController : ApiControllerBase
9 | {
10 | private readonly ISysConfigService _server;
11 |
12 | public SysConfigController(ISysConfigService server)
13 | {
14 | _server = server;
15 | }
16 |
17 | ///
18 | /// 分页查询
19 | ///
20 | ///
21 | [HttpGet]
22 | [Permission("配置分页查询")]
23 | public async Task PageList([FromQuery] PageParamBase input)
24 | {
25 | return await _server.PageList(input);
26 | }
27 |
28 | ///
29 | /// 添加配置
30 | ///
31 | ///
32 | [HttpPost]
33 | [Permission("配置添加")]
34 | public async Task Add(WechatConfigAddandUpIn input)
35 | {
36 | return await _server.Add(input);
37 | }
38 |
39 | ///
40 | /// 删除配置
41 | ///
42 | ///
43 | [HttpPost("{id}")]
44 | [Permission("配置删除")]
45 | public async Task Delete(int id)
46 | {
47 | return await _server.Delete(id);
48 | }
49 |
50 | ///
51 | /// 更新配置
52 | ///
53 | ///
54 | [HttpPost]
55 | [Permission("配置更新")]
56 | public async Task Update(WechatConfigAddandUpIn input)
57 | {
58 | return await _server.Update(input);
59 | }
60 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BackStageManger/SysDataController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 | using Microsoft.AspNetCore.Authorization;
3 |
4 | namespace MalusAdmin.WebApi.Controllers.BackStageManger;
5 |
6 | ///
7 | /// 基础服务
8 | ///
9 | [ApiExplorerSettings(GroupName = "后台管理")]
10 | [ResponseCache(Duration = 500)]
11 | public class SysDataController : ApiControllerBase
12 | {
13 | private readonly ISysDataService _dataService;
14 |
15 | public SysDataController(ISysDataService dataService)
16 | {
17 | _dataService = dataService;
18 | }
19 |
20 |
21 | ///
22 | /// 获取服务器信息
23 | ///
24 | ///
25 | [HttpGet]
26 | [AllowAnonymous]
27 | public async Task GetSystemInfo()
28 | {
29 | return await _dataService.GetServerInfo();
30 | }
31 |
32 |
33 | ///
34 | /// 获取当前使用的nuget包
35 | ///
36 | ///
37 | [HttpGet]
38 | [AllowAnonymous]
39 | public async Task GetNuGetPackages()
40 | {
41 | return await _dataService.GetNuGetPackages();
42 | }
43 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BackStageManger/SysLogController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 | using MalusAdmin.WebApi.Filter;
3 |
4 | namespace MalusAdmin.WebApi.Controllers.BackStageManger;
5 |
6 | ///
7 | /// 日志服务
8 | ///
9 | [DisabledRequestRecord]
10 | [ApiExplorerSettings(GroupName = "后台管理")]
11 | public class SysLogController : ApiControllerBase
12 | {
13 | private readonly ISysLogService _server;
14 |
15 | public SysLogController(ISysLogService server)
16 | {
17 | _server = server;
18 | }
19 |
20 |
21 | ///
22 | /// 访问日志分页
23 | ///
24 | ///
25 | [HttpGet]
26 | public async Task VisPageList([FromQuery] SysLogPageIn input)
27 | {
28 | return await _server.VisPageList(input);
29 | }
30 |
31 | ///
32 | /// 日志分页
33 | ///
34 | ///
35 | [HttpGet]
36 | public async Task ErrPageList([FromQuery] SysLogPageIn input)
37 | {
38 | return await _server.ErrPageList(input);
39 | }
40 |
41 | ///
42 | /// 操作 日志分页
43 | ///
44 | ///
45 | [HttpGet]
46 | public async Task OpPageList([FromQuery] SysLogPageIn input)
47 | {
48 | return await _server.OpPageList(input);
49 | }
50 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BackStageManger/SysLoginController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 | using MalusAdmin.Servers.SysUser;
3 | using MalusAdmin.Servers.SysUser.Dto;
4 | using MalusAdmin.WebApi.Filter;
5 | using Microsoft.AspNetCore.Authorization;
6 |
7 | namespace MalusAdmin.WebApi.Controllers.BackStageManger;
8 |
9 | ///
10 | /// 登录服务
11 | ///
12 | [ApiExplorerSettings(GroupName = "后台管理")]
13 |
14 | public class SysLoginController : ApiControllerBase
15 | {
16 | private readonly ISysUserService _sysUserService;
17 |
18 | public SysLoginController(ISysUserService userService)
19 | {
20 | _sysUserService = userService;
21 | }
22 |
23 | ///
24 | /// 用户登录
25 | ///
26 | ///
27 | [HttpPost]
28 | [AllowAnonymous]
29 | public async Task Login(SysUserLoginIn input)
30 | {
31 | return await _sysUserService.Login(input);
32 | }
33 |
34 |
35 | ///
36 | /// 获取登录用户的信息
37 | ///
38 | ///
39 | [HttpGet]
40 | //[ResponseCache(Duration = 60 * 60)]
41 | public async Task GetUserInfo()
42 | {
43 | return await _sysUserService.GetUserInfo();
44 | }
45 |
46 |
47 | ///
48 | /// 获取登录用户的路由
49 | ///
50 | ///
51 | [HttpGet]
52 | //[ResponseCache(Duration = 60 * 60)]
53 | [DisabledRequestRecord]
54 | public async Task GetUserMenu()
55 | {
56 | return await _sysUserService.GetUserMenu();
57 | }
58 |
59 | ///
60 | /// 更改基础资料
61 | ///
62 | ///
63 | [HttpPost]
64 | [ReadOnly]
65 | public async Task UpdateUserInfo([FromBody]SysUserInfo input)
66 | {
67 | return await _sysUserService.UpdateUserInfo(input);
68 | }
69 |
70 |
71 | ///
72 | /// 更改密码
73 | ///
74 | ///
75 | [HttpPost]
76 | [ReadOnly]
77 | public async Task ResetPassWord([FromBody] ResetPassWord input)
78 | {
79 | return await _sysUserService.ResetPassWord(input);
80 | }
81 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BackStageManger/SysMenuController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 | using MalusAdmin.Servers.SysMenu;
3 |
4 | namespace MalusAdmin.WebApi.Controllers.BackStageManger;
5 |
6 | ///
7 | /// 菜单服务
8 | ///
9 | [ApiExplorerSettings(GroupName = "后台管理")]
10 | public class SysMenuController : ApiControllerBase
11 | {
12 | private readonly ISysMenuService _service;
13 |
14 | public SysMenuController(ISysMenuService service)
15 | {
16 | _service = service;
17 | }
18 |
19 |
20 | ///
21 | /// 分页查询
22 | ///
23 | ///
24 | [HttpGet]
25 | [Permission("菜单树状列表")]
26 | public async Task MenuTreeList()
27 | {
28 | return await _service.MenuTreeList();
29 | }
30 |
31 |
32 | [ReadOnly]
33 | [HttpPost]
34 | [Permission("菜单新增")]
35 | public async Task Add(MenuAddandUpIn input)
36 | {
37 | return await _service.Add(input);
38 | }
39 |
40 |
41 | [HttpPost]
42 | [Permission("菜单更新")]
43 | [ReadOnly]
44 | public async Task Update(MenuAddandUpIn input)
45 | {
46 | return await _service.Update(input);
47 | }
48 |
49 | [ReadOnly]
50 | [HttpGet]
51 | [Permission("菜单删除")]
52 | public async Task Delete(int id)
53 | {
54 | return await _service.Delete(id);
55 | }
56 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BackStageManger/SysOnlineUserController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers.SysOnlineUser;
2 |
3 | namespace MalusAdmin.WebApi.Controllers.BackStageManger;
4 |
5 | ///
6 | /// 在线用户
7 | ///
8 | [ApiExplorerSettings(GroupName = "后台管理")]
9 | public class SysOnlineUserController : ApiControllerBase
10 | {
11 | private readonly ISysOnlineUserService _service;
12 |
13 | public SysOnlineUserController(ISysOnlineUserService service)
14 | {
15 | _service = service;
16 | }
17 |
18 | ///
19 | /// 分页查询
20 | ///
21 | ///
22 | [HttpGet]
23 | [Permission("在线用户分页")]
24 | public async Task PageList([FromQuery] OnlineUserPageInput input)
25 | {
26 | return await _service.PageList(input);
27 | }
28 |
29 |
30 | ///
31 | /// 强制下线
32 | ///
33 | ///
34 | [HttpGet]
35 | [Permission("强制用户下线")]
36 | public async Task ForceOffline([FromQuery] string connectionId)
37 | {
38 | return await _service.ForceOffline(connectionId);
39 | }
40 |
41 | ///
42 | /// 给指定用户发送消息
43 | ///
44 | ///
45 | [HttpPost]
46 | [Permission("给指定用户发送消息")]
47 | public async Task SendMsgToOne([FromBody] SendMsgOneInput input)
48 | {
49 | return await _service.SendMsgToOne(input);
50 | }
51 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BackStageManger/SysRoleController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 | using MalusAdmin.Servers.SysRole;
3 | using MalusAdmin.Servers.SysUser.Dto;
4 |
5 | namespace MalusAdmin.WebApi.Controllers.BackStageManger;
6 |
7 | ///
8 | /// 角色服务
9 | ///
10 | [ApiExplorerSettings(GroupName = "后台管理")]
11 | public class SysRoleController : ApiControllerBase
12 | {
13 | private readonly ISysRoleService _sysRoleService;
14 |
15 | public SysRoleController(ISysRoleService sysRoleService)
16 | {
17 | _sysRoleService = sysRoleService;
18 | }
19 |
20 | ///
21 | /// 分页查询
22 | ///
23 | ///
24 | [HttpGet]
25 | [Permission("角色查询分页")]
26 | public async Task PageList([FromQuery] UserPageIn input)
27 | {
28 | return await _sysRoleService.PageList(input);
29 | }
30 |
31 | ///
32 | /// 添加用户
33 | ///
34 | ///
35 | [HttpPost]
36 | [Permission("角色添加")]
37 | public async Task Add(RoleAddandUpIn input)
38 | {
39 | return await _sysRoleService.Add(input);
40 | }
41 |
42 |
43 | ///
44 | /// 删除用户
45 | ///
46 | ///
47 | [HttpPost("{id}")]
48 | [Permission("角色删除")]
49 | public async Task Delete(int id)
50 | {
51 | return await _sysRoleService.Delete(id);
52 | }
53 |
54 |
55 | ///
56 | /// 更新用户
57 | ///
58 | ///
59 | [HttpPost]
60 | [Permission("角色更新")]
61 | public async Task Update(RoleAddandUpIn input)
62 | {
63 | return await _sysRoleService.Update(input);
64 | }
65 |
66 |
67 | ///
68 | /// 角色列表
69 | ///
70 | ///
71 | [HttpGet]
72 | public async Task List()
73 | {
74 | return await _sysRoleService.List();
75 | }
76 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BackStageManger/SysRoleMenuController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers.SysRoleMenu;
2 | using MalusAdmin.Servers.SysRoleMenu.Dto;
3 |
4 | namespace MalusAdmin.WebApi.Controllers.BackStageManger;
5 |
6 | ///
7 | /// 角色菜单服务
8 | ///
9 | [ApiExplorerSettings(GroupName = "后台管理")]
10 | public class SysRoleMenuController : ApiControllerBase
11 | {
12 | private readonly ISysRoleMenuService _service;
13 |
14 | public SysRoleMenuController(ISysRoleMenuService service)
15 | {
16 | _service = service;
17 | }
18 |
19 | ///
20 | /// 角色菜单查询
21 | ///
22 | ///
23 | [HttpGet]
24 | [Permission("角色菜单查询")]
25 | public async Task Get([FromQuery] int RoleId)
26 | {
27 | return await _service.RoleUserMenu(new List { RoleId });
28 | }
29 |
30 | ///
31 | /// 添加用户
32 | ///
33 | ///
34 | [HttpPost]
35 | [Permission("角色菜单更新")]
36 | [ReadOnly]
37 | public async Task Set(UpdateRoleUserMenuIn input)
38 | {
39 | return await _service.SetRoleUserMenu(input);
40 | }
41 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BackStageManger/SysRolePermissionController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 |
3 | namespace MalusAdmin.WebApi.Controllers.BackStageManger;
4 |
5 | ///
6 | /// 按钮权限服务
7 | ///
8 | [ApiExplorerSettings(GroupName = "后台管理")]
9 | public class SysRolePermissionController : ApiControllerBase
10 | {
11 | private readonly ISysRolePermissionService _service;
12 |
13 | public SysRolePermissionController(ISysRolePermissionService service)
14 | {
15 | _service = service;
16 | }
17 |
18 |
19 | ///
20 | /// 获取所有按钮列表
21 | ///
22 | ///
23 | [HttpGet]
24 | public async Task GetAllButen()
25 | {
26 | return await _service.GetAllButen();
27 | }
28 |
29 |
30 | ///
31 | /// 获取角色按钮
32 | ///
33 | ///
34 | [HttpGet]
35 | [Permission("获取角色按钮")]
36 | public async Task GetRoleButen(int RoleId)
37 | {
38 | return await _service.GetRoleButtonPermiss(RoleId);
39 | }
40 |
41 | ///
42 | /// 设置角色按钮
43 | ///
44 | ///
45 | [HttpPost]
46 | [Permission("设置角色按钮")]
47 | [ReadOnly]
48 | public async Task AddUserButtonPermiss(UpdateRoleButtonIn Input)
49 | {
50 | return await _service.AddRoleButtonPermiss(Input);
51 | }
52 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BackStageManger/SysUserController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 | using MalusAdmin.Servers.SysUser;
3 | using MalusAdmin.Servers.SysUser.Dto;
4 |
5 | namespace MalusAdmin.WebApi.Controllers.BackStageManger;
6 |
7 | ///
8 | /// 用户服务
9 | ///
10 | [ApiExplorerSettings(GroupName = "后台管理")]
11 | public class SysUserController : ApiControllerBase
12 | {
13 | private readonly ISysUserService _sysUserService;
14 |
15 | public SysUserController(ISysUserService userService)
16 | {
17 | _sysUserService = userService;
18 | }
19 |
20 | ///
21 | /// 分页查询
22 | ///
23 | ///
24 | [HttpGet]
25 | [Permission("用户信息分页查询")]
26 | public async Task PageList([FromQuery] UserPageIn input)
27 | {
28 | return await _sysUserService.PageList(input);
29 | }
30 |
31 |
32 | ///
33 | /// 添加用户
34 | ///
35 | ///
36 | [HttpPost]
37 | [Permission("用户信息添加")]
38 | public async Task Add(UserAddAndUpIn input)
39 | {
40 | return await _sysUserService.Add(input);
41 | }
42 |
43 |
44 | ///
45 | ///删除用户
46 | ///
47 | ///
48 | [HttpPost("{id}")]
49 | [Permission("用户信息删除")]
50 | [ReadOnly]
51 | public async Task Delete(int id)
52 | {
53 | return await _sysUserService.Delete(id);
54 | }
55 |
56 |
57 | ///
58 | ///更新用户
59 | ///
60 | ///
61 | [HttpPost]
62 | [Permission("用户信息更新")]
63 | [ReadOnly]
64 | public async Task Update(UserAddAndUpIn input)
65 | {
66 | return await _sysUserService.Update(input);
67 | }
68 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BusinessManger/BingWallpaperController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 | using Microsoft.AspNetCore.Authorization;
3 | using Microsoft.AspNetCore.Mvc;
4 |
5 | namespace MalusAdmin.WebApi.Controllers.BusinessManger;
6 |
7 | ///
8 | /// 必应壁纸
9 | ///
10 | [ApiExplorerSettings(GroupName = "业务管理")]
11 | public class BingWallpaperController : ApiControllerBase
12 | {
13 | private readonly BingWallpaperService _services;
14 |
15 | public BingWallpaperController(BingWallpaperService service)
16 | {
17 | _services = service;
18 | }
19 |
20 |
21 | ///
22 | /// 必应壁纸分页
23 | ///
24 | ///
25 | [HttpGet]
26 | [Permission("壁纸分页")]
27 | public async Task PageList([FromQuery]cuetomerPageIn input)
28 | {
29 | return await _services.PageList(input);
30 | }
31 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BusinessManger/CustomerController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 | using Microsoft.AspNetCore.Authorization;
3 | using Microsoft.AspNetCore.Mvc;
4 |
5 | namespace MalusAdmin.WebApi.Controllers.BusinessManger;
6 |
7 | ///
8 | /// 用户服务
9 | ///
10 | [ApiExplorerSettings(GroupName = "业务管理")]
11 | public class CustomerController : ApiControllerBase
12 | {
13 |
14 | private readonly CustomerService _services;
15 |
16 | public CustomerController(CustomerService service)
17 | {
18 | _services = service;
19 | }
20 |
21 |
22 | ///
23 | /// 用户分页
24 | ///
25 | ///
26 | [HttpGet]
27 | [Permission("用户分页")]
28 | public async Task PageList([FromQuery]cuetomerPageIn input)
29 | {
30 | return await _services.PageList(input);
31 | }
32 |
33 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/BusinessManger/GalleryController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 | using MalusAdmin.Servers.Gallery;
3 | using Microsoft.AspNetCore.Authorization;
4 | using Microsoft.AspNetCore.Mvc;
5 |
6 | namespace MalusAdmin.WebApi.Controllers.BusinessManger;
7 |
8 | ///
9 | /// 图库服务
10 | ///
11 | [ApiExplorerSettings(GroupName = "业务管理")]
12 | public class GalleryController : ApiControllerBase
13 | {
14 |
15 | private readonly GalleryService _services;
16 |
17 | public GalleryController(GalleryService service)
18 | {
19 | _services = service;
20 | }
21 |
22 |
23 | ///
24 | /// 壁纸分页
25 | ///
26 | ///
27 | [HttpGet]
28 | [Permission("壁纸分页")]
29 | public async Task PageList([FromQuery]cuetomerPageIn input)
30 | {
31 | return await _services.PageList(input);
32 | }
33 |
34 | ///
35 | /// 壁纸分页
36 | ///
37 | ///
38 | [HttpGet]
39 | [Permission("壁纸删除")]
40 | public async Task Delete([FromQuery]int id)
41 | {
42 | return await _services.Delete(id);
43 | }
44 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/Orther/OrtherController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Common.Components;
2 | using MalusAdmin.Servers;
3 | using Microsoft.AspNetCore.Authorization;
4 |
5 | namespace MalusAdmin.WebApi.Controllers.BusinessManger;
6 |
7 | ///
8 | /// 其他
9 | ///
10 | [AllowAnonymous]
11 | public class OrtherController : ApiControllerBase
12 | {
13 | private readonly IHttpContextAccessor _httpContextAccessor;
14 | private readonly TestService _testService;
15 | private readonly IWeatherForecastService _weatherForecastService;
16 | private readonly MQPublish _mQPublish;
17 |
18 | public OrtherController(IWeatherForecastService weatherForecastService, TestService testService,
19 | IHttpContextAccessor httpContextAccessor, MQPublish mQPublish)
20 | {
21 | _weatherForecastService = weatherForecastService;
22 | _testService = testService;
23 | _httpContextAccessor = httpContextAccessor;
24 | _mQPublish = mQPublish;
25 | }
26 |
27 |
28 |
29 | [HttpGet("GetEnvironmentn")]
30 | public async Task GetEnvironmentn()
31 | {
32 | //await _mQPublish.PublishMessageAsync("Test",name);
33 | return App.WebHostEnvironment.ToString();
34 | }
35 |
36 |
37 | [HttpGet]
38 | public async Task GetException207BadBad22()
39 | {
40 | return await _testService.GetException207BadBad();
41 | }
42 |
43 | [HttpGet]
44 | public async Task GetException()
45 | {
46 | return await _testService.GetException();
47 | }
48 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Controllers/Orther/TestController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Servers;
2 | using Microsoft.AspNetCore.Authorization;
3 |
4 | namespace MalusAdmin.WebApi.Controllers.Orther;
5 |
6 | ///
7 | /// 测试业务
8 | ///
9 | [AllowAnonymous]
10 | public class TestController : ApiControllerBase
11 | {
12 | private readonly IHttpContextAccessor _httpContextAccessor;
13 | private readonly TestService _testService;
14 | private readonly IWeatherForecastService _weatherForecastService;
15 |
16 | public TestController(IWeatherForecastService weatherForecastService, TestService testService,
17 | IHttpContextAccessor httpContextAccessor)
18 | {
19 | _weatherForecastService = weatherForecastService;
20 | _testService = testService;
21 | _httpContextAccessor = httpContextAccessor;
22 | }
23 |
24 | [HttpGet]
25 | public async Task GetException207BadBad()
26 | {
27 | return await _testService.GetException207BadBad();
28 | }
29 |
30 | [HttpGet]
31 | public async Task GetException()
32 | {
33 | return await _testService.GetException();
34 | }
35 |
36 |
37 | [HttpGet]
38 | public async Task GetAppConfig()
39 | {
40 | return App.Configuration["IsDemo"]?.ToString();
41 | }
42 |
43 | ///
44 | /// 动态api
45 | ///
46 | ///
47 | //public async Task PostException2()
48 | //{
49 | // return await _testService.GetException();
50 | //}
51 |
52 |
53 | ///
54 | /// 动态api
55 | ///
56 | ///
57 | //public async Task GetException3()
58 | //{
59 | // return await _testService.GetException();
60 | //}
61 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Filter/CustomApiResultProvider.cs:
--------------------------------------------------------------------------------
1 | //namespace MalusAdmin.WebApi;
2 |
3 | //public class ApiJsonProvider
4 | //{
5 | // public override IActionResult ProcessActionResult(IActionResult actionResult)
6 | // {
7 | // // 都返回 200 状态码
8 | // // 只处理 ObjectResult
9 | // var oldResult = base.ProcessActionResult(actionResult);
10 | // if (oldResult is ObjectResult objectResult)
11 | // {
12 | // // 如果状态码已经是 200,直接返回
13 | // if (objectResult.StatusCode == StatusCodes.Status200OK) return oldResult;
14 |
15 | // // 修改状态码
16 | // return new ObjectResult(objectResult.Value) { StatusCode = StatusCodes.Status200OK };
17 | // }
18 |
19 | // return actionResult;
20 | // }
21 |
22 | // public override IActionResult ProcessApiJsonException(ApiJsonException resultException)
23 | // {
24 | // // 都返回 200 状态码
25 | // // API 结果 统一处理为 ObjectResult 与 API 控制器保持一致
26 | // var ApiJson = resultException.ApiJson;
27 | // IActionResult result = new ObjectResult(ApiJson) { StatusCode = StatusCodes.Status200OK };
28 |
29 | // return result;
30 | // }
31 | //}
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Filter/CustomAuthorizationFilter.cs:
--------------------------------------------------------------------------------
1 | //using Microsoft.AspNetCore.Mvc.Filters;
2 |
3 | //namespace MalusAdmin.WebApi.Filter
4 | //{
5 | // public class CustomAuthorizationFilter : IAuthorizationFilter
6 | // {
7 | // public void OnAuthorization(AuthorizationFilterContext context)
8 | // {
9 | // // 检查用户是否已登录
10 | // //var user = context.HttpContext.User;
11 |
12 | // //if (!user.Identity.IsAuthenticated)
13 | // //{
14 | // // // 如果用户未登录,则拒绝访问
15 | // // context.Result = new UnauthorizedResult();
16 | // // return;
17 | // //}
18 |
19 | // // 这里可以添加更多的授权检查逻辑
20 | // // 例如,检查用户的角色或声明等
21 | // }
22 | // }
23 | //}
24 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Filter/GlobalExceptionFilter.cs:
--------------------------------------------------------------------------------
1 | //using MalusAdmin.Common.Helper;
2 | //using Microsoft.AspNetCore.Mvc.Controllers;
3 | //using Microsoft.AspNetCore.Mvc.Filters;
4 | //using SqlSugar;
5 |
6 | //namespace MalusAdmin.WebApi.Filter;
7 |
8 | //public class GlobalExceptionFilter : IAsyncExceptionFilter
9 | //{
10 | // private readonly ISqlSugarClient _db;
11 | // private readonly ILogger _logger;
12 |
13 | // public GlobalExceptionFilter(ILogger logger, ISqlSugarClient sqldb)
14 | // {
15 | // _logger = logger;
16 | // _db = sqldb;
17 | // }
18 |
19 | // public async Task OnExceptionAsync(ExceptionContext context)
20 | // {
21 | // try
22 | // {
23 | // var actionMethod = (context.ActionDescriptor as ControllerActionDescriptor)?.MethodInfo;
24 |
25 | // var sysLogEx = new TSysLogErr
26 | // {
27 | // ExceptionType = "后台异常",
28 | // ActionName = actionMethod.Name,
29 | // Message = context.Exception.ToJson(),
30 | // LogDateTime = DateTime.Now
31 | // };
32 |
33 | // Console.WriteLine($"处理 {DateTime.Now} : {sysLogEx.ToJson()}");
34 |
35 | // _db.Insertable(sysLogEx).SplitTable().ExecuteReturnSnowflakeId();
36 | // }
37 | // catch (Exception e)
38 | // {
39 | // //异常进行记录
40 | // await IOFileHelper.Write("error/", e.ToJson());
41 | // }
42 | // // 设置为true,表示异常已经被处理了
43 | // context.ExceptionHandled = true;
44 |
45 | // //弹出500异常
46 | // var ApiJson = new ApiJson(ApiCode.服务器错误, context.Exception.Message, "");
47 | // // 如果是结果异常
48 | // //IActionResult result = new ObjectResult(ApiJson) { StatusCode = StatusCodes.Status200OK };
49 | // context.Result = new JsonResult(ApiJson);
50 | // }
51 |
52 | //}
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/GlobalUsings.cs:
--------------------------------------------------------------------------------
1 | global using System;
2 | global using System.Text.Json;
3 | global using Microsoft.AspNetCore.Mvc;
4 | global using Microsoft.Extensions.Caching.Distributed;
5 | global using Microsoft.Extensions.Caching.Memory;
6 | global using Microsoft.Extensions.DependencyInjection;
7 | global using Microsoft.Extensions.DependencyInjection.Extensions;
8 | global using Newtonsoft.Json;
9 | global using Newtonsoft.Json.Converters;
10 | global using Newtonsoft.Json.Serialization;
11 | global using Swashbuckle.AspNetCore.Swagger;
12 | global using Swashbuckle.AspNetCore.SwaggerUI;
13 | global using MalusAdmin.Common;
14 | global using Microsoft.AspNetCore.Http;
15 | global using MalusAdmin.Repository.Model;
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/MalusAdmin.WebApi.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0
5 | enable
6 | enable
7 | True
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | Always
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Middleware/ServiceInspectorMiddleware.cs:
--------------------------------------------------------------------------------
1 | namespace MalusAdmin.WebApi.Middleware
2 | {
3 | using Microsoft.Extensions.DependencyInjection;
4 | using System.Text.Json;
5 | using System.Threading.Tasks;
6 |
7 | public class ServiceInspectorMiddleware
8 | {
9 | private readonly RequestDelegate _next;
10 | private readonly IServiceCollection _services;
11 |
12 | public ServiceInspectorMiddleware(RequestDelegate next, IServiceCollection services)
13 | {
14 | _next = next;
15 | _services = services;
16 | }
17 |
18 | public async Task InvokeAsync(HttpContext context)
19 | {
20 | // 检查请求路径是否为 /allservices
21 | if (context.Request.Path.Equals("/allservices", StringComparison.OrdinalIgnoreCase))
22 | {
23 | // 准备服务信息列表
24 | var serviceInfos = _services.Select(s => new
25 | {
26 | ServiceType = s.ServiceType.FullName,
27 | ImplementationType = s.ImplementationType?.FullName ?? s.ImplementationInstance?.GetType().FullName ?? "Factory",
28 | Lifetime = s.Lifetime.ToString()
29 | }).ToList();
30 |
31 | // 设置响应内容类型为 JSON
32 | context.Response.ContentType = "application/json";
33 |
34 | // 序列化服务信息并写入响应
35 | var json = JsonSerializer.Serialize(serviceInfos, new JsonSerializerOptions { WriteIndented = true });
36 | await context.Response.WriteAsync(json);
37 |
38 | return; // 终止管道
39 | }
40 |
41 | // 继续执行下一个中间件
42 | await _next(context);
43 | }
44 | }
45 |
46 | // 扩展方法以简化中间件注册
47 | public static class ServiceInspectorMiddlewareExtensions
48 | {
49 | public static IApplicationBuilder UseServiceInspector(this IApplicationBuilder builder)
50 | {
51 | return builder.UseMiddleware();
52 | }
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Permission/PermissionChecker.cs:
--------------------------------------------------------------------------------
1 | using System.Security.Claims;
2 | using MalusAdmin.Common.Components;
3 | using MalusAdmin.Servers;
4 |
5 | namespace MalusAdmin.WebApi
6 | {
7 | //public class PermissionChecker : IPermissionChecker
8 | //{
9 | // private readonly IAppUser _appUser;
10 | // private readonly ISysRolePermissionService _sysRolePermission;
11 |
12 | // public PermissionChecker(IAppUser appUser, ISysRolePermissionService sysRolePermission)
13 | // {
14 | // _appUser = appUser;
15 | // _sysRolePermission = sysRolePermission;
16 | // }
17 | // public virtual async Task IsGrantedAsync(ClaimsPrincipal claimsPrincipal, string name)
18 | // {
19 | // // 如果当前用户是超级管理员,跳过验证
20 | // //if (_appUser.Info.IsSuperAdmin()) return true;
21 |
22 | // string permission = name;
23 | // if (string.IsNullOrEmpty(permission))
24 | // {
25 | // // todo
26 | // // 获取录入系统中的所有权限
27 | // var all = await _sysRolePermission.GetAllButen();
28 | // List allPermissions = all.Select(x=>x.PermissionId).ToList();
29 |
30 | // // 如果没有配置该权限,则不限制该权限,通过验证
31 | // if (!allPermissions.Contains(permission)) return true;
32 |
33 | // // 获取当前用户的所有权限
34 | // List permissions = await _sysRolePermission.GetUserPermiss(App.User.Info.UserId);
35 |
36 | // // 如果当前用户拥有对应权限,则通过验证
37 | // if (permissions.Contains(permission)) return true;
38 | // }
39 | // if (string.IsNullOrEmpty(permission)) return false;
40 | // return false;
41 | // }
42 | //}
43 | }
44 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Program.cs:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/MalusApi/MalusAdmin.WebApi/Program.cs
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/launchsettings.json",
3 | "iisSettings": {
4 | "windowsAuthentication": false,
5 | "anonymousAuthentication": true,
6 | "iisExpress": {
7 | "applicationUrl": "http://localhost:27330",
8 | "sslPort": 44313
9 | }
10 | },
11 | "profiles": {
12 | "http": {
13 | "commandName": "Project",
14 | "dotnetRunMessages": true,
15 | "launchBrowser": true,
16 | "launchUrl": "swagger",
17 | "applicationUrl": "http://localhost:5172",
18 | "environmentVariables": {
19 | "ASPNETCORE_ENVIRONMENT": "Development"
20 | }
21 | },
22 | "https": {
23 | "commandName": "Project",
24 | "dotnetRunMessages": true,
25 | "launchBrowser": true,
26 | "launchUrl": "swagger",
27 | "applicationUrl": "https://localhost:7154;http://localhost:5172",
28 | "environmentVariables": {
29 | "ASPNETCORE_ENVIRONMENT": "Development"
30 | }
31 | },
32 | "IIS Express": {
33 | "commandName": "IISExpress",
34 | "launchBrowser": true,
35 | "launchUrl": "swagger",
36 | "environmentVariables": {
37 | "ASPNETCORE_ENVIRONMENT": "Development"
38 | }
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft.AspNetCore": "Warning"
6 | }
7 | },
8 | "AllowCors": [
9 | "*",
10 | "http://localhost:9527"
11 | ],
12 | "DisplaySwaggerDoc": true, //是否展示swagger文档
13 | "IsDemo": true, //是否是demo模式
14 | "RabbitMqConnetion": "host=127.0.0.1;virtualHost=/;username=admin;password=111;publisherConfirms",
15 | "SqlServerConnection": "Data Source=127.0.0.1;Initial Catalog=MalusAdminTest;User ID=sa;Password=11;Integrated Security=False;Column Encryption Setting=Enabled;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;",
16 | "MongoDB": {
17 | "ConnectionString": "mongodb://localhost:27017",
18 | "DatabaseName": "MyDatabase"
19 | },
20 | "Redis": {
21 | "Enabled": false,
22 | "ConnectionString": "127.0.0.1,password=123456,DefaultDatabase=0"
23 | },
24 | "RabbitMQConfig": {
25 | "HostName": "127.0.0.1",
26 | "UserName": "admin",
27 | "Password": 123123
28 | },
29 | "Jwt": {
30 | "Issuer": "AdminNetApp",
31 | "Audience": "https://localhost:7031/",
32 | "Secret": "70FC177F-3667-453D-9DA1-AF223DF6C014",
33 | "ExpireDays": 1
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/pm2.json:
--------------------------------------------------------------------------------
1 | {
2 | "apps": {
3 | "name": "malusapi",
4 | "script": "dotnet",
5 | "exec_mode": "fork",
6 | "error_file": "logs/err.log",
7 | "out_file": "logs/out.log",
8 | "merge_logs": true,
9 | "log_date_format": "YYYY-MM-DD HH:mm:ss",
10 | "min_uptime": "60s",
11 | "max_restarts": 30,
12 | "autorestart": true,
13 | "restart_delay": "60",
14 | "args": [
15 | "MalusAdmin.WebApi.dll",
16 | "--urls=http://*:5004"
17 | ],
18 | "env": {
19 | "ASPNETCORE_ENVIRONMENT": "Production"
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/MalusApi/MalusAdmin.WebApi/wwwroot/logo.txt:
--------------------------------------------------------------------------------
1 | __ __ _ _ _
2 | | \/ | | | /\ | | (_)
3 | | \ / | __ _ | | _ _ ___ / \ __| | _ __ ___ _ _ __
4 | | |\/| | / _` || || | | |/ __| / /\ \ / _` || '_ ` _ \ | || '_ \
5 | | | | || (_| || || |_| |\__ \ / ____ \| (_| || | | | | || || | | |
6 | |_| |_| \__,_||_| \__,_||___//_/ \_\\__,_||_| |_| |_||_||_| |_|
7 |
--------------------------------------------------------------------------------
/MalusApi/TODO.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/MalusApi/TODO.md
--------------------------------------------------------------------------------
/MalusApi/TemplateEngineHost/vs/.vstemplates.global.etag:
--------------------------------------------------------------------------------
1 | ad1b7adb2ed42a9d7be4b5c88ac179289476e67c45289a3648c8dca882b9f246
--------------------------------------------------------------------------------
/MalusApi/TemplateEngineHost/vs/.vstemplates.local.etag:
--------------------------------------------------------------------------------
1 | 258e4a07c15b7316390a151869a0bcbb6dcdeb7c622b4a23e43e1fa97116c321
--------------------------------------------------------------------------------
/MalusApi/Wechat.Servers/GlobalUsings.cs:
--------------------------------------------------------------------------------
1 | // global using 指令
2 |
3 | global using System;
4 | global using System.Collections.Generic;
5 | global using System.Linq;
6 | global using System.Net.Http.Json;
7 | global using System.Text;
8 | global using System.Threading.Tasks;
9 | global using MalusAdmin.Common;
10 | global using MalusAdmin.Encryption;
11 | global using Microsoft.AspNetCore.Http;
12 | global using Microsoft.AspNetCore.Mvc;
13 | global using NetTaste;
14 | global using SqlSugar;
15 | global using MalusAdmin.Repository.Model;
16 | global using Microsoft.AspNetCore.Authorization;
--------------------------------------------------------------------------------
/MalusApi/Wechat.Servers/Wechat.Servers.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0
5 | enable
6 | enable
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/MalusApi/Wechat.Servers/Wechat/WeChatGetOpenId.cs:
--------------------------------------------------------------------------------
1 | namespace Wechat.Servers;
2 |
3 | public class WeChatGetOpenId
4 | {
5 | private const string OpenIDUrl = "https://api.weixin.qq.com/sns/jscode2session";
6 | private readonly ISqlSugarClient _db;
7 |
8 | public WeChatGetOpenId(ISqlSugarClient db)
9 | {
10 | _db = db;
11 | }
12 |
13 | ///
14 | /// 获取OpenID
15 | /// 小程序登录凭证校验
16 | /// URL:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html
17 | ///
18 | /// 登录时获取的 code
19 | ///
20 | public async Task GetOpenID(string code)
21 | {
22 | var entity = _db.Queryable().First();
23 | if (entity == null) throw new Exception("获取微信授权失败,请联系管理员");
24 | var url =
25 | $"{OpenIDUrl}?appid={entity.WechatAppID}&secret={entity.WechatAppSecret}&js_code={code}&grant_type=authorization_code";
26 | using (var http = new HttpClient())
27 | {
28 | var res = await http.GetFromJsonAsync(url);
29 | switch (res.errcode)
30 | {
31 | case 0:
32 | return res;
33 |
34 | default:
35 | //todo 记录登录失败的日志
36 | throw new Exception($"小程序登录错误,错误代码:{res.ToJson()}");
37 | }
38 | }
39 | }
40 |
41 |
42 | ///
43 | /// 微信小程序登录
44 | ///
45 | public class WechatOpenIDInfo
46 | {
47 | ///
48 | ///
49 | public string openid { get; set; }
50 |
51 | ///
52 | ///
53 | public string session_key { get; set; }
54 |
55 | ///
56 | ///
57 | public string unionid { get; set; }
58 |
59 | ///
60 | ///
61 | public int errcode { get; set; }
62 |
63 | ///
64 | ///
65 | public string errmsg { get; set; }
66 | }
67 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.Servers/WxApiControllerBase.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar.Extensions;
2 |
3 | namespace Wechat.Servers;
4 |
5 | [ApiController]
6 | [Route("api/[controller]/[action]")]
7 | [Produces("application/json")] //返回数据的格式 直接约定为Json
8 | [Authorize] //接口全部需要登录,特殊的除外
9 | [ApiExplorerSettings(GroupName = "小程序")]
10 | public class WxApiControllerBase : ControllerBase
11 | {
12 | private int UserId => HttpContext?.User.FindFirst("UserId")?.Value.ObjToInt() ?? 0;
13 | private string OpenID => HttpContext?.User.FindFirst("OpenID")?.Value ?? "";
14 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Controllers/Element/Dto/BingEveryInput.cs:
--------------------------------------------------------------------------------
1 | namespace Wechat.WebApi.Controllers;
2 |
3 | public class BingEveryInput
4 | {
5 | //当前月份
6 | public string monthstr { get; set; }
7 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Controllers/Element/Dto/EveryDayBingOutput.cs:
--------------------------------------------------------------------------------
1 | namespace Wechat.WebApi.Controllers;
2 |
3 | public class EveryDayBingOutput
4 | {
5 | public string CopyRight { get; set; }
6 |
7 | public string GitUrl { get; set; }
8 |
9 | ///
10 | /// 开始时间
11 | ///
12 | public DateTime StartDate { get; set; }
13 |
14 | public string Url { get; set; }
15 |
16 | public string MobileUrl { get; set; }
17 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Controllers/Gallery/Dto/CategorizeOutput.cs:
--------------------------------------------------------------------------------
1 | public class CategorizeOutput
2 | {
3 | ///
4 | /// 博客元素
5 | ///
6 | public string title { get; set; }
7 |
8 | ///
9 | ///
10 | public string backgroundColor { get; set; }
11 |
12 | ///
13 | ///
14 | public List list { get; set; }
15 | }
16 |
17 | ///
18 | /// 小类
19 | ///
20 | public class CategorizeOutputItem
21 | {
22 | ///
23 | ///
24 | public string icon { get; set; }
25 |
26 | ///
27 | /// 内容中心
28 | ///
29 | public string title { get; set; }
30 |
31 | ///
32 | ///
33 | public string url { get; set; }
34 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Controllers/Gallery/Dto/LikeImgPage.cs:
--------------------------------------------------------------------------------
1 | ///
2 | /// 喜欢的照片分页
3 | ///
4 | public class LikeImgPage : PageParamBase
5 | {
6 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Controllers/Gallery/Dto/RandomGalleryOutput.cs:
--------------------------------------------------------------------------------
1 | public class RandomGalleryOutput : BsGallery
2 | {
3 | public BsCustomerCollect customer_collect { get; set; }
4 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Controllers/Gallery/Dto/RandomPage.cs:
--------------------------------------------------------------------------------
1 | public class RandomPage : PageParamBase
2 | {
3 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Controllers/HomeController.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Common;
2 | using Microsoft.AspNetCore.Authorization;
3 | using Microsoft.AspNetCore.Mvc;
4 | using Wechat.Servers;
5 |
6 | namespace Wechat.WebApi.Controllers;
7 |
8 | ///
9 | /// 测试服务
10 | ///
11 | [AllowAnonymous]
12 | public class HomeController : WxApiControllerBase
13 | {
14 | private readonly IHttpContextAccessor _httpContextAccessor;
15 |
16 | public HomeController(IHttpContextAccessor httpContextAccessor)
17 | {
18 | _httpContextAccessor = httpContextAccessor;
19 | }
20 |
21 | ///
22 | /// 统一返回
23 | ///
24 | ///
25 | [HttpGet]
26 | public int Index()
27 | {
28 | return UserId;
29 | }
30 |
31 |
32 | ///
33 | /// 获取远程请求的ip
34 | ///
35 | ///
36 | [HttpGet]
37 | [Authorize]
38 | public string RemoveIp()
39 | {
40 | return _httpContextAccessor.HttpContext?.GetRequestIPv4() ?? "暂无";
41 | }
42 |
43 | ///
44 | /// 统一返回
45 | ///
46 | ///
47 | [HttpGet]
48 | [Authorize]
49 | public string Insss()
50 | {
51 | return HttpContext?.User.FindFirst("asd").Value;
52 | }
53 |
54 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Controllers/MiniServiceController.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc;
2 | using SqlSugar;
3 | using Wechat.Servers;
4 |
5 | ///
6 | /// 小程序服务
7 | ///
8 | public class MiniServiceController : WxApiControllerBase
9 | {
10 | private readonly ISqlSugarClient _db;
11 |
12 | public MiniServiceController(ISqlSugarClient db)
13 | {
14 | _db = db;
15 | }
16 |
17 |
18 | ///
19 | /// 获取小程序的友联
20 | ///
21 | ///
22 | [HttpGet]
23 | public async Task SiteLink()
24 | {
25 | var list = await _db.Queryable()
26 | .Where(x => x.IsDeleted == false).ToListAsync();
27 | //list.Add(new MiniAppSiteLinkOutPut { App_id = "wxf3d81a452b88ff4b", Url = "http://imagesoss.hunji.xyz/tuniao/sitelink/199750c10f5f66cf296ee68be38ca81a.jpg", Title = "图鸟UI" });
28 |
29 | return list;
30 | }
31 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Controllers/Wechat/Dto/WechatPhoneLoginInput.cs:
--------------------------------------------------------------------------------
1 | ///
2 | /// 微信电话号码
3 | /// 一件登录模型
4 | ///
5 | public class WechatPhoneLoginInput
6 | {
7 | ///
8 | /// 包括敏感数据在内的完整用户信息的加密数据
9 | /// https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#%E5%8A%A0%E5%AF%86%E6%95%B0%E6%8D%AE%E8%A7%A3%E5%AF%86%E7%AE%97%E6%B3%95
10 | ///
11 | public string EncryptedData { get; set; }
12 |
13 | ///
14 | /// 加密算法的初始向量
15 | /// https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#%E5%8A%A0%E5%AF%86%E6%95%B0%E6%8D%AE%E8%A7%A3%E5%AF%86%E7%AE%97%E6%B3%95
16 | ///
17 | public string IV { get; set; }
18 |
19 | ///
20 | /// 代码(小程序 jscode)
21 | ///
22 | public string Code { get; set; }
23 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Controllers/Wechat/Dto/WxLoginOutput.cs:
--------------------------------------------------------------------------------
1 | public class WxLoginOutput
2 | {
3 | public string token { get; set; }
4 |
5 | public BsCustomer userinfo { get; set; }
6 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Filter/CustomApiResultProvider.cs:
--------------------------------------------------------------------------------
1 | //using MalusAdmin.Common;
2 | //using Microsoft.AspNetCore.Mvc;
3 |
4 | //namespace Wechat.WebApi.Filter;
5 |
6 | //public class CustomApiJsonProvider
7 | //{
8 | // public override IActionResult ProcessActionResult(IActionResult actionResult)
9 | // {
10 | // // 都返回 200 状态码
11 | // // 只处理 ObjectResult
12 | // var oldResult = base.ProcessActionResult(actionResult);
13 | // if (oldResult is ObjectResult objectResult)
14 | // {
15 | // // 如果状态码已经是 200,直接返回
16 | // if (objectResult.StatusCode == StatusCodes.Status200OK) return oldResult;
17 |
18 | // // 修改状态码
19 | // return new ObjectResult(objectResult.Value) { StatusCode = StatusCodes.Status200OK };
20 | // }
21 |
22 | // return actionResult;
23 | // }
24 |
25 | // public override IActionResult ProcessApiJsonException(ApiJsonException resultException)
26 | // {
27 | // // 都返回 200 状态码
28 | // // API 结果 统一处理为 ObjectResult 与 API 控制器保持一致
29 | // var ApiJson = resultException.ApiJson;
30 | // IActionResult result = new ObjectResult(ApiJson) { StatusCode = StatusCodes.Status200OK };
31 |
32 | // return result;
33 | // }
34 | //}
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Filter/GlobalExceptionFilter.cs:
--------------------------------------------------------------------------------
1 | using MalusAdmin.Common;
2 | using MalusAdmin.Common.Helper;
3 | using Microsoft.AspNetCore.Mvc;
4 | using Microsoft.AspNetCore.Mvc.Filters;
5 |
6 | public class GlobalExceptionFilter : IExceptionFilter, IOrderedFilter
7 | {
8 | private readonly ILogger _logger;
9 |
10 | public GlobalExceptionFilter(ILogger logger)
11 | {
12 | _logger = logger;
13 | }
14 |
15 | public async void OnException(ExceptionContext context)
16 | {
17 | //日志记录
18 | _logger.LogError(context.Exception, context.Exception.Message);
19 | //异常进行记录
20 | await IOFileHelper.Write("error/", context.Exception.ToJson());
21 |
22 | var ApiJson = new ApiJson(ApiCode.服务器错误, context.Exception.Message, "");
23 | // 如果是结果异常
24 | IActionResult result = new ObjectResult(ApiJson) { StatusCode = StatusCodes.Status200OK };
25 | context.Result = result;
26 | }
27 |
28 | ///
29 | /// 最先执行
30 | ///
31 | public int Order => int.MinValue;
32 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/GlobalUsings.cs:
--------------------------------------------------------------------------------
1 | // global using 指令
2 |
3 | global using System;
4 | global using System.Collections.Generic;
5 | global using System.Linq;
6 | global using System.Net.Http.Json;
7 | global using System.Text;
8 | global using System.Threading.Tasks;
9 | global using MalusAdmin.Common;
10 | global using MalusAdmin.Encryption;
11 | global using Microsoft.AspNetCore.Http;
12 | global using Microsoft.AspNetCore.Mvc;
13 | global using NetTaste;
14 | global using SqlSugar;
15 | global using MalusAdmin.Repository.Model;
16 | global using Microsoft.AspNetCore.Authorization;
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/launchsettings.json",
3 | "iisSettings": {
4 | "windowsAuthentication": false,
5 | "anonymousAuthentication": true,
6 | "iisExpress": {
7 | "applicationUrl": "http://localhost:2290",
8 | "sslPort": 44323
9 | }
10 | },
11 | "profiles": {
12 | "http": {
13 | "commandName": "Project",
14 | "dotnetRunMessages": true,
15 | "launchBrowser": true,
16 | "launchUrl": "swagger",
17 | "applicationUrl": "http://localhost:5202",
18 | "environmentVariables": {
19 | "ASPNETCORE_ENVIRONMENT": "Development"
20 | }
21 | },
22 | "https": {
23 | "commandName": "Project",
24 | "dotnetRunMessages": true,
25 | "launchBrowser": true,
26 | "launchUrl": "swagger",
27 | "applicationUrl": "https://localhost:7018;http://localhost:5202",
28 | "environmentVariables": {
29 | "ASPNETCORE_ENVIRONMENT": "Development"
30 | }
31 | },
32 | "IIS Express": {
33 | "commandName": "IISExpress",
34 | "launchBrowser": true,
35 | "launchUrl": "swagger",
36 | "environmentVariables": {
37 | "ASPNETCORE_ENVIRONMENT": "Development"
38 | }
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/WeChatGetOpenId.cs:
--------------------------------------------------------------------------------
1 | namespace Wechat.Servers;
2 |
3 | public class WeChatGetOpenId
4 | {
5 | private const string OpenIDUrl = "https://api.weixin.qq.com/sns/jscode2session";
6 | private readonly ISqlSugarClient _db;
7 |
8 | public WeChatGetOpenId(ISqlSugarClient db)
9 | {
10 | _db = db;
11 | }
12 |
13 | ///
14 | /// 获取OpenID
15 | /// 小程序登录凭证校验
16 | /// URL:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html
17 | ///
18 | /// 登录时获取的 code
19 | ///
20 | public async Task GetOpenID(string code)
21 | {
22 | var entity = _db.Queryable().First();
23 | if (entity == null) throw new Exception("获取微信授权失败,请联系管理员");
24 | var url =
25 | $"{OpenIDUrl}?appid={entity.WechatAppID}&secret={entity.WechatAppSecret}&js_code={code}&grant_type=authorization_code";
26 | using (var http = new HttpClient())
27 | {
28 | var res = await http.GetFromJsonAsync(url);
29 | switch (res.errcode)
30 | {
31 | case 0:
32 | return res;
33 |
34 | default:
35 | //todo 记录登录失败的日志
36 | throw new Exception($"小程序登录错误,错误代码:{res.ToJson()}");
37 | }
38 | }
39 | }
40 |
41 |
42 | ///
43 | /// 微信小程序登录
44 | ///
45 | public class WechatOpenIDInfo
46 | {
47 | ///
48 | ///
49 | public string openid { get; set; }
50 |
51 | ///
52 | ///
53 | public string session_key { get; set; }
54 |
55 | ///
56 | ///
57 | public string unionid { get; set; }
58 |
59 | ///
60 | ///
61 | public int errcode { get; set; }
62 |
63 | ///
64 | ///
65 | public string errmsg { get; set; }
66 | }
67 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/Wechat.WebApi.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0
5 | enable
6 | enable
7 | True
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/WxApiControllerBase.cs:
--------------------------------------------------------------------------------
1 | using SqlSugar.Extensions;
2 |
3 | namespace Wechat.Servers;
4 |
5 | [ApiController]
6 | [Route("api/[controller]/[action]")]
7 | [Produces("application/json")] //返回数据的格式 直接约定为Json
8 | [Authorize] //接口全部需要登录,特殊的除外
9 | [ApiExplorerSettings(GroupName = "小程序")]
10 |
11 | public class WxApiControllerBase : ControllerBase
12 | {
13 | public int UserId => HttpContext?.User.FindFirst("UserId")?.Value.ObjToInt() ?? 0;
14 | public string OpenID => HttpContext?.User.FindFirst("OpenID")?.Value ?? "";
15 | }
--------------------------------------------------------------------------------
/MalusApi/Wechat.WebApi/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft.AspNetCore": "Warning"
6 | }
7 | },
8 | "AllowCors": [
9 | "*",
10 | "http://localhost:9527"
11 | ],
12 | "DisplaySwaggerDoc": true,
13 | "SqlServerConnection": "Data Source=127.0.0.1;Initial Catalog=MalusAdmin;User ID=sa;Password=123;Integrated Security=False;Column Encryption Setting=Enabled;;Encrypt=True;TrustServerCertificate=True;",
14 | "Redis": {
15 | "Enabled": false,
16 | "Instance": "Malus",
17 | "ConnectionString": "127.0.0.1:6379,password=123456,DefaultDatabase=6"
18 | },
19 | "Jwt": {
20 | "SecretKey": "8kh2luzmp0oq9wfbdeasygj647vr531n678fs",
21 | "Issuer": "WallpaperNetIssuer",
22 | "Audience": "WallpaperNetAudience"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/doc/dbsql/20240429.sql:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/dbsql/20240429.sql
--------------------------------------------------------------------------------
/doc/dbsql/20240611.sql:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/dbsql/20240611.sql
--------------------------------------------------------------------------------
/doc/dbsql/20241014_sqlserver.sql:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/dbsql/20241014_sqlserver.sql
--------------------------------------------------------------------------------
/doc/images/1abaa087f16b5a3d074cfbd373161ac.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/1abaa087f16b5a3d074cfbd373161ac.jpg
--------------------------------------------------------------------------------
/doc/images/20240429112515.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/20240429112515.png
--------------------------------------------------------------------------------
/doc/images/20240429132404.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/20240429132404.png
--------------------------------------------------------------------------------
/doc/images/443e64138bacb6deb3fcf27ca163c9a.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/443e64138bacb6deb3fcf27ca163c9a.jpg
--------------------------------------------------------------------------------
/doc/images/95084fd62cc92f610b95f4831e4743a.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/95084fd62cc92f610b95f4831e4743a.jpg
--------------------------------------------------------------------------------
/doc/images/957e9f5757f1691e21286eefcfc2922.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/957e9f5757f1691e21286eefcfc2922.jpg
--------------------------------------------------------------------------------
/doc/images/9e47ef5edb4f352ed31b80212820301.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/9e47ef5edb4f352ed31b80212820301.jpg
--------------------------------------------------------------------------------
/doc/images/b66f7dfe10870656878a573e2c8931f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/b66f7dfe10870656878a573e2c8931f.jpg
--------------------------------------------------------------------------------
/doc/images/malus1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus1.png
--------------------------------------------------------------------------------
/doc/images/malus10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus10.png
--------------------------------------------------------------------------------
/doc/images/malus11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus11.png
--------------------------------------------------------------------------------
/doc/images/malus12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus12.png
--------------------------------------------------------------------------------
/doc/images/malus13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus13.png
--------------------------------------------------------------------------------
/doc/images/malus14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus14.png
--------------------------------------------------------------------------------
/doc/images/malus15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus15.png
--------------------------------------------------------------------------------
/doc/images/malus16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus16.png
--------------------------------------------------------------------------------
/doc/images/malus2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus2.png
--------------------------------------------------------------------------------
/doc/images/malus3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus3.png
--------------------------------------------------------------------------------
/doc/images/malus4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus4.png
--------------------------------------------------------------------------------
/doc/images/malus5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus5.png
--------------------------------------------------------------------------------
/doc/images/malus6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus6.png
--------------------------------------------------------------------------------
/doc/images/malus7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus7.png
--------------------------------------------------------------------------------
/doc/images/malus8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus8.png
--------------------------------------------------------------------------------
/doc/images/malus9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/malus9.png
--------------------------------------------------------------------------------
/doc/images/mp-code.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pridejoy/MalusAdmin/81f1804bbd490219249a7f21c76cc36ddb050800/doc/images/mp-code.png
--------------------------------------------------------------------------------
/doc/更新文档 - 模板.md:
--------------------------------------------------------------------------------
1 | # 更新日志
2 | ## [版本号] - [发布日期]
3 | ### 新增
4 | - 功能描述:新增了什么功能。
5 | - 特性描述:添加了哪些特性。
6 |
7 | ### 改进
8 | - 功能改进:对哪些功能进行了改进。
9 | - 性能提升:性能上的哪些提升。
10 |
11 | ### 修复
12 | - 错误修复:修复了哪些已知的错误。
13 |
14 | ### 移除
15 | - 功能移除:移除了哪些不再支持的功能。
16 |
17 | ### 文档
18 | - 文档更新:对文档进行了哪些更新。
19 |
20 | ### 其他
21 | - 其他变更:其他任何值得注意的变更。
22 |
23 | ## [版本号] - [发布日期]
24 | ### 新增
25 | - ...
26 |
27 | ### 改进
28 | - ...
29 |
30 | ### 修复
31 | - ...
32 |
33 | ### 移除
34 | - ...
35 |
36 | ### 文档
37 | - ...
38 |
39 | ### 其他
40 | - ...
--------------------------------------------------------------------------------
/doc/更新文档.md:
--------------------------------------------------------------------------------
1 | # 更新日志
2 |
3 | ## [1.02] - [2024.04.30]
4 |
5 | ### 新增
6 | - 功能描述:增加了系统日志。
--------------------------------------------------------------------------------