多个业务子系统的集中统一管理用户权限,SQL脚本批量事务运行的参考代码
2012-12-25 18:12 通用C#系统架构 阅读(1628) 评论(0) 编辑 收藏 举报子系统的配置管理参考界面,通用权限管理系统组件可以同时集中管理控制多个子系统,提高同时开发多个项目的效率。每个系统都可以独立,互相不干涉,灵活性高,部署开发方便,管理规范。
数据库里每个独立的子系统的参考效果图
创建子系统的相关代码,批量执行sql脚本,执行数据库事务的参考代码
/// <summary> /// 调用批量执行脚本的语句 /// 批量执行脚本 /// </summary> private void ExecuteScript(string[] lines) { using (IDbHelper dbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType)) { String sqlQuery = String.Empty; String sqlLine = String.Empty; try { // 打开数据库连接 dbHelper.Open(BaseSystemInfo.UserCenterDbConnection); dbHelper.BeginTransaction(); // 循环读取文本文件 for (int i = 0; i < lines.Length; i++) { sqlLine = lines[i]; if (sqlLine != null && !string.IsNullOrEmpty(sqlLine)) { if (sqlLine.ToUpper().Equals("GO")) { // 执行数据库查询语句 dbHelper.ExecuteNonQuery(sqlQuery); sqlQuery = string.Empty; } else { sqlQuery += sqlLine + System.Environment.NewLine; } } } dbHelper.CommitTransaction(); // 成功的提示信息 MessageBox.Show(AppMessage.MSG3010, AppMessage.MSG0000, MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { dbHelper.RollbackTransaction(); // 在本地文件中记录系统异常信息 this.WriteException(ex); throw; } finally { // 关闭数据库库连接 dbHelper.Close(); } } } #region public bool CheckInputCreateSystem() 检查输入的有效性 /// <summary> /// 检查输入的有效性 /// </summary> public bool CheckInputCreateSystem() { // 是否没有输入系统编号 if (string.IsNullOrEmpty(this.txtSystemCode.Text)) { MessageBox.Show(AppMessage.Format(AppMessage.MSG0007, AppMessage.MSG9977), AppMessage.MSG0000, MessageBoxButtons.OK, MessageBoxIcon.Information); this.txtUser.Focus(); return false; } // 是否没有输入系统名称 if (string.IsNullOrEmpty(this.txtSystemName.Text)) { MessageBox.Show(AppMessage.Format(AppMessage.MSG0007, AppMessage.MSG9978), AppMessage.MSG0000, MessageBoxButtons.OK, MessageBoxIcon.Information); this.txtUser.Focus(); return false; } return true; } #endregion private void btnCreateSystem_Click(object sender, EventArgs e) { if (this.CheckInputCreateSystem()) { // 按系统的配置信息动态获取数据库连接 string file = Application.StartupPath + "//Resources/System.sql"; if (System.IO.File.Exists(file)) { // 读取指定的脚本文件 string[] lines = File.ReadAllLines(file); for (int i = 0; i < lines.Length; i++) { lines[i] = lines[i].Replace("{SystemCode}", this.txtSystemCode.Text).Replace("{SystemName}", this.txtSystemName.Text); } this.ExecuteScript(lines); } } }
创建子系统的脚本参考
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[{SystemCode}Items]( [Id] [ int ] IDENTITY(1,1) NOT NULL, [ParentId] [ int ] NULL, [Code] [nvarchar](50) NULL, [FullName] [nvarchar](100) NULL, [TargetTable] [nvarchar](50) NULL, [IsTree] [ int ] NOT NULL, [UseItemCode] [nvarchar](50) NOT NULL, [UseItemName] [nvarchar](50) NOT NULL, [UseItemValue] [nvarchar](50) NOT NULL, [Enabled] [ int ] NOT NULL, [AllowEdit] [ int ] NOT NULL, [AllowDelete] [ int ] NOT NULL, [DeletionStateCode] [ int ] NOT NULL, [SortCode] [ int ] NULL, [Description] [nvarchar](200) NULL, [CreateOn] [smalldatetime] NULL, [CreateUserId] [nvarchar](20) NULL, [CreateBy] [nvarchar](20) NULL, [ModifiedOn] [smalldatetime] NULL, [ModifiedUserId] [nvarchar](20) NULL, [ModifiedBy] [nvarchar](20) NULL, CONSTRAINT [PK_{SystemCode}Items] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[{SystemCode}Items] ADD CONSTRAINT [DF_{SystemCode}ItemsIsTree] DEFAULT ((0)) FOR [IsTree] GO ALTER TABLE [dbo].[{SystemCode}Items] ADD CONSTRAINT [DF_{SystemCode}ItemsUseItemCode] DEFAULT (N '编号' ) FOR [UseItemCode] GO ALTER TABLE [dbo].[{SystemCode}Items] ADD CONSTRAINT [DF_{SystemCode}ItemsUseItemName] DEFAULT (N '名称' ) FOR [UseItemName] GO ALTER TABLE [dbo].[{SystemCode}Items] ADD CONSTRAINT [DF_{SystemCode}ItemsUseItemValue] DEFAULT (N '值' ) FOR [UseItemValue] GO ALTER TABLE [dbo].[{SystemCode}Items] ADD CONSTRAINT [DF_{SystemCode}ItemsEnabled] DEFAULT ((1)) FOR [Enabled] GO ALTER TABLE [dbo].[{SystemCode}Items] ADD CONSTRAINT [DF_{SystemCode}ItemsAllowEdit] DEFAULT ((1)) FOR [AllowEdit] GO ALTER TABLE [dbo].[{SystemCode}Items] ADD CONSTRAINT [DF_{SystemCode}ItemsAllowDelete] DEFAULT ((1)) FOR [AllowDelete] GO ALTER TABLE [dbo].[{SystemCode}Items] ADD CONSTRAINT [DF_{SystemCode}ItemsDeletionStateCode] DEFAULT ((0)) FOR [DeletionStateCode] GO ALTER TABLE [dbo].[{SystemCode}Items] ADD CONSTRAINT [DF_{SystemCode}ItemsCreateOn] DEFAULT (getdate()) FOR [CreateOn] GO ALTER TABLE [dbo].[{SystemCode}Items] ADD CONSTRAINT [DF_{SystemCode}ItemsModifiedOn] DEFAULT (getdate()) FOR [ModifiedOn] GO CREATE TABLE [dbo].[{SystemCode}Module]( [Id] [ int ] IDENTITY(1,1) NOT NULL, [ParentId] [ int ] NULL, [Code] [nvarchar](100) NULL, [FullName] [nvarchar](100) NULL, [Category] [nvarchar](50) NULL, [ImageIndex] [nvarchar](50) NULL, [SelectedImageIndex] [nvarchar](50) NULL, [NavigateUrl] [nvarchar](200) NULL, [Target] [nvarchar](100) NULL, [FormName] [nvarchar](100) NULL, [AssemblyName] [nvarchar](100) NULL, [PermissionItemCode] [nvarchar](50) NULL, [PermissionScopeTables] [nvarchar](500) NULL, [SortCode] [ int ] NULL, [Enabled] [ int ] NOT NULL, [DeletionStateCode] [ int ] NOT NULL, [IsMenu] [ int ] NULL, [IsPublic] [ int ] NOT NULL, [Expand] [ int ] NOT NULL, [AllowEdit] [ int ] NOT NULL, [AllowDelete] [ int ] NOT NULL, [Description] [nvarchar](200) NULL, [CreateOn] [smalldatetime] NULL, [CreateUserId] [nvarchar](20) NULL, [CreateBy] [nvarchar](20) NULL, [ModifiedOn] [smalldatetime] NULL, [ModifiedUserId] [nvarchar](20) NULL, [ModifiedBy] [nvarchar](20) NULL, CONSTRAINT [PK_{SystemCode}Module] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[{SystemCode}Module] ADD CONSTRAINT [DF_{SystemCode}ModulePermissionItemCode] DEFAULT (N 'Resource.AccessPermission' ) FOR [PermissionItemCode] GO ALTER TABLE [dbo].[{SystemCode}Module] ADD CONSTRAINT [DF_{SystemCode}ModuleEnabled] DEFAULT ((1)) FOR [Enabled] GO ALTER TABLE [dbo].[{SystemCode}Module] ADD CONSTRAINT [DF_{SystemCode}ModuleDeletionStateCode] DEFAULT ((0)) FOR [DeletionStateCode] GO ALTER TABLE [dbo].[{SystemCode}Module] ADD CONSTRAINT [DF_{SystemCode}ModuleIsMenu] DEFAULT ((1)) FOR [IsMenu] GO ALTER TABLE [dbo].[{SystemCode}Module] ADD CONSTRAINT [DF_{SystemCode}ModuleIsPublic] DEFAULT ((0)) FOR [IsPublic] GO ALTER TABLE [dbo].[{SystemCode}Module] ADD CONSTRAINT [DF_{SystemCode}ModuleExpand] DEFAULT ((0)) FOR [Expand] GO ALTER TABLE [dbo].[{SystemCode}Module] ADD CONSTRAINT [DF_{SystemCode}ModuleAllowEdit] DEFAULT ((1)) FOR [AllowEdit] GO ALTER TABLE [dbo].[{SystemCode}Module] ADD CONSTRAINT [DF_{SystemCode}ModuleAllowDelete] DEFAULT ((1)) FOR [AllowDelete] GO CREATE TABLE [dbo].[{SystemCode}Permission]( [Id] [ int ] IDENTITY(1,1) NOT NULL, [ResourceCategory] [nvarchar](50) NULL, [ResourceId] [nvarchar](50) NULL, [PermissionId] [nvarchar](50) NULL, [PermissionConstraint] [nvarchar](200) NULL, [Enabled] [ int ] NULL, [DeletionStateCode] [ int ] NOT NULL, [Description] [nvarchar](200) NULL, [CreateOn] [smalldatetime] NULL, [CreateUserId] [nvarchar](20) NULL, [CreateBy] [nvarchar](20) NULL, [ModifiedOn] [smalldatetime] NULL, [ModifiedUserId] [nvarchar](20) NULL, [ModifiedBy] [nvarchar](20) NULL, CONSTRAINT [PK_{SystemCode}Permission] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[{SystemCode}Permission] ADD CONSTRAINT [DF_{SystemCode}PermissionDeletionStateCode] DEFAULT ((0)) FOR [DeletionStateCode] GO ALTER TABLE [dbo].[{SystemCode}Permission] ADD CONSTRAINT [DF_{SystemCode}PermissionCreateOn] DEFAULT (getdate()) FOR [CreateOn] GO ALTER TABLE [dbo].[{SystemCode}Permission] ADD CONSTRAINT [DF_{SystemCode}PermissionModifiedOn] DEFAULT (getdate()) FOR [ModifiedOn] GO CREATE TABLE [dbo].[{SystemCode}PermissionItem]( [Id] [ int ] IDENTITY(1,1) NOT NULL, [ParentId] [ int ] NULL, [Code] [nvarchar](100) NULL, [FullName] [nvarchar](200) NULL, [CategoryCode] [nvarchar](50) NOT NULL, [IsScope] [ int ] NOT NULL, [IsPublic] [ int ] NOT NULL, [IsVisible] [ int ] NOT NULL, [AllowEdit] [ int ] NOT NULL, [AllowDelete] [ int ] NOT NULL, [LastCall] [smalldatetime] NULL, [SortCode] [ int ] NULL, [Enabled] [ int ] NOT NULL, [DeletionStateCode] [ int ] NOT NULL, [Description] [nvarchar](200) NULL, [CreateOn] [smalldatetime] NULL, [CreateUserId] [nvarchar](20) NULL, [CreateBy] [nvarchar](20) NULL, [ModifiedOn] [smalldatetime] NULL, [ModifiedUserId] [nvarchar](20) NULL, [ModifiedBy] [nvarchar](20) NULL, CONSTRAINT [PK_{SystemCode}PermissionItem] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[{SystemCode}PermissionItem] ADD CONSTRAINT [DF_{SystemCode}PermissionItemCategoryCode] DEFAULT (N 'Application' ) FOR [CategoryCode] GO ALTER TABLE [dbo].[{SystemCode}PermissionItem] ADD CONSTRAINT [DF_{SystemCode}PermissionItemIsScope] DEFAULT ((0)) FOR [IsScope] GO ALTER TABLE [dbo].[{SystemCode}PermissionItem] ADD CONSTRAINT [DF_{SystemCode}PermissionItemIsPublic] DEFAULT ((0)) FOR [IsPublic] GO ALTER TABLE [dbo].[{SystemCode}PermissionItem] ADD CONSTRAINT [DF_{SystemCode}PermissionItemIsVisible] DEFAULT ((1)) FOR [IsVisible] GO ALTER TABLE [dbo].[{SystemCode}PermissionItem] ADD CONSTRAINT [DF_{SystemCode}PermissionItemAllowEdit] DEFAULT ((1)) FOR [AllowEdit] GO ALTER TABLE [dbo].[{SystemCode}PermissionItem] ADD CONSTRAINT [DF_{SystemCode}PermissionItemAllowDelete] DEFAULT ((1)) FOR [AllowDelete] GO ALTER TABLE [dbo].[{SystemCode}PermissionItem] ADD CONSTRAINT [DF_{SystemCode}PermissionItemEnabled] DEFAULT ((1)) FOR [Enabled] GO ALTER TABLE [dbo].[{SystemCode}PermissionItem] ADD CONSTRAINT [DF_{SystemCode}PermissionItemDeletionStateCode] DEFAULT ((0)) FOR [DeletionStateCode] GO ALTER TABLE [dbo].[{SystemCode}PermissionItem] ADD CONSTRAINT [DF_{SystemCode}PermissionItemCreateOn] DEFAULT (getdate()) FOR [CreateOn] GO ALTER TABLE [dbo].[{SystemCode}PermissionItem] ADD CONSTRAINT [DF_{SystemCode}PermissionItemModifiedOn] DEFAULT (getdate()) FOR [ModifiedOn] GO CREATE TABLE [dbo].[{SystemCode}PermissionScope]( [Id] [ int ] IDENTITY(1,1) NOT NULL, [ResourceCategory] [nvarchar](50) NULL, [ResourceId] [nvarchar](50) NULL, [TargetCategory] [nvarchar](50) NULL, [TargetId] [nvarchar](50) NULL, [PermissionId] [ int ] NULL, [PermissionConstraint] [nvarchar](200) NULL, [StartDate] [smalldatetime] NULL, [EndDate] [smalldatetime] NULL, [Enabled] [ int ] NOT NULL, [DeletionStateCode] [ int ] NOT NULL, [Description] [nvarchar](200) NULL, [CreateOn] [smalldatetime] NULL, [CreateUserId] [nvarchar](20) NULL, [CreateBy] [nvarchar](20) NULL, [ModifiedOn] [smalldatetime] NULL, [ModifiedUserId] [nvarchar](20) NULL, [ModifiedBy] [nvarchar](20) NULL, CONSTRAINT [PK_{SystemCode}PermissionScope] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[{SystemCode}PermissionScope] ADD CONSTRAINT [DF_{SystemCode}PermissionScopeEnabled] DEFAULT ((1)) FOR [Enabled] GO ALTER TABLE [dbo].[{SystemCode}PermissionScope] ADD CONSTRAINT [DF_{SystemCode}PermissionScopeDeletionStateCode] DEFAULT ((0)) FOR [DeletionStateCode] GO ALTER TABLE [dbo].[{SystemCode}PermissionScope] ADD CONSTRAINT [DF_{SystemCode}PermissionScopeCreateOn] DEFAULT (getdate()) FOR [CreateOn] GO ALTER TABLE [dbo].[{SystemCode}PermissionScope] ADD CONSTRAINT [DF_{SystemCode}PermissionScopeModifiedOn] DEFAULT (getdate()) FOR [ModifiedOn] GO CREATE TABLE [dbo].[{SystemCode}Role]( [Id] [ int ] IDENTITY(1,1) NOT NULL, [SystemId] [nvarchar](50) NULL, [OrganizeId] [ int ] NULL, [CategoryCode] [nvarchar](50) NULL, [Code] [nvarchar](50) NULL, [Realname] [nvarchar](200) NULL, [AllowEdit] [ int ] NOT NULL, [AllowDelete] [ int ] NOT NULL, [IsVisible] [ int ] NOT NULL, [SortCode] [ int ] NULL, [DeletionStateCode] [ int ] NOT NULL, [Enabled] [ int ] NOT NULL, [Description] [nvarchar](200) NULL, [CreateOn] [smalldatetime] NULL, [CreateUserId] [nvarchar](20) NULL, [CreateBy] [nvarchar](20) NULL, [ModifiedOn] [smalldatetime] NULL, [ModifiedUserId] [nvarchar](20) NULL, [ModifiedBy] [nvarchar](20) NULL, CONSTRAINT [PK_{SystemCode}Role] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[{SystemCode}Role] ADD CONSTRAINT [DF_{SystemCode}RoleAllowEdit] DEFAULT ((1)) FOR [AllowEdit] GO ALTER TABLE [dbo].[{SystemCode}Role] ADD CONSTRAINT [DF_{SystemCode}RoleAllowDelete] DEFAULT ((1)) FOR [AllowDelete] GO ALTER TABLE [dbo].[{SystemCode}Role] ADD CONSTRAINT [DF_{SystemCode}RoleIsVisible] DEFAULT ((1)) FOR [IsVisible] GO ALTER TABLE [dbo].[{SystemCode}Role] ADD CONSTRAINT [DF_{SystemCode}RoleSortCode] DEFAULT ((0)) FOR [SortCode] GO ALTER TABLE [dbo].[{SystemCode}Role] ADD CONSTRAINT [DF_{SystemCode}RoleDeletionStateCode] DEFAULT ((0)) FOR [DeletionStateCode] GO ALTER TABLE [dbo].[{SystemCode}Role] ADD CONSTRAINT [DF_{SystemCode}RoleEnabled] DEFAULT ((1)) FOR [Enabled] GO ALTER TABLE [dbo].[{SystemCode}Role] ADD CONSTRAINT [DF_{SystemCode}RoleCreateOn] DEFAULT (getdate()) FOR [CreateOn] GO ALTER TABLE [dbo].[{SystemCode}Role] ADD CONSTRAINT [DF_{SystemCode}RoleModifiedOn] DEFAULT (getdate()) FOR [ModifiedOn] GO CREATE TABLE [dbo].[{SystemCode}UserRole]( [Id] [ int ] IDENTITY(1,1) NOT NULL, [UserId] [ int ] NULL, [RoleId] [ int ] NOT NULL, [SortCode] [ int ] NULL, [Enabled] [ int ] NOT NULL, [DeletionStateCode] [ int ] NOT NULL, [Description] [nvarchar](200) NULL, [CreateOn] [smalldatetime] NULL, [CreateUserId] [nvarchar](20) NULL, [CreateBy] [nvarchar](20) NULL, [ModifiedOn] [smalldatetime] NULL, [ModifiedUserId] [nvarchar](20) NULL, [ModifiedBy] [nvarchar](20) NULL, CONSTRAINT [PK_{SystemCode}UserRole] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[{SystemCode}UserRole] ADD CONSTRAINT [DF_{SystemCode}UserRoleEnabled] DEFAULT ((1)) FOR [Enabled] GO ALTER TABLE [dbo].[{SystemCode}UserRole] ADD CONSTRAINT [DF_{SystemCode}UserRoleDeletionStateCode] DEFAULT ((0)) FOR [DeletionStateCode] GO ALTER TABLE [dbo].[{SystemCode}UserRole] ADD CONSTRAINT [DF_{SystemCode}UserRoleCreateOn] DEFAULT (getdate()) FOR [CreateOn] GO ALTER TABLE [dbo].[{SystemCode}UserRole] ADD CONSTRAINT [DF_{SystemCode}UserRoleModifiedOn] DEFAULT (getdate()) FOR [ModifiedOn] GO INSERT INTO [dbo].[{SystemCode}PermissionItem] ([Code],[FullName],[IsVisible]) VALUES( 'Resource.ManagePermission' , '资源管理权限[系统内置]' , 0) GO INSERT INTO [dbo].[{SystemCode}PermissionItem] ([Code],[FullName],[IsVisible]) VALUES( 'Resource.AccessPermission' , '资源访问权限[系统内置]' , 0) GO INSERT INTO [dbo].[{SystemCode}PermissionItem] ([Code],[FullName],[IsVisible]) VALUES( 'Column.Access' , '访问列权限[系统内置]' , 0) GO INSERT INTO [dbo].[{SystemCode}PermissionItem] ([Code],[FullName],[IsVisible]) VALUES( 'Column.Edit' , '编辑列访问[系统内置]' , 0) GO INSERT INTO [dbo].[{SystemCode}PermissionItem] ([Code],[FullName],[IsVisible]) VALUES( 'Column.Deney' , '拒绝访问列[系统内置]' , 0) GO INSERT INTO [dbo].[ItemsSystem] ([ItemCode],[ItemName],[ItemValue]) VALUES( '{SystemCode}' , '{SystemName}' , '{SystemCode}' ) GO |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!