Linux下的.NET MVC CMS(源码)

2018 年 1 月 5 日 DotNet

(点击上方蓝字,可快速关注我们)


来源:叶鹏

cnblogs.com/jqbird/p/8098334.html


CMS程序架构


本程序是主要是用于企业网站开发的,也可以做博客程序,程序是从之前上一篇的.NET博客程序改进过来的,主要技术由WebForm转成.NET MVC了,由于是很早之前的项目,12年还是MVC3版本,当然还是跑在Linux下的。


技术栈


  • .NET  framework 4.0


  • Sqlite 数据库


  • Mono Linux 运行环境以及mono下的Sqlite库


  • Razor 模板引擎


  • Dapper 轻量级ORM框架


  • VS2017 社区版本


这次的开发工具比较新了吧,上次用vs2010发的,跨度比较大,这个项目之前也是在10下开发出来的,虽然用2017,其实没什么影响的。


razor引擎比nvelocity的易用性高很多,而且跟后端集合的比较好。


而且这次的项目完全使用dapper orm,整个数据库访问层操作看起来也清爽很多了。


代码结构



左侧主要分为三个文件夹,Jqpress.web是存放web路由入口、模板皮肤、静态文件,上传文件夹,后台管理程序通过Areas域管理来实现的,整个项目结构还是比较清晰的。


路由设计



路由入口为HomeController这个文件,包括首页、产品列表,文章列表,文章内容等待,都是通过这个Controller来路由的,虽然功能比较多,但是代码量不到300行,业务逻辑处理基本都在service层。


如下为一个列表界面的Action逻辑才20几行


public ActionResult Category(string pagename) 

{

    var model = new PostListModel();

    CategoryInfo cate = _categoryService.GetCategory(pagename);

    model.Category = cate;

    if (cate != null)

    {

        int categoryId = cate.CategoryId;

        model.MetaKeywords = cate.CateName;

        model.MetaDescription = cate.Description;

        ViewBag.Title = cate.CateName;

        model.Url = ConfigHelper.SiteUrl + "category/" + Jqpress.Framework.Utils.StringHelper.SqlEncode(pagename) + "/page/{0}";


        const int pageSize = 10;

        int count = 0;

        int pageIndex = PressRequest.GetInt("page", 1);

        int cateid = PressRequest.GetQueryInt("cateid", -1);

        int tagid = PressRequest.GetQueryInt("tagid", -1);

        if (cateid > 0)

            pageIndex = pageIndex + 1;

        var cateids =categoryId+","+ _categoryService.GetCategoryList().FindAll(c => c.ParentId == categoryId).Aggregate(string.Empty, (current, t) => current + (t.CategoryId + ",")).TrimEnd(',');

        var postlist = _postService.GetPostPageList(pageSize, pageIndex, out count, cateids.TrimEnd(','), tagid, -1, -1, -1, -1, -1,-1, "", "", "");

        model.PageList.LoadPagedList(postlist);

        model.PostList = (List<PostInfo>)postlist;

    }

    model.IsDefault = 0;

    return View(model.Category.ViewName,model);

}


模板引擎设计




模板引擎采用razor,不同的cms风格模板以文件夹的形式存放在Themes文件夹下,通过后端设置可以随意切换模板(此功能还在完善当中)。


数据存储设计



作为轻量级的cms,当然不会用mysql或者sqlserver,依然坚定的使用sqlite,以上是通过dapper进行数据库操作,虽然没有微软增加的orm强大,但是可读性和操控性都是非常好的。



因为要支持linux,所以sqlite的操作类需要using Mono.Data.Sqlite;

,当然可以在windows下切换过来,上面我写的切换方式太粗暴了,学过设计模式的同学应该分分钟能够重构出来,切换windows和linux简直不要太方便。


数据库结构



  • jq_category 分类及标签表


  • jq_comments 评论表


  • jq_links 友链及导航设置


  • jq_posts 文章表


  • jq_sites 站点访问统计数字及文章、分类、数量统计表


  • jq_users 账户表


数据库结构跟之前的 博客程序没差别,只是部分表结构字段有所差别


运行


VS2017调试模式预览


CMS首页



后台登录,默认用户名admin,密码123456



后台首页



文章列表



文章编辑



Linux下的部署方式


mono



上图为我服务器上的mono安装信息。


jexus


Linux下需要安装mono和jexus就可以运行起来,mono作为.net framework的linux运行环境,jexus作为web服务器。



jexus配置,因为我的服务器上还有其他语言的站点,所以没有直接采用jexus对外服务。


nginx



nginx代理了jexus的81端口,此地方不是必选,但是Nginx作为常规的代理软件,可以在服务器上跑.net、php、java等,各司其职,百花齐放。


bin文件夹说明


.NET MVC 3 在 Linux下的部署需要注意的是需要将项目下引用的dll都需要上传到bin目录下。并且还需要上传Microsoft.web.Infrastructure.dll,这个是发布mvc项目需要用的。可以对比下我webform下的Linux博客程序站点bin下只要引入Mono和Nvelocity这2个第三方dll,其他都是自己的业务程序,这个.net cms要的东西还挺多,下图是我的博客站点下的bin文件夹内容。



Linux服务器上的的.net 程序问题


  • jexus不支持中文,所以文件上传的路径必须重写成字母加数字符号形式。


  • jexus web服务器是默认对大小写敏感的,所以部署的时候一定要只需要把 jws这个脚本文件中的 “export MONO_IOMAP=...”这一句前边的“#”去掉,就可以不区分大小写了


源码获取


https://github.com/robotbird/jqpress.cms


为了防止部分无法访问Github,所以放oschina的gitee上了


https://gitee.com/robotbird/jqpress.cms


后记


在开发这个cms的时候那时候.NET Core还没诞生,作为Linux下的.NET MVC项目还还是比较新颖的,只可惜没能好好的写代码,跑去做项目做产品去了,在这里开源出来缅怀写代码的岁月,如果对大家有用那最好不过了。


看完本文有收获?请转发分享给更多人

关注「DotNet」,提升.Net技能 


淘口令复制以下红色内容,再打开手淘即可购买

范品社,使用¥极客T恤¥抢先预览(长按复制整段文案,打开手机淘宝即可进入活动内容)

登录查看更多
0

相关内容

专知会员服务
56+阅读 · 2020年7月4日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
77+阅读 · 2020年6月22日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
239+阅读 · 2020年5月21日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
122+阅读 · 2020年5月10日
抢鲜看!13篇CVPR2020论文链接/开源代码/解读
专知会员服务
50+阅读 · 2020年2月26日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
183+阅读 · 2020年1月1日
MIT新书《强化学习与最优控制》
专知会员服务
280+阅读 · 2019年10月9日
防代码泄漏的监控系统架构与实践
FreeBuf
5+阅读 · 2019年4月30日
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
实战 | 源码入门之Faster RCNN
计算机视觉life
19+阅读 · 2019年4月16日
Github项目推荐 | pikepdf - Python的PDF读写库
AI研习社
9+阅读 · 2019年3月29日
从webview到flutter:详解iOS中的Web开发
前端之巅
5+阅读 · 2019年3月24日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
干货 | Python 爬虫的工具列表大全
机器学习算法与Python学习
10+阅读 · 2018年4月13日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
开源巨献:阿里巴巴最热门29款开源项目
算法与数据结构
5+阅读 · 2017年7月14日
Learning to See Through Obstructions
Arxiv
7+阅读 · 2020年4月2日
Arxiv
5+阅读 · 2019年2月28日
Arxiv
7+阅读 · 2018年11月27日
Arxiv
7+阅读 · 2018年1月21日
VIP会员
相关VIP内容
专知会员服务
56+阅读 · 2020年7月4日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
77+阅读 · 2020年6月22日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
239+阅读 · 2020年5月21日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
122+阅读 · 2020年5月10日
抢鲜看!13篇CVPR2020论文链接/开源代码/解读
专知会员服务
50+阅读 · 2020年2月26日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
183+阅读 · 2020年1月1日
MIT新书《强化学习与最优控制》
专知会员服务
280+阅读 · 2019年10月9日
相关资讯
防代码泄漏的监控系统架构与实践
FreeBuf
5+阅读 · 2019年4月30日
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
实战 | 源码入门之Faster RCNN
计算机视觉life
19+阅读 · 2019年4月16日
Github项目推荐 | pikepdf - Python的PDF读写库
AI研习社
9+阅读 · 2019年3月29日
从webview到flutter:详解iOS中的Web开发
前端之巅
5+阅读 · 2019年3月24日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
干货 | Python 爬虫的工具列表大全
机器学习算法与Python学习
10+阅读 · 2018年4月13日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
开源巨献:阿里巴巴最热门29款开源项目
算法与数据结构
5+阅读 · 2017年7月14日
Top
微信扫码咨询专知VIP会员