从零开始编写属于我的CMS:(六)插件

二三四五还没写,先写六吧(有道友说想看看插件部分)。

这里是一 从零开始编写属于我的CMS:(一)前言

一,首先预定义接口

新建类库,WangCms.PluginInterface

新建两个类,一个实体Models.cs,一个接口IPlugin.cs

Models是插件所用到的实体集合类;IPlugin是为第三方预定义接口,所有插件必须实现该接口。

实体Models代码如下

 1 namespace WangCms.PluginInterface
 2 {
 3     public class PluginInfo
 4     {
 5         /// <summary>
 6         /// Code
 7         /// </summary>
 8         public string Code { get; set; }
 9         /// <summary>
10         /// 插件名称
11         /// </summary>
12         public string Name { get; set; }
13         /// <summary>
14         /// 作者
15         /// </summary>
16         public string Author { get; set; }
17         /// <summary>
18         /// 插件版本
19         /// </summary>
20         public string Version { get; set; }
21         /// <summary>
22         /// 适用cms版本
23         /// </summary>
24         public string ApplyVersion { get; set; }
25         /// <summary>
26         /// 描述信息
27         /// </summary>
28         public string Description { get; set; }
29
30
31         //附加信息
32         public string Area { get; set; }
33         public string AdminController { get; set; }
34         public string AdminAction { get; set; }
35         public string AdminQueryString { get; set; }
36     }
37     public class ResultOptin<T>
38     {
39         public bool State { get; set; }
40         public string Msg { get; set; }
41
42         public T Result { get; set; }
43     }
44 }

接口IPlufin代码如下

 1 namespace WangCms.PluginInterface
 2 {
 3     public interface IPlugin
 4     {
 5         /// <summary>
 6         /// 插件注册
 7         /// </summary>
 8         /// <returns></returns>
 9         ResultOptin<PluginInfo> Register();
10         /// <summary>
11         /// 插件安装
12         /// </summary>
13         /// <param name="model"></param>
14         /// <returns></returns>
15         ResultOptin<string> Install();
16         /// <summary>
17         /// 插件卸载
18         /// </summary>
19         /// <returns></returns>
20         ResultOptin<string> Uninstall();
21     }
22 }

二,留言插件

新建一个插件项目(类库),WangCms.Plugin.LiuYan

然后添加相关引用(MVC、WangCms.PluginInterface)等。

首先实现插件接口,新建PluginRegister.cs继承IPlugin,主要为了实现插件的注册、安装以及卸载功能的实现。

PluginRegister代码如下

 1 namespace WangCms.Plugin.LiuYan
 2 {
 3     public class PluginRegister : IPlugin
 4     {
 5         #region 实现接口
 6         public ResultOptin<PluginInfo> Register()
 7         {
 8             ResultOptin<PluginInfo> result = new ResultOptin<PluginInfo>();
 9             try
10             {
11                 PluginInfo model = new PluginInfo();
12                 //后台管理入口
13                 model.Area = "LiuYan";
14                 model.AdminController = "LiuYanAdmin";
15                 model.AdminAction = "Index";
16                 model.AdminQueryString = null;
17
18                 //插件基本信息
19                 model.Code = "48a3619327c64a9aa68645007037b451";
20                 model.Name = "在线留言";
21                 model.Author = "千年";
22                 model.Version = "1.0.0";
23                 model.ApplyVersion = "1.0.0";
24                 model.Description = "";
25
26                 //状态  特别重要
27                 result.State = true;
28                 result.Result = model;
29             }
30             catch(Exception ex)
31             {
32                 result.State = false;
33                 result.Msg = ex.Message;
34             }
35             return result;
36         }
37
38         public ResultOptin<string> Install()
39         {
40             ResultOptin<string> result = new ResultOptin<string>();
41             try
42             {
43                 //安装插件
44                 //比如执行sql(创建表,插入数据等),创建目录,创建文件等
45                 string sql =
46     @"create table LiuYan(
47   Id varchar(50) primary key,
48   Title varchar(50),
49   Name varchar(50),
50   Contact varchar(50),
51   Content text
52 );";
53                 LiuYanService.Instance.Excute(sql);
54                 result.State = true;
55             }
56             catch(Exception ex)
57             {
58                 result.State = false;
59                 result.Msg = ex.Message;
60             }
61             return result;
62         }
63
64         public ResultOptin<string> Uninstall()
65         {
66             ResultOptin<string> result = new ResultOptin<string>();
67             try
68             {
69                 //卸载插件
70                 //比如执行sql(删除表,删除数据等),删除目录,删除文件等
71                 string sql = @"drop table LiuYan;";
72                 LiuYanService.Instance.Excute(sql);
73                 result.State = true;
74             }
75             catch(Exception ex)
76             {
77                 result.State = false;
78                 result.Msg = ex.Message;
79             }
80             return result;
81         }
82         #endregion
83     }
84 }

其实,只要实现了接口插件就算完成了,只是该插件还不具备任何实用功能,根据插件名字我想大家知道这个是干嘛的了吧,这就是在线留言的插件,下面就是很简单的留言业务逻辑以及功能的实现了。

插件区域,就是MVC的区域,我们用不同区域来区分和管理插件。

MVC区域,不熟悉的同学可以在园子里搜搜相关文章。

在区域里面可以建Controller和View,还有比较重要的就是区域注册,就是区域的路由吧。

LiuYanAreaRegistration.cs

 1 namespace WangCms.Plugin.LiuYan
 2 {
 3     public class LiuYanAreaRegistration : AreaRegistration
 4     {
 5         public override string AreaName
 6         {
 7             get
 8             {
 9                 return "LiuYan";
10             }
11         }
12
13         public override void RegisterArea(AreaRegistrationContext context)
14         {
15             context.MapRoute(
16                 "LiuYan_default",
17                 "LiuYan/{controller}/{action}/{id}",
18                 new { action = "Index", id = UrlParameter.Optional },
19                 new string[] { "WangCms.Plugin.LiuYan.Controllers" }
20             );
21         }
22     }
23 }

然后,就是功能实现了,这部分就略过吧。

在线留言后台管理,新建一个控制器AdminController.cs以及相应的视图。

在线留言前台功能,新建一个控制器PageController.cs以及相应的视图。

三,插件使用

主项目如何使用插件呢?

首先将编译好的插件,上传至主项目下,结构如图。

视图文件和插件时路径一致,WangCms.Plugin.LiuYan.dll上传至主项目bin下。

3.1 获取插件列表

 1 private List<Plugin> GetPluginList()
 2         {
 3             List<Plugin> list = new List<Plugin>();
 4             string path = Server.MapPath("/bin/");
 5             FileInfo[] files = (new DirectoryInfo(path)).GetFiles("*.dll");
 6             foreach (var item in files)
 7             {
 8                 try
 9                 {
10                     if (!item.Name.StartsWith("WangCms.Plugin.")) continue;
11                     Plugin model = new Plugin();
12                     Assembly ass = Assembly.LoadFile(item.FullName);
13                     Type tp = ass.GetType(item.Name.Replace(".dll", "") + "." + "PluginRegister");  //获取类名,必须 命名空间+类名
14                     Object obj = Activator.CreateInstance(tp);  //建立实例
15                     MethodInfo meth = tp.GetMethod("Register");  //获取方法
16                     object t = meth.Invoke(obj, null);  //Invoke调用方法
17
18                     PluginInterface.ResultOptin<PluginInterface.PluginInfo> result = (PluginInterface.ResultOptin<PluginInterface.PluginInfo>)t;
19                     if (result.State)//插件注册成功
20                     {
21                         ToPlugin(result.Result, ref model);
22                         model.Type = tp;
23                         list.Add(model);
24                     }
25                 }
26                 catch { }
27             }
28
29
30             return list;
31         }

这里有一个插件类转换的方法。

 1 private void ToPlugin(PluginInterface.PluginInfo t, ref Plugin p)
 2         {
 3             if (t != null)
 4             {
 5                 p.Code = t.Code;
 6                 p.Name = t.Name;
 7                 p.Author = t.Author;
 8                 p.Version = t.Version;
 9                 p.ApplyVersion = t.ApplyVersion;
10                 p.Description = t.Description;
11                 p.AdminController = t.AdminController;
12                 p.AdminAction = t.AdminAction;
13                 p.AdminQueryString = t.AdminQueryString;
14             }
15         }

3.2 安装插件

 1         public ActionResult plugin_install(string code)
 2         {
 3             var list = GetPluginList();
 4
 5             var o = list.FirstOrDefault(op => op.Code == code);
 6             if (o != null)
 7             {
 8                 //执行安装方法
 9                 Object obj = Activator.CreateInstance(o.Type);  //建立实例
10                 MethodInfo meth = o.Type.GetMethod("Install");  //获取方法
11                 object t = meth.Invoke(obj, null);  //Invoke调用方法
12
13                 PluginInterface.ResultOptin<string> result = (PluginInterface.ResultOptin<string>)t;
14                 if (result.State)
15                 {
16                     //记录数据
17                     PluginService.Instance.UpdateOrInsert(o);
18                 }
19                 else
20                 {
21                     return Content(result.Msg);
22                 }
23             }
24             return RedirectToAction("plugin_list");
25         }

3.3 卸载插件

 1        public ActionResult plugin_uninstall(string code)
 2         {
 3             var list = GetPluginList();
 4
 5             var o = list.FirstOrDefault(op => op.Code == code);
 6             if (o != null)
 7             {
 8                 //执行安装方法
 9                 Object obj = Activator.CreateInstance(o.Type);  //建立实例
10                 MethodInfo meth = o.Type.GetMethod("Uninstall");  //获取方法
11                 object t = meth.Invoke(obj, null);  //Invoke调用方法
12
13                 PluginInterface.ResultOptin<string> result = (PluginInterface.ResultOptin<string>)t;
14                 if (result.State)
15                 {
16                     //删除数据
17                     PluginService.Instance.DeleteByCode(o.Code);
18                 }
19                 else
20                 {
21                     return Content(result.Msg);
22                 }
23             }
24             return RedirectToAction("plugin_list");
25         }

插件源码下载

插件源码下载

时间: 2024-12-16 23:20:06

从零开始编写属于我的CMS:(六)插件的相关文章

从零开始编写属于我的CMS:(一)前言

一,项目背景 记得大学毕业课题,我就是选择做个CMS,不过当时虽然做了个,不过感觉不是很好,所以现在又重做了,顺便发上来供大家讨论的.虽然CMS不是什么特别的项目,但是还是想从一个普通项目学到更多的东西. 二,核心技术 使用asp.net mvc5 模板引擎使用razor. 还有简单数据操作工具WangSql,反正我用起来很爽. 大家都应该知道CMS最重要的一点就是模板,所谓快速建站还能适应各种需求,除了这些网站本来就有共同点外,最重要一点就是模板.模板甚至还可以体现网站业务,一套模板就可以撑起

从零开始编写属于我的CMS:(二)系统讲解

目录 1 系统管理 1.1 系统设置 1.2 路由设置 1.3 缓存管理 1.4 模板管理 2 系统用户 2.1 角色管理 2.2 管理员管理 3 站点管理 3.1 站点设置 3.2 频道管理 3.3 栏目管理 3.4 项目管理 4 内容管理 5 高级管理 5.1 内容回收 5.2 表单管理 5.3 插件管理(未实现) 正文 1.1 系统设置 主要用于设置系统相关信息,包括基本信息,前线设置,邮箱设置. 表结构 整个系统设置只是一个键值对的值,KEY:SysConfig VALUE:xml/js

从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用

标题:从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用. 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11717254.html 源代码:https://github.com/lamondlu/DynamicPlugins 前景回顾 从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图 从零开始实现ASP.NET Core MVC的插件

从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)

原文:从零开始编写自己的C#框架(6)--SubSonic3.0插件介绍(附源码) 前面几章主要是概念性的东西为主,向初学者们介绍项目开始前的一些知识与内容,从本章开始将会进入实操阶段,希望跟着本系统学习的朋友认真按说明做好每一步操作(对于代码最好是直接照着文档内容在你的IDE中打一次出来,而不是使用复制粘贴),这样对你理解后面的章节会有较好的帮助,如果你对我这种书写方式有什么建议或支持,也希望在评论中留言,谢谢你的支持. SubSonic3.0简介 SubSonic是Rob Conery用c#

从零开始编写一个vue插件

title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一个mathjax编辑器,因此直接写一个插件试一下. 准备账号 进入npm注册账号 初始化项目 vue init webpack-simple mathjax-toolbar cd mathjax-toolbar npm install 得到的项目内的/src结构如下: src/ ├── assets

从零开始编写IntelliJ IDEA插件

写Java代码的时候,经常会涉及到重复性的操作,这个时候就会想要是有这样一个插件就好了,如果是大家都会遇到的场景,IDE或许已经提供了,再不然也有可能有人编写了相关的插件.要是这个操作是你们的编码环境特有的,那就只能自己写工具了.所以这里来学学如何编写IDEA插件,让自己的编程环境更加强大,更好的进行装逼. 开发环境 开发IDEA插件有以下这些依赖: IntelliJ IDEA Community Edition IntelliJ IDEA Community Edition 源码 Plugin

从零开始编写自己的C#框架(5)——三层架构介绍

原文:从零开始编写自己的C#框架(5)--三层架构介绍 三层架构对于开发人员来说,已经是司空见惯了,除了大型与超小型项目外,大多都是这种架构来进行开发. 在这里为初学者们简单介绍一下三层架构: (下面内容摘自<趣味理解:三层架构与养猪-<.NET深入体验与实战精要>>,这是以前看到的关于三层架构介绍,觉得挺经典的,大家有时间的话认真看看) 对比以上两图,我们可以看出: 1)数据库好比猪圈 ,所有的猪有序地按区域或编号,存放在不同的猪栏里. 2)DAL 好比是屠宰场 ,把猪从猪圈取出

从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用ApplicationPart动态加载控制器和视图

标题:从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图作者:Lamond Lu地址:https://www.cnblogs.com/lwqlun/p/11137788.html源代码:https://github.com/lamondlu/Mystique 前言# 如果你使用过一些开源CMS的话,肯定会用过其中的的插件化功能,用户可以通过启用或者上传插件包的方式动态添加一些功能,那么在ASP.NET Core MVC中如

从零开始编写自己的C#框架(9)——数据库设计与创建

对于千万级与百万级数据库设计是有所区别的,由于本项目是基于中小型软件开发框架来设计,记录量相对会比较少,所以数据库设计时考虑的角度是:与开发相结合:空间换性能:空间换开发效率:减少null异常......当然不同的公司与项目要求不同,初学者要学会适应不同的项目开发要求,使用本框架开发时,必须严格按照本章节的要求来设计数据库,不然可能会产生不可控的异常. 从零开始编写自己的C#框架 数据库设计规范   文件状态: [√] 草稿 [  ] 正式发布 [  ] 正在修改 文件标识: C#框架 当前版本