# zhp.net **Repository Path**: netzhp/zhp.net ## Basic Information - **Project Name**: zhp.net - **Description**: 小项目开箱即用,简化开发,很方便的增删改查后台管理系统 - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 31 - **Forks**: 11 - **Created**: 2023-05-10 - **Last Updated**: 2026-01-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 项目介绍 小项目开箱即用,简化开发,很方便的增删改查后台管理系统 #### 软件架构 1. 基于.Net9、SqlSugar、Vue3、TypeScript,SignalR,Hangfire, Redis。 2. 页面权限:实现菜单权限,页面区域权限,按钮权限。 3. 系统日志:审计日志,异常日志。 4. 聊天功能:支持发送图片。 5. 流程管理:集成Else2.0的流程实现审批功能。 6. 动态表单:拖拽即可实现一个简单的增删改查功能。 7. 体验地址:http://47.116.219.127 #### 项目源码 1. 后端源码:https://gitee.com/netzhp/zhp.net.git 2. 前端源码:https://gitee.com/netzhp/zhp.vue.git #### 使用说明 1. 后端需要提前安装好数据库,修改配置使用的数据库类型,启动即可运行 2. 打开前端项目npm run dev运行启动 #### 项目技术 1. SqlSugar封装,CodeFirst模式。 new UserEntity().InsertExtraEntity.Add(new MenuEntity())可携带额外数据一次将多不同表的数据自带事务提交到数据库。 ``` public async Task Create(AddChatFriendModel friend) { var pairID = SnowFlakeHelper.GetLongId(); var user = new ChatFriend { Id = SnowFlakeHelper.GetLongId(), UserId = _currentUser.UserId, FriendUserId = friend.FriendUserId, FriendNickName = friend.NickName, PairID = pairID, }; var friendUser = new ChatFriend { Id = SnowFlakeHelper.GetLongId(), UserId = friend.FriendUserId, FriendUserId = _currentUser.UserId, FriendNickName = _currentUser.NickName, PairID = pairID, }; user.InsertExtraEntity.Add(friendUser); return await dbContext.InsertAsync(user); } ``` 2. Zhp.Trigger触发器封装,在小项目复杂恶心的业务中往往会遇到根据某些条件执行一些相关同步操作时,就可以将逻辑提到触发器中实现。 ``` [Trigger(nameof(ChatContent))] public sealed class ChatContentTrigger : BaseTriggerService { public override void Inserted(ChatContent msg) { string content = msg.Content; if (msg.MessageType == MessageTypeEnum.Img) { content = MessageTypeEnum.Img.GetDescription(); } var chatUserList = Context.Queryable().Where(x => x.PairID == msg.PairID).ToList(); if (chatUserList.Any()) { foreach (var user in chatUserList) { user.LastMessage = content; user.LastTime = DateTime.Now; } Context.Updateable(chatUserList).ExecuteCommand(); } } } ``` 3. 枚举封装,比如一些下拉框,以及一些特定业务,使用字典只是单纯的将数据存储起来,并不能解决在写代码过程中的一些逻辑判断,最终还是要再定义枚举来做逻辑判断,所以本系统没有实现字典功能,作者本人感觉华而不实,通用接口api/Common/GetEnumList("枚举名称")返回对象数组可用于下拉框数据。 4. Swagger分组,token无感刷新,自定义授权,接口限流。 5. 缓存封装,支持内存缓存和Redis缓存,修改配置即可切换。 6. appsettings.json取值封装AppSettingHelper.GetOptions()即可获取。 7. 日志使用Serilog,全局异常记录。 8. 使用Hangfire实现任务调度。 9. 数据初始化中间件,在Controller,Action上标记特性,会自动初始化数据。 #### 项目截图 ![输入图片说明](https://foruda.gitee.com/images/1721877972816828453/cbc5e40d_8979493.png "屏幕截图") ![输入图片说明](https://foruda.gitee.com/images/1721877930068414337/a195f692_8979493.png "屏幕截图") ![输入图片说明](https://foruda.gitee.com/images/1721877952273122688/691dcdc6_8979493.png "屏幕截图") ![输入图片说明](https://foruda.gitee.com/images/1721878066456363591/1dfdbadc_8979493.png "屏幕截图") #### 欢迎交流 ![输入图片说明](1722388742588.png)