├── .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 | - 功能描述:增加了系统日志。 --------------------------------------------------------------------------------