详解linux下的.net/mvc/cms程序结构
<p>cms程序架构</p>
<p>
本程序是主要是用于企业网站开发的,也可以做博客程序,程序是从之前上一篇的.net 博客程序改进过来的,主要技术由webform转成.net mvc了,由于是很早之前的项目,12年还是mvc3版本,当然还是跑在linux下的。</p>
<p>
技术栈 .net framework 4.0 sqlite 数据库 mono linux 运行环境以及mono下的sqlite库 razor 模板引擎 dapper 轻量级orm框架 vs2017 社区版本</p>
<p>
这次的开发工具比较新了吧,上次用vs2010发的,跨度比较大,这个项目之前也是在10下开发出来的,虽然用2017,其实没什么影响的。</p>
<p>
razor引擎比nvelocity的易用性高很多,而且跟后端集合的比较好。</p>
<p>
而且这次的项目完全使用dapper orm,整个数据库访问层操作看起来也清爽很多了。</p>
<p>
代码结构</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/c32f0f69396fc702861c8410016b552f.jpg"></p>
<p>
左侧主要分为三个文件夹,jqpress.web是存放web路由入口、模板皮肤、静态文件,上传文件夹,后台管理程序通过areas域管理来实现的,整个项目结构还是比较清晰的。</p>
<p>
路由设计</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/28af9addfa6a16f81a6e830523ae3006.jpg"></p>
<p>
路由入口为homecontroller这个文件,包括首页、产品列表,文章列表,文章内容等待,都是通过这个controller来路由的,虽然功能比较多,但是代码量不到300行,业务逻辑处理基本都在service层。</p>
<p>
如下为一个列表界面的action逻辑才20几行</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_31025">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">public actionresult category(string pagename) </code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">var model = new postlistmodel();</code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">categoryinfo cate = _categoryservice.getcategory(pagename);</code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">model.category = cate;</code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (cate != null)</code>
</div>
<div class="line number7 index6 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">{</code>
</div>
<div class="line number8 index7 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int categoryid = cate.categoryid;</code>
</div>
<div class="line number9 index8 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">model.metakeywords = cate.catename;</code>
</div>
<div class="line number10 index9 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">model.metadescription = cate.description;</code>
</div>
<div class="line number11 index10 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">viewbag.title = cate.catename;</code>
</div>
<div class="line number12 index11 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">model.url = confighelper.siteurl + "category/" + jqpress.framework.utils.stringhelper.sqlencode(pagename) + "/page/{0}";</code>
</div>
<div class="line number13 index12 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">const int pagesize = 10;</code>
</div>
<div class="line number14 index13 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int count = 0;</code>
</div>
<div class="line number15 index14 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int pageindex = pressrequest.getint("page", 1);</code>
</div>
<div class="line number16 index15 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int cateid = pressrequest.getqueryint("cateid", -1);</code>
</div>
<div class="line number17 index16 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int tagid = pressrequest.getqueryint("tagid", -1);</code>
</div>
<div class="line number18 index17 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">if (cateid > 0)</code>
</div>
<div class="line number19 index18 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">pageindex = pageindex + 1;</code>
</div>
<div class="line number20 index19 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">var cateids =categoryid+","+ _categoryservice.getcategorylist().findall(c => c.parentid == categoryid).aggregate(string.empty, (current, t) => current + (t.categoryid + ",")).trimend(',');</code>
</div>
<div class="line number21 index20 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">var postlist = _postservice.getpostpagelist(pagesize, pageindex, out count, cateids.trimend(','), tagid, -1, -1, -1, -1, -1,-1, "", "", "");</code>
</div>
<div class="line number22 index21 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">model.pagelist.loadpagedlist(postlist);</code>
</div>
<div class="line number23 index22 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">model.postlist = (list<</code><code class="xhtml keyword">postinfo</code><code class="xhtml plain">>)postlist;</code>
</div>
<div class="line number24 index23 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number25 index24 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">model.isdefault = 0;</code>
</div>
<div class="line number26 index25 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">return view(model.category.viewname,model);</code>
</div>
<div class="line number27 index26 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
</p>
<p>
模板引擎设计</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/a5d7789c9c4ebdd21daef2781f45d4df.jpg"></p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/e82e5c41fc3b09eedabecdce387b21b7.jpg"></p>
<p>
模板引擎采用razor,不同的cms风格模板以文件夹的形式存放在themes文件夹下,通过后端设置可以随意切换模板(此功能还在完善当中)。</p>
<p>
数据存储设计</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/6327c8fbd900c7b2e1770f84fb24853b.jpg"></p>
<p>
作为轻量级的cms,当然不会用mysql或者sqlserver,依然坚定的使用sqlite,以上是通过dapper进行数据库操作,虽然没有微软增加的orm强大,但是可读性和操控性都是非常好的。</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/7ec7b134df805bc42c41e07bba95bd83.jpg"></p>
<p>
因为要支持linux,所以sqlite的操作类需要<code>using mono.data.sqlite;</code><br>
,当然可以在windows下切换过来,上面我写的切换方式太粗暴了,学过设计模式的同学应该分分钟能够重构出来,切换windows和linux简直不要太方便。</p>
<p>
数据库结构</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/083d40870092767d599e327b7300c8a5.jpg"></p>
<p>
<code>jq_category</code> 分类及标签表 <code>jq_comments</code> 评论表 <code>jq_links</code> 友链及导航设置 <code>jq_posts</code> 文章表 <code>jq_sites</code> 站点访问统计数字及文章、分类、数量统计表 <code>jq_users</code> 账户表</p>
<p>
数据库结构跟之前的 博客程序没差别,只是部分表结构字段有所差别</p>
<p>
运行 vs2017调试模式预览</p>
<p>
cms首页</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/30c1ad61cfc598d64846039c943eb9bc.jpg"></p>
<p>
后台登录,默认用户名admin,密码123456</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/a00fcc5ee346023210fe030eaa06308a.jpg"></p>
<p>
后台首页</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/ab95cb322270cc85166ef879825970c7.jpg"></p>
<p>
文章列表</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/77d68d0d561967c673f0482f95693013.jpg"></p>
<p>
文章编辑</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/9b81438a301be570d46b70c901bf4cdc.jpg"></p>
<p>
linux下的部署方式 mono</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/e76d38f224dc9ef564f6bc9464f0d9f1.jpg"></p>
<p>
上图为我服务器上的mono安装信息。</p>
<p>
jexus</p>
<p>
linux下需要安装mono和jexus就可以运行起来,mono作为.net framework的linux运行环境,jexus作为web服务器。</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/82ba01ee3d8d1d4ceba734a856c2f6c9.jpg"></p>
<p>
jexus配置,因为我的服务器上还有其他语言的站点,所以没有直接采用jexus对外服务。</p>
<p>
nginx</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/5638662b3b488d26a5611ce900517f55.jpg"></p>
<p>
nginx代理了jexus的81端口,此地方不是必选,但是nginx作为常规的代理软件,可以在服务器上跑.net、php、java等,各司其职,百花齐放。</p>
<p>
bin文件夹说明</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/e1cc5727fba7e4246f54a9d0880cb426.jpg"></p>
<p>
.net mvc3在 linux下的部署需要注意的是需要将项目下引用的dll都需要上传到bin目录下。并且还需要上传microsoft.web.infrastructure.dll,这个是发布mvc项目需要用的。可以对比下我webform下的linux博客程序站点bin下只要引入mono和nvelocity这2个第三方dll,其他都是自己的业务程序,这个.net cms要的东西还挺多,下图是我的博客站点下的bin文件夹内容。</p>
<p>
<img title="详解linux下的.net/mvc/cms程序结构" alt="详解linux下的.net/mvc/cms程序结构" src="https://zhuji.jb51.net/uploads/img/202305/e24526ac22a1041aca68122af22d9e57.jpg"></p>
<p>
linux服务器上的的.net 程序问题 jexus不支持中文,所以文件上传的路径必须重写成字母加数字符号形式, jexus web服务器是默认对大小写敏感的,所以部署的时候一定要</p>
<p>
只需要把 jws这个脚本文件中的 “export MONO_IOMAP=...”这一句前边的“#”去掉,就可以不区分大小写了 源码获取</p>
<p>
https://github.com/robotbird/jqpress.cms</p>
<p>
为了防止部分同学无法访问Github,所以放oschina的gitee上了</p>
<p>
https://gitee.com/robotbird/jqpress.cms</p>
<p>
以上就是本次我们为大家整理的全部内容,希望对你有所帮助,如果大家还有任何不明白的地方可以在下方的留言区讨论,感谢你对的支持。</p>
頁:
[1]